@@ -3,6 +3,7 @@ package garlicecies
33import (
44 "crypto/ecdh"
55 "encoding/binary"
6+ "encoding/hex"
67 "errors"
78 "testing"
89
@@ -116,22 +117,49 @@ func TestRatchetBoundNewSessionDoesNotInstallBeforeCommit(t *testing.T) {
116117 }
117118}
118119
119- func TestReplyTagUsesJavaSessionReplyTagSetKDF (t * testing.T ) {
120+ func TestReplyTagSetKDFMatchesJavaI2P2130Vector (t * testing.T ) {
121+ // Generated by RatchetTagSet from the I2P 2.13.0 release router.jar
122+ // using i2p.jar SHA-256 1a6f9296fcd07854dffce9c11850c2ebe75a2269aab39e2be869168c0ebc6ef7.
123+ const javaData = "0665ff1f1ebfe25e4facf84840b0428296e73662ff3b77edfe4904bf7063e3fa"
124+ const javaNextRoot = "f764b2c8a236502964fde33cd9d81aaf882ba2403f59c916a3e244d9ffb0f6a7"
125+ javaEntries := []struct {
126+ tag string
127+ key string
128+ }{
129+ {"2698fd64096e9f0d" , "59e67dac8fe352e2956bd84f911efc7b6f1933c05da05360554c88614978ca66" },
130+ {"8eb1f7070dc0e53d" , "f822968404d098d2030a6b93eab2a6ca9c6eac4853a471bc60b82b43011232ae" },
131+ {"60c4eaee68a6ede1" , "e3e860ecd0f17cc31e2b86bfe45320980e8ca183aaaf18b4050584c65697d8a0" },
132+ }
120133 var chain [32 ]byte
121134 for i := range chain {
122135 chain [i ] = byte (i + 1 )
123136 }
124137 data := hkdf64 (chain [:], nil , "SessionReplyTags" )
138+ if got := hex .EncodeToString (data [:32 ]); got != javaData {
139+ t .Fatalf ("SessionReplyTags KDF = %s, want Java I2P 2.13.0 %s" , got , javaData )
140+ }
125141 set , err := newTagSet (0 , chain , data [:32 ], 1 )
126142 if err != nil {
127143 t .Fatal (err )
128144 }
129- entry , err := set .nextEntry ()
130- if err != nil {
131- t .Fatal (err )
145+ if got := hex .EncodeToString (set .nextRoot [:]); got != javaNextRoot {
146+ t .Fatalf ("next root = %s, want Java I2P 2.13.0 %s" , got , javaNextRoot )
132147 }
133- if got := deriveReplyTag (chain ); got != entry .tag {
134- t .Fatalf ("reply tag = %x, want Java/i2pd tagset %x" , got , entry .tag )
148+ reply := deriveReplyTag (chain )
149+ if got := hex .EncodeToString (reply [:]); got != javaEntries [0 ].tag {
150+ t .Fatalf ("reply tag = %s, want Java I2P 2.13.0 %s" , got , javaEntries [0 ].tag )
151+ }
152+ for index , want := range javaEntries {
153+ entry , nextErr := set .nextEntry ()
154+ if nextErr != nil {
155+ t .Fatal (nextErr )
156+ }
157+ if got := hex .EncodeToString (entry .tag [:]); got != want .tag {
158+ t .Fatalf ("tag %d = %s, want Java I2P 2.13.0 %s" , index , got , want .tag )
159+ }
160+ if got := hex .EncodeToString (entry .key [:]); got != want .key {
161+ t .Fatalf ("key %d = %s, want Java I2P 2.13.0 %s" , index , got , want .key )
162+ }
135163 }
136164}
137165
0 commit comments