devolutions_crypto/signature/
signature_v1.rs

1//! Signature V1: ed25519
2use super::Error;
3use super::Result;
4
5use super::{SigningKeyPair, SigningPublicKey};
6
7use std::convert::TryFrom;
8
9use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey};
10
11#[cfg(feature = "fuzz")]
12use arbitrary::Arbitrary;
13
14#[derive(Clone, Debug)]
15pub struct SignatureV1 {
16    signature: Signature,
17}
18
19#[cfg(feature = "fuzz")]
20impl Arbitrary for SignatureV1 {
21    fn arbitrary(u: &mut arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
22        let mut signature = [0u8; 64];
23        u.fill_buffer(&mut signature)?;
24
25        Ok(Self {
26            signature: Signature::from_bytes(&signature),
27        })
28    }
29}
30
31impl From<SignatureV1> for Vec<u8> {
32    fn from(signature: SignatureV1) -> Vec<u8> {
33        signature.signature.to_bytes().to_vec()
34    }
35}
36
37impl TryFrom<&[u8]> for SignatureV1 {
38    type Error = Error;
39
40    fn try_from(data: &[u8]) -> Result<SignatureV1> {
41        if data.len() != 64 {
42            return Err(Error::InvalidLength);
43        };
44
45        match Signature::try_from(&data[0..64]) {
46            Ok(signature) => Ok(SignatureV1 { signature }),
47            Err(_) => Err(Error::InvalidData),
48        }
49    }
50}
51
52impl SignatureV1 {
53    pub fn sign(data: &[u8], key: &SigningKeyPair) -> Self {
54        let key = SigningKey::from(key);
55        let signature = key.sign(data);
56
57        Self { signature }
58    }
59
60    pub fn verify(&self, data: &[u8], key: &SigningPublicKey) -> bool {
61        let key = VerifyingKey::from(key);
62
63        key.verify(data, &self.signature).is_ok()
64    }
65}