use std::{rc::Rc, sync::Arc};
pub trait Sign {
type Error: Send;
fn sign(&self, signing_string: &str) -> Result<String, Self::Error>;
}
pub trait PrivateKey {
type Signer: Sign + Send + 'static;
fn key_id(&self) -> String;
fn signer(&self) -> Self::Signer;
}
pub trait PrivateKeyBuilder: PrivateKey {
type Error: Send;
fn build(key_id: String, private_key_pem: &str) -> Result<Self, Self::Error>
where
Self: Sized;
fn private_key_pem(&self) -> Result<String, Self::Error>;
}
pub trait Verify {
type Error: Send;
fn verify(&self, signing_string: &str, signature: &str) -> Result<bool, Self::Error>;
}
pub trait VerifyFactory {
type Verify: Verify + VerifyBuilder;
}
pub trait VerifyBuilder: Verify {
fn build(public_key_pem: &str) -> Result<Self, Self::Error>
where
Self: Sized;
}
impl<'a, T> Verify for &'a T
where
T: Verify,
{
type Error = T::Error;
fn verify(&self, signing_string: &str, signature: &str) -> Result<bool, Self::Error> {
T::verify(self, signing_string, signature)
}
}
impl<'a, T> Verify for &'a mut T
where
T: Verify,
{
type Error = T::Error;
fn verify(&self, signing_string: &str, signature: &str) -> Result<bool, Self::Error> {
T::verify(self, signing_string, signature)
}
}
impl<T> Verify for Box<T>
where
T: Verify,
{
type Error = T::Error;
fn verify(&self, signing_string: &str, signature: &str) -> Result<bool, Self::Error> {
T::verify(self, signing_string, signature)
}
}
impl<T> Verify for Rc<T>
where
T: Verify,
{
type Error = T::Error;
fn verify(&self, signing_string: &str, signature: &str) -> Result<bool, Self::Error> {
T::verify(self, signing_string, signature)
}
}
impl<T> Verify for Arc<T>
where
T: Verify,
{
type Error = T::Error;
fn verify(&self, signing_string: &str, signature: &str) -> Result<bool, Self::Error> {
T::verify(self, signing_string, signature)
}
}
impl<'a, T> Sign for &'a T
where
T: Sign,
{
type Error = T::Error;
fn sign(&self, signing_string: &str) -> Result<String, Self::Error> {
T::sign(self, signing_string)
}
}
impl<'a, T> Sign for &'a mut T
where
T: Sign,
{
type Error = T::Error;
fn sign(&self, signing_string: &str) -> Result<String, Self::Error> {
T::sign(self, signing_string)
}
}
impl<T> Sign for Box<T>
where
T: Sign,
{
type Error = T::Error;
fn sign(&self, signing_string: &str) -> Result<String, Self::Error> {
T::sign(self, signing_string)
}
}
impl<T> Sign for Rc<T>
where
T: Sign,
{
type Error = T::Error;
fn sign(&self, signing_string: &str) -> Result<String, Self::Error> {
T::sign(self, signing_string)
}
}
impl<T> Sign for Arc<T>
where
T: Sign,
{
type Error = T::Error;
fn sign(&self, signing_string: &str) -> Result<String, Self::Error> {
T::sign(self, signing_string)
}
}
impl<'a, T> PrivateKey for &'a T
where
T: PrivateKey,
{
type Signer = T::Signer;
fn key_id(&self) -> String {
T::key_id(self)
}
fn signer(&self) -> Self::Signer {
T::signer(self)
}
}
impl<'a, T> PrivateKey for &'a mut T
where
T: PrivateKey,
{
type Signer = T::Signer;
fn key_id(&self) -> String {
T::key_id(self)
}
fn signer(&self) -> Self::Signer {
T::signer(self)
}
}
impl<T> PrivateKey for Box<T>
where
T: PrivateKey,
{
type Signer = T::Signer;
fn key_id(&self) -> String {
T::key_id(self)
}
fn signer(&self) -> Self::Signer {
T::signer(self)
}
}
impl<T> PrivateKey for Rc<T>
where
T: PrivateKey,
{
type Signer = T::Signer;
fn key_id(&self) -> String {
T::key_id(self)
}
fn signer(&self) -> Self::Signer {
T::signer(self)
}
}
impl<T> PrivateKey for Arc<T>
where
T: PrivateKey,
{
type Signer = T::Signer;
fn key_id(&self) -> String {
T::key_id(self)
}
fn signer(&self) -> Self::Signer {
T::signer(self)
}
}