zescrow_core/condition/
ed25519.rs

1use bincode::{Decode, Encode};
2use ed25519_dalek::{Signature, Verifier, VerifyingKey};
3#[cfg(feature = "json")]
4use hex::serde as hex_serde;
5#[cfg(feature = "json")]
6use serde::{Deserialize, Serialize};
7
8/// Ed25519 signature condition.
9///
10/// Verifies that `signature` is a valid Ed25519 signature of `message`
11/// under `public_key`.
12///
13/// # Example
14///
15/// ```ignore
16/// use ed25519_dalek::{Signer, SigningKey};
17/// use zescrow_core::Condition;
18///
19/// let signing_key = SigningKey::generate(&mut rand::rngs::OsRng);
20/// let message = b"escrow-release-auth".to_vec();
21/// let signature = signing_key.sign(&message).to_bytes().to_vec();
22/// let public_key = signing_key.verifying_key().to_bytes();
23///
24/// let condition = Condition::ed25519(public_key, message, signature);
25/// assert!(condition.verify().is_ok());
26/// ```
27#[cfg_attr(feature = "json", derive(Serialize, Deserialize))]
28#[derive(Debug, Clone, Encode, Decode, PartialEq, Eq)]
29pub struct Ed25519 {
30    /// Public key bytes
31    #[cfg_attr(feature = "json", serde(with = "hex_serde"))]
32    pub public_key: [u8; 32],
33
34    /// Signature bytes
35    #[cfg_attr(feature = "json", serde(with = "hex_serde"))]
36    pub signature: Vec<u8>,
37
38    /// Original message bytes
39    #[cfg_attr(feature = "json", serde(with = "hex_serde"))]
40    pub message: Vec<u8>,
41}
42
43impl Ed25519 {
44    /// Verify that `signature` is a valid Ed25519 signature of `message` under `public_key`.
45    pub fn verify(&self) -> Result<(), Error> {
46        let pk = VerifyingKey::from_bytes(&self.public_key)
47            .map_err(|e| Error::InvalidPublicKey(e.to_string()))?;
48        let sig = Signature::from_slice(&self.signature).map_err(Error::InvalidSignature)?;
49        pk.verify(&self.message, &sig)
50            .map_err(|_| Error::VerificationFailed)
51    }
52}
53
54/// Errors from ed25519 signature verification.
55#[derive(Debug, thiserror::Error)]
56pub enum Error {
57    /// Error decoding public key
58    #[error("public key decoding error: {0}")]
59    InvalidPublicKey(String),
60
61    /// Error decoding signature
62    #[error("signature decoding error: {0}")]
63    InvalidSignature(#[from] ed25519_dalek::SignatureError),
64
65    /// Error verifying signature
66    #[error("signature verification failed")]
67    VerificationFailed,
68}