aboutsummaryrefslogtreecommitdiff
path: root/openssl/src
diff options
context:
space:
mode:
authorChris Dawes <[email protected]>2016-05-03 19:45:30 +0100
committerChris Dawes <[email protected]>2016-05-03 19:46:08 +0100
commit6bbb21779b2665d91ddb8457894945913c189085 (patch)
treecce1ddad590fffc56a7e99f4c35fbd33ac53ccd5 /openssl/src
parentUpdate openssl version in CI (diff)
downloadrust-openssl-6bbb21779b2665d91ddb8457894945913c189085.tar.xz
rust-openssl-6bbb21779b2665d91ddb8457894945913c189085.zip
add constructor for private keys from bignums
Diffstat (limited to 'openssl/src')
-rw-r--r--openssl/src/crypto/rsa.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/openssl/src/crypto/rsa.rs b/openssl/src/crypto/rsa.rs
index 6fcb5b07..974f9ad9 100644
--- a/openssl/src/crypto/rsa.rs
+++ b/openssl/src/crypto/rsa.rs
@@ -28,6 +28,21 @@ impl RSA {
Ok(RSA(rsa))
}
}
+
+ pub fn from_private_components(n: BigNum, e: BigNum, d: BigNum, p: BigNum, q: BigNum, dp: BigNum, dq: BigNum, qi: BigNum) -> Result<RSA, SslError> {
+ unsafe {
+ let rsa = try_ssl_null!(ffi::RSA_new());
+ (*rsa).n = n.into_raw();
+ (*rsa).e = e.into_raw();
+ (*rsa).d = d.into_raw();
+ (*rsa).p = p.into_raw();
+ (*rsa).q = q.into_raw();
+ (*rsa).dmp1 = dp.into_raw();
+ (*rsa).dmq1 = dq.into_raw();
+ (*rsa).iqmp = qi.into_raw();
+ Ok(RSA(rsa))
+ }
+ }
/// the caller should assert that the rsa pointer is valid.
pub unsafe fn from_raw(rsa: *mut ffi::RSA) -> RSA {
@@ -65,6 +80,43 @@ impl RSA {
Ok(RSA(rsa))
}
}
+
+ pub fn size(&self) -> Result<u32, SslError> {
+ if self.has_n() {
+ unsafe {
+ Ok(ffi::RSA_size(self.0) as u32)
+ }
+ } else {
+ Err(SslError::OpenSslErrors(vec![]))
+ }
+ }
+
+ pub fn sign(&self, hash_id: i32, message: &[u8]) -> Result<Vec<u8>, SslError> {
+ // RSA_sign(t: c_int, m: *const u8, mlen: c_uint, sig: *mut u8, siglen: *mut c_uint, k: *mut RSA) -> c_int
+
+ let k_len = try!(self.size());
+ let mut sig = vec![0;k_len as usize];
+ let mut sig_len = k_len;
+
+ unsafe {
+ let result = ffi::RSA_sign(hash_id, message.as_ptr(), message.len() as u32, sig.as_mut_ptr(), &mut sig_len, self.0);
+ assert!(sig_len == k_len);
+
+ if result == 1 {
+ Ok(sig)
+ } else {
+ Err(SslError::OpenSslErrors(vec![]))
+ }
+ }
+ }
+
+ pub fn verify(&self, hash_id: i32, message: &[u8], sig: &[u8]) -> Result<bool, SslError> {
+ unsafe {
+ let result = ffi::RSA_verify(hash_id, message.as_ptr(), message.len() as u32, sig.as_ptr(), sig.len() as u32, self.0);
+
+ Ok(result == 1)
+ }
+ }
pub fn as_ptr(&self) -> *mut ffi::RSA {
self.0