devolutions_crypto/signature/
signature_v1.rs1use 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}