Unverified Commit 15419c24 authored by Steven Fackler's avatar Steven Fackler Committed by GitHub
Browse files

Merge pull request #1338 from krisztian-kovacs/asn1_object_from_string

Add constructor for creating Asn1Object from a textual OID representation
parents 5161e3f8 8bfdc7bd
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -16,4 +16,5 @@ extern "C" {
    pub fn OBJ_find_sigid_algs(signid: c_int, pdig_nid: *mut c_int, ppkey_nid: *mut c_int)
        -> c_int;
    pub fn OBJ_sn2nid(sn: *const libc::c_char) -> libc::c_int;
    pub fn OBJ_txt2obj(s: *const libc::c_char, no_name: libc::c_int) -> *mut ASN1_OBJECT;
}
+32 −0
Original line number Diff line number Diff line
@@ -537,6 +537,24 @@ foreign_type_and_impl_send_sync! {
    pub struct Asn1ObjectRef;
}

impl Asn1Object {
    /// Constructs an ASN.1 Object Identifier from a string representation of
    /// the OID.
    ///
    /// This corresponds to [`OBJ_txt2obj`].
    ///
    /// [`OBJ_txt2obj`]: https://www.openssl.org/docs/man1.1.0/man3/OBJ_txt2obj.html
    #[allow(clippy::should_implement_trait)]
    pub fn from_str(txt: &str) -> Result<Asn1Object, ErrorStack> {
        unsafe {
            ffi::init();
            let txt = CString::new(txt).unwrap();
            let obj: *mut ffi::ASN1_OBJECT = cvt_p(ffi::OBJ_txt2obj(txt.as_ptr() as *const _, 0))?;
            Ok(Asn1Object::from_ptr(obj))
        }
    }
}

impl Asn1ObjectRef {
    /// Returns the NID associated with this OID.
    pub fn nid(&self) -> Nid {
@@ -584,6 +602,7 @@ mod tests {
    use super::*;

    use bn::BigNum;
    use nid::Nid;

    /// Tests conversion between BigNum and Asn1Integer.
    #[test]
@@ -660,4 +679,17 @@ mod tests {
        assert!(b_ref <= a_ref);
        assert!(c_ref < a_ref);
    }

    #[test]
    fn object_from_str() {
        let object = Asn1Object::from_str("2.16.840.1.101.3.4.2.1").unwrap();
        assert_eq!(object.nid(), Nid::SHA256);
    }

    #[test]
    fn object_from_str_with_invalid_input() {
        Asn1Object::from_str("NOT AN OID")
            .map(|object| object.to_string())
            .expect_err("parsing invalid OID should fail");
    }
}