Skip to content

Commit d3072c4

Browse files
authored
Merge pull request #19 from cfromknecht/bolt4-test-vectors
sphinx_test: adds bolt4 packet test vector
2 parents aeb7d71 + 81d7159 commit d3072c4

File tree

1 file changed

+122
-0
lines changed

1 file changed

+122
-0
lines changed

sphinx_test.go

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,80 @@ import (
1212
"github.com/roasbeef/btcd/chaincfg"
1313
)
1414

15+
// BOLT 4 Test Vectors
16+
var (
17+
// bolt4PubKeys are the public keys of the hops used in the route.
18+
bolt4PubKeys = []string{
19+
"02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619",
20+
"0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c",
21+
"027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007",
22+
"032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e668680991",
23+
"02edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145",
24+
}
25+
26+
// bolt4SessionKey is the session private key.
27+
bolt4SessionKey = bytes.Repeat([]byte{'A'}, 32)
28+
29+
// bolt4AssocData is the associated data added to the packet.
30+
bolt4AssocData = bytes.Repeat([]byte{'B'}, 32)
31+
32+
// bolt4FinalPacketHex encodes the expected sphinx packet as a result of
33+
// creating a new packet with the above parameters.
34+
bolt4FinalPacketHex = "0002eec7245d6b7d2ccb30380bfbe2a3648cd7" +
35+
"a942653f5aa340edcea1f283686619e5f14350c2a76fc232b5e4" +
36+
"6d421e9615471ab9e0bc887beff8c95fdb878f7b3a71da571226" +
37+
"458c510bbadd1276f045c21c520a07d35da256ef75b436796243" +
38+
"7b0dd10f7d61ab590531cf08000178a333a347f8b4072e216400" +
39+
"406bdf3bf038659793a86cae5f52d32f3438527b47a1cfc54285" +
40+
"a8afec3a4c9f3323db0c946f5d4cb2ce721caad69320c3a469a2" +
41+
"02f3e468c67eaf7a7cda226d0fd32f7b48084dca885d15222e60" +
42+
"826d5d971f64172d98e0760154400958f00e86697aa1aa9d41be" +
43+
"e8119a1ec866abe044a9ad635778ba61fc0776dc832b39451bd5" +
44+
"d35072d2269cf9b040d6ba38b54ec35f81d7fc67678c3be47274" +
45+
"f3c4cc472aff005c3469eb3bc140769ed4c7f0218ff8c6c7dd72" +
46+
"21d189c65b3b9aaa71a01484b122846c7c7b57e02e679ea8469b" +
47+
"70e14fe4f70fee4d87b910cf144be6fe48eef24da475c0b0bcc6" +
48+
"565ae82cd3f4e3b24c76eaa5616c6111343306ab35c1fe5ca4a7" +
49+
"7c0e314ed7dba39d6f1e0de791719c241a939cc493bea2bae1c1" +
50+
"e932679ea94d29084278513c77b899cc98059d06a27d171b0dbd" +
51+
"f6bee13ddc4fc17a0c4d2827d488436b57baa167544138ca2e64" +
52+
"a11b43ac8a06cd0c2fba2d4d900ed2d9205305e2d7383cc98dac" +
53+
"b078133de5f6fb6bed2ef26ba92cea28aafc3b9948dd9ae5559e" +
54+
"8bd6920b8cea462aa445ca6a95e0e7ba52961b181c79e73bd581" +
55+
"821df2b10173727a810c92b83b5ba4a0403eb710d2ca10689a35" +
56+
"bec6c3a708e9e92f7d78ff3c5d9989574b00c6736f84c199256e" +
57+
"76e19e78f0c98a9d580b4a658c84fc8f2096c2fbea8f5f8c59d0" +
58+
"fdacb3be2802ef802abbecb3aba4acaac69a0e965abd8981e989" +
59+
"6b1f6ef9d60f7a164b371af869fd0e48073742825e9434fc54da" +
60+
"837e120266d53302954843538ea7c6c3dbfb4ff3b2fdbe244437" +
61+
"f2a153ccf7bdb4c92aa08102d4f3cff2ae5ef86fab4653595e6a" +
62+
"5837fa2f3e29f27a9cde5966843fb847a4a61f1e76c281fe8bb2" +
63+
"b0a181d096100db5a1a5ce7a910238251a43ca556712eaadea16" +
64+
"7fb4d7d75825e440f3ecd782036d7574df8bceacb397abefc5f5" +
65+
"254d2722215c53ff54af8299aaaad642c6d72a14d27882d9bbd5" +
66+
"39e1cc7a527526ba89b8c037ad09120e98ab042d3e8652b31ae0" +
67+
"e478516bfaf88efca9f3676ffe99d2819dcaeb7610a626695f53" +
68+
"117665d267d3f7abebd6bbd6733f645c72c389f03855bdf1e4b8" +
69+
"075b516569b118233a0f0971d24b83113c0b096f5216a207ca99" +
70+
"a7cddc81c130923fe3d91e7508c9ac5f2e914ff5dccab9e55856" +
71+
"6fa14efb34ac98d878580814b94b73acbfde9072f30b881f7f0f" +
72+
"ff42d4045d1ace6322d86a97d164aa84d93a60498065cc7c20e6" +
73+
"36f5862dc81531a88c60305a2e59a985be327a6902e4bed986db" +
74+
"f4a0b50c217af0ea7fdf9ab37f9ea1a1aaa72f54cf40154ea9b2" +
75+
"69f1a7c09f9f43245109431a175d50e2db0132337baa0ef97eed" +
76+
"0fcf20489da36b79a1172faccc2f7ded7c60e00694282d93359c" +
77+
"4682135642bc81f433574aa8ef0c97b4ade7ca372c5ffc23c7ed" +
78+
"dd839bab4e0f14d6df15c9dbeab176bec8b5701cf054eb3072f6" +
79+
"dadc98f88819042bf10c407516ee58bce33fbe3b3d86a54255e5" +
80+
"77db4598e30a135361528c101683a5fcde7e8ba53f3456254be8" +
81+
"f45fe3a56120ae96ea3773631fcb3873aa3abd91bcff00bd38bd" +
82+
"43697a2e789e00da6077482e7b1b1a677b5afae4c54e6cbdf737" +
83+
"7b694eb7d7a5b913476a5be923322d3de06060fd5e819635232a" +
84+
"2cf4f0731da13b8546d1d6d4f8d75b9fce6c2341a71b0ea6f780" +
85+
"df54bfdb0dd5cd9855179f602f917265f21f9190c70217774a6f" +
86+
"baaa7d63ad64199f4664813b955cff954949076dcf"
87+
)
88+
1589
func newTestRoute(numHops int) ([]*Router, *[]HopData, *OnionPacket, error) {
1690
nodes := make([]*Router, numHops)
1791

@@ -55,6 +129,54 @@ func newTestRoute(numHops int) ([]*Router, *[]HopData, *OnionPacket, error) {
55129
return nodes, &hopsData, fwdMsg, nil
56130
}
57131

132+
func TestBolt4Packet(t *testing.T) {
133+
var route = make([]*btcec.PublicKey, len(bolt4PubKeys))
134+
for i, pubKeyHex := range bolt4PubKeys {
135+
pubKeyBytes, err := hex.DecodeString(pubKeyHex)
136+
if err != nil {
137+
t.Fatalf("unable to decode BOLT 4 hex pubkey #%d: %v", err)
138+
}
139+
140+
route[i], err = btcec.ParsePubKey(pubKeyBytes, btcec.S256())
141+
if err != nil {
142+
t.Fatalf("unable to parse BOLT 4 pubkey #%d: %v", i, err)
143+
}
144+
}
145+
146+
finalPacket, err := hex.DecodeString(bolt4FinalPacketHex)
147+
if err != nil {
148+
t.Fatalf("unable to decode BOLT 4 final onion packet from hex: "+
149+
"%v", err)
150+
}
151+
152+
var hopsData []HopData
153+
for i := range route {
154+
hopsData = append(hopsData, HopData{
155+
Realm: 0x00,
156+
ForwardAmount: uint64(i),
157+
OutgoingCltv: uint32(i),
158+
})
159+
copy(hopsData[i].NextAddress[:], bytes.Repeat([]byte{byte(i)}, 8))
160+
}
161+
162+
sessionKey, _ := btcec.PrivKeyFromBytes(btcec.S256(), bolt4SessionKey)
163+
pkt, err := NewOnionPacket(route, sessionKey, hopsData, bolt4AssocData)
164+
if err != nil {
165+
t.Fatalf("unable to construct onion packet: %v", err)
166+
}
167+
168+
var b bytes.Buffer
169+
if err := pkt.Encode(&b); err != nil {
170+
t.Fatalf("unable to decode onion packet: %v", err)
171+
}
172+
173+
if bytes.Compare(b.Bytes(), finalPacket) != 0 {
174+
t.Fatalf("final packet does not match expected BOLT 4 packet, "+
175+
"want: %s, got %s", hex.EncodeToString(finalPacket),
176+
hex.EncodeToString(b.Bytes()))
177+
}
178+
}
179+
58180
func TestSphinxCorrectness(t *testing.T) {
59181
nodes, hopDatas, fwdMsg, err := newTestRoute(NumMaxHops)
60182
if err != nil {

0 commit comments

Comments
 (0)