use alloc::vec::Vec;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use super::{Algorithm, crypto::decode_public_key};
use crate::error::ProtoResult;
pub trait PublicKey {
fn public_bytes(&self) -> &[u8];
fn verify(&self, message: &[u8], signature: &[u8]) -> ProtoResult<()>;
fn algorithm(&self) -> Algorithm;
}
#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub struct PublicKeyBuf {
key_buf: Vec<u8>,
algorithm: Algorithm,
}
impl PublicKeyBuf {
pub fn new(key_buf: Vec<u8>, algorithm: Algorithm) -> Self {
Self { key_buf, algorithm }
}
pub fn into_inner(self) -> Vec<u8> {
self.key_buf
}
}
impl PublicKey for PublicKeyBuf {
fn public_bytes(&self) -> &[u8] {
&self.key_buf
}
fn verify(&self, message: &[u8], signature: &[u8]) -> ProtoResult<()> {
decode_public_key(&self.key_buf, self.algorithm)?.verify(message, signature)
}
fn algorithm(&self) -> Algorithm {
self.algorithm
}
}