Unverified Commit 367bc979 authored by Steven Fackler's avatar Steven Fackler Committed by GitHub
Browse files

Merge pull request #1004 from mbelop/ecdsa-der

Add support for encoding and decoding ECDSA signatures
parents e9e9239c 18dfc9b6
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -200,4 +200,12 @@ extern "C" {
        sig: *const ECDSA_SIG,
        eckey: *mut EC_KEY,
    ) -> c_int;

    pub fn d2i_ECDSA_SIG(
        sig: *mut *mut ECDSA_SIG,
        inp: *mut *const c_uchar,
        length: c_long,
    ) -> *mut ECDSA_SIG;

    pub fn i2d_ECDSA_SIG(sig: *const ECDSA_SIG, out: *mut *mut c_uchar) -> c_int;
}
+36 −0
Original line number Diff line number Diff line
@@ -102,6 +102,25 @@ impl EcdsaSig {
            BigNumRef::from_ptr(s as *mut _)
        }
    }

    from_der! {
        /// Decodes a DER-encoded ECDSA signature.
        ///
        /// This corresponds to [`d2i_ECDSA_SIG`]: https://www.openssl.org/docs/man1.1.0/crypto/d2i_ECDSA_SIG.html
        from_der,
        EcdsaSig,
        ffi::d2i_ECDSA_SIG
	}
}

impl EcdsaSigRef {
    to_der! {
        /// Serializes the ECDSA signature into a DER-encoded ECDSASignature structure.
        ///
        /// This corresponds to [`i2d_ECDSA_SIG`]: https://www.openssl.org/docs/man1.1.0/crypto/i2d_ECDSA_SIG.html
        to_der,
        ffi::i2d_ECDSA_SIG
	}
}

cfg_if! {
@@ -194,4 +213,21 @@ mod test {
        let verification2 = res2.verify(data.as_bytes(), &public_key).unwrap();
        assert!(verification2);
    }

    #[test]
    #[cfg_attr(osslconf = "OPENSSL_NO_EC2M", ignore)]
    fn serialize_deserialize() {
        let group = EcGroup::from_curve_name(Nid::SECP256K1).unwrap();
        let private_key = EcKey::generate(&group).unwrap();
        let public_key = get_public_key(&group, &private_key).unwrap();

        let data = String::from("hello");
        let res = EcdsaSig::sign(data.as_bytes(), &private_key).unwrap();

        let der = res.to_der().unwrap();
        let sig = EcdsaSig::from_der(&der).unwrap();

        let verification = sig.verify(data.as_bytes(), &public_key).unwrap();
        assert!(verification);
    }
}