aboutsummaryrefslogtreecommitdiff
path: root/openssl
diff options
context:
space:
mode:
authorMarco Huenseler <[email protected]>2018-05-28 11:18:17 +0200
committerMarco Huenseler <[email protected]>2018-06-03 15:38:46 +0200
commit2afdc16fc96e4a45baadab8bfa91dc91104f00f0 (patch)
treeab56ed7cbb0ba3a18317cd77213c53a31d9e7e1b /openssl
parentMerge pull request #944 from sfackler/1.1.1-pre7 (diff)
downloadrust-openssl-2afdc16fc96e4a45baadab8bfa91dc91104f00f0.tar.xz
rust-openssl-2afdc16fc96e4a45baadab8bfa91dc91104f00f0.zip
Make X509NameRef provide an iterator over all X509NameEntries
Diffstat (limited to 'openssl')
-rw-r--r--openssl/src/x509/mod.rs30
-rw-r--r--openssl/src/x509/tests.rs21
2 files changed, 46 insertions, 5 deletions
diff --git a/openssl/src/x509/mod.rs b/openssl/src/x509/mod.rs
index 5c1bb23f..b0519856 100644
--- a/openssl/src/x509/mod.rs
+++ b/openssl/src/x509/mod.rs
@@ -820,16 +820,25 @@ impl X509NameRef {
pub fn entries_by_nid<'a>(&'a self, nid: Nid) -> X509NameEntries<'a> {
X509NameEntries {
name: self,
- nid: nid,
+ nid: Some(nid),
loc: -1,
}
}
+
+ /// Returns an iterator over all `X509NameEntry` values
+ pub fn all_entries<'a>(&'a self) -> X509NameEntries<'a> {
+ X509NameEntries {
+ name: self,
+ nid: None,
+ loc: -1
+ }
+ }
}
/// A type to destructure and examine an `X509Name`.
pub struct X509NameEntries<'a> {
name: &'a X509NameRef,
- nid: Nid,
+ nid: Option<Nid>,
loc: c_int,
}
@@ -838,10 +847,21 @@ impl<'a> Iterator for X509NameEntries<'a> {
fn next(&mut self) -> Option<&'a X509NameEntryRef> {
unsafe {
- self.loc =
- ffi::X509_NAME_get_index_by_NID(self.name.as_ptr(), self.nid.as_raw(), self.loc);
+ let entry_count = ffi::X509_NAME_entry_count(self.name.as_ptr());
+
+ match self.nid {
+ Some(nid) => {
+ // There is a `Nid` specified to search for
+ self.loc =
+ ffi::X509_NAME_get_index_by_NID(self.name.as_ptr(), nid.as_raw(), self.loc);
+ }
+ None => {
+ // Iterate over all `Nid`s
+ self.loc += 1;
+ }
+ }
- if self.loc == -1 {
+ if self.loc == -1 || self.loc >= entry_count {
return None;
}
diff --git a/openssl/src/x509/tests.rs b/openssl/src/x509/tests.rs
index 42859c97..3e2ead9d 100644
--- a/openssl/src/x509/tests.rs
+++ b/openssl/src/x509/tests.rs
@@ -80,6 +80,27 @@ fn test_nid_values() {
}
#[test]
+fn test_nameref_iterator() {
+ let cert = include_bytes!("../../test/nid_test_cert.pem");
+ let cert = X509::from_pem(cert).unwrap();
+ let subject = cert.subject_name();
+ let mut all_entries = subject.all_entries();
+
+ let email = all_entries.next().unwrap();
+ assert_eq!(email.data().as_slice(), b"[email protected]");
+
+ let cn = all_entries.next().unwrap();
+ assert_eq!(cn.data().as_slice(), b"example.com");
+
+ let friendly = all_entries.next().unwrap();
+ assert_eq!(&**friendly.data().as_utf8().unwrap(), "Example");
+
+ if let Some(_) = all_entries.next() {
+ assert!(false);
+ }
+}
+
+#[test]
fn test_nid_uid_value() {
let cert = include_bytes!("../../test/nid_uid_test_cert.pem");
let cert = X509::from_pem(cert).unwrap();