@@ -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+
1589func 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+
58180func TestSphinxCorrectness (t * testing.T ) {
59181 nodes , hopDatas , fwdMsg , err := newTestRoute (NumMaxHops )
60182 if err != nil {
0 commit comments