1use signature::{SignatureEncoding, Signer, Verifier};
4
5use crate::{SignMessage, ToVerifier, VerifySignature};
6
7pub trait KeyFromBytes: Sized {
9 fn from_raw_bytes(bytes: &[u8]) -> Option<Self>;
11}
12
13pub trait Parameters: VerifySignature {
15 fn raw_bytes(&self) -> &[u8];
17}
18
19pub trait Curve {
21 type Verifier: Verifier<Self::Signature> + AsRef<[u8]> + KeyFromBytes;
23 type Signer: Signer<Self::Signature>;
25 type Signature: SignatureEncoding;
27
28 fn verifier(signer: &Self::Signer) -> Self::Verifier;
30}
31
32pub 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
44pub 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
56pub struct VerifyingKey<C: Curve> {
58 pub(crate) key: C::Verifier,
60}
61
62pub struct SigningKey<C: Curve> {
64 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 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}