diff options
author | Steven Fackler <sfackler@gmail.com> | 2016-10-31 22:43:05 -0700 |
---|---|---|
committer | Steven Fackler <sfackler@gmail.com> | 2016-10-31 22:43:05 -0700 |
commit | dc4098bdd83e23703b2490741ee7461caea83375 (patch) | |
tree | e0f1fd86bd2fc67e51fe744b09762f89f04d46e3 /openssl/src/asn1.rs | |
parent | 50d8cca640d4919474605810179f2800f7242722 (diff) | |
download | rust-openssl-dc4098bdd83e23703b2490741ee7461caea83375.zip |
Clean up x509 name entries
Diffstat (limited to 'openssl/src/asn1.rs')
-rw-r--r-- | openssl/src/asn1.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/openssl/src/asn1.rs b/openssl/src/asn1.rs index a089b41b..d0704693 100644 --- a/openssl/src/asn1.rs +++ b/openssl/src/asn1.rs @@ -1,9 +1,11 @@ use libc::c_long; use std::{ptr, fmt}; +use std::slice; use ffi; use {cvt, cvt_p}; use bio::MemBio; +use crypto::CryptoString; use error::ErrorStack; use types::{OpenSslType, Ref}; @@ -35,3 +37,29 @@ impl Asn1Time { Asn1Time::from_period(days as c_long * 60 * 60 * 24) } } + +type_!(Asn1String, ffi::ASN1_STRING, ffi::ASN1_STRING_free); + +impl Ref<Asn1String> { + pub fn as_utf8(&self) -> Result<CryptoString, ErrorStack> { + unsafe { + let mut ptr = ptr::null_mut(); + let len = ffi::ASN1_STRING_to_UTF8(&mut ptr, self.as_ptr()); + if len < 0 { + return Err(ErrorStack::get()); + } + + Ok(CryptoString::from_raw_parts(ptr, len as usize)) + } + } + + pub fn as_slice(&self) -> &[u8] { + unsafe { slice::from_raw_parts(ffi::ASN1_STRING_data(self.as_ptr()), self.len()) } + } + + pub fn len(&self) -> usize { + unsafe { + ffi::ASN1_STRING_length(self.as_ptr()) as usize + } + } +} |