diff --git a/openssl-sys/build/run_bindgen.rs b/openssl-sys/build/run_bindgen.rs index 5e62237f35..ae9702c920 100644 --- a/openssl-sys/build/run_bindgen.rs +++ b/openssl-sys/build/run_bindgen.rs @@ -32,6 +32,7 @@ const INCLUDES: &str = " #include #include #include +#include #include #include #include diff --git a/openssl-sys/src/handwritten/mod.rs b/openssl-sys/src/handwritten/mod.rs index d3adfa5a13..3920f05854 100644 --- a/openssl-sys/src/handwritten/mod.rs +++ b/openssl-sys/src/handwritten/mod.rs @@ -28,6 +28,7 @@ pub use self::sha::*; pub use self::srtp::*; pub use self::ssl::*; pub use self::stack::*; +pub use self::store::*; pub use self::tls1::*; pub use self::types::*; pub use self::x509::*; @@ -64,6 +65,7 @@ mod sha; mod srtp; mod ssl; mod stack; +mod store; mod tls1; mod types; mod x509; diff --git a/openssl-sys/src/handwritten/store.rs b/openssl-sys/src/handwritten/store.rs new file mode 100644 index 0000000000..2739714724 --- /dev/null +++ b/openssl-sys/src/handwritten/store.rs @@ -0,0 +1,35 @@ +use super::super::*; +use libc::*; + +pub enum OSSL_STORE_CTX {} + +pub enum OSSL_STORE_INFO {} + +pub const OSSL_STORE_INFO_PUBKEY: c_int = 3; +pub const OSSL_STORE_INFO_PKEY: c_int = 4; +pub const OSSL_STORE_INFO_CERT: c_int = 5; +pub const OSSL_STORE_INFO_CRL: c_int = 6; + +extern "C" { + pub fn OSSL_STORE_open( + uri: *const c_char, + // const UI_METHOD *ui_method, + ui_method: *const c_void, + ui_data: *const c_void, + // OSSL_STORE_post_process_info_fn post_process, + post_process: *const c_void, + post_process_data: *const c_void, + ) -> *mut OSSL_STORE_CTX; + + pub fn OSSL_STORE_load(ctx: *mut OSSL_STORE_CTX) -> *mut OSSL_STORE_INFO; + + pub fn OSSL_STORE_INFO_get_type(store_info: *mut OSSL_STORE_INFO) -> c_int; + + pub fn OSSL_STORE_INFO_get1_PUBKEY(store_info: *mut OSSL_STORE_INFO) -> *mut EVP_PKEY; + + pub fn OSSL_STORE_INFO_get1_PKEY(store_info: *mut OSSL_STORE_INFO) -> *mut EVP_PKEY; + + pub fn OSSL_STORE_INFO_free(store_info: *mut OSSL_STORE_INFO); + + pub fn OSSL_STORE_close(ctx: *mut OSSL_STORE_CTX) -> c_int; +} diff --git a/openssl/src/lib.rs b/openssl/src/lib.rs index 5c9ccf7a05..d532d38c9a 100644 --- a/openssl/src/lib.rs +++ b/openssl/src/lib.rs @@ -181,6 +181,7 @@ pub mod sign; pub mod srtp; pub mod ssl; pub mod stack; +pub mod store; pub mod string; pub mod symm; pub mod version; diff --git a/openssl/src/store.rs b/openssl/src/store.rs new file mode 100644 index 0000000000..f38e4cf434 --- /dev/null +++ b/openssl/src/store.rs @@ -0,0 +1,51 @@ +use foreign_types::ForeignType; + +use std::ffi::CString; +use std::ptr; + +use crate::cvt_p; +use crate::error::ErrorStack; +use crate::pkey::{PKey, Private}; + +pub struct Store(*mut ffi::OSSL_STORE_CTX); + +impl Drop for Store { + fn drop(&mut self) { + unsafe { + ffi::OSSL_STORE_close(self.0); + } + } +} + +impl Store { + pub fn private_key_from_uri(uri: &str) -> Result>, ErrorStack> { + let uri = CString::new(uri).unwrap(); + unsafe { + let store = cvt_p(ffi::OSSL_STORE_open( + uri.as_ptr(), + ptr::null(), + ptr::null(), + ptr::null(), + ptr::null(), + )) + .map(|p| Store(p))?; + + let mut store_info = cvt_p(ffi::OSSL_STORE_load(store.0))?; + + while store_info != ptr::null_mut() { + let type_ = ffi::OSSL_STORE_INFO_get_type(store_info); + if type_ == ffi::OSSL_STORE_INFO_PKEY { + let pkey_ptr = cvt_p(ffi::OSSL_STORE_INFO_get1_PKEY(store_info))?; + return Ok(Some(PKey::from_ptr(pkey_ptr))); + } + + ffi::OSSL_STORE_INFO_free(store_info); + + store_info = cvt_p(ffi::OSSL_STORE_load(store.0))?; + } + + // error? + Ok(None) + } + } +}