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 <stdio.h>
16d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <string.h>
17d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
18d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/crypto.h>
19d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/digest.h>
20d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/err.h>
21d9e397b599b13d642138480a28c14db7a136bf0Adam Langley#include <openssl/hkdf.h>
22d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
23d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
24d9e397b599b13d642138480a28c14db7a136bf0Adam Langleytypedef struct {
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;
32d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const size_t out_len;
33d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  const uint8_t out[82];
34d9e397b599b13d642138480a28c14db7a136bf0Adam Langley} hkdf_test_vector_t;
35d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
36d9e397b599b13d642138480a28c14db7a136bf0Adam Langley/* These test vectors are from RFC 5869. */
37d9e397b599b13d642138480a28c14db7a136bf0Adam Langleystatic const hkdf_test_vector_t kTests[] = {
38d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  {
39d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    EVP_sha256,
40d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
41d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
42d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
43d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 22,
44d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
45d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
46d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0c,
47d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 13,
48d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
49d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
50d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 10,
51d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    42, {
52d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x3c, 0xb2, 0x5f, 0x25, 0xfa, 0xac, 0xd5, 0x7a, 0x90, 0x43, 0x4f, 0x64,
53d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xd0, 0x36, 0x2f, 0x2a, 0x2d, 0x2d, 0x0a, 0x90, 0xcf, 0x1a, 0x5a, 0x4c,
54d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x5d, 0xb0, 0x2d, 0x56, 0xec, 0xc4, 0xc5, 0xbf, 0x34, 0x00, 0x72, 0x08,
55d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xd5, 0xb8, 0x87, 0x18, 0x58, 0x65
56d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
57d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  },
58d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  {
59d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    EVP_sha256,
60d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
61d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
62d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
63d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
64d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
65d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
66d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
67d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
68d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 80,
69d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
70d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
71d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
72d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
73d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
74d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
75d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
76d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
77d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 80,
78d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
79d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,
80d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
81d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3,
82d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
83d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
84d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
85d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
86d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 80,
87d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    82, {
88d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xb1, 0x1e, 0x39, 0x8d, 0xc8, 0x03, 0x27, 0xa1, 0xc8, 0xe7, 0xf7, 0x8c,
89d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x59, 0x6a, 0x49, 0x34, 0x4f, 0x01, 0x2e, 0xda, 0x2d, 0x4e, 0xfa, 0xd8,
90d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xa0, 0x50, 0xcc, 0x4c, 0x19, 0xaf, 0xa9, 0x7c, 0x59, 0x04, 0x5a, 0x99,
91d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xca, 0xc7, 0x82, 0x72, 0x71, 0xcb, 0x41, 0xc6, 0x5e, 0x59, 0x0e, 0x09,
92d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xda, 0x32, 0x75, 0x60, 0x0c, 0x2f, 0x09, 0xb8, 0x36, 0x77, 0x93, 0xa9,
93d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xac, 0xa3, 0xdb, 0x71, 0xcc, 0x30, 0xc5, 0x81, 0x79, 0xec, 0x3e, 0x87,
94d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xc1, 0x4c, 0x01, 0xd5, 0xc1, 0xf3, 0x43, 0x4f, 0x1d, 0x87
95d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
96d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  },
97d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  {
98d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    EVP_sha256,
99d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
100d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
101d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
102d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 22,
103d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
104d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       0,
105d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 0,
106d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
107d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       0,
108d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 0,
109d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    42, {
110d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f, 0x71, 0x5f, 0x80, 0x2a,
111d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x06, 0x3c, 0x5a, 0x31, 0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1, 0x87, 0x9e,
112d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d, 0x9d, 0x20, 0x13, 0x95,
113d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xfa, 0xa4, 0xb6, 0x1a, 0x96, 0xc8
114d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
115d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  },
116d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  {
117d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    EVP_sha1,
118d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
119d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
120d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 11,
121d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
122d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
123d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0c,
124d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 13,
125d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
126d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
127d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 10,
128d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    42, {
129d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x08, 0x5a, 0x01, 0xea, 0x1b, 0x10, 0xf3, 0x69, 0x33, 0x06, 0x8b, 0x56,
130d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xef, 0xa5, 0xad, 0x81, 0xa4, 0xf1, 0x4b, 0x82, 0x2f, 0x5b, 0x09, 0x15,
131d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x68, 0xa9, 0xcd, 0xd4, 0xf1, 0x55, 0xfd, 0xa2, 0xc2, 0x2e, 0x42, 0x24,
132d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x78, 0xd3, 0x05, 0xf3, 0xf8, 0x96
133d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
134d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  },
135d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  {
136d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    EVP_sha1,
137d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
138d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
139d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
140d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
141d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
142d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
143d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
144d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f
145d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 80,
146d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
147d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
148d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
149d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
150d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
151d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
152d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
153d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf
154d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 80,
155d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
156d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,
157d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
158d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3,
159d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
160d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
161d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
162d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
163d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 80,
164d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    82, {
165d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0xd7, 0x70, 0xa7, 0x4d, 0x11, 0x60, 0xf7, 0xc9, 0xf1, 0x2c, 0xd5,
166d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x91, 0x2a, 0x06, 0xeb, 0xff, 0x6a, 0xdc, 0xae, 0x89, 0x9d, 0x92, 0x19,
167d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x1f, 0xe4, 0x30, 0x56, 0x73, 0xba, 0x2f, 0xfe, 0x8f, 0xa3, 0xf1, 0xa4,
168d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xe5, 0xad, 0x79, 0xf3, 0xf3, 0x34, 0xb3, 0xb2, 0x02, 0xb2, 0x17, 0x3c,
169d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x48, 0x6e, 0xa3, 0x7c, 0xe3, 0xd3, 0x97, 0xed, 0x03, 0x4c, 0x7f, 0x9d,
170d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xfe, 0xb1, 0x5c, 0x5e, 0x92, 0x73, 0x36, 0xd0, 0x44, 0x1f, 0x4c, 0x43,
171d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x00, 0xe2, 0xcf, 0xf0, 0xd0, 0x90, 0x0b, 0x52, 0xd3, 0xb4
172d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
173d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  },
174d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  {
175d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    EVP_sha1,
176d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
177d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
178d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
179d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 22,
180d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
181d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       0,
182d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 0,
183d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
184d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       0,
185d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 0,
186d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    42, {
187d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0a, 0xc1, 0xaf, 0x70, 0x02, 0xb3, 0xd7, 0x61, 0xd1, 0xe5, 0x52, 0x98,
188d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xda, 0x9d, 0x05, 0x06, 0xb9, 0xae, 0x52, 0x05, 0x72, 0x20, 0xa3, 0x06,
189d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xe0, 0x7b, 0x6b, 0x87, 0xe8, 0xdf, 0x21, 0xd0, 0xea, 0x00, 0x03, 0x3d,
190d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xe0, 0x39, 0x84, 0xd3, 0x49, 0x18
191d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
192d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  },
193d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  {
194d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    EVP_sha1,
195d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
196d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
197d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
198d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 22,
199d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
200d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       0,
201d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 0,
202d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    {
203d9e397b599b13d642138480a28c14db7a136bf0Adam Langley       0,
204d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }, 0,
205d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    42, {
206d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x2c, 0x91, 0x11, 0x72, 0x04, 0xd7, 0x45, 0xf3, 0x50, 0x0d, 0x63, 0x6a,
207d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x62, 0xf6, 0x4f, 0x0a, 0xb3, 0xba, 0xe5, 0x48, 0xaa, 0x53, 0xd4, 0x23,
208d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0xb0, 0xd1, 0xf2, 0x7e, 0xbb, 0xa6, 0xf5, 0xe5, 0x67, 0x3a, 0x08, 0x1d,
209d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      0x70, 0xcc, 0xe7, 0xac, 0xfc, 0x48
210d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
211d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  },
212d9e397b599b13d642138480a28c14db7a136bf0Adam Langley};
213d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
214d9e397b599b13d642138480a28c14db7a136bf0Adam Langleyint main(void) {
215d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  uint8_t buf[82];
216d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  size_t i;
217d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
218d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  CRYPTO_library_init();
219d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  ERR_load_crypto_strings();
220d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
221d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  for (i = 0; i < sizeof(kTests) / sizeof(kTests[0]); i++) {
222d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    const hkdf_test_vector_t *test = &kTests[i];
223d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (!HKDF(buf, test->out_len, test->md_func(), test->ikm, test->ikm_len,
224d9e397b599b13d642138480a28c14db7a136bf0Adam Langley              test->salt, test->salt_len, test->info, test->info_len)) {
225d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      fprintf(stderr, "Call to HKDF failed\n");
226e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley      ERR_print_errors_fp(stderr);
227d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      return 1;
228d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
229d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    if (memcmp(buf, test->out, test->out_len) != 0) {
230d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      fprintf(stderr, "%u: Resulting key material does not match test vector\n",
231d9e397b599b13d642138480a28c14db7a136bf0Adam Langley              (unsigned)i);
232d9e397b599b13d642138480a28c14db7a136bf0Adam Langley      return 1;
233d9e397b599b13d642138480a28c14db7a136bf0Adam Langley    }
234d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  }
235d9e397b599b13d642138480a28c14db7a136bf0Adam Langley
236d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  printf("PASS\n");
237d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  ERR_free_strings();
238d9e397b599b13d642138480a28c14db7a136bf0Adam Langley  return 0;
239d9e397b599b13d642138480a28c14db7a136bf0Adam Langley}
240