use std::{borrow::Cow, sync::Arc};
use crate::{
crypto::signer::{JwsSigner, JwsSignerSelector},
jwk::PublicJwk,
};
pub trait AsymmetricJwsSignerSelector: JwsSignerSelector {
fn select_asymmetric_signer(&self) -> Arc<dyn AsymmetricJwsSigner>;
fn select_signer_by_thumbprint(&self, thumbprint: &str)
-> Option<Arc<dyn AsymmetricJwsSigner>>;
}
pub trait AsymmetricJwsSigner: JwsSigner {
fn public_key_jwk(&self) -> Cow<'_, PublicJwk>;
}
impl<T: AsymmetricJwsSignerSelector + ?Sized> AsymmetricJwsSignerSelector for &T {
fn select_asymmetric_signer(&self) -> Arc<dyn AsymmetricJwsSigner> {
(**self).select_asymmetric_signer()
}
fn select_signer_by_thumbprint(
&self,
thumbprint: &str,
) -> Option<Arc<dyn AsymmetricJwsSigner>> {
(**self).select_signer_by_thumbprint(thumbprint)
}
}
impl<T: AsymmetricJwsSignerSelector + ?Sized> AsymmetricJwsSignerSelector for Box<T> {
fn select_asymmetric_signer(&self) -> Arc<dyn AsymmetricJwsSigner> {
(**self).select_asymmetric_signer()
}
fn select_signer_by_thumbprint(
&self,
thumbprint: &str,
) -> Option<Arc<dyn AsymmetricJwsSigner>> {
(**self).select_signer_by_thumbprint(thumbprint)
}
}
impl<T: AsymmetricJwsSignerSelector + ?Sized> AsymmetricJwsSignerSelector for Arc<T> {
fn select_asymmetric_signer(&self) -> Arc<dyn AsymmetricJwsSigner> {
(**self).select_asymmetric_signer()
}
fn select_signer_by_thumbprint(
&self,
thumbprint: &str,
) -> Option<Arc<dyn AsymmetricJwsSigner>> {
(**self).select_signer_by_thumbprint(thumbprint)
}
}
impl<T: AsymmetricJwsSigner + ?Sized> AsymmetricJwsSigner for &T {
fn public_key_jwk(&self) -> Cow<'_, PublicJwk> {
(**self).public_key_jwk()
}
}
impl<T: AsymmetricJwsSigner + ?Sized> AsymmetricJwsSigner for Box<T> {
fn public_key_jwk(&self) -> Cow<'_, PublicJwk> {
(**self).public_key_jwk()
}
}
impl<T: AsymmetricJwsSigner + ?Sized> AsymmetricJwsSigner for Arc<T> {
fn public_key_jwk(&self) -> Cow<'_, PublicJwk> {
(**self).public_key_jwk()
}
}