From ff0480549745403290f5cfdba5da3221982d42cf Mon Sep 17 00:00:00 2001 From: Chris Cole Date: Sat, 29 Nov 2014 19:40:48 -0500 Subject: Added mod_mul. --- src/bn/mod.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/bn/mod.rs b/src/bn/mod.rs index cc64d8cd..fddd5703 100644 --- a/src/bn/mod.rs +++ b/src/bn/mod.rs @@ -45,6 +45,7 @@ extern { fn BN_exp(r: *mut BIGNUM, a: *mut BIGNUM, p: *mut BIGNUM, ctx: *mut BN_CTX) -> c_int; fn BN_mod_exp(r: *mut BIGNUM, a: *mut BIGNUM, p: *mut BIGNUM, m: *mut BIGNUM, ctx: *mut BN_CTX) -> c_int; fn BN_mod_inverse(r: *mut BIGNUM, a: *mut BIGNUM, n: *mut BIGNUM, ctx: *mut BN_CTX) -> *const BIGNUM; + fn BN_mod_word(r: *mut BIGNUM, w: c_ulong) -> c_ulong; fn BN_gcd(r: *mut BIGNUM, a: *mut BIGNUM, b: *mut BIGNUM, ctx: *mut BN_CTX) -> c_int; /* Bit operations on BIGNUMs */ @@ -232,6 +233,12 @@ impl BigNum { } } + pub fn mod_word(&self, w: c_ulong) -> c_ulong { + unsafe { + return BN_mod_word(self.raw(), w); + } + } + pub fn checked_gcd(&self, a: &BigNum) -> Result { unsafe { with_bn_in_ctx!(r, ctx, { BN_gcd(r.raw(), self.raw(), a.raw(), ctx) == 1 }) -- cgit v1.2.3 From 33f3c966ac0448a6f906f23d7cf51969c088bfa1 Mon Sep 17 00:00:00 2001 From: Chris Cole Date: Wed, 10 Dec 2014 22:08:32 -0500 Subject: Added mod_word. --- openssl-sys/src/lib.rs | 1 + src/bn/mod.rs | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/openssl-sys/src/lib.rs b/openssl-sys/src/lib.rs index 2b0c9292..931920a9 100644 --- a/openssl-sys/src/lib.rs +++ b/openssl-sys/src/lib.rs @@ -255,6 +255,7 @@ extern "C" { pub fn BN_mod_sub(r: *mut BIGNUM, a: *mut BIGNUM, b: *mut BIGNUM, m: *mut BIGNUM, ctx: *mut BN_CTX) -> c_int; pub fn BN_mul(r: *mut BIGNUM, a: *mut BIGNUM, b: *mut BIGNUM, ctx: *mut BN_CTX) -> c_int; pub fn BN_nnmod(rem: *mut BIGNUM, a: *mut BIGNUM, m: *mut BIGNUM, ctx: *mut BN_CTX) -> c_int; + pub fn BN_mod_word(r: *mut BIGNUM, w: c_ulong) -> c_ulong; pub fn BN_sqr(r: *mut BIGNUM, a: *mut BIGNUM, ctx: *mut BN_CTX) -> c_int; pub fn BN_sub(r: *mut BIGNUM, a: *mut BIGNUM, b: *mut BIGNUM) -> c_int; diff --git a/src/bn/mod.rs b/src/bn/mod.rs index 3944fdcd..95805085 100644 --- a/src/bn/mod.rs +++ b/src/bn/mod.rs @@ -145,13 +145,11 @@ impl BigNum { } } -/*XXX pub fn mod_word(&self, w: c_ulong) -> c_ulong { unsafe { BN_mod_word(self.raw(), w) } } -*/ pub fn checked_gcd(&self, a: &BigNum) -> Result { unsafe { -- cgit v1.2.3 From f0de77388863eadf1a332a1bf02383a9003b0d04 Mon Sep 17 00:00:00 2001 From: Chris Cole Date: Wed, 10 Dec 2014 22:11:29 -0500 Subject: Use "ffi" namespace. --- src/bn/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bn/mod.rs b/src/bn/mod.rs index 95805085..7e8697b7 100644 --- a/src/bn/mod.rs +++ b/src/bn/mod.rs @@ -147,7 +147,7 @@ impl BigNum { pub fn mod_word(&self, w: c_ulong) -> c_ulong { unsafe { - BN_mod_word(self.raw(), w) + ffi::BN_mod_word(self.raw(), w) } } -- cgit v1.2.3 From 7a4fbc1567d2a1fd886a00adcf0bb01e796bf5aa Mon Sep 17 00:00:00 2001 From: Chris Cole Date: Thu, 11 Dec 2014 11:03:49 -0500 Subject: Added BigNum::one(). --- src/bn/mod.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/bn/mod.rs b/src/bn/mod.rs index 7e8697b7..7f33e9ed 100644 --- a/src/bn/mod.rs +++ b/src/bn/mod.rs @@ -84,6 +84,10 @@ impl BigNum { }) } + pub fn one() -> BigNum { + BigNum::new_from(1).unwrap() + } + pub fn new_from_slice(n: &[u8]) -> Result { BigNum::new().and_then(|v| unsafe { try_ssl_null!(ffi::BN_bin2bn(n.as_ptr(), n.len() as c_int, v.raw())); -- cgit v1.2.3 From 38682821ade69780e5c125fa00f1f71a3b161ffd Mon Sep 17 00:00:00 2001 From: Chris Cole Date: Sun, 14 Dec 2014 10:02:18 -0500 Subject: Added BigNum::{from_dec_str,from_hex_str}, BN_dec2bn, and BN_hex2bn. --- openssl-sys/src/lib.rs | 12 +++++++++++- src/bn/mod.rs | 29 +++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/openssl-sys/src/lib.rs b/openssl-sys/src/lib.rs index 03a5a567..68d2d6dc 100644 --- a/openssl-sys/src/lib.rs +++ b/openssl-sys/src/lib.rs @@ -81,6 +81,11 @@ pub struct BIGNUM { pub flags: c_int, } +#[repr(C)] +pub struct BIGNUM_PTR { + pub ptr: *mut BIGNUM, +} + pub type CRYPTO_EX_new = extern "C" fn(parent: *mut c_void, ptr: *mut c_void, ad: *const CRYPTO_EX_DATA, idx: c_int, argl: c_long, argp: *const c_void) -> c_int; @@ -291,9 +296,14 @@ extern "C" { pub fn BN_bin2bn(s: *const u8, size: c_int, ret: *mut BIGNUM) -> *mut BIGNUM; pub fn BN_bn2bin(a: *mut BIGNUM, to: *mut u8) -> c_int; - /* Conversion from/to string representation */ + /* Conversion from/to decimal string representation */ + pub fn BN_dec2bn(a: *mut BIGNUM_PTR, s: *const i8) -> c_int; pub fn BN_bn2dec(a: *mut BIGNUM) -> *const c_char; + /* Conversion from/to hexidecimal string representation */ + pub fn BN_hex2bn(a: *mut BIGNUM_PTR, s: *const i8) -> c_int; + pub fn BN_bn2hex(a: *mut BIGNUM) -> *const c_char; + pub fn CRYPTO_num_locks() -> c_int; pub fn CRYPTO_set_locking_callback(func: extern "C" fn(mode: c_int, n: c_int, diff --git a/src/bn/mod.rs b/src/bn/mod.rs index 7f33e9ed..7605fee0 100644 --- a/src/bn/mod.rs +++ b/src/bn/mod.rs @@ -84,8 +84,22 @@ impl BigNum { }) } - pub fn one() -> BigNum { - BigNum::new_from(1).unwrap() + pub fn from_dec_str(s: &str) -> Result { + BigNum::new().and_then(|v| unsafe { + let ref mut bn_ptr = ffi::BIGNUM_PTR { ptr: v.raw(), }; + let c_str = s.to_c_str(); + try_ssl!(ffi::BN_dec2bn(bn_ptr, c_str.as_ptr())); + Ok(v) + }) + } + + pub fn from_hex_str(s: &str) -> Result { + BigNum::new().and_then(|v| unsafe { + let ref mut bn_ptr = ffi::BIGNUM_PTR { ptr: v.raw(), }; + let c_str = s.to_c_str(); + try_ssl!(ffi::BN_hex2bn(bn_ptr, c_str.as_ptr())); + Ok(v) + }) } pub fn new_from_slice(n: &[u8]) -> Result { @@ -362,6 +376,17 @@ impl BigNum { str } } + + pub fn to_hex_str(&self) -> String { + unsafe { + let buf = ffi::BN_bn2hex(self.raw()); + assert!(!buf.is_null()); + let c_str = CString::new(buf, false); + let str = c_str.as_str().unwrap().to_string(); + ffi::CRYPTO_free(buf as *mut c_void); + str + } + } } impl fmt::Show for BigNum { -- cgit v1.2.3 From fa32bc950b8756b77bc1ba44d6f65276f55f4442 Mon Sep 17 00:00:00 2001 From: Chris Cole Date: Tue, 23 Dec 2014 15:50:29 -0500 Subject: Added Copy impl. --- openssl-sys/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openssl-sys/src/lib.rs b/openssl-sys/src/lib.rs index 48fac1d2..dfcbf769 100644 --- a/openssl-sys/src/lib.rs +++ b/openssl-sys/src/lib.rs @@ -93,6 +93,8 @@ pub struct BIGNUM_PTR { pub ptr: *mut BIGNUM, } +impl Copy for BIGNUM_PTR {} + pub type CRYPTO_EX_new = extern "C" fn(parent: *mut c_void, ptr: *mut c_void, ad: *const CRYPTO_EX_DATA, idx: c_int, argl: c_long, argp: *const c_void) -> c_int; -- cgit v1.2.3 From 2e2fde4b1a868050245b185b26a12187c379ec0d Mon Sep 17 00:00:00 2001 From: Chris Cole Date: Fri, 2 Jan 2015 18:47:29 -0500 Subject: Added BN_add_word, BN_sub_word, BN_mul_word, BN_div_word. Removed BIGNUM_PTR struct. --- openssl-sys/src/lib.rs | 17 ++++++-------- src/bn/mod.rs | 61 +++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/openssl-sys/src/lib.rs b/openssl-sys/src/lib.rs index df38215d..7471616f 100644 --- a/openssl-sys/src/lib.rs +++ b/openssl-sys/src/lib.rs @@ -88,13 +88,6 @@ pub struct BIGNUM { impl Copy for BIGNUM {} -#[repr(C)] -pub struct BIGNUM_PTR { - pub ptr: *mut BIGNUM, -} - -impl Copy for BIGNUM_PTR {} - pub type CRYPTO_EX_new = extern "C" fn(parent: *mut c_void, ptr: *mut c_void, ad: *const CRYPTO_EX_DATA, idx: c_int, argl: c_long, argp: *const c_void) -> c_int; @@ -275,7 +268,11 @@ extern "C" { pub fn BN_mod_sub(r: *mut BIGNUM, a: *mut BIGNUM, b: *mut BIGNUM, m: *mut BIGNUM, ctx: *mut BN_CTX) -> c_int; pub fn BN_mul(r: *mut BIGNUM, a: *mut BIGNUM, b: *mut BIGNUM, ctx: *mut BN_CTX) -> c_int; pub fn BN_nnmod(rem: *mut BIGNUM, a: *mut BIGNUM, m: *mut BIGNUM, ctx: *mut BN_CTX) -> c_int; - pub fn BN_mod_word(r: *mut BIGNUM, w: c_ulong) -> c_ulong; + pub fn BN_add_word(r: *mut BIGNUM, w: c_ulong) -> c_int; + pub fn BN_sub_word(r: *mut BIGNUM, w: c_ulong) -> c_int; + pub fn BN_mul_word(r: *mut BIGNUM, w: c_ulong) -> c_int; + pub fn BN_div_word(r: *mut BIGNUM, w: c_ulong) -> c_ulong; + pub fn BN_mod_word(r: *const BIGNUM, w: c_ulong) -> c_ulong; pub fn BN_sqr(r: *mut BIGNUM, a: *mut BIGNUM, ctx: *mut BN_CTX) -> c_int; pub fn BN_sub(r: *mut BIGNUM, a: *mut BIGNUM, b: *mut BIGNUM) -> c_int; @@ -309,11 +306,11 @@ extern "C" { pub fn BN_bn2bin(a: *mut BIGNUM, to: *mut u8) -> c_int; /* Conversion from/to decimal string representation */ - pub fn BN_dec2bn(a: *mut BIGNUM_PTR, s: *const i8) -> c_int; + pub fn BN_dec2bn(a: *const *mut BIGNUM, s: *const i8) -> c_int; pub fn BN_bn2dec(a: *mut BIGNUM) -> *const c_char; /* Conversion from/to hexidecimal string representation */ - pub fn BN_hex2bn(a: *mut BIGNUM_PTR, s: *const i8) -> c_int; + pub fn BN_hex2bn(a: *const *mut BIGNUM, s: *const i8) -> c_int; pub fn BN_bn2hex(a: *mut BIGNUM) -> *const c_char; pub fn CRYPTO_num_locks() -> c_int; diff --git a/src/bn/mod.rs b/src/bn/mod.rs index a4d23302..137adc43 100644 --- a/src/bn/mod.rs +++ b/src/bn/mod.rs @@ -87,18 +87,16 @@ impl BigNum { pub fn from_dec_str(s: &str) -> Result { BigNum::new().and_then(|v| unsafe { - let ref mut bn_ptr = ffi::BIGNUM_PTR { ptr: v.raw(), }; let c_str = s.to_c_str(); - try_ssl!(ffi::BN_dec2bn(bn_ptr, c_str.as_ptr())); + try_ssl!(ffi::BN_dec2bn(v.raw_ptr(), c_str.as_ptr())); Ok(v) }) } pub fn from_hex_str(s: &str) -> Result { BigNum::new().and_then(|v| unsafe { - let ref mut bn_ptr = ffi::BIGNUM_PTR { ptr: v.raw(), }; let c_str = s.to_c_str(); - try_ssl!(ffi::BN_hex2bn(bn_ptr, c_str.as_ptr())); + try_ssl!(ffi::BN_hex2bn(v.raw_ptr(), c_str.as_ptr())); Ok(v) }) } @@ -164,9 +162,55 @@ impl BigNum { } } - pub fn mod_word(&self, w: c_ulong) -> c_ulong { + pub fn add_word(&mut self, w: c_ulong) -> Result<(), SslError> { unsafe { - ffi::BN_mod_word(self.raw(), w) + if ffi::BN_add_word(self.raw(), w) == 1 { + Ok(()) + } else { + Err(SslError::get()) + } + } + } + + pub fn sub_word(&mut self, w: c_ulong) -> Result<(), SslError> { + unsafe { + if ffi::BN_sub_word(self.raw(), w) == 1 { + Ok(()) + } else { + Err(SslError::get()) + } + } + } + + pub fn mul_word(&mut self, w: c_ulong) -> Result<(), SslError> { + unsafe { + if ffi::BN_mul_word(self.raw(), w) == 1 { + Ok(()) + } else { + Err(SslError::get()) + } + } + } + + pub fn div_word(&mut self, w: c_ulong) -> Result { + unsafe { + let result = ffi::BN_div_word(self.raw(), w); + if result != -1 as c_ulong { + Ok(result) + } else { + Err(SslError::get()) + } + } + } + + pub fn mod_word(&self, w: c_ulong) -> Result { + unsafe { + let result = ffi::BN_mod_word(self.raw(), w); + if result != -1 as c_ulong { + Ok(result) + } else { + Err(SslError::get()) + } } } @@ -357,6 +401,11 @@ impl BigNum { n } + unsafe fn raw_ptr(&self) -> *const *mut ffi::BIGNUM { + let BigNum(ref n) = *self; + n + } + pub fn to_vec(&self) -> Vec { let size = self.num_bytes() as uint; let mut v = Vec::with_capacity(size); -- cgit v1.2.3 From b2929a662a9e4ef53c7ab5ca81e48a2d67a9b9ef Mon Sep 17 00:00:00 2001 From: Chris Cole Date: Sat, 3 Jan 2015 20:05:38 -0500 Subject: Added use of ToCStr trait. --- src/bn/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bn/mod.rs b/src/bn/mod.rs index da14d367..4861738e 100644 --- a/src/bn/mod.rs +++ b/src/bn/mod.rs @@ -1,5 +1,5 @@ use libc::{c_int, c_ulong, c_void}; -use std::c_str::CString; +use std::c_str::{CString, ToCStr}; use std::cmp::Ordering; use std::{fmt, ptr}; -- cgit v1.2.3