diff --git a/openssl-sys/src/lib.rs b/openssl-sys/src/lib.rs index a260e2a97f5c6c975ed2e39cd816f41c131c9404..52b5eda44ae3e2ebf3cd3f9c20d72931f76d0b1a 100644 --- a/openssl-sys/src/lib.rs +++ b/openssl-sys/src/lib.rs @@ -2111,6 +2111,14 @@ extern "C" { callback: Option, user_data: *mut c_void, ) -> *mut RSA; + + pub fn PEM_read_bio_RSAPublicKey( + bio: *mut BIO, + rsa: *mut *mut RSA, + callback: Option, + user_data: *mut c_void, + ) -> *mut RSA; + pub fn PEM_read_bio_RSA_PUBKEY( bio: *mut BIO, rsa: *mut *mut RSA, diff --git a/openssl/src/rsa.rs b/openssl/src/rsa.rs index 472ca94fc6ba2d430b02ebd7daf7c8ff554672cc..dfa56d70938af6b70a42ee38981c17d54401985d 100644 --- a/openssl/src/rsa.rs +++ b/openssl/src/rsa.rs @@ -428,6 +428,19 @@ impl Rsa { ffi::PEM_read_bio_RSA_PUBKEY } + from_pem! { + /// Decodes a PEM-encoded PKCS#1 RSAPublicKey structure. + /// + /// The input should have a header of `-----BEGIN RSA PUBLIC KEY-----`. + /// + /// This corresponds to [`PEM_read_bio_RSAPublicKey`]. + /// + /// [`PEM_read_bio_RSAPublicKey`]: https://www.openssl.org/docs/man1.0.2/crypto/PEM_read_bio_RSAPublicKey.html + public_key_from_pem_pkcs1, + Rsa, + ffi::PEM_read_bio_RSAPublicKey + } + from_der! { /// Decodes a DER-encoded SubjectPublicKeyInfo structure containing an RSA key. /// @@ -732,4 +745,18 @@ mod test { .unwrap(); assert_eq!(msg, &dmesg[..len]); } + + #[test] + fn test_public_key_from_pem_pkcs1() { + let key = include_bytes!("../test/pkcs1.pem.pub"); + Rsa::public_key_from_pem_pkcs1(key).unwrap(); + } + + #[test] + #[should_panic] + fn test_public_key_from_pem_pkcs1_panic() { + let key = include_bytes!("../test/key.pem.pub"); + Rsa::public_key_from_pem_pkcs1(key).unwrap(); + } + } diff --git a/openssl/test/pkcs1.pem.pub b/openssl/test/pkcs1.pem.pub new file mode 100644 index 0000000000000000000000000000000000000000..4d557048feacec44302e577fb45a68a052467700 --- /dev/null +++ b/openssl/test/pkcs1.pem.pub @@ -0,0 +1,8 @@ +-----BEGIN RSA PUBLIC KEY----- +MIIBCgKCAQEAyrcf7lv42BCoiDd3LYmF8eaGO4rhmGzGgi+NSZowkEuLhibHGQle +FkZC7h1VKsxKFgy7Fx+GYHkv9OLm9H5fdp3HhYlo19bZVGvSJ66OJe/Bc4S02bBb +Y8vwpc/N5O77m5J/nHLuL7XJtpfSKkX+3NPiX1X2L99iipt7F0a7hNws3G3Lxg6t +P3Yc55TPjXzXvDIgjt/fag6iF8L/bR3augJJdDhLzNucR8A5HcvPtIVo51R631Zq +MCh+dZvgz9zGCXwsvSky/iOJTHN3wnpsWuCAzS1iJMfjR783Tfv6sWFs19FH7pHP +xBA3b2enPM9KBzINGOly0eM4h0fh+VBltQIDAQAB +-----END RSA PUBLIC KEY-----