diff options
Diffstat (limited to 'openssl/src/x509/extension.rs')
| -rw-r--r-- | openssl/src/x509/extension.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/openssl/src/x509/extension.rs b/openssl/src/x509/extension.rs index 88cb64a2..c0b3bad4 100644 --- a/openssl/src/x509/extension.rs +++ b/openssl/src/x509/extension.rs @@ -1,4 +1,9 @@ use std::fmt; +use std::marker::PhantomData; +use std::slice; +use std::str; +use ffi; + use nid::Nid; /// Type-only version of the `Extension` enum. @@ -218,3 +223,37 @@ impl fmt::Display for AltNameOption { }) } } + +pub struct GeneralName<'a> { + name: *const ffi::GENERAL_NAME, + m: PhantomData<&'a ()>, +} + +impl<'a> GeneralName<'a> { + pub fn dns(&self) -> Option<&str> { + unsafe { + if (*self.name).type_ != ffi::GEN_DNS { + return None; + } + + let ptr = ffi::ASN1_STRING_data((*self.name).d as *mut _); + let len = ffi::ASN1_STRING_length((*self.name).d as *mut _); + + let slice = slice::from_raw_parts(ptr as *const u8, len as usize); + Some(str::from_utf8_unchecked(slice)) + } + } + + pub fn ipadd(&self) -> Option<&[u8]> { + unsafe { + if (*self.name).type_ != ffi::GEN_IPADD { + return None; + } + + let ptr = ffi::ASN1_STRING_data((*self.name).d as *mut _); + let len = ffi::ASN1_STRING_length((*self.name).d as *mut _); + + Some(slice::from_raw_parts(ptr as *const u8, len as usize)) + } + } +} |