use crate::constants::ACCOUNT_ID_LENGTH;
use core::convert::TryInto;
use ripemd::Ripemd160;
use sha2::{Digest, Sha256, Sha512};
pub(crate) const SECP256K1_INTERMEDIATE_KEYPAIR_PADDING: [u8; 4] = [0, 0, 0, 0];
pub(crate) const SECP256K1_KEY_LENGTH: usize = 66;
pub(crate) const SECP256K1_SEQUENCE_SIZE: u32 = 4;
pub(crate) const SECP256K1_SEQUENCE_MAX: u64 = u64::pow(256, SECP256K1_SEQUENCE_SIZE);
pub(crate) const SIGNATURE_VERIFICATION_MESSAGE: &[u8] = b"This test message should verify.";
pub const SECP256K1_SIGNATURE_LENGTH: usize = secp256k1::constants::MAX_SIGNATURE_SIZE;
pub const ED25519_SIGNATURE_LENGTH: usize = ed25519_dalek::SIGNATURE_LENGTH;
pub const SHA512_HASH_LENGTH: usize = 32;
pub const ED25519_PREFIX: &str = "ED";
pub const SECP256K1_PREFIX: char = '0';
#[derive(Debug, PartialEq)]
pub(crate) enum Secp256k1Phase {
Root,
Mid,
}
pub fn sha512_first_half(message: &[u8]) -> [u8; SHA512_HASH_LENGTH] {
let mut sha512 = Sha512::new();
sha512.update(message);
sha512.finalize()[..SHA512_HASH_LENGTH]
.try_into()
.expect("Invalid slice length")
}
pub fn get_account_id(public_key: &[u8]) -> [u8; ACCOUNT_ID_LENGTH] {
let mut sha256 = Sha256::new();
let mut ripemd160 = Ripemd160::new();
sha256.update(public_key);
ripemd160.update(sha256.finalize());
ripemd160.finalize()[..ACCOUNT_ID_LENGTH]
.try_into()
.expect("Invalid slice length")
}
#[cfg(test)]
mod test {
use super::*;
use crate::core::keypairs::test_cases::*;
#[test]
fn test_sha512_first_half() {
assert_eq!(TEST_MESSAGE_SHA, sha512_first_half(TEST_MESSAGE.as_bytes()));
}
#[test]
fn test_get_account_id() {
assert_eq!(TEST_ACCOUNT_ID, get_account_id(TEST_MESSAGE.as_bytes()));
}
}