use sha2::{Digest, Sha512};
use super::{
Context, ContextError, PrivateKey, PublicKey, Signature, Signer, SigningError,
VerificationError, Verifier,
};
const ALGORITHM_NAME: &str = "sha512";
pub struct HashContext;
impl Context for HashContext {
fn algorithm_name(&self) -> &str {
ALGORITHM_NAME
}
fn new_signer(&self, _key: PrivateKey) -> Box<dyn Signer> {
Box::new(HashSigner)
}
fn new_verifier(&self) -> Box<dyn Verifier> {
Box::new(HashVerifier)
}
fn new_random_private_key(&self) -> PrivateKey {
PrivateKey::new(vec![])
}
fn get_public_key(&self, _private_key: &PrivateKey) -> Result<PublicKey, ContextError> {
Ok(PublicKey::new(vec![]))
}
}
#[derive(Clone)]
pub struct HashSigner;
impl Signer for HashSigner {
fn algorithm_name(&self) -> &str {
ALGORITHM_NAME
}
fn sign(&self, message: &[u8]) -> Result<Signature, SigningError> {
Ok(Signature::new(Sha512::digest(message).to_vec()))
}
fn public_key(&self) -> Result<PublicKey, SigningError> {
Ok(PublicKey::new(b"hash_signer".to_vec()))
}
fn clone_box(&self) -> Box<dyn Signer> {
Box::new(self.clone())
}
}
pub struct HashVerifier;
impl Verifier for HashVerifier {
fn algorithm_name(&self) -> &str {
ALGORITHM_NAME
}
fn verify(
&self,
message: &[u8],
signature: &Signature,
_public_key: &PublicKey,
) -> Result<bool, VerificationError> {
Ok(signature.as_slice() == Sha512::digest(message).as_slice())
}
}