use cryptoki::{mechanism::Mechanism, object::ObjectHandle};
use oxicrypto_core::{CryptoError, Signer, Verifier};
use crate::provider::{Pkcs11Provider, PkcsError};
#[derive(Debug)]
pub struct Pkcs11Signer<'a> {
provider: &'a Pkcs11Provider,
}
impl<'a> Pkcs11Signer<'a> {
pub fn new(provider: &'a Pkcs11Provider) -> Self {
Self { provider }
}
pub fn sign_with_handle(
&self,
mechanism: Mechanism<'_>,
key: ObjectHandle,
msg: &[u8],
) -> Result<Vec<u8>, PkcsError> {
self.provider
.with_session(|session| session.sign(&mechanism, key, msg))
}
}
impl Signer for Pkcs11Signer<'_> {
fn name(&self) -> &'static str {
"PKCS#11 (cryptoki)"
}
fn signature_len(&self) -> usize {
512
}
fn sign(&self, _sk: &[u8], _msg: &[u8], _sig_out: &mut [u8]) -> Result<usize, CryptoError> {
Err(CryptoError::BadInput)
}
}
#[derive(Debug)]
pub struct Pkcs11Verifier<'a> {
provider: &'a Pkcs11Provider,
}
impl<'a> Pkcs11Verifier<'a> {
pub fn new(provider: &'a Pkcs11Provider) -> Self {
Self { provider }
}
pub fn verify_with_handle(
&self,
mechanism: Mechanism<'_>,
key: ObjectHandle,
msg: &[u8],
sig: &[u8],
) -> Result<(), PkcsError> {
self.provider
.with_session(|session| session.verify(&mechanism, key, msg, sig))
}
}
impl Verifier for Pkcs11Verifier<'_> {
fn name(&self) -> &'static str {
"PKCS#11 (cryptoki)"
}
fn verify(&self, _pk: &[u8], _msg: &[u8], _sig: &[u8]) -> Result<(), CryptoError> {
Err(CryptoError::BadInput)
}
}