From b8de619fbe20dd08849c5364a222d5bc117d9072 Mon Sep 17 00:00:00 2001 From: Marco Huenseler Date: Thu, 24 May 2018 12:01:47 +0200 Subject: [PATCH 1/2] Get Nid string representations --- openssl-sys/src/lib.rs | 1 + openssl/src/nid.rs | 69 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/openssl-sys/src/lib.rs b/openssl-sys/src/lib.rs index e7bd046e..f2a77cab 100644 --- a/openssl-sys/src/lib.rs +++ b/openssl-sys/src/lib.rs @@ -2106,6 +2106,7 @@ extern "C" { a: *const ASN1_OBJECT, no_name: c_int, ) -> c_int; + pub fn OBJ_nid2ln(nid: c_int) -> *const c_char; pub fn OBJ_nid2sn(nid: c_int) -> *const c_char; pub fn OBJ_find_sigid_algs(signid: c_int, pdig_nid: *mut c_int, ppkey_nid: *mut c_int) -> c_int; diff --git a/openssl/src/nid.rs b/openssl/src/nid.rs index 78ffac96..ceefece5 100644 --- a/openssl/src/nid.rs +++ b/openssl/src/nid.rs @@ -3,6 +3,9 @@ use ffi; use libc::c_int; use std::ptr; +use std::ffi::CStr; +use std::str; + /// A numerical identifier for an OpenSSL object. /// /// Objects in OpenSSL can have a short name, a long name, and @@ -57,6 +60,38 @@ impl Nid { } } + /// Return the string representation of a `Nid` (long) + /// This corresponds to [`OBJ_nid2ln`] + /// + /// [`OBJ_nid2ln`]: https://www.openssl.org/docs/man1.1.0/crypto/OBJ_nid2ln.html + pub fn to_long_name(&self) -> Option<&'static str> { + unsafe { + let s = ffi::OBJ_nid2ln(self.0); + if s.is_null() { + None + } + else { + Some(str::from_utf8(CStr::from_ptr(s).to_bytes()).unwrap()) + } + } + } + + /// Return the string representation of a `Nid` (short) + /// This corresponds to [`OBJ_nid2sn`] + /// + /// [`OBJ_nid2sn`]: https://www.openssl.org/docs/man1.1.0/crypto/OBJ_nid2sn.html + pub fn to_short_name(&self) -> Option<&'static str> { + unsafe { + let s = ffi::OBJ_nid2sn(self.0); + if s.is_null() { + None + } + else { + Some(str::from_utf8(CStr::from_ptr(s).to_bytes()).unwrap()) + } + } + } + pub const UNDEF: Nid = Nid(ffi::NID_undef); pub const ITU_T: Nid = Nid(ffi::NID_itu_t); pub const CCITT: Nid = Nid(ffi::NID_ccitt); @@ -1018,4 +1053,38 @@ mod test { Some(Nid::SHA256) ); } + + #[test] + fn test_long_name_conversion() { + let common_name = Nid::COMMONNAME; + let organizational_unit_name = Nid::ORGANIZATIONALUNITNAME; + let aes256_cbc_hmac_sha1 = Nid::AES_256_CBC_HMAC_SHA1; + let id_cmc_lrapopwitness = Nid::ID_CMC_LRAPOPWITNESS; + let ms_ctl_sign = Nid::MS_CTL_SIGN; + let undefined_nid = Nid::from_raw(118); + + assert_eq!(common_name.to_long_name(), Some("commonName")); + assert_eq!(organizational_unit_name.to_long_name(), Some("organizationalUnitName")); + assert_eq!(aes256_cbc_hmac_sha1.to_long_name(), Some("aes-256-cbc-hmac-sha1")); + assert_eq!(id_cmc_lrapopwitness.to_long_name(), Some("id-cmc-lraPOPWitness")); + assert_eq!(ms_ctl_sign.to_long_name(), Some("Microsoft Trust List Signing")); + assert_eq!(undefined_nid.to_long_name(), None); + } + + #[test] + fn test_short_name_conversion() { + let common_name = Nid::COMMONNAME; + let organizational_unit_name = Nid::ORGANIZATIONALUNITNAME; + let aes256_cbc_hmac_sha1 = Nid::AES_256_CBC_HMAC_SHA1; + let id_cmc_lrapopwitness = Nid::ID_CMC_LRAPOPWITNESS; + let ms_ctl_sign = Nid::MS_CTL_SIGN; + let undefined_nid = Nid::from_raw(118); + + assert_eq!(common_name.to_short_name(), Some("CN")); + assert_eq!(organizational_unit_name.to_short_name(), Some("OU")); + assert_eq!(aes256_cbc_hmac_sha1.to_short_name(), Some("AES-256-CBC-HMAC-SHA1")); + assert_eq!(id_cmc_lrapopwitness.to_short_name(), Some("id-cmc-lraPOPWitness")); + assert_eq!(ms_ctl_sign.to_short_name(), Some("msCTLSign")); + assert_eq!(undefined_nid.to_long_name(), None); + } } From 2977f6ed308473869a29d2507c6124778827bd0d Mon Sep 17 00:00:00 2001 From: Marco Huenseler Date: Mon, 28 May 2018 11:57:59 +0200 Subject: [PATCH 2/2] rewrite Nid::{long_name,short_name} to return Results instead of Options --- openssl/src/nid.rs | 51 ++++++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/openssl/src/nid.rs b/openssl/src/nid.rs index ceefece5..23068406 100644 --- a/openssl/src/nid.rs +++ b/openssl/src/nid.rs @@ -1,11 +1,14 @@ //! A collection of numerical identifiers for OpenSSL objects. use ffi; -use libc::c_int; +use libc::{c_int,c_char}; use std::ptr; use std::ffi::CStr; use std::str; +use error::ErrorStack; +use cvt_p; + /// A numerical identifier for an OpenSSL object. /// /// Objects in OpenSSL can have a short name, a long name, and @@ -64,15 +67,10 @@ impl Nid { /// This corresponds to [`OBJ_nid2ln`] /// /// [`OBJ_nid2ln`]: https://www.openssl.org/docs/man1.1.0/crypto/OBJ_nid2ln.html - pub fn to_long_name(&self) -> Option<&'static str> { + pub fn long_name(&self) -> Result<&'static str, ErrorStack> { unsafe { - let s = ffi::OBJ_nid2ln(self.0); - if s.is_null() { - None - } - else { - Some(str::from_utf8(CStr::from_ptr(s).to_bytes()).unwrap()) - } + cvt_p(ffi::OBJ_nid2ln(self.0) as *mut c_char) + .map(|nameptr| str::from_utf8(CStr::from_ptr(nameptr).to_bytes()).unwrap()) } } @@ -80,15 +78,10 @@ impl Nid { /// This corresponds to [`OBJ_nid2sn`] /// /// [`OBJ_nid2sn`]: https://www.openssl.org/docs/man1.1.0/crypto/OBJ_nid2sn.html - pub fn to_short_name(&self) -> Option<&'static str> { + pub fn short_name(&self) -> Result<&'static str, ErrorStack> { unsafe { - let s = ffi::OBJ_nid2sn(self.0); - if s.is_null() { - None - } - else { - Some(str::from_utf8(CStr::from_ptr(s).to_bytes()).unwrap()) - } + cvt_p(ffi::OBJ_nid2sn(self.0) as *mut c_char) + .map(|nameptr| str::from_utf8(CStr::from_ptr(nameptr).to_bytes()).unwrap()) } } @@ -1063,12 +1056,12 @@ mod test { let ms_ctl_sign = Nid::MS_CTL_SIGN; let undefined_nid = Nid::from_raw(118); - assert_eq!(common_name.to_long_name(), Some("commonName")); - assert_eq!(organizational_unit_name.to_long_name(), Some("organizationalUnitName")); - assert_eq!(aes256_cbc_hmac_sha1.to_long_name(), Some("aes-256-cbc-hmac-sha1")); - assert_eq!(id_cmc_lrapopwitness.to_long_name(), Some("id-cmc-lraPOPWitness")); - assert_eq!(ms_ctl_sign.to_long_name(), Some("Microsoft Trust List Signing")); - assert_eq!(undefined_nid.to_long_name(), None); + assert_eq!(common_name.long_name().unwrap(), "commonName"); + assert_eq!(organizational_unit_name.long_name().unwrap(), "organizationalUnitName"); + assert_eq!(aes256_cbc_hmac_sha1.long_name().unwrap(), "aes-256-cbc-hmac-sha1"); + assert_eq!(id_cmc_lrapopwitness.long_name().unwrap(), "id-cmc-lraPOPWitness"); + assert_eq!(ms_ctl_sign.long_name().unwrap(), "Microsoft Trust List Signing"); + assert!(undefined_nid.long_name().is_err(), "undefined_nid should not return a valid value"); } #[test] @@ -1080,11 +1073,11 @@ mod test { let ms_ctl_sign = Nid::MS_CTL_SIGN; let undefined_nid = Nid::from_raw(118); - assert_eq!(common_name.to_short_name(), Some("CN")); - assert_eq!(organizational_unit_name.to_short_name(), Some("OU")); - assert_eq!(aes256_cbc_hmac_sha1.to_short_name(), Some("AES-256-CBC-HMAC-SHA1")); - assert_eq!(id_cmc_lrapopwitness.to_short_name(), Some("id-cmc-lraPOPWitness")); - assert_eq!(ms_ctl_sign.to_short_name(), Some("msCTLSign")); - assert_eq!(undefined_nid.to_long_name(), None); + assert_eq!(common_name.short_name().unwrap(), "CN"); + assert_eq!(organizational_unit_name.short_name().unwrap(), "OU"); + assert_eq!(aes256_cbc_hmac_sha1.short_name().unwrap(), "AES-256-CBC-HMAC-SHA1"); + assert_eq!(id_cmc_lrapopwitness.short_name().unwrap(), "id-cmc-lraPOPWitness"); + assert_eq!(ms_ctl_sign.short_name().unwrap(), "msCTLSign"); + assert!(undefined_nid.short_name().is_err(), "undefined_nid should not return a valid value"); } }