1d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* Copyright (c) 2014, Google Inc.
2d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
3d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * Permission to use, copy, modify, and/or distribute this software for any
4d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * purpose with or without fee is hereby granted, provided that the above
5d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * copyright notice and this permission notice appear in all copies.
6d9e397b599b13d642138480a28c14db7a136bf0Adam Langley *
7d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13d9e397b599b13d642138480a28c14db7a136bf0Adam Langley * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
15d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/digest.h>
16d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/err.h>
17d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/hkdf.h>
18d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
198ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan#include <gtest/gtest.h>
208ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan
214969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin#include "../test/test_util.h"
224969cc9b0ab2905ec478277f50ed3849b37a6c6bDavid Benjamin
23d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
2469939df2891f62f7f00ff2ac275f1cd81a67454cRobert Sloanstruct HKDFTestVector {
25d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const EVP_MD *(*md_func)(void);
26d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const uint8_t ikm[80];
27d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const size_t ikm_len;
28d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const uint8_t salt[80];
29d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const size_t salt_len;
30d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const uint8_t info[80];
31d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const size_t info_len;
32d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin  const uint8_t prk[EVP_MAX_MD_SIZE];
33d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin  const size_t prk_len;
34d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const size_t out_len;
35d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const uint8_t out[82];
3669939df2891f62f7f00ff2ac275f1cd81a67454cRobert Sloan};
37d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
388f860b133896bf655e4342ecefe692d52df81d48Robert Sloan// These test vectors are from RFC 5869.
3969939df2891f62f7f00ff2ac275f1cd81a67454cRobert Sloanstatic const HKDFTestVector kTests[] = {
40d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  {
41d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    EVP_sha256,
42d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
43d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
44d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
45d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 22,
46d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
47d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
48d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0c,
49d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 13,
50d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
51d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
52d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 10,
53d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin    {
54d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin      0x07, 0x77, 0x09, 0x36, 0x2c, 0x2e, 0x32, 0xdf, 0x0d, 0xdc, 0x3f, 0x0d,
55d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin      0xc4, 0x7b, 0xba, 0x63, 0x90, 0xb6, 0xc7, 0x3b, 0xb5, 0x0f, 0x9c, 0x31,
56d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin      0x22, 0xec, 0x84, 0x4a, 0xd7, 0xc2, 0xb3, 0xe5,
57d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin    }, 32,
58d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    42, {
59d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x3c, 0xb2, 0x5f, 0x25, 0xfa, 0xac, 0xd5, 0x7a, 0x90, 0x43, 0x4f, 0x64,
60d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xd0, 0x36, 0x2f, 0x2a, 0x2d, 0x2d, 0x0a, 0x90, 0xcf, 0x1a, 0x5a, 0x4c,
61d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x5d, 0xb0, 0x2d, 0x56, 0xec, 0xc4, 0xc5, 0xbf, 0x34, 0x00, 0x72, 0x08,
62d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xd5, 0xb8, 0x87, 0x18, 0x58, 0x65
63d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
64d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  },
65d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  {
66d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    EVP_sha256,
67d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
68d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
69d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
70d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
71d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
72d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
73d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
74d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
75d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 80,
76d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
77d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
78d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
79d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
80d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
81d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
82d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
83d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
84d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 80,
85d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
86d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,
87d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
88d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3,
89d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
90d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
91d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
92d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
93d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 80,
94d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin    {
95d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin       0x06, 0xa6, 0xb8, 0x8c, 0x58, 0x53, 0x36, 0x1a, 0x06, 0x10, 0x4c, 0x9c,
96d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin       0xeb, 0x35, 0xb4, 0x5c, 0xef, 0x76, 0x00, 0x14, 0x90, 0x46, 0x71, 0x01,
97d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin       0x4a, 0x19, 0x3f, 0x40, 0xc1, 0x5f, 0xc2, 0x44,
98d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin    }, 32,
99d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    82, {
100d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xb1, 0x1e, 0x39, 0x8d, 0xc8, 0x03, 0x27, 0xa1, 0xc8, 0xe7, 0xf7, 0x8c,
101d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x59, 0x6a, 0x49, 0x34, 0x4f, 0x01, 0x2e, 0xda, 0x2d, 0x4e, 0xfa, 0xd8,
102d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xa0, 0x50, 0xcc, 0x4c, 0x19, 0xaf, 0xa9, 0x7c, 0x59, 0x04, 0x5a, 0x99,
103d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xca, 0xc7, 0x82, 0x72, 0x71, 0xcb, 0x41, 0xc6, 0x5e, 0x59, 0x0e, 0x09,
104d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xda, 0x32, 0x75, 0x60, 0x0c, 0x2f, 0x09, 0xb8, 0x36, 0x77, 0x93, 0xa9,
105d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xac, 0xa3, 0xdb, 0x71, 0xcc, 0x30, 0xc5, 0x81, 0x79, 0xec, 0x3e, 0x87,
106d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xc1, 0x4c, 0x01, 0xd5, 0xc1, 0xf3, 0x43, 0x4f, 0x1d, 0x87
107d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
108d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  },
109d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  {
110d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    EVP_sha256,
111d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
112d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
113d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
114d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 22,
115d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
116d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       0,
117d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 0,
118d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
119d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       0,
120d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 0,
121d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin    {
122d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin      0x19, 0xef, 0x24, 0xa3, 0x2c, 0x71, 0x7b, 0x16, 0x7f, 0x33, 0xa9, 0x1d,
123d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin      0x6f, 0x64, 0x8b, 0xdf, 0x96, 0x59, 0x67, 0x76, 0xaf, 0xdb, 0x63, 0x77,
124d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin      0xac, 0x43, 0x4c, 0x1c, 0x29, 0x3c, 0xcb, 0x04
125d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin    }, 32,
126d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    42, {
127d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f, 0x71, 0x5f, 0x80, 0x2a,
128d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x06, 0x3c, 0x5a, 0x31, 0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1, 0x87, 0x9e,
129d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d, 0x9d, 0x20, 0x13, 0x95,
130d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xfa, 0xa4, 0xb6, 0x1a, 0x96, 0xc8
131d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
132d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  },
133d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  {
134d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    EVP_sha1,
135d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
136d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
137d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 11,
138d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
139d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
140d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0c,
141d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 13,
142d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
143d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
144d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 10,
145d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin    {
146d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin      0x9b, 0x6c, 0x18, 0xc4, 0x32, 0xa7, 0xbf, 0x8f, 0x0e, 0x71, 0xc8, 0xeb,
147d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin      0x88, 0xf4, 0xb3, 0x0b, 0xaa, 0x2b, 0xa2, 0x43
148d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin    }, 20,
149d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    42, {
150d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x08, 0x5a, 0x01, 0xea, 0x1b, 0x10, 0xf3, 0x69, 0x33, 0x06, 0x8b, 0x56,
151d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xef, 0xa5, 0xad, 0x81, 0xa4, 0xf1, 0x4b, 0x82, 0x2f, 0x5b, 0x09, 0x15,
152d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x68, 0xa9, 0xcd, 0xd4, 0xf1, 0x55, 0xfd, 0xa2, 0xc2, 0x2e, 0x42, 0x24,
153d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x78, 0xd3, 0x05, 0xf3, 0xf8, 0x96
154d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
155d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  },
156d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  {
157d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    EVP_sha1,
158d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
159d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
160d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
161d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
162d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
163d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
164d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
165d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
166d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 80,
167d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
168d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
169d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
170d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
171d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
172d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
173d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
174d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
175d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 80,
176d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
177d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,
178d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
179d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3,
180d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
181d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
182d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
183d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
184d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 80,
185d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin    {
186d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin      0x8a, 0xda, 0xe0, 0x9a, 0x2a, 0x30, 0x70, 0x59, 0x47, 0x8d, 0x30, 0x9b,
187d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin      0x26, 0xc4, 0x11, 0x5a, 0x22, 0x4c, 0xfa, 0xf6,
188d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin    }, 20,
189d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    82, {
190d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0xd7, 0x70, 0xa7, 0x4d, 0x11, 0x60, 0xf7, 0xc9, 0xf1, 0x2c, 0xd5,
191d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x91, 0x2a, 0x06, 0xeb, 0xff, 0x6a, 0xdc, 0xae, 0x89, 0x9d, 0x92, 0x19,
192d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x1f, 0xe4, 0x30, 0x56, 0x73, 0xba, 0x2f, 0xfe, 0x8f, 0xa3, 0xf1, 0xa4,
193d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xe5, 0xad, 0x79, 0xf3, 0xf3, 0x34, 0xb3, 0xb2, 0x02, 0xb2, 0x17, 0x3c,
194d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x48, 0x6e, 0xa3, 0x7c, 0xe3, 0xd3, 0x97, 0xed, 0x03, 0x4c, 0x7f, 0x9d,
195d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xfe, 0xb1, 0x5c, 0x5e, 0x92, 0x73, 0x36, 0xd0, 0x44, 0x1f, 0x4c, 0x43,
196d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x00, 0xe2, 0xcf, 0xf0, 0xd0, 0x90, 0x0b, 0x52, 0xd3, 0xb4
197d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
198d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  },
199d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  {
200d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    EVP_sha1,
201d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
202d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
203d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
204d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 22,
205d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
206d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       0,
207d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 0,
208d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
209d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       0,
210d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 0,
211d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin    {
212d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin      0xda, 0x8c, 0x8a, 0x73, 0xc7, 0xfa, 0x77, 0x28, 0x8e, 0xc6, 0xf5, 0xe7,
213d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin      0xc2, 0x97, 0x78, 0x6a, 0xa0, 0xd3, 0x2d, 0x01,
214d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin    }, 20,
215d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    42, {
216d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0a, 0xc1, 0xaf, 0x70, 0x02, 0xb3, 0xd7, 0x61, 0xd1, 0xe5, 0x52, 0x98,
217d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xda, 0x9d, 0x05, 0x06, 0xb9, 0xae, 0x52, 0x05, 0x72, 0x20, 0xa3, 0x06,
218d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xe0, 0x7b, 0x6b, 0x87, 0xe8, 0xdf, 0x21, 0xd0, 0xea, 0x00, 0x03, 0x3d,
219d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xe0, 0x39, 0x84, 0xd3, 0x49, 0x18
220d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
221d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  },
222d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  {
223d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    EVP_sha1,
224d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
225d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
226d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
227d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 22,
228d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
229d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       0,
230d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 0,
231d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
232d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       0,
233d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 0,
234d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin    {
235d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin      0x2a, 0xdc, 0xca, 0xda, 0x18, 0x77, 0x9e, 0x7c, 0x20, 0x77, 0xad, 0x2e,
236d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin      0xb1, 0x9d, 0x3f, 0x3e, 0x73, 0x13, 0x85, 0xdd,
237d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin    }, 20,
238d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    42, {
239d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x2c, 0x91, 0x11, 0x72, 0x04, 0xd7, 0x45, 0xf3, 0x50, 0x0d, 0x63, 0x6a,
240d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x62, 0xf6, 0x4f, 0x0a, 0xb3, 0xba, 0xe5, 0x48, 0xaa, 0x53, 0xd4, 0x23,
241d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xb0, 0xd1, 0xf2, 0x7e, 0xbb, 0xa6, 0xf5, 0xe5, 0x67, 0x3a, 0x08, 0x1d,
242d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x70, 0xcc, 0xe7, 0xac, 0xfc, 0x48
243d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
244d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  },
245d9e397b599b13d642138480a28c14db7a136bf0Adam Langley};
246d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
2478ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert SloanTEST(HKDFTest, TestVectors) {
24869939df2891f62f7f00ff2ac275f1cd81a67454cRobert Sloan  for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kTests); i++) {
2498ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan    SCOPED_TRACE(i);
25069939df2891f62f7f00ff2ac275f1cd81a67454cRobert Sloan    const HKDFTestVector *test = &kTests[i];
2518ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan
25269939df2891f62f7f00ff2ac275f1cd81a67454cRobert Sloan    uint8_t prk[EVP_MAX_MD_SIZE];
25369939df2891f62f7f00ff2ac275f1cd81a67454cRobert Sloan    size_t prk_len;
2548ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan    ASSERT_TRUE(HKDF_extract(prk, &prk_len, test->md_func(), test->ikm,
2558ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan                             test->ikm_len, test->salt, test->salt_len));
2568ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan    EXPECT_EQ(Bytes(test->prk, test->prk_len), Bytes(prk, prk_len));
2578ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan
25869939df2891f62f7f00ff2ac275f1cd81a67454cRobert Sloan    uint8_t buf[82];
2598ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan    ASSERT_TRUE(HKDF_expand(buf, test->out_len, test->md_func(), prk, prk_len,
2608ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan                            test->info, test->info_len));
2618ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan    EXPECT_EQ(Bytes(test->out, test->out_len), Bytes(buf, test->out_len));
262d316cba52b5aeac660e03068e65dd873669ce1dbDavid Benjamin
2638ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan    ASSERT_TRUE(HKDF(buf, test->out_len, test->md_func(), test->ikm,
2648ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan                     test->ikm_len, test->salt, test->salt_len, test->info,
2658ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan                     test->info_len));
2668ff035535f7cf2903f02bbe94d2fa10b7ab855f1Robert Sloan    EXPECT_EQ(Bytes(test->out, test->out_len), Bytes(buf, test->out_len));
267d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
268d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
269