use async_trait::async_trait;
use c2pa_raw_crypto::{RawSigner, RawSignerError, SigningAlg};
use crate::{
crypto::time_stamp::{AsyncTimeStampProvider, TimeStampProvider},
maybe_send_sync::{MaybeSend, MaybeSync},
};
pub(crate) trait CoseSigner: TimeStampProvider {
fn sign(&self, data: &[u8]) -> Result<Vec<u8>, RawSignerError>;
fn alg(&self) -> SigningAlg;
fn cert_chain(&self) -> Result<Vec<Vec<u8>>, RawSignerError>;
fn ocsp_response(&self) -> Option<Vec<u8>> {
None
}
}
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
pub(crate) trait AsyncCoseSigner: AsyncTimeStampProvider + MaybeSync + MaybeSend {
async fn sign(&self, data: Vec<u8>) -> Result<Vec<u8>, RawSignerError>;
fn alg(&self) -> SigningAlg;
fn cert_chain(&self) -> Result<Vec<Vec<u8>>, RawSignerError>;
async fn ocsp_response(&self) -> Option<Vec<u8>> {
None
}
}
pub(crate) struct RawSignerCoseSigner<'a> {
signer: &'a dyn RawSigner,
cert_chain: &'a [Vec<u8>],
}
impl<'a> RawSignerCoseSigner<'a> {
pub(crate) fn new(signer: &'a dyn RawSigner, cert_chain: &'a [Vec<u8>]) -> Self {
Self { signer, cert_chain }
}
}
impl CoseSigner for RawSignerCoseSigner<'_> {
fn sign(&self, data: &[u8]) -> Result<Vec<u8>, RawSignerError> {
self.signer.sign(data)
}
fn alg(&self) -> SigningAlg {
self.signer.alg()
}
fn cert_chain(&self) -> Result<Vec<Vec<u8>>, RawSignerError> {
Ok(self.cert_chain.to_vec())
}
}
impl TimeStampProvider for RawSignerCoseSigner<'_> {}