diff --git a/openssl-sys/src/ossl_typ.rs b/openssl-sys/src/ossl_typ.rs index fa6eb1bab23180923d6f087002d5fe6b4f01e799..449ecd910b07d42a5bbe0ba92a8f4283186f45c9 100644 --- a/openssl-sys/src/ossl_typ.rs +++ b/openssl-sys/src/ossl_typ.rs @@ -342,8 +342,46 @@ cfg_if! { } } pub enum X509_CRL {} +stack!(stack_st_X509_CRL); + pub enum X509_NAME {} -pub enum X509_STORE {} + +cfg_if! { + if #[cfg(any(ossl110, libressl270))] { + pub enum X509_STORE {} + } else { + #[repr(C)] + pub struct X509_STORE { + cache: c_int, + pub objs: *mut stack_st_X509_OBJECT, + get_cert_methods: *mut stack_st_X509_LOOKUP, + param: *mut X509_VERIFY_PARAM, + verify: Option c_int>, + verify_cb: Option c_int>, + get_issuer: Option< + extern "C" fn(issuer: *mut *mut X509, ctx: *mut X509_STORE_CTX, x: *mut X509) -> c_int, + >, + check_issued: + Option c_int>, + check_revocation: Option c_int>, + get_crl: Option< + extern "C" fn(ctx: *mut X509_STORE_CTX, crl: *mut *mut X509_CRL, x: *mut X509) -> c_int, + >, + check_crl: Option c_int>, + cert_crl: + Option c_int>, + lookup_certs: + Option *mut stack_st_X509>, + lookup_crls: Option< + extern "C" fn(ctx: *const X509_STORE_CTX, nm: *const X509_NAME) -> *mut stack_st_X509_CRL, + >, + cleanup: Option c_int>, + ex_data: CRYPTO_EX_DATA, + references: c_int, + } + } +} + pub enum X509_STORE_CTX {} cfg_if! { @@ -375,7 +413,7 @@ cfg_if! { pub policies: *mut stack_st_ASN1_OBJECT, //pub id: *mut X509_VERIFY_PARAM_ID, } - } else if #[cfg(ossl102)] { + } else { #[repr(C)] pub struct X509_VERIFY_PARAM { pub name: *mut c_char, @@ -386,6 +424,7 @@ cfg_if! { pub trust: c_int, pub depth: c_int, pub policies: *mut stack_st_ASN1_OBJECT, + #[cfg(ossl102)] pub id: *mut X509_VERIFY_PARAM_ID, } } diff --git a/openssl-sys/src/x509.rs b/openssl-sys/src/x509.rs index 572a29e4f6e9e7e1885e86cd87b0903673f87634..70b8bbc1c921758b59a34a399c51e08ae5ef33e9 100644 --- a/openssl-sys/src/x509.rs +++ b/openssl-sys/src/x509.rs @@ -103,6 +103,10 @@ cfg_if! { stack!(stack_st_X509_OBJECT); +pub enum X509_LOOKUP {} + +stack!(stack_st_X509_LOOKUP); + extern "C" { pub fn X509_verify_cert_error_string(n: c_long) -> *const c_char; @@ -377,15 +381,20 @@ extern "C" { pub fn X509_verify_cert(ctx: *mut X509_STORE_CTX) -> c_int; } +#[cfg(any(ossl110, libressl270))] extern "C" { pub fn X509_STORE_get0_objects(ctx: *mut X509_STORE) -> *mut stack_st_X509_OBJECT; - pub fn X509_OBJECT_free(a: *mut X509_OBJECT); + pub fn X509_OBJECT_get0_X509(x: *const X509_OBJECT) -> *mut X509; } cfg_if! { - if #[cfg(any(ossl110, libressl270))] { + if #[cfg(ossl110)] { + extern "C" { + pub fn X509_OBJECT_free(a: *mut X509_OBJECT); + } + } else { extern "C" { - pub fn X509_OBJECT_get0_X509(x: *const X509_OBJECT) -> *mut X509; + pub fn X509_OBJECT_free_contents(a: *mut X509_OBJECT); } } } diff --git a/openssl/src/x509/mod.rs b/openssl/src/x509/mod.rs index efb5ae8ec3cdebf9a889c3e4d8fdc449d9db51c5..4ec47f4fd5a901783c79863e7930cd1fda9f1537 100644 --- a/openssl/src/x509/mod.rs +++ b/openssl/src/x509/mod.rs @@ -1324,7 +1324,7 @@ impl X509AlgorithmRef { foreign_type_and_impl_send_sync! { type CType = ffi::X509_OBJECT; - fn drop = ffi::X509_OBJECT_free; + fn drop = X509_OBJECT_free; /// An `X509` or an X509 certificate revocation list. pub struct X509Object; @@ -1444,3 +1444,15 @@ cfg_if! { } } } + +cfg_if! { + if #[cfg(ossl110)] { + use ffi::X509_OBJECT_free; + } else { + #[allow(bad_style)] + unsafe fn X509_OBJECT_free(x: *mut ffi::X509_OBJECT) { + ffi::X509_OBJECT_free_contents(x); + ffi::CRYPTO_free(x as *mut libc::c_void); + } + } +} diff --git a/openssl/src/x509/store.rs b/openssl/src/x509/store.rs index 2459a06b6fa5fe229e4f9bf61d5342e70805aae4..2fb342a10d9a4e65618d7117d35ba35508dd4cf2 100644 --- a/openssl/src/x509/store.rs +++ b/openssl/src/x509/store.rs @@ -109,6 +109,17 @@ foreign_type_and_impl_send_sync! { impl X509StoreRef { /// Get a reference to the cache of certificates in this store. pub fn certs(&self) -> &StackRef { - unsafe { StackRef::from_ptr(ffi::X509_STORE_get0_objects(self.as_ptr())) } + unsafe { StackRef::from_ptr(X509_STORE_get0_objects(self.as_ptr())) } + } +} + +cfg_if! { + if #[cfg(any(ossl110, libressl270))] { + use ffi::X509_STORE_get0_objects; + } else { + #[allow(bad_style)] + unsafe fn X509_STORE_get0_objects(x: *mut ffi::X509_STORE) -> *mut ffi::stack_st_X509_OBJECT { + (*x).objs + } } }