use crate::internal_alloc::Vec;
use noxtls_core::Result;
use noxtls_psa::{
KeyDecryptRequest as PsaKeyDecryptRequest, KeyDeriveRequest as PsaKeyDeriveRequest,
KeySignRequest as PsaKeySignRequest, PsaCryptoBackend, PsaDecryptAlgorithm, PsaDeriveAlgorithm,
PsaExternalKeyHandle, PsaProvider, PsaSignAlgorithm,
};
use super::{
ExternalKeyHandle, ExternalKeyProvider, KeyDecryptAlgorithm, KeyDecryptRequest,
KeyDeriveAlgorithm, KeyDeriveRequest, KeySignAlgorithm, KeySignRequest,
};
#[derive(Clone, Debug)]
pub struct PsaExternalKeyProvider<B: PsaCryptoBackend> {
provider: PsaProvider<B>,
}
impl<B: PsaCryptoBackend> PsaExternalKeyProvider<B> {
pub fn new(backend: B) -> Self {
Self {
provider: PsaProvider::new(backend),
}
}
fn convert_handle(handle: &ExternalKeyHandle) -> PsaExternalKeyHandle {
PsaExternalKeyHandle::new(handle.as_bytes().to_vec())
}
}
impl<B: PsaCryptoBackend> ExternalKeyProvider for PsaExternalKeyProvider<B> {
fn sign(&self, request: &KeySignRequest<'_>) -> Result<Vec<u8>> {
let algorithm = match request.algorithm {
KeySignAlgorithm::RsaPkcs1Sha256 => PsaSignAlgorithm::RsaPkcs1Sha256,
KeySignAlgorithm::RsaPssSha256 => PsaSignAlgorithm::RsaPssSha256,
};
let handle = Self::convert_handle(request.handle);
let mapped = PsaKeySignRequest {
handle: &handle,
algorithm,
message: request.message,
salt: request.salt,
};
self.provider.sign(&mapped)
}
fn decrypt(&self, request: &KeyDecryptRequest<'_>) -> Result<Vec<u8>> {
let algorithm = match request.algorithm {
KeyDecryptAlgorithm::RsaPkcs1v15 => PsaDecryptAlgorithm::RsaPkcs1v15,
KeyDecryptAlgorithm::RsaOaepSha256 => PsaDecryptAlgorithm::RsaOaepSha256,
};
let handle = Self::convert_handle(request.handle);
let mapped = PsaKeyDecryptRequest {
handle: &handle,
algorithm,
ciphertext: request.ciphertext,
label: request.label,
};
self.provider.decrypt(&mapped)
}
fn derive_shared_secret(&self, request: &KeyDeriveRequest<'_>) -> Result<Vec<u8>> {
let algorithm = match request.algorithm {
KeyDeriveAlgorithm::X25519 => PsaDeriveAlgorithm::X25519,
};
let handle = Self::convert_handle(request.handle);
let mapped = PsaKeyDeriveRequest {
handle: &handle,
algorithm,
peer_public_key: request.peer_public_key,
};
self.provider.derive(&mapped)
}
}