aboutsummaryrefslogtreecommitdiff
path: root/openssl/src/x509/extension.rs
diff options
context:
space:
mode:
Diffstat (limited to 'openssl/src/x509/extension.rs')
-rw-r--r--openssl/src/x509/extension.rs39
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))
+ }
+ }
+}