1#![doc = include_str!("../examples/basic.rs")]
18#![warn(missing_docs)]
23#![deny(rustdoc::broken_intra_doc_links)]
24#![no_std]
25
26extern crate alloc;
27
28pub mod consts;
29pub use consts::KeyNumber;
30
31mod encoding;
32pub use encoding::Codeable;
33
34mod errors;
35pub use errors::{Error, FormatError};
36
37mod key;
38pub use key::{NewKeyOpts, PrivateKey, PublicKey, Signature};
39
40#[cfg(test)]
41pub(crate) mod test_utils;
42
43use ed25519_dalek::{Signer as _, Verifier as _};
44
45impl PrivateKey {
46 pub fn sign(&self, msg: &[u8]) -> Signature {
48 let keypair = PrivateKey::from_key_bytes(&self.complete_key)
53 .expect("invalid private keypair used for signing");
54 let sig = keypair.sign(msg).to_bytes();
55 Signature::new(self.keynum, sig)
56 }
57}
58
59impl PublicKey {
60 pub fn verify(&self, msg: &[u8], signature: &Signature) -> Result<(), Error> {
68 let current_keynum = self.keynum();
69 let expected_keynum = signature.keynum;
70
71 if expected_keynum != current_keynum {
72 return Err(Error::MismatchedKey {
73 expected: expected_keynum,
74 found: current_keynum,
75 });
76 }
77
78 let public_key = ed25519_dalek::VerifyingKey::from_bytes(&self.key())
83 .map_err(|_| Error::BadSignature)?;
84 let signature = ed25519_dalek::Signature::from_bytes(&signature.signature());
85 public_key
86 .verify(msg, &signature)
87 .map_err(|_| Error::BadSignature)
88 }
89}
90
91#[cfg(test)]
92mod tests {
93 use super::*;
94 use crate::test_utils::StepperRng;
95
96 const MSG: &[u8] = b"signify!!!";
97
98 #[test]
99 fn check_signature_roundtrip() {
100 let mut rng = StepperRng::default();
101
102 let secret_key = PrivateKey::generate(&mut rng, NewKeyOpts::NoEncryption).unwrap();
103 let public_key = secret_key.public();
104 let signature = secret_key.sign(MSG);
105
106 assert_eq!(signature.signer_keynum(), public_key.keynum());
107
108 assert!(public_key.verify(MSG, &signature).is_ok());
109 }
110
111 #[test]
112 fn check_signature_mismatched_keynum() {
113 let mut rng = StepperRng::default();
114
115 let secret_key = PrivateKey::generate(&mut rng, NewKeyOpts::NoEncryption).unwrap();
116 let public_key = secret_key.public();
117 let mut signature = secret_key.sign(MSG);
118
119 let wrong_keynum = KeyNumber::new([0u8; KeyNumber::LEN]);
120
121 signature.keynum = wrong_keynum;
122
123 assert_eq!(
124 public_key.verify(MSG, &signature),
125 Err(Error::MismatchedKey {
126 expected: wrong_keynum,
127 found: public_key.keynum()
128 })
129 )
130 }
131
132 #[test]
133 fn check_malformed_publickey() {
134 let mut rng = StepperRng::default();
135
136 let secret_key = PrivateKey::generate(&mut rng, NewKeyOpts::NoEncryption).unwrap();
137 let mut public_key = secret_key.public();
138 let signature = secret_key.sign(MSG);
139
140 public_key.key = [
142 136, 95, 131, 189, 208, 168, 196, 163, 180, 145, 35, 42, 113, 108, 172, 178, 62, 108,
143 7, 205, 20, 215, 240, 50, 149, 237, 146, 32, 181, 180, 91, 255,
144 ];
145
146 assert_eq!(public_key.verify(MSG, &signature), Err(Error::BadSignature));
147 }
148
149 #[test]
150 fn check_malformed_signature() {
151 let mut rng = StepperRng::default();
152
153 let secret_key = PrivateKey::generate(&mut rng, NewKeyOpts::NoEncryption).unwrap();
154 let public_key = secret_key.public();
155 let mut signature = secret_key.sign(MSG);
156
157 let real_sig = signature.sig;
158
159 signature.sig = [255u8; consts::SIG_LEN];
161
162 assert_eq!(public_key.verify(MSG, &signature), Err(Error::BadSignature));
163
164 signature.sig = real_sig;
165 signature.sig[20] = 3;
167
168 assert_eq!(public_key.verify(MSG, &signature), Err(Error::BadSignature));
169 }
170}