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