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