diff --git a/openssl-sys/src/libressl/mod.rs b/openssl-sys/src/libressl/mod.rs index aa258a02e1f1a97cd64c334afa14c9a41d47f694..4825309ce27eb4bd6a595d48fe8780a653f57955 100644 --- a/openssl-sys/src/libressl/mod.rs +++ b/openssl-sys/src/libressl/mod.rs @@ -592,6 +592,7 @@ extern "C" { pub fn X509_NAME_entry_count(n: *mut ::X509_NAME) -> c_int; pub fn X509_NAME_get_entry(n: *mut ::X509_NAME, loc: c_int) -> *mut ::X509_NAME_ENTRY; pub fn X509_NAME_ENTRY_get_data(ne: *mut ::X509_NAME_ENTRY) -> *mut ::ASN1_STRING; + pub fn X509_NAME_ENTRY_get_object(ne: *mut ::X509_NAME_ENTRY) -> *mut ::ASN1_OBJECT; pub fn X509_STORE_CTX_get_chain(ctx: *mut ::X509_STORE_CTX) -> *mut stack_st_X509; pub fn X509V3_EXT_nconf_nid( conf: *mut ::CONF, diff --git a/openssl-sys/src/openssl/v10x.rs b/openssl-sys/src/openssl/v10x.rs index 0b28820d22cf06a88020dfc10e550824f8c55d0b..92ad295c72cc2cd03db71c15212b1fa85592333b 100644 --- a/openssl-sys/src/openssl/v10x.rs +++ b/openssl-sys/src/openssl/v10x.rs @@ -962,6 +962,7 @@ extern "C" { pub fn X509_NAME_entry_count(n: *mut ::X509_NAME) -> c_int; pub fn X509_NAME_get_entry(n: *mut ::X509_NAME, loc: c_int) -> *mut ::X509_NAME_ENTRY; pub fn X509_NAME_ENTRY_get_data(ne: *mut ::X509_NAME_ENTRY) -> *mut ::ASN1_STRING; + pub fn X509_NAME_ENTRY_get_object(ne: *mut ::X509_NAME_ENTRY) -> *mut ::ASN1_OBJECT; pub fn X509_STORE_CTX_get_chain(ctx: *mut ::X509_STORE_CTX) -> *mut stack_st_X509; pub fn X509V3_EXT_nconf_nid( conf: *mut ::CONF, diff --git a/openssl-sys/src/openssl/v110.rs b/openssl-sys/src/openssl/v110.rs index 73fb92784b0806bb584424d0b60287bc28662bd4..404a5d96001cadd966182c3865921aaf03af02e4 100644 --- a/openssl-sys/src/openssl/v110.rs +++ b/openssl-sys/src/openssl/v110.rs @@ -201,6 +201,7 @@ extern "C" { pub fn X509_NAME_entry_count(n: *const ::X509_NAME) -> c_int; pub fn X509_NAME_get_entry(n: *const ::X509_NAME, loc: c_int) -> *mut ::X509_NAME_ENTRY; pub fn X509_NAME_ENTRY_get_data(ne: *const ::X509_NAME_ENTRY) -> *mut ::ASN1_STRING; + pub fn X509_NAME_ENTRY_get_object(ne: *const ::X509_NAME_ENTRY) -> *mut ::ASN1_OBJECT; pub fn X509V3_EXT_nconf_nid( conf: *mut ::CONF, ctx: *mut ::X509V3_CTX, diff --git a/openssl/src/x509/mod.rs b/openssl/src/x509/mod.rs index b051985684c6cde1f713fe41a051638c54bbc40a..697aba6f99ef4f17160a0c8a289a9ffe0aa02754 100644 --- a/openssl/src/x509/mod.rs +++ b/openssl/src/x509/mod.rs @@ -895,6 +895,19 @@ impl X509NameEntryRef { Asn1StringRef::from_ptr(data) } } + + /// Returns the `Asn1Object` value of an `X509NameEntry`. + /// This is useful for finding out about the actual `Nid` when iterating over all `X509NameEntries`. + /// + /// This corresponds to [`X509_NAME_ENTRY_get_object`]. + /// + /// [`X509_NAME_ENTRY_get_object`]: https://www.openssl.org/docs/man1.1.0/crypto/X509_NAME_ENTRY_get_object.html + pub fn object(&self) -> &Asn1ObjectRef { + unsafe { + let object = ffi::X509_NAME_ENTRY_get_object(self.as_ptr()); + Asn1ObjectRef::from_ptr(object) + } + } } /// A builder used to construct an `X509Req`. diff --git a/openssl/src/x509/tests.rs b/openssl/src/x509/tests.rs index 3e2ead9de609b5dde12d5e30da0399474df850af..bfc50899b3ac2bdbf4fcd2c460b42b22724290a3 100644 --- a/openssl/src/x509/tests.rs +++ b/openssl/src/x509/tests.rs @@ -87,12 +87,15 @@ fn test_nameref_iterator() { let mut all_entries = subject.all_entries(); let email = all_entries.next().unwrap(); + assert_eq!(email.object().nid().as_raw(), Nid::PKCS9_EMAILADDRESS.as_raw()); assert_eq!(email.data().as_slice(), b"test@example.com"); let cn = all_entries.next().unwrap(); + assert_eq!(cn.object().nid().as_raw(), Nid::COMMONNAME.as_raw()); assert_eq!(cn.data().as_slice(), b"example.com"); let friendly = all_entries.next().unwrap(); + assert_eq!(friendly.object().nid().as_raw(), Nid::FRIENDLYNAME.as_raw()); assert_eq!(&**friendly.data().as_utf8().unwrap(), "Example"); if let Some(_) = all_entries.next() {