use crate::types::Ulong;
use cryptoki_sys::*;
use std::convert::TryInto;
use std::marker::PhantomData;
use std::slice;
#[derive(Debug, Clone, Copy)]
#[repr(transparent)]
pub struct GcmParams<'a> {
inner: CK_GCM_PARAMS,
_marker: PhantomData<&'a [u8]>,
}
impl<'a> GcmParams<'a> {
pub fn new(iv: &'a [u8], aad: &'a [u8], tag_bits: Ulong) -> Self {
GcmParams {
inner: CK_GCM_PARAMS {
pIv: iv.as_ptr() as *mut _,
ulIvLen: iv
.len()
.try_into()
.expect("iv length does not fit in CK_ULONG"),
ulIvBits: 0,
pAAD: aad.as_ptr() as *mut _,
ulAADLen: aad
.len()
.try_into()
.expect("aad length does not fit in CK_ULONG"),
ulTagBits: tag_bits.into(),
},
_marker: PhantomData,
}
}
pub fn iv(&self) -> &'a [u8] {
unsafe { slice::from_raw_parts(self.inner.pIv, self.inner.ulIvLen as _) }
}
pub fn aad(&self) -> &'a [u8] {
unsafe { slice::from_raw_parts(self.inner.pAAD, self.inner.ulAADLen as _) }
}
pub fn tag_bits(&self) -> Ulong {
self.inner.ulTagBits.into()
}
}