Loading openssl/src/bn.rs +1 −14 Original line number Diff line number Diff line Loading @@ -23,16 +23,7 @@ pub enum RNGProperty { TwoMsbOne = 1, } /// A context object for `BigNum` operations. pub struct BnCtx(*mut ffi::BN_CTX); impl Drop for BnCtx { fn drop(&mut self) { unsafe { ffi::BN_CTX_free(self.0); } } } type_!(BnCtx, ffi::BN_CTX, ffi::BN_CTX_free); impl BnCtx { /// Returns a new `BnCtx`. Loading @@ -40,10 +31,6 @@ impl BnCtx { unsafe { cvt_p(ffi::BN_CTX_new()).map(BnCtx) } } pub fn as_ptr(&self) -> *mut ffi::BN_CTX { self.0 } /// Places the result of `a * b` in `r`. pub fn mul(&mut self, r: &mut BigNumRef, Loading openssl/src/lib.rs +39 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,44 @@ use libc::c_int; use error::ErrorStack; macro_rules! type_ { ($n:ident, $c:path, $d:path) => { pub struct $n(*mut $c); unsafe impl ::types::OpenSslType for $n { type CType = $c; unsafe fn from_ptr(ptr: *mut $c) -> $n { $n(ptr) } fn as_ptr(&self) -> *mut $c { self.0 } } impl Drop for $n { fn drop(&mut self) { unsafe { $d(self.0) } } } impl ::std::ops::Deref for $n { type Target = ::types::Ref<$n>; fn deref(&self) -> &::types::Ref<$n> { unsafe { ::types::Ref::from_ptr(self.0) } } } impl ::std::ops::DerefMut for $n { fn deref_mut(&mut self) -> &mut ::types::Ref<$n> { unsafe { ::types::Ref::from_ptr_mut(self.0) } } } } } mod bio; mod opaque; mod util; Loading @@ -37,6 +75,7 @@ pub mod pkcs12; pub mod pkcs5; pub mod pkey; pub mod rand; pub mod types; pub mod rsa; pub mod sign; pub mod ssl; Loading openssl/src/types.rs 0 → 100644 +27 −0 Original line number Diff line number Diff line use std::marker::PhantomData; use opaque::Opaque; pub unsafe trait OpenSslType { type CType; unsafe fn from_ptr(ptr: *mut Self::CType) -> Self; fn as_ptr(&self) -> *mut Self::CType; } pub struct Ref<T>(Opaque, PhantomData<T>); impl<T: OpenSslType> Ref<T> { pub unsafe fn from_ptr<'a>(ptr: *mut T::CType) -> &'a Ref<T> { &*(ptr as *mut _) } pub unsafe fn from_ptr_mut<'a>(ptr: *mut T::CType) -> &'a mut Ref<T> { &mut *(ptr as *mut _) } pub fn as_ptr(&self) -> *mut T::CType { self as *const _ as *mut _ } } Loading
openssl/src/bn.rs +1 −14 Original line number Diff line number Diff line Loading @@ -23,16 +23,7 @@ pub enum RNGProperty { TwoMsbOne = 1, } /// A context object for `BigNum` operations. pub struct BnCtx(*mut ffi::BN_CTX); impl Drop for BnCtx { fn drop(&mut self) { unsafe { ffi::BN_CTX_free(self.0); } } } type_!(BnCtx, ffi::BN_CTX, ffi::BN_CTX_free); impl BnCtx { /// Returns a new `BnCtx`. Loading @@ -40,10 +31,6 @@ impl BnCtx { unsafe { cvt_p(ffi::BN_CTX_new()).map(BnCtx) } } pub fn as_ptr(&self) -> *mut ffi::BN_CTX { self.0 } /// Places the result of `a * b` in `r`. pub fn mul(&mut self, r: &mut BigNumRef, Loading
openssl/src/lib.rs +39 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,44 @@ use libc::c_int; use error::ErrorStack; macro_rules! type_ { ($n:ident, $c:path, $d:path) => { pub struct $n(*mut $c); unsafe impl ::types::OpenSslType for $n { type CType = $c; unsafe fn from_ptr(ptr: *mut $c) -> $n { $n(ptr) } fn as_ptr(&self) -> *mut $c { self.0 } } impl Drop for $n { fn drop(&mut self) { unsafe { $d(self.0) } } } impl ::std::ops::Deref for $n { type Target = ::types::Ref<$n>; fn deref(&self) -> &::types::Ref<$n> { unsafe { ::types::Ref::from_ptr(self.0) } } } impl ::std::ops::DerefMut for $n { fn deref_mut(&mut self) -> &mut ::types::Ref<$n> { unsafe { ::types::Ref::from_ptr_mut(self.0) } } } } } mod bio; mod opaque; mod util; Loading @@ -37,6 +75,7 @@ pub mod pkcs12; pub mod pkcs5; pub mod pkey; pub mod rand; pub mod types; pub mod rsa; pub mod sign; pub mod ssl; Loading
openssl/src/types.rs 0 → 100644 +27 −0 Original line number Diff line number Diff line use std::marker::PhantomData; use opaque::Opaque; pub unsafe trait OpenSslType { type CType; unsafe fn from_ptr(ptr: *mut Self::CType) -> Self; fn as_ptr(&self) -> *mut Self::CType; } pub struct Ref<T>(Opaque, PhantomData<T>); impl<T: OpenSslType> Ref<T> { pub unsafe fn from_ptr<'a>(ptr: *mut T::CType) -> &'a Ref<T> { &*(ptr as *mut _) } pub unsafe fn from_ptr_mut<'a>(ptr: *mut T::CType) -> &'a mut Ref<T> { &mut *(ptr as *mut _) } pub fn as_ptr(&self) -> *mut T::CType { self as *const _ as *mut _ } }