1
2
3
4
5
6
7
8 package wycheproof
9
10 import (
11 "crypto"
12 "crypto/internal/cryptotest"
13 "encoding/hex"
14 "encoding/json"
15 "flag"
16 "fmt"
17 "internal/testenv"
18 "os"
19 "path"
20 "reflect"
21 "testing"
22 )
23
24
25
26 var wycheproofDir = flag.String("wycheproof-dir", "",
27 "path to a local Wycheproof checkout to load test vectors from.")
28
29
30
31
32
33
34
35
36 func LoadVectorFile(t *testing.T, filename string, value any) {
37 testenv.SkipIfShortAndSlow(t)
38
39
40
41
42
43
44
45
46
47 dir := *wycheproofDir
48 if dir == "" {
49 dir = cryptotest.FetchModule(
50 t, "github.com/c2sp/wycheproof", wycheproofVersion)
51 }
52
53 content, err := os.ReadFile(path.Join(dir, "testvectors_v1", filename))
54 if err != nil {
55 t.Fatalf("missing Wycheproof vector file %q: %v", filename, err)
56 }
57
58 err = json.Unmarshal(content, value)
59 if err != nil {
60 t.Fatalf("failed to unmarshal vector file %q: %v", filename, err)
61 }
62 }
63
64
65
66
67
68
69
70
71 func ShouldPass(t *testing.T, result Result, flags []string, flagsShouldPass map[string]bool) bool {
72 switch result {
73 case "valid":
74 return true
75 case "invalid":
76 return false
77 case "acceptable":
78 for _, flag := range flags {
79 pass, ok := flagsShouldPass[flag]
80 if !ok {
81 t.Fatalf("unspecified flag: %q", flag)
82 }
83 if !pass {
84 return false
85 }
86 }
87 return true
88 default:
89 t.Fatalf("unexpected result: %v", result)
90 return false
91 }
92 }
93
94
95
96 func ParseHash(h string) crypto.Hash {
97 switch h {
98 case "SHA-1":
99 return crypto.SHA1
100 case "SHA-256":
101 return crypto.SHA256
102 case "SHA-224":
103 return crypto.SHA224
104 case "SHA-384":
105 return crypto.SHA384
106 case "SHA-512":
107 return crypto.SHA512
108 case "SHA-512/224":
109 return crypto.SHA512_224
110 case "SHA-512/256":
111 return crypto.SHA512_256
112 case "SHA3-224":
113 return crypto.SHA3_224
114 case "SHA3-256":
115 return crypto.SHA3_256
116 case "SHA3-384":
117 return crypto.SHA3_384
118 case "SHA3-512":
119 return crypto.SHA3_512
120 default:
121 panic(fmt.Sprintf("unknown hash algorithm: %q", h))
122 }
123 }
124
125
126 func TestName(file string, tv any) string {
127 v := reflect.ValueOf(tv)
128 if v.Kind() == reflect.Pointer {
129 v = v.Elem()
130 }
131 tcID := v.FieldByName("TcId").Int()
132 comment := v.FieldByName("Comment").String()
133 name := fmt.Sprintf("%s #%d", file, tcID)
134 if comment != "" {
135 name += " " + comment
136 }
137 return name
138 }
139
140
141
142
143
144 func MustDecodeHex(h string) []byte {
145 d, err := hex.DecodeString(h)
146 if err != nil {
147 panic(err)
148 }
149 return d
150 }
151
152
153
154
155
156
157 func MustPanic(t *testing.T, name string, fn func()) {
158 t.Helper()
159 defer func() {
160 if r := recover(); r == nil {
161 t.Errorf("%s: expected panic but didn't get one", name)
162 }
163 }()
164 fn()
165 }
166
View as plain text