unc_crypto/
test_utils.rs

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