commonware_cryptography/
lib.rs1use commonware_codec::{Encode, ReadExt};
9use commonware_utils::Array;
10use rand::{CryptoRng, Rng, RngCore, SeedableRng};
11
12pub mod bls12381;
13pub mod ed25519;
14pub mod sha256;
15pub use sha256::{hash, CoreSha256, Sha256};
16pub mod blake3;
17pub use blake3::{Blake3, CoreBlake3};
18pub mod bloomfilter;
19pub use bloomfilter::BloomFilter;
20pub mod lthash;
21pub use lthash::LtHash;
22pub mod secp256r1;
23
24pub trait Signer: Send + Sync + Clone + 'static {
26 type Signature: Signature;
28
29 type PublicKey: PublicKey<Signature = Self::Signature>;
31
32 fn public_key(&self) -> Self::PublicKey;
34
35 fn sign(&self, namespace: Option<&[u8]>, msg: &[u8]) -> Self::Signature;
46}
47
48pub trait PrivateKey: Signer + Sized + ReadExt + Encode + PartialEq + Array {}
50
51pub trait PrivateKeyExt: PrivateKey {
53 fn from_seed(seed: u64) -> Self {
60 let mut rng = rand::rngs::StdRng::seed_from_u64(seed);
61 Self::from_rng(&mut rng)
62 }
63
64 fn from_rng<R: Rng + CryptoRng>(rng: &mut R) -> Self;
66}
67
68pub trait Verifier {
70 type Signature: Signature;
72
73 fn verify(&self, namespace: Option<&[u8]>, msg: &[u8], sig: &Self::Signature) -> bool;
81}
82
83pub trait PublicKey: Verifier + Sized + ReadExt + Encode + PartialEq + Array {}
85
86pub trait Signature: Sized + Clone + ReadExt + Encode + PartialEq + Array {}
88
89pub trait BatchVerifier<K: PublicKey> {
91 fn new() -> Self;
93
94 fn add(
104 &mut self,
105 namespace: Option<&[u8]>,
106 message: &[u8],
107 public_key: &K,
108 signature: &K::Signature,
109 ) -> bool;
110
111 fn verify<R: RngCore + CryptoRng>(self, rng: &mut R) -> bool;
125}
126
127pub trait Digest: Array + Copy {
130 fn random<R: RngCore + CryptoRng>(rng: &mut R) -> Self;
137}
138
139pub trait Digestible: Clone + Sized + Send + Sync + 'static {
141 type Digest: Digest;
143
144 fn digest(&self) -> Self::Digest;
149}
150
151pub trait Committable: Clone + Sized + Send + Sync + 'static {
153 type Commitment: Digest;
155
156 fn commitment(&self) -> Self::Commitment;
169}
170
171pub trait Hasher: Clone + Send + Sync + 'static {
184 type Digest: Digest;
186
187 fn new() -> Self;
189
190 fn update(&mut self, message: &[u8]);
192
193 fn finalize(&mut self) -> Self::Digest;
196
197 fn reset(&mut self);
201
202 fn empty() -> Self::Digest;
204}
205
206#[cfg(test)]
207mod tests {
208 use super::*;
209 use commonware_codec::{DecodeExt, FixedSize};
210 use rand::rngs::OsRng;
211
212 fn test_validate<C: PrivateKeyExt>() {
213 let private_key = C::from_rng(&mut OsRng);
214 let public_key = private_key.public_key();
215 assert!(C::PublicKey::decode(public_key.as_ref()).is_ok());
216 }
217
218 fn test_validate_invalid_public_key<C: Signer>() {
219 let result = C::PublicKey::decode(vec![0; 1024].as_ref());
220 assert!(result.is_err());
221 }
222
223 fn test_sign_and_verify<C: PrivateKeyExt>() {
224 let private_key = C::from_seed(0);
225 let namespace = Some(&b"test_namespace"[..]);
226 let message = b"test_message";
227 let signature = private_key.sign(namespace, message);
228 let public_key = private_key.public_key();
229 assert!(public_key.verify(namespace, message, &signature));
230 }
231
232 fn test_sign_and_verify_wrong_message<C: PrivateKeyExt>() {
233 let private_key = C::from_seed(0);
234 let namespace: Option<&[u8]> = Some(&b"test_namespace"[..]);
235 let message = b"test_message";
236 let wrong_message = b"wrong_message";
237 let signature = private_key.sign(namespace, message);
238 let public_key = private_key.public_key();
239 assert!(!public_key.verify(namespace, wrong_message, &signature));
240 }
241
242 fn test_sign_and_verify_wrong_namespace<C: PrivateKeyExt>() {
243 let private_key = C::from_seed(0);
244 let namespace = Some(&b"test_namespace"[..]);
245 let wrong_namespace = Some(&b"wrong_namespace"[..]);
246 let message = b"test_message";
247 let signature = private_key.sign(namespace, message);
248 let public_key = private_key.public_key();
249 assert!(!public_key.verify(wrong_namespace, message, &signature));
250 }
251
252 fn test_empty_vs_none_namespace<C: PrivateKeyExt>() {
253 let private_key = C::from_seed(0);
254 let empty_namespace = Some(&b""[..]);
255 let message = b"test_message";
256 let signature = private_key.sign(empty_namespace, message);
257 let public_key = private_key.public_key();
258 assert!(public_key.verify(empty_namespace, message, &signature));
259 assert!(!public_key.verify(None, message, &signature));
260 }
261
262 fn test_signature_determinism<C: PrivateKeyExt>() {
263 let private_key_1 = C::from_seed(0);
264 let private_key_2 = C::from_seed(0);
265 let namespace = Some(&b"test_namespace"[..]);
266 let message = b"test_message";
267 let signature_1 = private_key_1.sign(namespace, message);
268 let signature_2 = private_key_2.sign(namespace, message);
269 assert_eq!(private_key_1.public_key(), private_key_2.public_key());
270 assert_eq!(signature_1, signature_2);
271 }
272
273 fn test_invalid_signature_publickey_pair<C: PrivateKeyExt>() {
274 let private_key = C::from_seed(0);
275 let private_key_2 = C::from_seed(1);
276 let namespace = Some(&b"test_namespace"[..]);
277 let message = b"test_message";
278 let signature = private_key.sign(namespace, message);
279 let public_key = private_key_2.public_key();
280 assert!(!public_key.verify(namespace, message, &signature));
281 }
282
283 #[test]
284 fn test_ed25519_validate() {
285 test_validate::<ed25519::PrivateKey>();
286 }
287
288 #[test]
289 fn test_ed25519_validate_invalid_public_key() {
290 test_validate_invalid_public_key::<ed25519::PrivateKey>();
291 }
292
293 #[test]
294 fn test_ed25519_sign_and_verify() {
295 test_sign_and_verify::<ed25519::PrivateKey>();
296 }
297
298 #[test]
299 fn test_ed25519_sign_and_verify_wrong_message() {
300 test_sign_and_verify_wrong_message::<ed25519::PrivateKey>();
301 }
302
303 #[test]
304 fn test_ed25519_sign_and_verify_wrong_namespace() {
305 test_sign_and_verify_wrong_namespace::<ed25519::PrivateKey>();
306 }
307
308 #[test]
309 fn test_ed25519_empty_vs_none_namespace() {
310 test_empty_vs_none_namespace::<ed25519::PrivateKey>();
311 }
312
313 #[test]
314 fn test_ed25519_signature_determinism() {
315 test_signature_determinism::<ed25519::PrivateKey>();
316 }
317
318 #[test]
319 fn test_ed25519_invalid_signature_publickey_pair() {
320 test_invalid_signature_publickey_pair::<ed25519::PrivateKey>();
321 }
322
323 #[test]
324 fn test_ed25519_len() {
325 assert_eq!(ed25519::PublicKey::SIZE, 32);
326 assert_eq!(ed25519::Signature::SIZE, 64);
327 }
328
329 #[test]
330 fn test_bls12381_validate() {
331 test_validate::<bls12381::PrivateKey>();
332 }
333
334 #[test]
335 fn test_bls12381_validate_invalid_public_key() {
336 test_validate_invalid_public_key::<bls12381::PrivateKey>();
337 }
338
339 #[test]
340 fn test_bls12381_sign_and_verify() {
341 test_sign_and_verify::<bls12381::PrivateKey>();
342 }
343
344 #[test]
345 fn test_bls12381_sign_and_verify_wrong_message() {
346 test_sign_and_verify_wrong_message::<bls12381::PrivateKey>();
347 }
348
349 #[test]
350 fn test_bls12381_sign_and_verify_wrong_namespace() {
351 test_sign_and_verify_wrong_namespace::<bls12381::PrivateKey>();
352 }
353
354 #[test]
355 fn test_bls12381_empty_vs_none_namespace() {
356 test_empty_vs_none_namespace::<bls12381::PrivateKey>();
357 }
358
359 #[test]
360 fn test_bls12381_signature_determinism() {
361 test_signature_determinism::<bls12381::PrivateKey>();
362 }
363
364 #[test]
365 fn test_bls12381_invalid_signature_publickey_pair() {
366 test_invalid_signature_publickey_pair::<bls12381::PrivateKey>();
367 }
368
369 #[test]
370 fn test_bls12381_len() {
371 assert_eq!(bls12381::PublicKey::SIZE, 48);
372 assert_eq!(bls12381::Signature::SIZE, 96);
373 }
374
375 #[test]
376 fn test_secp256r1_validate() {
377 test_validate::<secp256r1::PrivateKey>();
378 }
379
380 #[test]
381 fn test_secp256r1_validate_invalid_public_key() {
382 test_validate_invalid_public_key::<secp256r1::PrivateKey>();
383 }
384
385 #[test]
386 fn test_secp256r1_sign_and_verify() {
387 test_sign_and_verify::<secp256r1::PrivateKey>();
388 }
389
390 #[test]
391 fn test_secp256r1_sign_and_verify_wrong_message() {
392 test_sign_and_verify_wrong_message::<secp256r1::PrivateKey>();
393 }
394
395 #[test]
396 fn test_secp256r1_sign_and_verify_wrong_namespace() {
397 test_sign_and_verify_wrong_namespace::<secp256r1::PrivateKey>();
398 }
399
400 #[test]
401 fn test_secp256r1_empty_vs_none_namespace() {
402 test_empty_vs_none_namespace::<secp256r1::PrivateKey>();
403 }
404
405 #[test]
406 fn test_secp256r1_signature_determinism() {
407 test_signature_determinism::<secp256r1::PrivateKey>();
408 }
409
410 #[test]
411 fn test_secp256r1_invalid_signature_publickey_pair() {
412 test_invalid_signature_publickey_pair::<secp256r1::PrivateKey>();
413 }
414
415 #[test]
416 fn test_secp256r1_len() {
417 assert_eq!(secp256r1::PublicKey::SIZE, 33);
418 assert_eq!(secp256r1::Signature::SIZE, 64);
419 }
420
421 fn test_hasher_multiple_runs<H: Hasher>() {
422 let mut hasher = H::new();
424 hasher.update(b"hello world");
425 let digest = hasher.finalize();
426 assert!(H::Digest::decode(digest.as_ref()).is_ok());
427 assert_eq!(digest.as_ref().len(), H::Digest::SIZE);
428
429 hasher.update(b"hello world");
431 let digest_again = hasher.finalize();
432 assert!(H::Digest::decode(digest_again.as_ref()).is_ok());
433 assert_eq!(digest, digest_again);
434
435 hasher.update(b"hello mars");
437 hasher.reset();
438 hasher.update(b"hello world");
439 let digest_reset = hasher.finalize();
440 assert!(H::Digest::decode(digest_reset.as_ref()).is_ok());
441 assert_eq!(digest, digest_reset);
442
443 hasher.update(b"hello mars");
445 let digest_mars = hasher.finalize();
446 assert!(H::Digest::decode(digest_mars.as_ref()).is_ok());
447 assert_ne!(digest, digest_mars);
448 }
449
450 fn test_hasher_multiple_updates<H: Hasher>() {
451 let mut hasher = H::new();
453 hasher.update(b"hello");
454 hasher.update(b" world");
455 let digest = hasher.finalize();
456 assert!(H::Digest::decode(digest.as_ref()).is_ok());
457
458 let mut hasher = H::new();
460 hasher.update(b"hello world");
461 let digest_oneshot = hasher.finalize();
462 assert!(H::Digest::decode(digest_oneshot.as_ref()).is_ok());
463 assert_eq!(digest, digest_oneshot);
464 }
465
466 fn test_hasher_empty_input<H: Hasher>() {
467 let mut hasher = H::new();
468 let digest = hasher.finalize();
469 assert!(H::Digest::decode(digest.as_ref()).is_ok());
470 }
471
472 fn test_hasher_large_input<H: Hasher>() {
473 let mut hasher = H::new();
474 let data = vec![1; 1024];
475 hasher.update(&data);
476 let digest = hasher.finalize();
477 assert!(H::Digest::decode(digest.as_ref()).is_ok());
478 }
479
480 #[test]
481 fn test_sha256_hasher_multiple_runs() {
482 test_hasher_multiple_runs::<Sha256>();
483 }
484
485 #[test]
486 fn test_sha256_hasher_multiple_updates() {
487 test_hasher_multiple_updates::<Sha256>();
488 }
489
490 #[test]
491 fn test_sha256_hasher_empty_input() {
492 test_hasher_empty_input::<Sha256>();
493 }
494
495 #[test]
496 fn test_sha256_hasher_large_input() {
497 test_hasher_large_input::<Sha256>();
498 }
499}