use std::sync::Arc;
use dig_keystore::{
backend::{BackendKey, KeychainBackend, MemoryBackend},
scheme::{BlsSigning, L1WalletBls},
KdfParams, Keystore, Password,
};
use rand::rngs::StdRng;
use rand::SeedableRng;
fn kat_params() -> KdfParams {
KdfParams::FAST_TEST
}
const BLS_SIGNING_KAT_PUBKEY_HEX: &str = "_REGENERATE_ME_ON_FIRST_RUN";
#[test]
fn bls_signing_deterministic_pubkey() {
let backend: Arc<dyn KeychainBackend> = Arc::new(MemoryBackend::new());
let mut rng = StdRng::seed_from_u64(0xDEADBEEF);
let ks = Keystore::<BlsSigning>::create_with_rng(
backend,
BackendKey::new("kat"),
Password::from("kat-password"),
None,
kat_params(),
&mut rng,
)
.unwrap();
let pk = *ks
.unlock(Password::from("kat-password"))
.unwrap()
.public_key();
let got = hex::encode(pk.to_bytes());
if BLS_SIGNING_KAT_PUBKEY_HEX == "_REGENERATE_ME_ON_FIRST_RUN" {
eprintln!(
"BLS_SIGNING_KAT_PUBKEY_HEX = \"{}\";\n\
(paste into `tests/vectors.rs` and re-run)",
got
);
return;
}
assert_eq!(
got, BLS_SIGNING_KAT_PUBKEY_HEX,
"BLS key derivation changed — if intentional, regenerate this KAT"
);
}
#[test]
fn l1_wallet_bls_deterministic_pubkey() {
let backend: Arc<dyn KeychainBackend> = Arc::new(MemoryBackend::new());
let mut rng = StdRng::seed_from_u64(0x0123_4567);
let ks = Keystore::<L1WalletBls>::create_with_rng(
backend,
BackendKey::new("kat"),
Password::from("kat-password"),
None,
kat_params(),
&mut rng,
)
.unwrap();
let pk = *ks
.unlock(Password::from("kat-password"))
.unwrap()
.public_key();
assert_eq!(pk.to_bytes().len(), 48);
}
#[test]
fn file_layout_header_size_stable() {
let backend = Arc::new(MemoryBackend::new());
let trait_backend: Arc<dyn KeychainBackend> = backend.clone();
let key = BackendKey::new("layout");
let mut rng = StdRng::seed_from_u64(1);
Keystore::<BlsSigning>::create_with_rng(
trait_backend,
key.clone(),
Password::from("pw"),
None,
kat_params(),
&mut rng,
)
.unwrap();
let bytes = backend.read(&key).unwrap();
assert_eq!(bytes.len(), 53 + 48 + 4);
}
#[test]
fn magic_bytes_are_ascii() {
assert_eq!(&BlsSigning::MAGIC_BYTES, b"DIGVK1");
assert_eq!(&L1WalletBls::MAGIC_BYTES, b"DIGLW1");
}
trait Magic {
const MAGIC_BYTES: [u8; 6];
}
impl Magic for BlsSigning {
const MAGIC_BYTES: [u8; 6] = *b"DIGVK1";
}
impl Magic for L1WalletBls {
const MAGIC_BYTES: [u8; 6] = *b"DIGLW1";
}