1 // Copyright 2014 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
17 type hkdfTest struct {
26 var hkdfTests = []hkdfTest{
27 // Tests from RFC 5869
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,
36 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
37 0x08, 0x09, 0x0a, 0x0b, 0x0c,
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,
46 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
167 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
171 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
172 0x08, 0x09, 0x0a, 0x0b, 0x0c,
175 0x9b, 0x6c, 0x18, 0xc4, 0x32, 0xa7, 0xbf, 0x8f,
176 0x0e, 0x71, 0xc8, 0xeb, 0x88, 0xf4, 0xb3, 0x0b,
177 0xaa, 0x2b, 0xa2, 0x43,
180 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
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,
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,
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,
219 0x8a, 0xda, 0xe0, 0x9a, 0x2a, 0x30, 0x70, 0x59,
220 0x47, 0x8d, 0x30, 0x9b, 0x26, 0xc4, 0x11, 0x5a,
221 0x22, 0x4c, 0xfa, 0xf6,
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,
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,
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,
258 0xda, 0x8c, 0x8a, 0x73, 0xc7, 0xfa, 0x77, 0x28,
259 0x8e, 0xc6, 0xf5, 0xe7, 0xc2, 0x97, 0x78, 0x6a,
260 0xa0, 0xd3, 0x2d, 0x01,
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,
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,
281 0x2a, 0xdc, 0xca, 0xda, 0x18, 0x77, 0x9e, 0x7c,
282 0x20, 0x77, 0xad, 0x2e, 0xb1, 0x9d, 0x3f, 0x3e,
283 0x73, 0x13, 0x85, 0xdd,
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,
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)
304 hkdf := New(tt.hash, tt.master, tt.salt, tt.info)
305 out := make([]byte, len(tt.out))
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)
312 if !bytes.Equal(out, tt.out) {
313 t.Errorf("test %d: incorrect output: have %v, need %v.", i, out, tt.out)
316 hkdf = Expand(tt.hash, prk, tt.info)
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)
323 if !bytes.Equal(out, tt.out) {
324 t.Errorf("test %d: incorrect output from Expand: have %v, need %v.", i, out, tt.out)
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))
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))
341 if !bytes.Equal(out, tt.out) {
342 t.Errorf("test %d: incorrect output: have %v, need %v.", i, out, tt.out)
347 func TestHKDFLimit(t *testing.T) {
349 master := []byte{0x00, 0x01, 0x02, 0x03}
352 hkdf := New(hash, master, nil, info)
353 limit := hash().Size() * 255
354 out := make([]byte, limit)
356 // The maximum output bytes should be extractable
357 n, err := io.ReadFull(hkdf, out)
358 if n != limit || err != nil {
359 t.Errorf("not enough output bytes: %d, %v.", n, err)
362 // Reading one more should fail
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)
369 func Benchmark16ByteMD5Single(b *testing.B) {
370 benchmarkHKDFSingle(md5.New, 16, b)
373 func Benchmark20ByteSHA1Single(b *testing.B) {
374 benchmarkHKDFSingle(sha1.New, 20, b)
377 func Benchmark32ByteSHA256Single(b *testing.B) {
378 benchmarkHKDFSingle(sha256.New, 32, b)
381 func Benchmark64ByteSHA512Single(b *testing.B) {
382 benchmarkHKDFSingle(sha512.New, 64, b)
385 func Benchmark8ByteMD5Stream(b *testing.B) {
386 benchmarkHKDFStream(md5.New, 8, b)
389 func Benchmark16ByteMD5Stream(b *testing.B) {
390 benchmarkHKDFStream(md5.New, 16, b)
393 func Benchmark8ByteSHA1Stream(b *testing.B) {
394 benchmarkHKDFStream(sha1.New, 8, b)
397 func Benchmark20ByteSHA1Stream(b *testing.B) {
398 benchmarkHKDFStream(sha1.New, 20, b)
401 func Benchmark8ByteSHA256Stream(b *testing.B) {
402 benchmarkHKDFStream(sha256.New, 8, b)
405 func Benchmark32ByteSHA256Stream(b *testing.B) {
406 benchmarkHKDFStream(sha256.New, 32, b)
409 func Benchmark8ByteSHA512Stream(b *testing.B) {
410 benchmarkHKDFStream(sha512.New, 8, b)
413 func Benchmark64ByteSHA512Stream(b *testing.B) {
414 benchmarkHKDFStream(sha512.New, 64, b)
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)
423 b.SetBytes(int64(block))
426 for i := 0; i < b.N; i++ {
427 hkdf := New(hasher, master, salt, info)
428 io.ReadFull(hkdf, out)
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)
438 b.SetBytes(int64(block))
441 hkdf := New(hasher, master, salt, info)
442 for i := 0; i < b.N; i++ {
443 _, err := io.ReadFull(hkdf, out)
445 hkdf = New(hasher, master, salt, info)