mod hash;
mod traits;
#[cfg(feature = "bls")]
mod bls12381;
#[cfg(feature = "ed25519")]
mod ed25519;
#[cfg(feature = "ed25519")]
mod multi_ed25519;
mod multi_key;
#[cfg(feature = "secp256k1")]
mod secp256k1;
#[cfg(feature = "secp256r1")]
mod secp256r1;
pub use hash::{HashFunction, sha2_256, sha3_256, sha3_256_of, signing_message};
pub use traits::{PublicKey, Signature, Signer, Verifier};
#[cfg(feature = "ed25519")]
pub use ed25519::{
ED25519_PRIVATE_KEY_LENGTH, ED25519_PUBLIC_KEY_LENGTH, ED25519_SIGNATURE_LENGTH,
Ed25519PrivateKey, Ed25519PublicKey, Ed25519Signature,
};
#[cfg(feature = "ed25519")]
pub use multi_ed25519::{
MAX_NUM_OF_KEYS, MIN_THRESHOLD, MultiEd25519PublicKey, MultiEd25519Signature,
};
pub use multi_key::{
AnyPublicKey, AnyPublicKeyVariant, AnySignature, MAX_NUM_OF_KEYS as MULTI_KEY_MAX_NUM_OF_KEYS,
MIN_THRESHOLD as MULTI_KEY_MIN_THRESHOLD, MultiKeyPublicKey, MultiKeySignature,
};
#[cfg(feature = "secp256k1")]
pub use secp256k1::{
SECP256K1_PRIVATE_KEY_LENGTH, SECP256K1_PUBLIC_KEY_LENGTH,
SECP256K1_PUBLIC_KEY_UNCOMPRESSED_LENGTH, SECP256K1_SIGNATURE_LENGTH, Secp256k1PrivateKey,
Secp256k1PublicKey, Secp256k1Signature,
};
#[cfg(feature = "secp256r1")]
pub use secp256r1::{
SECP256R1_PRIVATE_KEY_LENGTH, SECP256R1_PUBLIC_KEY_LENGTH, SECP256R1_SIGNATURE_LENGTH,
Secp256r1PrivateKey, Secp256r1PublicKey, Secp256r1Signature,
};
#[cfg(feature = "bls")]
pub use bls12381::{
BLS12381_POP_LENGTH, BLS12381_PRIVATE_KEY_LENGTH, BLS12381_PUBLIC_KEY_LENGTH,
BLS12381_SIGNATURE_LENGTH, Bls12381PrivateKey, Bls12381ProofOfPossession, Bls12381PublicKey,
Bls12381Signature,
};
pub const ED25519_SCHEME: u8 = 0;
pub const MULTI_ED25519_SCHEME: u8 = 1;
pub const SINGLE_KEY_SCHEME: u8 = 2;
pub const MULTI_KEY_SCHEME: u8 = 3;
pub const KEYLESS_SCHEME: u8 = 5;
pub fn derive_authentication_key(public_key: &[u8], scheme: u8) -> [u8; 32] {
use sha3::{Digest, Sha3_256};
let mut hasher = Sha3_256::new();
hasher.update(public_key);
hasher.update([scheme]);
let result = hasher.finalize();
let mut auth_key = [0u8; 32];
auth_key.copy_from_slice(&result);
auth_key
}
pub fn derive_address(public_key: &[u8], scheme: u8) -> crate::types::AccountAddress {
let auth_key = derive_authentication_key(public_key, scheme);
crate::types::AccountAddress::new(auth_key)
}