1
2
3
4 package hkdf
5
6 import (
7 "bytes"
8 "crypto/md5"
9 "crypto/sha1"
10 "crypto/sha256"
11 "crypto/sha512"
12 "hash"
13 "io"
14 "testing"
15 )
16
17 type hkdfTest struct {
18 hash func() hash.Hash
19 master []byte
20 salt []byte
21 prk []byte
22 info []byte
23 out []byte
24 }
25
26 var hkdfTests = []hkdfTest{
27
28 {
29 sha256.New,
30 []byte{
31 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
32 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
33 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
34 },
35 []byte{
36 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
37 0x08, 0x09, 0x0a, 0x0b, 0x0c,
38 },
39 []byte{
40 0x07, 0x77, 0x09, 0x36, 0x2c, 0x2e, 0x32, 0xdf,
41 0x0d, 0xdc, 0x3f, 0x0d, 0xc4, 0x7b, 0xba, 0x63,
42 0x90, 0xb6, 0xc7, 0x3b, 0xb5, 0x0f, 0x9c, 0x31,
43 0x22, 0xec, 0x84, 0x4a, 0xd7, 0xc2, 0xb3, 0xe5,
44 },
45 []byte{
46 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
47 0xf8, 0xf9,
48 },
49 []byte{
50 0x3c, 0xb2, 0x5f, 0x25, 0xfa, 0xac, 0xd5, 0x7a,
51 0x90, 0x43, 0x4f, 0x64, 0xd0, 0x36, 0x2f, 0x2a,
52 0x2d, 0x2d, 0x0a, 0x90, 0xcf, 0x1a, 0x5a, 0x4c,
53 0x5d, 0xb0, 0x2d, 0x56, 0xec, 0xc4, 0xc5, 0xbf,
54 0x34, 0x00, 0x72, 0x08, 0xd5, 0xb8, 0x87, 0x18,
55 0x58, 0x65,
56 },
57 },
58 {
59 sha256.New,
60 []byte{
61 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
62 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
63 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
64 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
65 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
66 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
67 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
68 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
69 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
70 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
71 },
72 []byte{
73 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
74 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
75 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
76 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
77 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
78 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
79 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
80 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
81 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
82 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
83 },
84 []byte{
85 0x06, 0xa6, 0xb8, 0x8c, 0x58, 0x53, 0x36, 0x1a,
86 0x06, 0x10, 0x4c, 0x9c, 0xeb, 0x35, 0xb4, 0x5c,
87 0xef, 0x76, 0x00, 0x14, 0x90, 0x46, 0x71, 0x01,
88 0x4a, 0x19, 0x3f, 0x40, 0xc1, 0x5f, 0xc2, 0x44,
89 },
90 []byte{
91 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
92 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
93 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
94 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
95 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
96 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
97 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
98 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
99 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
100 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
101 },
102 []byte{
103 0xb1, 0x1e, 0x39, 0x8d, 0xc8, 0x03, 0x27, 0xa1,
104 0xc8, 0xe7, 0xf7, 0x8c, 0x59, 0x6a, 0x49, 0x34,
105 0x4f, 0x01, 0x2e, 0xda, 0x2d, 0x4e, 0xfa, 0xd8,
106 0xa0, 0x50, 0xcc, 0x4c, 0x19, 0xaf, 0xa9, 0x7c,
107 0x59, 0x04, 0x5a, 0x99, 0xca, 0xc7, 0x82, 0x72,
108 0x71, 0xcb, 0x41, 0xc6, 0x5e, 0x59, 0x0e, 0x09,
109 0xda, 0x32, 0x75, 0x60, 0x0c, 0x2f, 0x09, 0xb8,
110 0x36, 0x77, 0x93, 0xa9, 0xac, 0xa3, 0xdb, 0x71,
111 0xcc, 0x30, 0xc5, 0x81, 0x79, 0xec, 0x3e, 0x87,
112 0xc1, 0x4c, 0x01, 0xd5, 0xc1, 0xf3, 0x43, 0x4f,
113 0x1d, 0x87,
114 },
115 },
116 {
117 sha256.New,
118 []byte{
119 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
120 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
121 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
122 },
123 []byte{},
124 []byte{
125 0x19, 0xef, 0x24, 0xa3, 0x2c, 0x71, 0x7b, 0x16,
126 0x7f, 0x33, 0xa9, 0x1d, 0x6f, 0x64, 0x8b, 0xdf,
127 0x96, 0x59, 0x67, 0x76, 0xaf, 0xdb, 0x63, 0x77,
128 0xac, 0x43, 0x4c, 0x1c, 0x29, 0x3c, 0xcb, 0x04,
129 },
130 []byte{},
131 []byte{
132 0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f,
133 0x71, 0x5f, 0x80, 0x2a, 0x06, 0x3c, 0x5a, 0x31,
134 0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1, 0x87, 0x9e,
135 0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d,
136 0x9d, 0x20, 0x13, 0x95, 0xfa, 0xa4, 0xb6, 0x1a,
137 0x96, 0xc8,
138 },
139 },
140 {
141 sha256.New,
142 []byte{
143 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
144 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
145 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
146 },
147 nil,
148 []byte{
149 0x19, 0xef, 0x24, 0xa3, 0x2c, 0x71, 0x7b, 0x16,
150 0x7f, 0x33, 0xa9, 0x1d, 0x6f, 0x64, 0x8b, 0xdf,
151 0x96, 0x59, 0x67, 0x76, 0xaf, 0xdb, 0x63, 0x77,
152 0xac, 0x43, 0x4c, 0x1c, 0x29, 0x3c, 0xcb, 0x04,
153 },
154 nil,
155 []byte{
156 0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f,
157 0x71, 0x5f, 0x80, 0x2a, 0x06, 0x3c, 0x5a, 0x31,
158 0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1, 0x87, 0x9e,
159 0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d,
160 0x9d, 0x20, 0x13, 0x95, 0xfa, 0xa4, 0xb6, 0x1a,
161 0x96, 0xc8,
162 },
163 },
164 {
165 sha1.New,
166 []byte{
167 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
168 0x0b, 0x0b, 0x0b,
169 },
170 []byte{
171 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
172 0x08, 0x09, 0x0a, 0x0b, 0x0c,
173 },
174 []byte{
175 0x9b, 0x6c, 0x18, 0xc4, 0x32, 0xa7, 0xbf, 0x8f,
176 0x0e, 0x71, 0xc8, 0xeb, 0x88, 0xf4, 0xb3, 0x0b,
177 0xaa, 0x2b, 0xa2, 0x43,
178 },
179 []byte{
180 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
181 0xf8, 0xf9,
182 },
183 []byte{
184 0x08, 0x5a, 0x01, 0xea, 0x1b, 0x10, 0xf3, 0x69,
185 0x33, 0x06, 0x8b, 0x56, 0xef, 0xa5, 0xad, 0x81,
186 0xa4, 0xf1, 0x4b, 0x82, 0x2f, 0x5b, 0x09, 0x15,
187 0x68, 0xa9, 0xcd, 0xd4, 0xf1, 0x55, 0xfd, 0xa2,
188 0xc2, 0x2e, 0x42, 0x24, 0x78, 0xd3, 0x05, 0xf3,
189 0xf8, 0x96,
190 },
191 },
192 {
193 sha1.New,
194 []byte{
195 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
196 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
197 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
198 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
199 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
200 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
201 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
202 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
203 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
204 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
205 },
206 []byte{
207 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
208 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
209 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
210 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
211 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
212 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
213 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
214 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
215 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
216 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
217 },
218 []byte{
219 0x8a, 0xda, 0xe0, 0x9a, 0x2a, 0x30, 0x70, 0x59,
220 0x47, 0x8d, 0x30, 0x9b, 0x26, 0xc4, 0x11, 0x5a,
221 0x22, 0x4c, 0xfa, 0xf6,
222 },
223 []byte{
224 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
225 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
226 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
227 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
228 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
229 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
230 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
231 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
232 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
233 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
234 },
235 []byte{
236 0x0b, 0xd7, 0x70, 0xa7, 0x4d, 0x11, 0x60, 0xf7,
237 0xc9, 0xf1, 0x2c, 0xd5, 0x91, 0x2a, 0x06, 0xeb,
238 0xff, 0x6a, 0xdc, 0xae, 0x89, 0x9d, 0x92, 0x19,
239 0x1f, 0xe4, 0x30, 0x56, 0x73, 0xba, 0x2f, 0xfe,
240 0x8f, 0xa3, 0xf1, 0xa4, 0xe5, 0xad, 0x79, 0xf3,
241 0xf3, 0x34, 0xb3, 0xb2, 0x02, 0xb2, 0x17, 0x3c,
242 0x48, 0x6e, 0xa3, 0x7c, 0xe3, 0xd3, 0x97, 0xed,
243 0x03, 0x4c, 0x7f, 0x9d, 0xfe, 0xb1, 0x5c, 0x5e,
244 0x92, 0x73, 0x36, 0xd0, 0x44, 0x1f, 0x4c, 0x43,
245 0x00, 0xe2, 0xcf, 0xf0, 0xd0, 0x90, 0x0b, 0x52,
246 0xd3, 0xb4,
247 },
248 },
249 {
250 sha1.New,
251 []byte{
252 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
253 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
254 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
255 },
256 []byte{},
257 []byte{
258 0xda, 0x8c, 0x8a, 0x73, 0xc7, 0xfa, 0x77, 0x28,
259 0x8e, 0xc6, 0xf5, 0xe7, 0xc2, 0x97, 0x78, 0x6a,
260 0xa0, 0xd3, 0x2d, 0x01,
261 },
262 []byte{},
263 []byte{
264 0x0a, 0xc1, 0xaf, 0x70, 0x02, 0xb3, 0xd7, 0x61,
265 0xd1, 0xe5, 0x52, 0x98, 0xda, 0x9d, 0x05, 0x06,
266 0xb9, 0xae, 0x52, 0x05, 0x72, 0x20, 0xa3, 0x06,
267 0xe0, 0x7b, 0x6b, 0x87, 0xe8, 0xdf, 0x21, 0xd0,
268 0xea, 0x00, 0x03, 0x3d, 0xe0, 0x39, 0x84, 0xd3,
269 0x49, 0x18,
270 },
271 },
272 {
273 sha1.New,
274 []byte{
275 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
276 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
277 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
278 },
279 nil,
280 []byte{
281 0x2a, 0xdc, 0xca, 0xda, 0x18, 0x77, 0x9e, 0x7c,
282 0x20, 0x77, 0xad, 0x2e, 0xb1, 0x9d, 0x3f, 0x3e,
283 0x73, 0x13, 0x85, 0xdd,
284 },
285 nil,
286 []byte{
287 0x2c, 0x91, 0x11, 0x72, 0x04, 0xd7, 0x45, 0xf3,
288 0x50, 0x0d, 0x63, 0x6a, 0x62, 0xf6, 0x4f, 0x0a,
289 0xb3, 0xba, 0xe5, 0x48, 0xaa, 0x53, 0xd4, 0x23,
290 0xb0, 0xd1, 0xf2, 0x7e, 0xbb, 0xa6, 0xf5, 0xe5,
291 0x67, 0x3a, 0x08, 0x1d, 0x70, 0xcc, 0xe7, 0xac,
292 0xfc, 0x48,
293 },
294 },
295 }
296
297 func TestHKDF(t *testing.T) {
298 for i, tt := range hkdfTests {
299 prk := Extract(tt.hash, tt.master, tt.salt)
300 if !bytes.Equal(prk, tt.prk) {
301 t.Errorf("test %d: incorrect PRK: have %v, need %v.", i, prk, tt.prk)
302 }
303
304 hkdf := New(tt.hash, tt.master, tt.salt, tt.info)
305 out := make([]byte, len(tt.out))
306
307 n, err := io.ReadFull(hkdf, out)
308 if n != len(tt.out) || err != nil {
309 t.Errorf("test %d: not enough output bytes: %d.", i, n)
310 }
311
312 if !bytes.Equal(out, tt.out) {
313 t.Errorf("test %d: incorrect output: have %v, need %v.", i, out, tt.out)
314 }
315
316 hkdf = Expand(tt.hash, prk, tt.info)
317
318 n, err = io.ReadFull(hkdf, out)
319 if n != len(tt.out) || err != nil {
320 t.Errorf("test %d: not enough output bytes from Expand: %d.", i, n)
321 }
322
323 if !bytes.Equal(out, tt.out) {
324 t.Errorf("test %d: incorrect output from Expand: have %v, need %v.", i, out, tt.out)
325 }
326 }
327 }
328
329 func TestHKDFMultiRead(t *testing.T) {
330 for i, tt := range hkdfTests {
331 hkdf := New(tt.hash, tt.master, tt.salt, tt.info)
332 out := make([]byte, len(tt.out))
333
334 for b := 0; b < len(tt.out); b++ {
335 n, err := io.ReadFull(hkdf, out[b:b+1])
336 if n != 1 || err != nil {
337 t.Errorf("test %d.%d: not enough output bytes: have %d, need %d .", i, b, n, len(tt.out))
338 }
339 }
340
341 if !bytes.Equal(out, tt.out) {
342 t.Errorf("test %d: incorrect output: have %v, need %v.", i, out, tt.out)
343 }
344 }
345 }
346
347 func TestHKDFLimit(t *testing.T) {
348 hash := sha1.New
349 master := []byte{0x00, 0x01, 0x02, 0x03}
350 info := []byte{}
351
352 hkdf := New(hash, master, nil, info)
353 limit := hash().Size() * 255
354 out := make([]byte, limit)
355
356
357 n, err := io.ReadFull(hkdf, out)
358 if n != limit || err != nil {
359 t.Errorf("not enough output bytes: %d, %v.", n, err)
360 }
361
362
363 n, err = io.ReadFull(hkdf, make([]byte, 1))
364 if n > 0 || err == nil {
365 t.Errorf("key expansion overflowed: n = %d, err = %v", n, err)
366 }
367 }
368
369 func Benchmark16ByteMD5Single(b *testing.B) {
370 benchmarkHKDFSingle(md5.New, 16, b)
371 }
372
373 func Benchmark20ByteSHA1Single(b *testing.B) {
374 benchmarkHKDFSingle(sha1.New, 20, b)
375 }
376
377 func Benchmark32ByteSHA256Single(b *testing.B) {
378 benchmarkHKDFSingle(sha256.New, 32, b)
379 }
380
381 func Benchmark64ByteSHA512Single(b *testing.B) {
382 benchmarkHKDFSingle(sha512.New, 64, b)
383 }
384
385 func Benchmark8ByteMD5Stream(b *testing.B) {
386 benchmarkHKDFStream(md5.New, 8, b)
387 }
388
389 func Benchmark16ByteMD5Stream(b *testing.B) {
390 benchmarkHKDFStream(md5.New, 16, b)
391 }
392
393 func Benchmark8ByteSHA1Stream(b *testing.B) {
394 benchmarkHKDFStream(sha1.New, 8, b)
395 }
396
397 func Benchmark20ByteSHA1Stream(b *testing.B) {
398 benchmarkHKDFStream(sha1.New, 20, b)
399 }
400
401 func Benchmark8ByteSHA256Stream(b *testing.B) {
402 benchmarkHKDFStream(sha256.New, 8, b)
403 }
404
405 func Benchmark32ByteSHA256Stream(b *testing.B) {
406 benchmarkHKDFStream(sha256.New, 32, b)
407 }
408
409 func Benchmark8ByteSHA512Stream(b *testing.B) {
410 benchmarkHKDFStream(sha512.New, 8, b)
411 }
412
413 func Benchmark64ByteSHA512Stream(b *testing.B) {
414 benchmarkHKDFStream(sha512.New, 64, b)
415 }
416
417 func benchmarkHKDFSingle(hasher func() hash.Hash, block int, b *testing.B) {
418 master := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}
419 salt := []byte{0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17}
420 info := []byte{0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27}
421 out := make([]byte, block)
422
423 b.SetBytes(int64(block))
424 b.ResetTimer()
425
426 for i := 0; i < b.N; i++ {
427 hkdf := New(hasher, master, salt, info)
428 io.ReadFull(hkdf, out)
429 }
430 }
431
432 func benchmarkHKDFStream(hasher func() hash.Hash, block int, b *testing.B) {
433 master := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}
434 salt := []byte{0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17}
435 info := []byte{0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27}
436 out := make([]byte, block)
437
438 b.SetBytes(int64(block))
439 b.ResetTimer()
440
441 hkdf := New(hasher, master, salt, info)
442 for i := 0; i < b.N; i++ {
443 _, err := io.ReadFull(hkdf, out)
444 if err != nil {
445 hkdf = New(hasher, master, salt, info)
446 i--
447 }
448 }
449 }
450
View as plain text