ts_crypto/
edwards.rs

1//! Edwards curve cryptography
2
3use signature::{SignatureEncoding, Signer, Verifier};
4
5use crate::{SignMessage, ToVerifier, VerifySignature};
6
7/// Create an `EdDSA` key from bytes
8pub trait KeyFromBytes: Sized {
9    /// Create an `EdDSA` key from bytes
10    fn from_raw_bytes(bytes: &[u8]) -> Option<Self>;
11}
12
13/// Parameters for an `EdDSA` key
14pub trait Parameters: VerifySignature {
15    /// Get the raw public key bytes for the key
16    fn raw_bytes(&self) -> &[u8];
17}
18
19/// An Edwards curve
20pub trait Curve {
21    /// The verifier for the curve
22    type Verifier: Verifier<Self::Signature> + AsRef<[u8]> + KeyFromBytes;
23    /// The signer for the curve
24    type Signer: Signer<Self::Signature>;
25    /// The curve's signature type
26    type Signature: SignatureEncoding;
27
28    /// Create a verifier from a signer
29    fn verifier(signer: &Self::Signer) -> Self::Verifier;
30}
31
32/// Edwards curve 25519
33pub struct Curve25519;
34impl Curve for Curve25519 {
35    type Verifier = ed25519_dalek::VerifyingKey;
36    type Signer = ed25519_dalek::SigningKey;
37    type Signature = ed25519::Signature;
38
39    fn verifier(signer: &Self::Signer) -> Self::Verifier {
40        signer.verifying_key()
41    }
42}
43
44/// Edwards curve 448
45pub struct Curve448;
46impl Curve for Curve448 {
47    type Verifier = ed448_goldilocks::VerifyingKey;
48    type Signer = ed448_goldilocks::SigningKey;
49    type Signature = ed448::Signature;
50
51    fn verifier(signer: &Self::Signer) -> Self::Verifier {
52        signer.verifying_key()
53    }
54}
55
56/// An Edwards curve verifying key
57pub struct VerifyingKey<C: Curve> {
58    /// The inner key
59    pub(crate) key: C::Verifier,
60}
61
62/// An Edwards curve signing key
63pub struct SigningKey<C: Curve> {
64    /// The inner key
65    pub(crate) key: C::Signer,
66}
67
68impl KeyFromBytes for ed448_goldilocks::VerifyingKey {
69    fn from_raw_bytes(bytes: &[u8]) -> Option<Self> {
70        Self::from_bytes(bytes.try_into().ok()?).ok()
71    }
72}
73impl KeyFromBytes for ed25519_dalek::VerifyingKey {
74    fn from_raw_bytes(bytes: &[u8]) -> Option<Self> {
75        Self::from_bytes(bytes.try_into().ok()?).ok()
76    }
77}
78
79impl<C: Curve> VerifyingKey<C> {
80    /// Create a verifying key from the raw public key bytes
81    pub fn from_raw_bytes(bytes: &[u8]) -> Option<Self> {
82        let key = C::Verifier::from_raw_bytes(bytes)?;
83        Some(Self { key })
84    }
85}
86
87impl<C: Curve> Parameters for VerifyingKey<C> {
88    fn raw_bytes(&self) -> &[u8] {
89        self.key.as_ref()
90    }
91}
92
93impl<C: Curve> VerifySignature for VerifyingKey<C> {
94    fn verifies_signature(&self, signature: &[u8], message: &[u8]) -> bool {
95        let Ok(signature) = C::Signature::try_from(signature) else {
96            return false;
97        };
98        self.key.verify(message, &signature).is_ok()
99    }
100}
101
102impl<C: Curve> SignMessage for SigningKey<C> {
103    fn sign(&self, message: &[u8]) -> Vec<u8> {
104        self.key.sign(message).to_vec()
105    }
106}
107
108impl<C: Curve> ToVerifier for SigningKey<C> {
109    type Key = VerifyingKey<C>;
110
111    fn verifying_key(&self) -> Self::Key {
112        let key = C::verifier(&self.key);
113        Self::Key { key }
114    }
115}