utility_crypto/
test_utils.rs

1use secp256k1::rand::SeedableRng;
2
3use crate::signature::{ED25519PublicKey, ED25519SecretKey, KeyType, PRIVTAE_KEY_DEFAULT_RSA_KEY_BITS, PublicKey, SecretKey};
4use crate::{InMemorySigner, Signature};
5use near_account_id::AccountId;
6
7fn ed25519_key_pair_from_seed(seed: &str) -> ed25519_dalek::SigningKey {
8    let seed_bytes = seed.as_bytes();
9    let len = std::cmp::min(ed25519_dalek::SECRET_KEY_LENGTH, seed_bytes.len());
10    let mut seed: [u8; ed25519_dalek::SECRET_KEY_LENGTH] = [b' '; ed25519_dalek::SECRET_KEY_LENGTH];
11    seed[..len].copy_from_slice(&seed_bytes[..len]);
12    ed25519_dalek::SigningKey::from_bytes(&seed)
13}
14
15fn secp256k1_secret_key_from_seed(seed: &str) -> secp256k1::SecretKey {
16    let seed_bytes = seed.as_bytes();
17    let len = std::cmp::min(32, seed_bytes.len());
18    let mut seed: [u8; 32] = [b' '; 32];
19    seed[..len].copy_from_slice(&seed_bytes[..len]);
20    let mut rng = secp256k1::rand::rngs::StdRng::from_seed(seed);
21    secp256k1::SecretKey::new(&mut rng)
22}
23
24fn rsa2048_secret_key_from_seed(seed: &str) -> rsa::RsaPrivateKey {
25    let seed_bytes = seed.as_bytes();
26    let len = std::cmp::min(32, seed_bytes.len());
27    let mut seed: [u8; 32] = [b' '; 32];
28    seed[..len].copy_from_slice(&seed_bytes[..len]);
29    let mut rng = secp256k1::rand::rngs::StdRng::from_seed(seed);
30    rsa::RsaPrivateKey::new(&mut rng, PRIVTAE_KEY_DEFAULT_RSA_KEY_BITS).unwrap()
31}
32
33impl PublicKey {
34    pub fn from_seed(key_type: KeyType, seed: &str) -> Self {
35        match key_type {
36            KeyType::ED25519 => {
37                let keypair = ed25519_key_pair_from_seed(seed);
38                PublicKey::ED25519(ED25519PublicKey(keypair.verifying_key().to_bytes()))
39            }
40            KeyType::SECP256K1 => {
41                let secret_key = SecretKey::SECP256K1(secp256k1_secret_key_from_seed(seed));
42                PublicKey::SECP256K1(secret_key.public_key().unwrap_as_secp256k1().clone())
43            }
44            KeyType::RSA2048 => {
45                let secret_key = SecretKey::RSA(rsa2048_secret_key_from_seed(seed));
46                PublicKey::RSA(secret_key.public_key().unwrap_as_rsa2048().clone())
47            }
48        }
49    }
50}
51
52impl SecretKey {
53    pub fn from_seed(key_type: KeyType, seed: &str) -> Self {
54        match key_type {
55            KeyType::ED25519 => {
56                let keypair = ed25519_key_pair_from_seed(seed);
57                SecretKey::ED25519(ED25519SecretKey(keypair.to_keypair_bytes()))
58            }
59            KeyType::SECP256K1 => SecretKey::SECP256K1(secp256k1_secret_key_from_seed(seed)),
60            KeyType::RSA2048 => SecretKey::RSA(rsa2048_secret_key_from_seed(seed)),
61        }
62    }
63}
64
65const SIG: [u8; ed25519_dalek::SIGNATURE_LENGTH] = [0u8; ed25519_dalek::SIGNATURE_LENGTH];
66
67impl Signature {
68    /// Empty signature that doesn't correspond to anything.
69    pub fn empty(key_type: KeyType) -> Self {
70        match key_type {
71            KeyType::ED25519 => Signature::ED25519(ed25519_dalek::Signature::from_bytes(&SIG)),
72            _ => unimplemented!(),
73        }
74    }
75}
76
77impl InMemorySigner {
78    pub fn from_random(account_id: AccountId, key_type: KeyType) -> Self {
79        let secret_key = SecretKey::from_random(key_type);
80        Self { account_id, public_key: secret_key.public_key(), secret_key }
81    }
82}