Skip to content

Commit e753d9f

Browse files
committed
paserk: Test against official test vectors
1 parent 107dc12 commit e753d9f

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed

paserk/vectors_test.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package paserk
2+
3+
import (
4+
"encoding/json"
5+
"os"
6+
"testing"
7+
8+
"aidanwoods.dev/go-paseto"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
type TestVectors struct {
13+
Name string
14+
Tests []TestVector
15+
}
16+
17+
type TestVector struct {
18+
Name string
19+
Key string
20+
Paserk string
21+
ExpectFail bool `json:"expect-fail"`
22+
Comment string
23+
}
24+
25+
func TestKID(t *testing.T) {
26+
testKID(t, paseto.V2SymmetricKeyFromHex, "../test-vectors/PASERK/k2.lid.json")
27+
testKID(t, paseto.NewV2AsymmetricSecretKeyFromHex, "../test-vectors/PASERK/k2.sid.json")
28+
testKID(t, paseto.NewV2AsymmetricPublicKeyFromHex, "../test-vectors/PASERK/k2.pid.json")
29+
testKID(t, paseto.V3SymmetricKeyFromHex, "../test-vectors/PASERK/k3.lid.json")
30+
testKID(t, paseto.NewV3AsymmetricSecretKeyFromHex, "../test-vectors/PASERK/k3.sid.json")
31+
testKID(t, paseto.NewV3AsymmetricPublicKeyFromHex, "../test-vectors/PASERK/k3.pid.json")
32+
testKID(t, paseto.V4SymmetricKeyFromHex, "../test-vectors/PASERK/k4.lid.json")
33+
testKID(t, paseto.NewV4AsymmetricSecretKeyFromHex, "../test-vectors/PASERK/k4.sid.json")
34+
testKID(t, paseto.NewV4AsymmetricPublicKeyFromHex, "../test-vectors/PASERK/k4.pid.json")
35+
}
36+
37+
type keyLoader[T Key] func(hexEncoded string) (T, error)
38+
39+
func testKID[T Key](t *testing.T, loader keyLoader[T], path string) {
40+
data, err := os.ReadFile(path)
41+
require.NoError(t, err)
42+
43+
var tests TestVectors
44+
err = json.Unmarshal(data, &tests)
45+
require.NoError(t, err)
46+
47+
for _, test := range tests.Tests {
48+
t.Run(test.Name, func(t *testing.T) {
49+
key, err := loader(test.Key)
50+
if test.ExpectFail {
51+
require.Error(t, err)
52+
return
53+
}
54+
55+
kid, err := SerializeKeyID(key)
56+
require.NoError(t, err)
57+
require.Equal(t, test.Paserk, kid)
58+
})
59+
}
60+
}
61+
62+
func TestSerialization(t *testing.T) {
63+
testSerialization(t, paseto.V2SymmetricKeyFromHex, "../test-vectors/PASERK/k2.local.json")
64+
testSerialization(t, paseto.NewV2AsymmetricSecretKeyFromHex, "../test-vectors/PASERK/k2.secret.json")
65+
testSerialization(t, paseto.NewV2AsymmetricPublicKeyFromHex, "../test-vectors/PASERK/k2.public.json")
66+
testSerialization(t, paseto.V3SymmetricKeyFromHex, "../test-vectors/PASERK/k3.local.json")
67+
testSerialization(t, paseto.NewV3AsymmetricSecretKeyFromHex, "../test-vectors/PASERK/k3.secret.json")
68+
testSerialization(t, paseto.NewV3AsymmetricPublicKeyFromHex, "../test-vectors/PASERK/k3.public.json")
69+
testSerialization(t, paseto.V4SymmetricKeyFromHex, "../test-vectors/PASERK/k4.local.json")
70+
testSerialization(t, paseto.NewV4AsymmetricSecretKeyFromHex, "../test-vectors/PASERK/k4.secret.json")
71+
testSerialization(t, paseto.NewV4AsymmetricPublicKeyFromHex, "../test-vectors/PASERK/k4.public.json")
72+
}
73+
74+
func testSerialization[T Key](t *testing.T, loader keyLoader[T], path string) {
75+
data, err := os.ReadFile(path)
76+
require.NoError(t, err)
77+
78+
var tests TestVectors
79+
err = json.Unmarshal(data, &tests)
80+
require.NoError(t, err)
81+
82+
for _, test := range tests.Tests {
83+
t.Run(test.Name, func(t *testing.T) {
84+
deserialized, err := DeserializeKey[T](test.Paserk)
85+
if test.ExpectFail {
86+
require.Error(t, err)
87+
return
88+
}
89+
require.NoError(t, err)
90+
91+
key, err := loader(test.Key)
92+
require.NoError(t, err)
93+
require.Equal(t, key, deserialized)
94+
95+
paserk, err := SerializeKey(key)
96+
require.NoError(t, err)
97+
require.Equal(t, test.Paserk, paserk)
98+
})
99+
}
100+
}

0 commit comments

Comments
 (0)