Merge pull request #330 from esclear/master
Add a interface to RSA structs
This commit is contained in:
commit
18e7e2455c
|
|
@ -22,9 +22,7 @@ pub type ENGINE = c_void;
|
||||||
pub type EVP_CIPHER = c_void;
|
pub type EVP_CIPHER = c_void;
|
||||||
pub type EVP_CIPHER_CTX = c_void;
|
pub type EVP_CIPHER_CTX = c_void;
|
||||||
pub type EVP_MD = c_void;
|
pub type EVP_MD = c_void;
|
||||||
pub type EVP_PKEY = c_void;
|
|
||||||
pub type EVP_PKEY_CTX = c_void;
|
pub type EVP_PKEY_CTX = c_void;
|
||||||
pub type RSA = c_void;
|
|
||||||
pub type SSL = c_void;
|
pub type SSL = c_void;
|
||||||
pub type SSL_CTX = c_void;
|
pub type SSL_CTX = c_void;
|
||||||
pub type SSL_METHOD = c_void;
|
pub type SSL_METHOD = c_void;
|
||||||
|
|
@ -64,6 +62,47 @@ pub struct BIO_METHOD {
|
||||||
// so we can create static BIO_METHODs
|
// so we can create static BIO_METHODs
|
||||||
unsafe impl Sync for BIO_METHOD {}
|
unsafe impl Sync for BIO_METHOD {}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct RSA {
|
||||||
|
pub pad: c_int,
|
||||||
|
pub version: c_long,
|
||||||
|
pub meth: *const c_void,
|
||||||
|
|
||||||
|
pub engine: *mut c_void,
|
||||||
|
pub n: *mut BIGNUM,
|
||||||
|
pub e: *mut BIGNUM,
|
||||||
|
pub d: *mut BIGNUM,
|
||||||
|
pub p: *mut BIGNUM,
|
||||||
|
pub q: *mut BIGNUM,
|
||||||
|
pub dmp1: *mut BIGNUM,
|
||||||
|
pub dmq1: *mut BIGNUM,
|
||||||
|
pub iqmp: *mut BIGNUM,
|
||||||
|
|
||||||
|
pub ex_data: *mut c_void,
|
||||||
|
pub references: c_int,
|
||||||
|
pub flags: c_int,
|
||||||
|
|
||||||
|
pub _method_mod_n: *mut c_void,
|
||||||
|
pub _method_mod_p: *mut c_void,
|
||||||
|
pub _method_mod_q: *mut c_void,
|
||||||
|
|
||||||
|
pub bignum_data: *mut c_char,
|
||||||
|
pub blinding: *mut c_void,
|
||||||
|
pub mt_blinding: *mut c_void,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct EVP_PKEY {
|
||||||
|
pub type_: c_int,
|
||||||
|
pub save_type: c_int,
|
||||||
|
pub references: c_int,
|
||||||
|
pub ameth: *const c_void,
|
||||||
|
pub engine: *mut ENGINE,
|
||||||
|
pub pkey: *mut c_void,
|
||||||
|
pub save_parameters: c_int,
|
||||||
|
pub attributes: *mut c_void,
|
||||||
|
}
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct BIO {
|
pub struct BIO {
|
||||||
pub method: *mut BIO_METHOD,
|
pub method: *mut BIO_METHOD,
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,18 @@ impl BigNum {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub unsafe fn new_from_ffi(orig: *mut ffi::BIGNUM) -> Result<BigNum, SslError> {
|
||||||
|
if orig.is_null() {
|
||||||
|
panic!("Null Pointer was supplied to BigNum::new_from_ffi");
|
||||||
|
}
|
||||||
|
let r = ffi::BN_dup(orig);
|
||||||
|
if r.is_null() {
|
||||||
|
Err(SslError::get())
|
||||||
|
} else {
|
||||||
|
Ok(BigNum(r))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn new_from_slice(n: &[u8]) -> Result<BigNum, SslError> {
|
pub fn new_from_slice(n: &[u8]) -> Result<BigNum, SslError> {
|
||||||
BigNum::new().and_then(|v| unsafe {
|
BigNum::new().and_then(|v| unsafe {
|
||||||
try_ssl_null!(ffi::BN_bin2bn(n.as_ptr(), n.len() as c_int, v.raw()));
|
try_ssl_null!(ffi::BN_bin2bn(n.as_ptr(), n.len() as c_int, v.raw()));
|
||||||
|
|
|
||||||
|
|
@ -21,5 +21,6 @@ pub mod pkey;
|
||||||
pub mod rand;
|
pub mod rand;
|
||||||
pub mod symm;
|
pub mod symm;
|
||||||
pub mod memcmp;
|
pub mod memcmp;
|
||||||
|
pub mod rsa;
|
||||||
|
|
||||||
mod symm_internal;
|
mod symm_internal;
|
||||||
|
|
|
||||||
|
|
@ -100,7 +100,7 @@ impl PKey {
|
||||||
None,
|
None,
|
||||||
ptr::null_mut()));
|
ptr::null_mut()));
|
||||||
Ok(PKey {
|
Ok(PKey {
|
||||||
evp: evp,
|
evp: evp as *mut ffi::EVP_PKEY,
|
||||||
parts: Parts::Both,
|
parts: Parts::Both,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -119,7 +119,7 @@ impl PKey {
|
||||||
None,
|
None,
|
||||||
ptr::null_mut()));
|
ptr::null_mut()));
|
||||||
Ok(PKey {
|
Ok(PKey {
|
||||||
evp: evp,
|
evp: evp as *mut ffi::EVP_PKEY,
|
||||||
parts: Parts::Public,
|
parts: Parts::Public,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
use ffi;
|
||||||
|
use bn::BigNum;
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
|
pub struct RSA {
|
||||||
|
rsa_obj : ffi::RSA
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RSA {
|
||||||
|
// The following getters are unsafe, since BigNum::new_from_ffi fails upon null pointers
|
||||||
|
pub fn n(&self) -> BigNum {
|
||||||
|
unsafe {
|
||||||
|
BigNum::new_from_ffi(self.rsa_obj.n).unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn d(&self) -> BigNum {
|
||||||
|
unsafe {
|
||||||
|
BigNum::new_from_ffi(self.rsa_obj.d).unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn e(&self) -> BigNum {
|
||||||
|
unsafe {
|
||||||
|
BigNum::new_from_ffi(self.rsa_obj.e).unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn p(&self) -> BigNum {
|
||||||
|
unsafe {
|
||||||
|
BigNum::new_from_ffi(self.rsa_obj.p).unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn q(&self) -> BigNum {
|
||||||
|
unsafe {
|
||||||
|
BigNum::new_from_ffi(self.rsa_obj.q).unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for RSA {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
write!(f, "RSA")
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue