use bincode::{Decode, Encode};
#[cfg(feature = "json")]
use hex::serde as hex_serde;
use k256::ecdsa::signature::Verifier;
use k256::ecdsa::{Signature, VerifyingKey};
#[cfg(feature = "json")]
use serde::{Deserialize, Serialize};
#[cfg_attr(feature = "json", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, Encode, Decode, PartialEq, Eq)]
pub struct Secp256k1 {
#[cfg_attr(feature = "json", serde(with = "hex_serde"))]
pub public_key: Vec<u8>,
#[cfg_attr(feature = "json", serde(with = "hex_serde"))]
pub signature: Vec<u8>,
#[cfg_attr(feature = "json", serde(with = "hex_serde"))]
pub message: Vec<u8>,
}
impl Secp256k1 {
pub fn verify(&self) -> Result<(), Error> {
let vk = VerifyingKey::from_sec1_bytes(&self.public_key)
.map_err(|e| Error::InvalidPublicKey(e.to_string()))?;
let sig = Signature::from_der(&self.signature).map_err(Error::InvalidSignature)?;
vk.verify(&self.message, &sig)
.map_err(|_| Error::VerificationFailed)
}
}
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("public key decoding error: {0}")]
InvalidPublicKey(String),
#[error("signature decoding error: {0}")]
InvalidSignature(#[from] k256::ecdsa::Error),
#[error("signature verification failed")]
VerificationFailed,
}