| /* Copyright (c) 2023, Google Inc. |
| * |
| * Permission to use, copy, modify, and/or distribute this software for any |
| * purpose with or without fee is hereby granted, provided that the above |
| * copyright notice and this permission notice appear in all copies. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
| * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION |
| * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN |
| * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| */ |
| |
| use crate::{CSlice, ForeignType}; |
| |
| pub(crate) struct BigNum { |
| ptr: *mut bssl_sys::BIGNUM, |
| } |
| |
| // Safety: Implementation ensures `from_ptr(x).as_ptr() == x` |
| unsafe impl ForeignType for BigNum { |
| type CType = bssl_sys::BIGNUM; |
| |
| unsafe fn from_ptr(ptr: *mut Self::CType) -> Self { |
| Self { ptr } |
| } |
| |
| fn as_ptr(&self) -> *mut Self::CType { |
| self.ptr |
| } |
| } |
| |
| impl BigNum { |
| pub(crate) fn new() -> Self { |
| // Safety: There are no preconditions for BN_new() |
| unsafe { Self::from_ptr(bssl_sys::BN_new()) } |
| } |
| } |
| |
| impl From<&[u8]> for BigNum { |
| fn from(value: &[u8]) -> Self { |
| let value_ffi = CSlice(value); |
| // Safety: |
| // - `value` is a CSlice from safe Rust. |
| // - The `ret` argument can be null to request allocating a new result. |
| let ptr = unsafe { |
| bssl_sys::BN_bin2bn(value_ffi.as_ptr(), value_ffi.len(), core::ptr::null_mut()) |
| }; |
| assert!(!ptr.is_null()); |
| Self { ptr } |
| } |
| } |
| |
| impl Drop for BigNum { |
| fn drop(&mut self) { |
| // Safety: `self.ptr` is owned by `self`. |
| unsafe { bssl_sys::BN_free(self.ptr) } |
| } |
| } |