diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/bn/mod.rs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/bn/mod.rs b/src/bn/mod.rs index bcf6c104..a4d23302 100644 --- a/src/bn/mod.rs +++ b/src/bn/mod.rs @@ -85,6 +85,24 @@ impl BigNum { }) } + pub fn from_dec_str(s: &str) -> Result<BigNum, SslError> { + 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, SslError> { + 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<BigNum, SslError> { BigNum::new().and_then(|v| unsafe { try_ssl_null!(ffi::BN_bin2bn(n.as_ptr(), n.len() as c_int, v.raw())); @@ -146,6 +164,12 @@ impl BigNum { } } + pub fn mod_word(&self, w: c_ulong) -> c_ulong { + unsafe { + ffi::BN_mod_word(self.raw(), w) + } + } + pub fn checked_gcd(&self, a: &BigNum) -> Result<BigNum, SslError> { unsafe { with_bn_in_ctx!(r, ctx, { ffi::BN_gcd(r.raw(), self.raw(), a.raw(), ctx) == 1 }) @@ -353,6 +377,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 { |