use cryptoki::{mechanism::Mechanism, object::ObjectHandle};
use oxicrypto_core::CryptoError;
use crate::provider::{Pkcs11Provider, PkcsError};
#[derive(Debug)]
pub struct Pkcs11SymOp<'a> {
provider: &'a Pkcs11Provider,
}
impl<'a> Pkcs11SymOp<'a> {
pub fn new(provider: &'a Pkcs11Provider) -> Self {
Self { provider }
}
pub fn encrypt(
&self,
mechanism: Mechanism<'_>,
key: ObjectHandle,
plaintext: &[u8],
) -> Result<Vec<u8>, PkcsError> {
self.provider
.with_session(|session| session.encrypt(&mechanism, key, plaintext))
}
pub fn decrypt(
&self,
mechanism: Mechanism<'_>,
key: ObjectHandle,
ciphertext: &[u8],
) -> Result<Vec<u8>, PkcsError> {
self.provider
.with_session(|session| session.decrypt(&mechanism, key, ciphertext))
}
pub fn map_err(e: PkcsError) -> CryptoError {
CryptoError::from(e)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn pkcs11_sym_op_error_mapping() {
let e = PkcsError::Operation("encrypt failed".to_string());
let ce = Pkcs11SymOp::map_err(e);
assert!(matches!(ce, CryptoError::Internal(_)));
}
}