diff options
| author | Steven Fackler <[email protected]> | 2016-07-29 09:05:51 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2016-07-29 09:05:51 -0700 |
| commit | 4eaada2c4b9e4be8d349cf537db0004df7867e3f (patch) | |
| tree | 189aa150549862165d706d5ca7e5776899f5101f | |
| parent | Merge pull request #428 from onur/get_handle_for_X509Req (diff) | |
| parent | Implement save_der for X509 and X509Req (diff) | |
| download | rust-openssl-4eaada2c4b9e4be8d349cf537db0004df7867e3f.tar.xz rust-openssl-4eaada2c4b9e4be8d349cf537db0004df7867e3f.zip | |
Merge pull request #427 from onur/save_der
Implement save_der for X509 and X509Req
| -rw-r--r-- | openssl-sys/src/lib.rs | 3 | ||||
| -rw-r--r-- | openssl/src/x509/mod.rs | 22 | ||||
| -rw-r--r-- | openssl/src/x509/tests.rs | 13 |
3 files changed, 38 insertions, 0 deletions
diff --git a/openssl-sys/src/lib.rs b/openssl-sys/src/lib.rs index 96a24e48..1e0d5fe5 100644 --- a/openssl-sys/src/lib.rs +++ b/openssl-sys/src/lib.rs @@ -841,6 +841,9 @@ extern "C" { pub fn X509_REQ_add_extensions(req: *mut X509_REQ, exts: *mut stack_st_X509_EXTENSION) -> c_int; pub fn X509_REQ_sign(x: *mut X509_REQ, pkey: *mut EVP_PKEY, md: *const EVP_MD) -> c_int; + pub fn i2d_X509_bio(b: *mut BIO, x: *mut X509) -> c_int; + pub fn i2d_X509_REQ_bio(b: *mut BIO, x: *mut X509_REQ) -> c_int; + pub fn i2d_RSA_PUBKEY(k: *mut RSA, buf: *const *mut u8) -> c_int; pub fn d2i_RSA_PUBKEY(k: *const *mut RSA, buf: *const *const u8, len: c_uint) -> *mut RSA; pub fn i2d_RSAPrivateKey(k: *mut RSA, buf: *const *mut u8) -> c_int; diff --git a/openssl/src/x509/mod.rs b/openssl/src/x509/mod.rs index daeb9283..c9d1772d 100644 --- a/openssl/src/x509/mod.rs +++ b/openssl/src/x509/mod.rs @@ -532,6 +532,17 @@ impl<'ctx> X509<'ctx> { } io::copy(&mut mem_bio, writer).map_err(StreamError).map(|_| ()) } + + /// Returns a DER serialized form of the certificate + pub fn save_der(&self) -> Result<Vec<u8>, SslError> { + let mut mem_bio = try!(MemBio::new()); + unsafe { + ffi::i2d_X509_bio(mem_bio.get_handle(), self.handle); + } + let mut v = Vec::new(); + try!(io::copy(&mut mem_bio, &mut v).map_err(StreamError)); + Ok(v) + } } extern "C" { @@ -641,6 +652,17 @@ impl X509Req { } io::copy(&mut mem_bio, writer).map_err(StreamError).map(|_| ()) } + + /// Returns a DER serialized form of the CSR + pub fn save_der(&self) -> Result<Vec<u8>, SslError> { + let mut mem_bio = try!(MemBio::new()); + unsafe { + ffi::i2d_X509_REQ_bio(mem_bio.get_handle(), self.handle); + } + let mut v = Vec::new(); + try!(io::copy(&mut mem_bio, &mut v).map_err(StreamError)); + Ok(v) + } } impl Drop for X509Req { diff --git a/openssl/src/x509/tests.rs b/openssl/src/x509/tests.rs index f547a982..5d9b30ab 100644 --- a/openssl/src/x509/tests.rs +++ b/openssl/src/x509/tests.rs @@ -93,6 +93,19 @@ fn test_cert_loading() { } #[test] +fn test_save_der() { + let cert_path = Path::new("test/cert.pem"); + let mut file = File::open(&cert_path) + .ok() + .expect("Failed to open `test/cert.pem`"); + + let cert = X509::from_pem(&mut file).ok().expect("Failed to load PEM"); + + let der = cert.save_der().unwrap(); + assert!(!der.is_empty()); +} + +#[test] fn test_subject_read_cn() { let cert_path = Path::new("test/cert.pem"); let mut file = File::open(&cert_path) |