casper_types/
crypto.rs

1//! Cryptographic types and operations on them
2
3mod asymmetric_key;
4mod error;
5
6use blake2::{
7    digest::{Update, VariableOutput},
8    VarBlake2b,
9};
10
11use num::FromPrimitive;
12use num_derive::FromPrimitive;
13
14pub use crate::key::BLAKE2B_DIGEST_LENGTH;
15#[cfg(any(feature = "std", test))]
16pub use asymmetric_key::generate_ed25519_keypair;
17#[cfg(any(feature = "testing", feature = "gens", test))]
18pub use asymmetric_key::gens;
19pub use asymmetric_key::{
20    recover_secp256k1, sign, verify, AsymmetricType, PublicKey, SecretKey, Signature, ED25519_TAG,
21    SECP256K1_TAG, SYSTEM_ACCOUNT, SYSTEM_TAG,
22};
23pub use error::Error;
24#[cfg(any(feature = "std", feature = "testing", test))]
25pub use error::ErrorExt;
26
27pub(crate) fn blake2b<T: AsRef<[u8]>>(data: T) -> [u8; BLAKE2B_DIGEST_LENGTH] {
28    let mut result = [0; BLAKE2B_DIGEST_LENGTH];
29    // NOTE: Assumed safe as `BLAKE2B_DIGEST_LENGTH` is a valid value for a hasher
30    let mut hasher = VarBlake2b::new(BLAKE2B_DIGEST_LENGTH).expect("should create hasher");
31
32    hasher.update(data);
33    hasher.finalize_variable(|slice| {
34        result.copy_from_slice(slice);
35    });
36    result
37}
38
39/// A type of hashing algorithm.
40#[repr(u8)]
41#[derive(Debug, Copy, Clone, PartialEq, Eq, FromPrimitive)]
42pub enum HashAlgorithm {
43    /// Blake2b
44    Blake2b = 0,
45    /// Blake3
46    Blake3 = 1,
47    /// Sha256,
48    Sha256 = 2,
49}
50
51impl TryFrom<u8> for HashAlgorithm {
52    type Error = ();
53
54    fn try_from(value: u8) -> Result<Self, Self::Error> {
55        FromPrimitive::from_u8(value).ok_or(())
56    }
57}