diff options
| author | Steven Fackler <[email protected]> | 2017-01-03 15:31:03 -0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2017-01-03 15:31:03 -0800 |
| commit | 0897c196e12627ef8e5eca99bada9027dfe9baaa (patch) | |
| tree | 55b26cc538b35c712eca27f20e00d0fe1cc58b6e /openssl/src/x509/mod.rs | |
| parent | Merge pull request #541 from bluejekyll/master (diff) | |
| parent | Add X509::stack_from_pem (diff) | |
| download | rust-openssl-0897c196e12627ef8e5eca99bada9027dfe9baaa.tar.xz rust-openssl-0897c196e12627ef8e5eca99bada9027dfe9baaa.zip | |
Merge pull request #547 from sfackler/x509-stack
Add X509::stack_from_pem
Diffstat (limited to 'openssl/src/x509/mod.rs')
| -rw-r--r-- | openssl/src/x509/mod.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/openssl/src/x509/mod.rs b/openssl/src/x509/mod.rs index 68652f8e..d90cee22 100644 --- a/openssl/src/x509/mod.rs +++ b/openssl/src/x509/mod.rs @@ -433,6 +433,36 @@ impl ToOwned for X509Ref { impl X509 { from_pem!(X509, ffi::PEM_read_bio_X509); from_der!(X509, ffi::d2i_X509); + + /// Deserializes a list of PEM-formatted certificates. + pub fn stack_from_pem(pem: &[u8]) -> Result<Vec<X509>, ErrorStack> { + unsafe { + ffi::init(); + let bio = try!(MemBioSlice::new(pem)); + + let mut certs = vec![]; + loop { + let r = ffi::PEM_read_bio_X509(bio.as_ptr(), + ptr::null_mut(), + None, + ptr::null_mut()); + if r.is_null() { + let err = ffi::ERR_peek_last_error(); + if ffi::ERR_GET_LIB(err) == ffi::ERR_LIB_PEM + && ffi::ERR_GET_REASON(err) == ffi::PEM_R_NO_START_LINE { + ffi::ERR_clear_error(); + break; + } + + return Err(ErrorStack::get()); + } else { + certs.push(X509(r)); + } + } + + Ok(certs) + } + } } impl Clone for X509 { |