mwc_libp2p_core/identity/
ed25519.rs1use ed25519_dalek::{self as ed25519, Signer as _, Verifier as _};
24use rand::RngCore;
25use std::convert::TryFrom;
26use super::error::DecodingError;
27use zeroize::Zeroize;
28use core::fmt;
29
30pub struct Keypair(ed25519::Keypair);
32
33impl Keypair {
34 pub fn generate() -> Keypair {
36 Keypair::from(SecretKey::generate())
37 }
38
39 pub fn from_secret( sk_bytes: impl AsMut<[u8]>) -> Result<Keypair, DecodingError> {
40 Ok( Keypair::from(SecretKey::from_bytes(sk_bytes)?) )
41 }
42
43 pub fn encode(&self) -> [u8; 64] {
47 self.0.to_bytes()
48 }
49
50 pub fn decode(kp: &mut [u8]) -> Result<Keypair, DecodingError> {
53 ed25519::Keypair::from_bytes(kp)
54 .map(|k| { kp.zeroize(); Keypair(k) })
55 .map_err(|e| DecodingError::new("Ed25519 keypair").source(e))
56 }
57
58 pub fn sign(&self, msg: &[u8]) -> Vec<u8> {
60 self.0.sign(msg).to_bytes().to_vec()
61 }
62
63 pub fn public(&self) -> PublicKey {
65 PublicKey(self.0.public)
66 }
67
68 pub fn secret(&self) -> SecretKey {
70 SecretKey::from_bytes(&mut self.0.secret.to_bytes())
71 .expect("ed25519::SecretKey::from_bytes(to_bytes(k)) != k")
72 }
73}
74
75impl fmt::Debug for Keypair {
76 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
77 f.debug_struct("Keypair").field("public", &self.0.public).finish()
78 }
79}
80
81impl Clone for Keypair {
82 fn clone(&self) -> Keypair {
83 let mut sk_bytes = self.0.secret.to_bytes();
84 let secret = SecretKey::from_bytes(&mut sk_bytes)
85 .expect("ed25519::SecretKey::from_bytes(to_bytes(k)) != k").0;
86 let public = ed25519::PublicKey::from_bytes(&self.0.public.to_bytes())
87 .expect("ed25519::PublicKey::from_bytes(to_bytes(k)) != k");
88 Keypair(ed25519::Keypair { secret, public })
89 }
90}
91
92impl From<Keypair> for SecretKey {
94 fn from(kp: Keypair) -> SecretKey {
95 SecretKey(kp.0.secret)
96 }
97}
98
99impl From<SecretKey> for Keypair {
101 fn from(sk: SecretKey) -> Keypair {
102 let secret: ed25519::ExpandedSecretKey = (&sk.0).into();
103 let public = ed25519::PublicKey::from(&secret);
104 Keypair(ed25519::Keypair { secret: sk.0, public })
105 }
106}
107
108#[derive(PartialEq, Eq, Debug, Clone)]
110pub struct PublicKey(pub ed25519::PublicKey);
111
112impl PublicKey {
113 pub fn verify(&self, msg: &[u8], sig: &[u8]) -> bool {
115 ed25519::Signature::try_from(sig).and_then(|s| self.0.verify(msg, &s)).is_ok()
116 }
117
118 pub fn encode(&self) -> [u8; 32] {
121 self.0.to_bytes()
122 }
123
124 pub fn decode(k: &[u8]) -> Result<PublicKey, DecodingError> {
126 ed25519::PublicKey::from_bytes(k)
127 .map_err(|e| DecodingError::new("Ed25519 public key").source(e))
128 .map(PublicKey)
129 }
130}
131
132pub struct SecretKey(ed25519::SecretKey);
134
135impl AsRef<[u8]> for SecretKey {
137 fn as_ref(&self) -> &[u8] {
138 self.0.as_bytes()
139 }
140}
141
142impl Clone for SecretKey {
143 fn clone(&self) -> SecretKey {
144 let mut sk_bytes = self.0.to_bytes();
145 Self::from_bytes(&mut sk_bytes)
146 .expect("ed25519::SecretKey::from_bytes(to_bytes(k)) != k")
147 }
148}
149
150impl fmt::Debug for SecretKey {
151 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
152 write!(f, "SecretKey")
153 }
154}
155
156impl SecretKey {
157 pub fn generate() -> SecretKey {
159 let mut bytes = [0u8; 32];
160 rand::thread_rng().fill_bytes(&mut bytes);
161 SecretKey(ed25519::SecretKey::from_bytes(&bytes)
162 .expect("this returns `Err` only if the length is wrong; the length is correct; qed"))
163 }
164
165 pub fn from_bytes(mut sk_bytes: impl AsMut<[u8]>) -> Result<SecretKey, DecodingError> {
169 let sk_bytes = sk_bytes.as_mut();
170 let secret = ed25519::SecretKey::from_bytes(&*sk_bytes)
171 .map_err(|e| DecodingError::new("Ed25519 secret key").source(e))?;
172 sk_bytes.zeroize();
173 Ok(SecretKey(secret))
174 }
175}
176
177#[cfg(test)]
178mod tests {
179 use super::*;
180 use quickcheck::*;
181
182 fn eq_keypairs(kp1: &Keypair, kp2: &Keypair) -> bool {
183 kp1.public() == kp2.public()
184 &&
185 kp1.0.secret.as_bytes() == kp2.0.secret.as_bytes()
186 }
187
188 #[test]
189 fn ed25519_keypair_encode_decode() {
190 fn prop() -> bool {
191 let kp1 = Keypair::generate();
192 let mut kp1_enc = kp1.encode();
193 let kp2 = Keypair::decode(&mut kp1_enc).unwrap();
194 eq_keypairs(&kp1, &kp2)
195 &&
196 kp1_enc.iter().all(|b| *b == 0)
197 }
198 QuickCheck::new().tests(10).quickcheck(prop as fn() -> _);
199 }
200
201 #[test]
202 fn ed25519_keypair_from_secret() {
203 fn prop() -> bool {
204 let kp1 = Keypair::generate();
205 let mut sk = kp1.0.secret.to_bytes();
206 let kp2 = Keypair::from(SecretKey::from_bytes(&mut sk).unwrap());
207 eq_keypairs(&kp1, &kp2)
208 &&
209 sk == [0u8; 32]
210 }
211 QuickCheck::new().tests(10).quickcheck(prop as fn() -> _);
212 }
213
214 #[test]
215 fn ed25519_signature() {
216 let kp = Keypair::generate();
217 let pk = kp.public();
218
219 let msg = "hello world".as_bytes();
220 let sig = kp.sign(msg);
221 assert!(pk.verify(msg, &sig));
222
223 let mut invalid_sig = sig.clone();
224 invalid_sig[3..6].copy_from_slice(&[10, 23, 42]);
225 assert!(!pk.verify(msg, &invalid_sig));
226
227 let invalid_msg = "h3ll0 w0rld".as_bytes();
228 assert!(!pk.verify(invalid_msg, &sig));
229 }
230}