commonware_cryptography/
lib.rs1#![doc(
9 html_logo_url = "https://commonware.xyz/imgs/rustdoc_logo.svg",
10 html_favicon_url = "https://commonware.xyz/favicon.ico"
11)]
12#![cfg_attr(not(feature = "std"), no_std)]
13
14#[cfg(not(feature = "std"))]
15extern crate alloc;
16
17use commonware_codec::{Encode, ReadExt};
18use commonware_utils::Array;
19use rand::{CryptoRng, Rng, RngCore, SeedableRng as _};
20use rand_chacha::ChaCha20Rng;
21
22pub mod bls12381;
23pub mod ed25519;
24pub mod sha256;
25pub use sha256::{CoreSha256, Sha256};
26pub mod blake3;
27pub use blake3::{Blake3, CoreBlake3};
28pub mod bloomfilter;
29pub use bloomfilter::BloomFilter;
30pub mod lthash;
31pub use lthash::LtHash;
32pub mod secp256r1;
33
34pub trait Signer: Send + Sync + Clone + 'static {
36 type Signature: Signature;
38
39 type PublicKey: PublicKey<Signature = Self::Signature>;
41
42 fn public_key(&self) -> Self::PublicKey;
44
45 fn sign(&self, namespace: Option<&[u8]>, msg: &[u8]) -> Self::Signature;
56}
57
58pub trait PrivateKey: Signer + Sized + ReadExt + Encode + PartialEq + Array {}
60
61pub trait PrivateKeyExt: PrivateKey {
63 fn from_seed(seed: u64) -> Self {
70 let mut rng = ChaCha20Rng::seed_from_u64(seed);
71 Self::from_rng(&mut rng)
72 }
73
74 fn from_rng<R: Rng + CryptoRng>(rng: &mut R) -> Self;
76}
77
78pub trait Verifier {
80 type Signature: Signature;
82
83 fn verify(&self, namespace: Option<&[u8]>, msg: &[u8], sig: &Self::Signature) -> bool;
91}
92
93pub trait PublicKey: Verifier + Sized + ReadExt + Encode + PartialEq + Array {}
95
96pub trait Signature: Sized + Clone + ReadExt + Encode + PartialEq + Array {}
98
99pub trait BatchVerifier<K: PublicKey> {
101 fn new() -> Self;
103
104 fn add(
114 &mut self,
115 namespace: Option<&[u8]>,
116 message: &[u8],
117 public_key: &K,
118 signature: &K::Signature,
119 ) -> bool;
120
121 fn verify<R: RngCore + CryptoRng>(self, rng: &mut R) -> bool;
135}
136
137pub trait Digest: Array + Copy {
140 fn random<R: RngCore + CryptoRng>(rng: &mut R) -> Self;
147}
148
149pub trait Digestible: Clone + Sized + Send + Sync + 'static {
151 type Digest: Digest;
153
154 fn digest(&self) -> Self::Digest;
159}
160
161pub trait Committable: Clone + Sized + Send + Sync + 'static {
163 type Commitment: Digest;
165
166 fn commitment(&self) -> Self::Commitment;
179}
180
181pub trait Hasher: Clone + Send + Sync + 'static {
194 type Digest: Digest;
196
197 fn new() -> Self;
199
200 fn update(&mut self, message: &[u8]) -> &mut Self;
202
203 fn finalize(&mut self) -> Self::Digest;
206
207 fn reset(&mut self) -> &mut Self;
211
212 fn empty() -> Self::Digest;
214
215 fn hash(message: &[u8]) -> Self::Digest {
217 Self::new().update(message).finalize()
218 }
219}
220
221#[cfg(test)]
222mod tests {
223 use super::*;
224 use commonware_codec::{DecodeExt, FixedSize};
225 use rand::rngs::OsRng;
226
227 fn test_validate<C: PrivateKeyExt>() {
228 let private_key = C::from_rng(&mut OsRng);
229 let public_key = private_key.public_key();
230 assert!(C::PublicKey::decode(public_key.as_ref()).is_ok());
231 }
232
233 fn test_validate_invalid_public_key<C: Signer>() {
234 let result = C::PublicKey::decode(vec![0; 1024].as_ref());
235 assert!(result.is_err());
236 }
237
238 fn test_sign_and_verify<C: PrivateKeyExt>() {
239 let private_key = C::from_seed(0);
240 let namespace = Some(&b"test_namespace"[..]);
241 let message = b"test_message";
242 let signature = private_key.sign(namespace, message);
243 let public_key = private_key.public_key();
244 assert!(public_key.verify(namespace, message, &signature));
245 }
246
247 fn test_sign_and_verify_wrong_message<C: PrivateKeyExt>() {
248 let private_key = C::from_seed(0);
249 let namespace: Option<&[u8]> = Some(&b"test_namespace"[..]);
250 let message = b"test_message";
251 let wrong_message = b"wrong_message";
252 let signature = private_key.sign(namespace, message);
253 let public_key = private_key.public_key();
254 assert!(!public_key.verify(namespace, wrong_message, &signature));
255 }
256
257 fn test_sign_and_verify_wrong_namespace<C: PrivateKeyExt>() {
258 let private_key = C::from_seed(0);
259 let namespace = Some(&b"test_namespace"[..]);
260 let wrong_namespace = Some(&b"wrong_namespace"[..]);
261 let message = b"test_message";
262 let signature = private_key.sign(namespace, message);
263 let public_key = private_key.public_key();
264 assert!(!public_key.verify(wrong_namespace, message, &signature));
265 }
266
267 fn test_empty_vs_none_namespace<C: PrivateKeyExt>() {
268 let private_key = C::from_seed(0);
269 let empty_namespace = Some(&b""[..]);
270 let message = b"test_message";
271 let signature = private_key.sign(empty_namespace, message);
272 let public_key = private_key.public_key();
273 assert!(public_key.verify(empty_namespace, message, &signature));
274 assert!(!public_key.verify(None, message, &signature));
275 }
276
277 fn test_signature_determinism<C: PrivateKeyExt>() {
278 let private_key_1 = C::from_seed(0);
279 let private_key_2 = C::from_seed(0);
280 let namespace = Some(&b"test_namespace"[..]);
281 let message = b"test_message";
282 let signature_1 = private_key_1.sign(namespace, message);
283 let signature_2 = private_key_2.sign(namespace, message);
284 assert_eq!(private_key_1.public_key(), private_key_2.public_key());
285 assert_eq!(signature_1, signature_2);
286 }
287
288 fn test_invalid_signature_publickey_pair<C: PrivateKeyExt>() {
289 let private_key = C::from_seed(0);
290 let private_key_2 = C::from_seed(1);
291 let namespace = Some(&b"test_namespace"[..]);
292 let message = b"test_message";
293 let signature = private_key.sign(namespace, message);
294 let public_key = private_key_2.public_key();
295 assert!(!public_key.verify(namespace, message, &signature));
296 }
297
298 #[test]
299 fn test_ed25519_validate() {
300 test_validate::<ed25519::PrivateKey>();
301 }
302
303 #[test]
304 fn test_ed25519_validate_invalid_public_key() {
305 test_validate_invalid_public_key::<ed25519::PrivateKey>();
306 }
307
308 #[test]
309 fn test_ed25519_sign_and_verify() {
310 test_sign_and_verify::<ed25519::PrivateKey>();
311 }
312
313 #[test]
314 fn test_ed25519_sign_and_verify_wrong_message() {
315 test_sign_and_verify_wrong_message::<ed25519::PrivateKey>();
316 }
317
318 #[test]
319 fn test_ed25519_sign_and_verify_wrong_namespace() {
320 test_sign_and_verify_wrong_namespace::<ed25519::PrivateKey>();
321 }
322
323 #[test]
324 fn test_ed25519_empty_vs_none_namespace() {
325 test_empty_vs_none_namespace::<ed25519::PrivateKey>();
326 }
327
328 #[test]
329 fn test_ed25519_signature_determinism() {
330 test_signature_determinism::<ed25519::PrivateKey>();
331 }
332
333 #[test]
334 fn test_ed25519_invalid_signature_publickey_pair() {
335 test_invalid_signature_publickey_pair::<ed25519::PrivateKey>();
336 }
337
338 #[test]
339 fn test_ed25519_len() {
340 assert_eq!(ed25519::PublicKey::SIZE, 32);
341 assert_eq!(ed25519::Signature::SIZE, 64);
342 }
343
344 #[test]
345 fn test_bls12381_validate() {
346 test_validate::<bls12381::PrivateKey>();
347 }
348
349 #[test]
350 fn test_bls12381_validate_invalid_public_key() {
351 test_validate_invalid_public_key::<bls12381::PrivateKey>();
352 }
353
354 #[test]
355 fn test_bls12381_sign_and_verify() {
356 test_sign_and_verify::<bls12381::PrivateKey>();
357 }
358
359 #[test]
360 fn test_bls12381_sign_and_verify_wrong_message() {
361 test_sign_and_verify_wrong_message::<bls12381::PrivateKey>();
362 }
363
364 #[test]
365 fn test_bls12381_sign_and_verify_wrong_namespace() {
366 test_sign_and_verify_wrong_namespace::<bls12381::PrivateKey>();
367 }
368
369 #[test]
370 fn test_bls12381_empty_vs_none_namespace() {
371 test_empty_vs_none_namespace::<bls12381::PrivateKey>();
372 }
373
374 #[test]
375 fn test_bls12381_signature_determinism() {
376 test_signature_determinism::<bls12381::PrivateKey>();
377 }
378
379 #[test]
380 fn test_bls12381_invalid_signature_publickey_pair() {
381 test_invalid_signature_publickey_pair::<bls12381::PrivateKey>();
382 }
383
384 #[test]
385 fn test_bls12381_len() {
386 assert_eq!(bls12381::PublicKey::SIZE, 48);
387 assert_eq!(bls12381::Signature::SIZE, 96);
388 }
389
390 #[test]
391 fn test_secp256r1_validate() {
392 test_validate::<secp256r1::PrivateKey>();
393 }
394
395 #[test]
396 fn test_secp256r1_validate_invalid_public_key() {
397 test_validate_invalid_public_key::<secp256r1::PrivateKey>();
398 }
399
400 #[test]
401 fn test_secp256r1_sign_and_verify() {
402 test_sign_and_verify::<secp256r1::PrivateKey>();
403 }
404
405 #[test]
406 fn test_secp256r1_sign_and_verify_wrong_message() {
407 test_sign_and_verify_wrong_message::<secp256r1::PrivateKey>();
408 }
409
410 #[test]
411 fn test_secp256r1_sign_and_verify_wrong_namespace() {
412 test_sign_and_verify_wrong_namespace::<secp256r1::PrivateKey>();
413 }
414
415 #[test]
416 fn test_secp256r1_empty_vs_none_namespace() {
417 test_empty_vs_none_namespace::<secp256r1::PrivateKey>();
418 }
419
420 #[test]
421 fn test_secp256r1_signature_determinism() {
422 test_signature_determinism::<secp256r1::PrivateKey>();
423 }
424
425 #[test]
426 fn test_secp256r1_invalid_signature_publickey_pair() {
427 test_invalid_signature_publickey_pair::<secp256r1::PrivateKey>();
428 }
429
430 #[test]
431 fn test_secp256r1_len() {
432 assert_eq!(secp256r1::PublicKey::SIZE, 33);
433 assert_eq!(secp256r1::Signature::SIZE, 64);
434 }
435
436 fn test_hasher_multiple_runs<H: Hasher>() {
437 let mut hasher = H::new();
439 hasher.update(b"hello world");
440 let digest = hasher.finalize();
441 assert!(H::Digest::decode(digest.as_ref()).is_ok());
442 assert_eq!(digest.as_ref().len(), H::Digest::SIZE);
443
444 hasher.update(b"hello world");
446 let digest_again = hasher.finalize();
447 assert!(H::Digest::decode(digest_again.as_ref()).is_ok());
448 assert_eq!(digest, digest_again);
449
450 hasher.update(b"hello mars");
452 hasher.reset();
453 hasher.update(b"hello world");
454 let digest_reset = hasher.finalize();
455 assert!(H::Digest::decode(digest_reset.as_ref()).is_ok());
456 assert_eq!(digest, digest_reset);
457
458 hasher.update(b"hello mars");
460 let digest_mars = hasher.finalize();
461 assert!(H::Digest::decode(digest_mars.as_ref()).is_ok());
462 assert_ne!(digest, digest_mars);
463 }
464
465 fn test_hasher_multiple_updates<H: Hasher>() {
466 let mut hasher = H::new();
468 hasher.update(b"hello");
469 hasher.update(b" world");
470 let digest = hasher.finalize();
471 assert!(H::Digest::decode(digest.as_ref()).is_ok());
472
473 let mut hasher = H::new();
475 hasher.update(b"hello world");
476 let digest_oneshot = hasher.finalize();
477 assert!(H::Digest::decode(digest_oneshot.as_ref()).is_ok());
478 assert_eq!(digest, digest_oneshot);
479 }
480
481 fn test_hasher_empty_input<H: Hasher>() {
482 let mut hasher = H::new();
483 let digest = hasher.finalize();
484 assert!(H::Digest::decode(digest.as_ref()).is_ok());
485 }
486
487 fn test_hasher_large_input<H: Hasher>() {
488 let mut hasher = H::new();
489 let data = vec![1; 1024];
490 hasher.update(&data);
491 let digest = hasher.finalize();
492 assert!(H::Digest::decode(digest.as_ref()).is_ok());
493 }
494
495 #[test]
496 fn test_sha256_hasher_multiple_runs() {
497 test_hasher_multiple_runs::<Sha256>();
498 }
499
500 #[test]
501 fn test_sha256_hasher_multiple_updates() {
502 test_hasher_multiple_updates::<Sha256>();
503 }
504
505 #[test]
506 fn test_sha256_hasher_empty_input() {
507 test_hasher_empty_input::<Sha256>();
508 }
509
510 #[test]
511 fn test_sha256_hasher_large_input() {
512 test_hasher_large_input::<Sha256>();
513 }
514}