1+ test("Keys", |T| {
2+ test("Key generation & byte encoding", |T| {
3+ $sk = xpriv::rand();
4+ $pk = pubkey($sk);
5+
6+ t::eq(typeof($sk), "seckey");
7+ t::eq(len(bytes($sk)), 78);
8+ t::eq(seckey(bytes($sk)), $sk);
9+
10+ t::eq(typeof($pk), "pubkey");
11+ t::eq(len(bytes($pk)), 78);
12+ t::eq(pubkey(bytes($pk)), $pk)
13+ });
14+
15+ test("Signing & Verification", |T| {
16+ $sk = xpriv::rand(), $pk = pubkey($sk);
17+ $H1 = hash::sha256("Hello"), $H2 = hash::sha256("Hello2");
18+
19+ test("ECDSA", |T| {
20+ t::assert(ecdsa::verify($pk, $H1, ecdsa::sign($sk, $H1)));
21+ t::assert(!ecdsa::verify($pk, $H2, ecdsa::sign($sk, $H1)));
22+
23+ it("Is deterministic (RFC 6979)", |T|
24+ t::eq(ecdsa::sign($sk, $H1), ecdsa::sign($sk, $H1)));
25+
26+ it("Uses DER by default", len(ecdsa::sign($sk, $H1)) >= 70); // 70-73
27+
28+ it("Supports compact encoding", |T|
29+ t::eq(len(ecdsa::sign($sk, $H1, true)), 64));
30+ });
31+
32+ test("Schnorr", |T| {
33+ t::assert(schnorr::verify($pk, $H1, schnorr::sign($sk, $H1)));
34+ t::assert(!schnorr::verify($pk, $H1, schnorr::sign($sk, $H2)));
35+
36+ it("Is deterministic without aux_rand", |T| {
37+ t::eq(schnorr::sign($sk, $H1), schnorr::sign($sk, $H1));
38+ t::assert(schnorr::sign($sk, $H1, true) != schnorr::sign($sk, $H1, true));
39+ })
40+ })
41+ });
42+
43+
44+ test("BIP32 Test Vectors", |T| {
45+ mainnet = _$$_RECKLESSLY_RISK_MY_BITCOINS_$$_;
46+
47+ test("Test 1", |T| {
48+ $sk = xpriv::from_seed(0x000102030405060708090a0b0c0d0e0f, mainnet);
49+ $pk = pubkey($sk);
50+
51+ t::eq($sk, xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi);
52+ t::eq($pk, xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8);
53+
54+ t::eq(bytes($sk), 0x0488ade4000000000000000000873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d50800e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35);
55+ t::eq(bytes($pk), 0x0488b21e000000000000000000873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d5080339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2);
56+ });
57+
58+ test("Test 2", |T| {
59+ $sk = xpriv::from_seed(0xfffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542, mainnet);
60+ $pk = pubkey($sk);
61+
62+ t::eq($sk, xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U);
63+ t::eq($pk, xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB);
64+ });
65+ });
66+ })
0 commit comments