Skip to content

Commit 15b0860

Browse files
committed
test(ecies): add Java ratchet KDF vector
1 parent 7bfee99 commit 15b0860

1 file changed

Lines changed: 34 additions & 6 deletions

File tree

networking/internal/garlic/ecies/ratchet_test.go

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package garlicecies
33
import (
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

Comments
 (0)