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