use crate::types::Ulong;
use cryptoki_sys::*;
use std::convert::TryInto;
use std::marker::PhantomData;
use std::ptr;
#[derive(Copy, Debug, Clone)]
#[repr(C)]
pub struct Ecdh1DeriveParams<'a> {
kdf: CK_EC_KDF_TYPE,
shared_data_len: Ulong,
shared_data: *const u8,
public_data_len: Ulong,
public_data: *const u8,
_marker: PhantomData<&'a [u8]>,
}
impl<'a> Ecdh1DeriveParams<'a> {
pub fn new(kdf: EcKdf<'a>, public_data: &'a [u8]) -> Self {
Self {
kdf: kdf.kdf_type,
shared_data_len: kdf
.shared_data
.map_or(0, <[u8]>::len)
.try_into()
.expect("usize can not fit in CK_ULONG"),
shared_data: kdf.shared_data.map_or(ptr::null(), <[u8]>::as_ptr),
public_data_len: public_data
.len()
.try_into()
.expect("usize can not fit in CK_ULONG"),
public_data: public_data.as_ptr(),
_marker: PhantomData,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct EcKdf<'a> {
kdf_type: CK_EC_KDF_TYPE,
shared_data: Option<&'a [u8]>,
}
impl<'a> EcKdf<'a> {
pub fn null() -> Self {
Self {
kdf_type: CKD_NULL,
shared_data: None,
}
}
}