blob: 2a19c7b62fa60d71790751dde6887c72e20e66f9 [file] [log] [blame]
// Copyright 2024 The BoringSSL Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Helpers to ensure that some temporary objects are always freed.
use crate::initialized_struct;
/// A scoped `EC_KEY`.
pub struct EvpPkey(*mut bssl_sys::EVP_PKEY);
impl EvpPkey {
pub fn new() -> Self {
let ptr = unsafe { bssl_sys::EVP_PKEY_new() };
// `ptr` is only NULL if we're out of memory, which this crate
// doesn't handle.
assert!(!ptr.is_null());
EvpPkey(ptr)
}
pub fn from_ptr(ptr: *mut bssl_sys::EVP_PKEY) -> Self {
EvpPkey(ptr)
}
pub fn as_ffi_ptr(&mut self) -> *mut bssl_sys::EVP_PKEY {
self.0
}
}
impl Drop for EvpPkey {
fn drop(&mut self) {
unsafe { bssl_sys::EVP_PKEY_free(self.0) }
}
}
/// A scoped `EC_KEY`.
pub struct EcKey(*mut bssl_sys::EC_KEY);
impl EcKey {
pub fn new() -> Self {
let ptr = unsafe { bssl_sys::EC_KEY_new() };
// `ptr` is only NULL if we're out of memory, which this crate
// doesn't handle.
assert!(!ptr.is_null());
EcKey(ptr)
}
pub fn as_ffi_ptr(&mut self) -> *mut bssl_sys::EC_KEY {
self.0
}
}
impl Drop for EcKey {
fn drop(&mut self) {
unsafe { bssl_sys::EC_KEY_free(self.0) }
}
}
/// A scoped `EVP_HPKE_CTX`.
pub struct EvpHpkeCtx(*mut bssl_sys::EVP_HPKE_CTX);
// bssl_sys::EVP_HPKE_CTX is heap-allocated and safe to transfer
// between threads.
unsafe impl Send for EvpHpkeCtx {}
impl EvpHpkeCtx {
pub fn new() -> Self {
let ptr = unsafe { bssl_sys::EVP_HPKE_CTX_new() };
// `ptr` is only NULL if we're out of memory, which this crate
// doesn't handle.
assert!(!ptr.is_null());
EvpHpkeCtx(ptr)
}
pub fn as_ffi_ptr(&self) -> *const bssl_sys::EVP_HPKE_CTX {
self.0
}
pub fn as_mut_ffi_ptr(&mut self) -> *mut bssl_sys::EVP_HPKE_CTX {
self.0
}
}
impl Drop for EvpHpkeCtx {
fn drop(&mut self) {
unsafe { bssl_sys::EVP_HPKE_CTX_free(self.0) }
}
}
/// A scoped `EVP_HPKE_KEY`.
pub struct EvpHpkeKey(bssl_sys::EVP_HPKE_KEY);
impl EvpHpkeKey {
pub fn new() -> Self {
EvpHpkeKey(unsafe { initialized_struct(|ptr| bssl_sys::EVP_HPKE_KEY_zero(ptr)) })
}
pub fn as_ffi_ptr(&self) -> *const bssl_sys::EVP_HPKE_KEY {
&self.0
}
pub fn as_mut_ffi_ptr(&mut self) -> *mut bssl_sys::EVP_HPKE_KEY {
&mut self.0
}
}
impl Drop for EvpHpkeKey {
fn drop(&mut self) {
// unsafe: the only way to create a `EvpHpkeKey` is via `new` and that
// ensures that this structure is initialized.
unsafe { bssl_sys::EVP_HPKE_KEY_cleanup(&mut self.0) }
}
}
/// A scoped `BIGNUM`.
pub struct Bignum(bssl_sys::BIGNUM);
impl Bignum {
pub fn from_u64(value: u64) -> Self {
let mut ret = Bignum(unsafe { initialized_struct(|ptr| bssl_sys::BN_init(ptr)) });
assert_eq!(1, unsafe { bssl_sys::BN_set_u64(&mut ret.0, value) });
ret
}
pub fn as_ffi_ptr(&self) -> *const bssl_sys::BIGNUM {
&self.0
}
}
impl Drop for Bignum {
fn drop(&mut self) {
unsafe { bssl_sys::BN_free(&mut self.0) }
}
}