]> git.ipfire.org Git - thirdparty/openssl.git/blob - test/evp_kdf_test.c
Remove getenv(OPENSSL_FIPS) in openssl command
[thirdparty/openssl.git] / test / evp_kdf_test.c
1 /*
2 * Copyright 2018-2019 The OpenSSL Project Authors. All Rights Reserved.
3 * Copyright (c) 2018-2019, Oracle and/or its affiliates. All rights reserved.
4 *
5 * Licensed under the Apache License 2.0 (the "License"). You may not use
6 * this file except in compliance with the License. You can obtain a copy
7 * in the file LICENSE in the source distribution or at
8 * https://www.openssl.org/source/license.html
9 */
10
11 /* Tests of the EVP_KDF_CTX APIs */
12
13 #include <stdio.h>
14 #include <string.h>
15
16 #include <openssl/evp.h>
17 #include <openssl/kdf.h>
18 #include <openssl/core_names.h>
19 #include "testutil.h"
20
21 static EVP_KDF_CTX *get_kdfbyname(const char *name)
22 {
23 EVP_KDF *kdf = EVP_KDF_fetch(NULL, name, NULL);
24 EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf);
25
26 EVP_KDF_free(kdf);
27 return kctx;
28 }
29
30 static int test_kdf_tls1_prf(void)
31 {
32 int ret;
33 EVP_KDF_CTX *kctx = NULL;
34 unsigned char out[16];
35 OSSL_PARAM params[4], *p = params;
36 static const unsigned char expected[sizeof(out)] = {
37 0x8e, 0x4d, 0x93, 0x25, 0x30, 0xd7, 0x65, 0xa0,
38 0xaa, 0xe9, 0x74, 0xc3, 0x04, 0x73, 0x5e, 0xcc
39 };
40
41 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST,
42 (char *)"sha256", sizeof("sha256"));
43 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SECRET,
44 (unsigned char *)"secret",
45 (size_t)6);
46 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SEED,
47 (unsigned char *)"seed",
48 (size_t)4);
49 *p = OSSL_PARAM_construct_end();
50
51 ret =
52 TEST_ptr(kctx = get_kdfbyname(OSSL_KDF_NAME_TLS1_PRF))
53 && TEST_true(EVP_KDF_CTX_set_params(kctx, params))
54 && TEST_int_gt(EVP_KDF_derive(kctx, out, sizeof(out)), 0)
55 && TEST_mem_eq(out, sizeof(out), expected, sizeof(expected));
56
57 EVP_KDF_CTX_free(kctx);
58 return ret;
59 }
60
61 static int test_kdf_hkdf(void)
62 {
63 int ret;
64 EVP_KDF_CTX *kctx;
65 unsigned char out[10];
66 OSSL_PARAM params[5], *p = params;
67 static const unsigned char expected[sizeof(out)] = {
68 0x2a, 0xc4, 0x36, 0x9f, 0x52, 0x59, 0x96, 0xf8, 0xde, 0x13
69 };
70
71 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST,
72 (char *)"sha256", sizeof("sha256"));
73 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT,
74 (unsigned char *)"salt", 4);
75 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY,
76 (unsigned char *)"secret", 6);
77 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO,
78 (unsigned char *)"label", 5);
79 *p = OSSL_PARAM_construct_end();
80
81 ret =
82 TEST_ptr(kctx = get_kdfbyname(OSSL_KDF_NAME_HKDF))
83 && TEST_true(EVP_KDF_CTX_set_params(kctx, params))
84 && TEST_int_gt(EVP_KDF_derive(kctx, out, sizeof(out)), 0)
85 && TEST_mem_eq(out, sizeof(out), expected, sizeof(expected));
86
87 EVP_KDF_CTX_free(kctx);
88 return ret;
89 }
90
91 static int test_kdf_pbkdf2(void)
92 {
93 int ret = 0;
94 EVP_KDF_CTX *kctx;
95 unsigned char out[25];
96 size_t len = 0;
97 unsigned int iterations = 4096;
98 int mode = 0;
99 OSSL_PARAM params[6], *p = params;
100 const unsigned char expected[sizeof(out)] = {
101 0x34, 0x8c, 0x89, 0xdb, 0xcb, 0xd3, 0x2b, 0x2f,
102 0x32, 0xd8, 0x14, 0xb8, 0x11, 0x6e, 0x84, 0xcf,
103 0x2b, 0x17, 0x34, 0x7e, 0xbc, 0x18, 0x00, 0x18,
104 0x1c
105 };
106
107 if (sizeof(len) > 32)
108 len = SIZE_MAX;
109
110 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_PASSWORD,
111 (unsigned char *)
112 "passwordPASSWORDpassword", 24);
113 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT,
114 (unsigned char *)
115 "saltSALTsaltSALTsaltSALTsaltSALTsalt",
116 36);
117 *p++ = OSSL_PARAM_construct_uint(OSSL_KDF_PARAM_ITER, &iterations);
118 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST,
119 (char *)"sha256", 7);
120 *p++ = OSSL_PARAM_construct_int(OSSL_KDF_PARAM_PKCS5, &mode);
121 *p = OSSL_PARAM_construct_end();
122
123 if (!TEST_ptr(kctx = get_kdfbyname(OSSL_KDF_NAME_PBKDF2))
124 || !TEST_true(EVP_KDF_CTX_set_params(kctx, params))
125 || !TEST_int_gt(EVP_KDF_derive(kctx, out, sizeof(out)), 0)
126 || !TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))
127 || !TEST_true(EVP_KDF_CTX_set_params(kctx, params))
128 /* A key length that is too small should fail */
129 || !TEST_int_eq(EVP_KDF_derive(kctx, out, 112 / 8 - 1), 0)
130 /* A key length that is too large should fail */
131 || (len != 0 && !TEST_int_eq(EVP_KDF_derive(kctx, out, len), 0)))
132 goto err;
133 #if 0
134 /* TODO */
135 /* Salt length less than 128 bits should fail */
136 || TEST_int_eq(EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_SALT,
137 "123456781234567",
138 (size_t)15), 0)
139 /* A small iteration count should fail */
140 || TEST_int_eq(EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_ITER, 1), 0)
141 || TEST_int_gt(EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_PBKDF2_PKCS5_MODE,
142 1), 0)
143 /* Small salts will pass if the "pkcs5" mode is enabled */
144 || TEST_int_gt(EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_SALT,
145 "123456781234567",
146 (size_t)15), 0)
147 /* A small iteration count will pass if "pkcs5" mode is enabled */
148 || TEST_int_gt(EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_ITER, 1), 0)
149 /*
150 * If the "pkcs5" mode is disabled then the small salt and iter will
151 * fail when the derive gets called.
152 */
153 || TEST_int_gt(EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_PBKDF2_PKCS5_MODE,
154 0), 0)
155 || TEST_int_eq(EVP_KDF_derive(kctx, out, sizeof(out)), 0);
156 #endif
157 ret = 1;
158 err:
159 EVP_KDF_CTX_free(kctx);
160 return ret;
161 }
162
163 #ifndef OPENSSL_NO_SCRYPT
164 static int test_kdf_scrypt(void)
165 {
166 int ret;
167 EVP_KDF_CTX *kctx;
168 OSSL_PARAM params[7], *p = params;
169 unsigned char out[64];
170 unsigned int nu = 1024, ru = 8, pu = 16, maxmem = 16;
171 static const unsigned char expected[sizeof(out)] = {
172 0xfd, 0xba, 0xbe, 0x1c, 0x9d, 0x34, 0x72, 0x00,
173 0x78, 0x56, 0xe7, 0x19, 0x0d, 0x01, 0xe9, 0xfe,
174 0x7c, 0x6a, 0xd7, 0xcb, 0xc8, 0x23, 0x78, 0x30,
175 0xe7, 0x73, 0x76, 0x63, 0x4b, 0x37, 0x31, 0x62,
176 0x2e, 0xaf, 0x30, 0xd9, 0x2e, 0x22, 0xa3, 0x88,
177 0x6f, 0xf1, 0x09, 0x27, 0x9d, 0x98, 0x30, 0xda,
178 0xc7, 0x27, 0xaf, 0xb9, 0x4a, 0x83, 0xee, 0x6d,
179 0x83, 0x60, 0xcb, 0xdf, 0xa2, 0xcc, 0x06, 0x40
180 };
181
182 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_PASSWORD,
183 (char *)"password", 8);
184 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT,
185 (char *)"NaCl", 4);
186 *p++ = OSSL_PARAM_construct_uint(OSSL_KDF_PARAM_SCRYPT_N, &nu);
187 *p++ = OSSL_PARAM_construct_uint(OSSL_KDF_PARAM_SCRYPT_R, &ru);
188 *p++ = OSSL_PARAM_construct_uint(OSSL_KDF_PARAM_SCRYPT_P, &pu);
189 *p++ = OSSL_PARAM_construct_uint(OSSL_KDF_PARAM_SCRYPT_MAXMEM, &maxmem);
190 *p = OSSL_PARAM_construct_end();
191
192 ret =
193 TEST_ptr(kctx = get_kdfbyname(OSSL_KDF_NAME_SCRYPT))
194 && TEST_true(EVP_KDF_CTX_set_params(kctx, params))
195 /* failure test *//*
196 && TEST_int_le(EVP_KDF_derive(kctx, out, sizeof(out)), 0)*/
197 && TEST_true(OSSL_PARAM_set_uint(p - 1, 10 * 1024 * 1024))
198 && TEST_true(EVP_KDF_CTX_set_params(kctx, p - 1))
199 && TEST_int_gt(EVP_KDF_derive(kctx, out, sizeof(out)), 0)
200 && TEST_mem_eq(out, sizeof(out), expected, sizeof(expected));
201
202 EVP_KDF_CTX_free(kctx);
203 return ret;
204 }
205 #endif /* OPENSSL_NO_SCRYPT */
206
207 static int test_kdf_ss_hash(void)
208 {
209 int ret;
210 EVP_KDF_CTX *kctx;
211 OSSL_PARAM params[4], *p = params;
212 unsigned char out[14];
213 static unsigned char z[] = {
214 0x6d,0xbd,0xc2,0x3f,0x04,0x54,0x88,0xe4,0x06,0x27,0x57,0xb0,0x6b,0x9e,
215 0xba,0xe1,0x83,0xfc,0x5a,0x59,0x46,0xd8,0x0d,0xb9,0x3f,0xec,0x6f,0x62,
216 0xec,0x07,0xe3,0x72,0x7f,0x01,0x26,0xae,0xd1,0x2c,0xe4,0xb2,0x62,0xf4,
217 0x7d,0x48,0xd5,0x42,0x87,0xf8,0x1d,0x47,0x4c,0x7c,0x3b,0x18,0x50,0xe9
218 };
219 static unsigned char other[] = {
220 0xa1,0xb2,0xc3,0xd4,0xe5,0x43,0x41,0x56,0x53,0x69,0x64,0x3c,0x83,0x2e,
221 0x98,0x49,0xdc,0xdb,0xa7,0x1e,0x9a,0x31,0x39,0xe6,0x06,0xe0,0x95,0xde,
222 0x3c,0x26,0x4a,0x66,0xe9,0x8a,0x16,0x58,0x54,0xcd,0x07,0x98,0x9b,0x1e,
223 0xe0,0xec,0x3f,0x8d,0xbe
224 };
225 static const unsigned char expected[sizeof(out)] = {
226 0xa4,0x62,0xde,0x16,0xa8,0x9d,0xe8,0x46,0x6e,0xf5,0x46,0x0b,0x47,0xb8
227 };
228
229 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST,
230 (char *)"sha224", sizeof("sha224"));
231 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, z, sizeof(z));
232 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO, other,
233 sizeof(other));
234 *p = OSSL_PARAM_construct_end();
235
236 ret =
237 TEST_ptr(kctx = get_kdfbyname(OSSL_KDF_NAME_SSKDF))
238 && TEST_true(EVP_KDF_CTX_set_params(kctx, params))
239 && TEST_int_gt(EVP_KDF_derive(kctx, out, sizeof(out)), 0)
240 && TEST_mem_eq(out, sizeof(out), expected, sizeof(expected));
241
242 EVP_KDF_CTX_free(kctx);
243 return ret;
244 }
245
246 static int test_kdf_x963(void)
247 {
248 int ret;
249 EVP_KDF_CTX *kctx;
250 OSSL_PARAM params[4], *p = params;
251 unsigned char out[1024 / 8];
252 /*
253 * Test data from https://csrc.nist.gov/CSRC/media/Projects/
254 * Cryptographic-Algorithm-Validation-Program/documents/components/
255 * 800-135testvectors/ansx963_2001.zip
256 */
257 static unsigned char z[] = {
258 0x00, 0xaa, 0x5b, 0xb7, 0x9b, 0x33, 0xe3, 0x89, 0xfa, 0x58, 0xce, 0xad,
259 0xc0, 0x47, 0x19, 0x7f, 0x14, 0xe7, 0x37, 0x12, 0xf4, 0x52, 0xca, 0xa9,
260 0xfc, 0x4c, 0x9a, 0xdb, 0x36, 0x93, 0x48, 0xb8, 0x15, 0x07, 0x39, 0x2f,
261 0x1a, 0x86, 0xdd, 0xfd, 0xb7, 0xc4, 0xff, 0x82, 0x31, 0xc4, 0xbd, 0x0f,
262 0x44, 0xe4, 0x4a, 0x1b, 0x55, 0xb1, 0x40, 0x47, 0x47, 0xa9, 0xe2, 0xe7,
263 0x53, 0xf5, 0x5e, 0xf0, 0x5a, 0x2d
264 };
265 static unsigned char shared[] = {
266 0xe3, 0xb5, 0xb4, 0xc1, 0xb0, 0xd5, 0xcf, 0x1d, 0x2b, 0x3a, 0x2f, 0x99,
267 0x37, 0x89, 0x5d, 0x31
268 };
269 static const unsigned char expected[sizeof(out)] = {
270 0x44, 0x63, 0xf8, 0x69, 0xf3, 0xcc, 0x18, 0x76, 0x9b, 0x52, 0x26, 0x4b,
271 0x01, 0x12, 0xb5, 0x85, 0x8f, 0x7a, 0xd3, 0x2a, 0x5a, 0x2d, 0x96, 0xd8,
272 0xcf, 0xfa, 0xbf, 0x7f, 0xa7, 0x33, 0x63, 0x3d, 0x6e, 0x4d, 0xd2, 0xa5,
273 0x99, 0xac, 0xce, 0xb3, 0xea, 0x54, 0xa6, 0x21, 0x7c, 0xe0, 0xb5, 0x0e,
274 0xef, 0x4f, 0x6b, 0x40, 0xa5, 0xc3, 0x02, 0x50, 0xa5, 0xa8, 0xee, 0xee,
275 0x20, 0x80, 0x02, 0x26, 0x70, 0x89, 0xdb, 0xf3, 0x51, 0xf3, 0xf5, 0x02,
276 0x2a, 0xa9, 0x63, 0x8b, 0xf1, 0xee, 0x41, 0x9d, 0xea, 0x9c, 0x4f, 0xf7,
277 0x45, 0xa2, 0x5a, 0xc2, 0x7b, 0xda, 0x33, 0xca, 0x08, 0xbd, 0x56, 0xdd,
278 0x1a, 0x59, 0xb4, 0x10, 0x6c, 0xf2, 0xdb, 0xbc, 0x0a, 0xb2, 0xaa, 0x8e,
279 0x2e, 0xfa, 0x7b, 0x17, 0x90, 0x2d, 0x34, 0x27, 0x69, 0x51, 0xce, 0xcc,
280 0xab, 0x87, 0xf9, 0x66, 0x1c, 0x3e, 0x88, 0x16
281 };
282
283 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST,
284 (char *)"sha512", sizeof("sha512"));
285 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, z, sizeof(z));
286 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO, shared,
287 sizeof(shared));
288 *p = OSSL_PARAM_construct_end();
289
290 ret =
291 TEST_ptr(kctx = get_kdfbyname(OSSL_KDF_NAME_X963KDF))
292 && TEST_true(EVP_KDF_CTX_set_params(kctx, params))
293 && TEST_int_gt(EVP_KDF_derive(kctx, out, sizeof(out)), 0)
294 && TEST_mem_eq(out, sizeof(out), expected, sizeof(expected));
295
296 EVP_KDF_CTX_free(kctx);
297 return ret;
298 }
299
300 #if !defined(OPENSSL_NO_CMAC) && !defined(OPENSSL_NO_CAMELLIA)
301 /*
302 * KBKDF test vectors from RFC 6803 (Camellia Encryption for Kerberos 5)
303 * section 10.
304 */
305 static int test_kdf_kbkdf_6803_128(void)
306 {
307 int ret = 0, i, p;
308 EVP_KDF_CTX *kctx;
309 OSSL_PARAM params[7];
310 static unsigned char input_key[] = {
311 0x57, 0xD0, 0x29, 0x72, 0x98, 0xFF, 0xD9, 0xD3,
312 0x5D, 0xE5, 0xA4, 0x7F, 0xB4, 0xBD, 0xE2, 0x4B,
313 };
314 static unsigned char constants[][5] = {
315 { 0x00, 0x00, 0x00, 0x02, 0x99 },
316 { 0x00, 0x00, 0x00, 0x02, 0xaa },
317 { 0x00, 0x00, 0x00, 0x02, 0x55 },
318 };
319 static unsigned char outputs[][16] = {
320 {0xD1, 0x55, 0x77, 0x5A, 0x20, 0x9D, 0x05, 0xF0,
321 0x2B, 0x38, 0xD4, 0x2A, 0x38, 0x9E, 0x5A, 0x56},
322 {0x64, 0xDF, 0x83, 0xF8, 0x5A, 0x53, 0x2F, 0x17,
323 0x57, 0x7D, 0x8C, 0x37, 0x03, 0x57, 0x96, 0xAB},
324 {0x3E, 0x4F, 0xBD, 0xF3, 0x0F, 0xB8, 0x25, 0x9C,
325 0x42, 0x5C, 0xB6, 0xC9, 0x6F, 0x1F, 0x46, 0x35}
326 };
327 static unsigned char iv[16] = { 0 };
328 unsigned char result[16] = { 0 };
329
330 for (i = 0; i < 3; i++) {
331 p = 0;
332 params[p++] = OSSL_PARAM_construct_utf8_string(
333 OSSL_KDF_PARAM_CIPHER, "CAMELLIA-128-CBC", 0);
334 params[p++] = OSSL_PARAM_construct_utf8_string(
335 OSSL_KDF_PARAM_MAC, "CMAC", 0);
336 params[p++] = OSSL_PARAM_construct_utf8_string(
337 OSSL_KDF_PARAM_MODE, "FEEDBACK", 0);
338 params[p++] = OSSL_PARAM_construct_octet_string(
339 OSSL_KDF_PARAM_KEY, input_key, sizeof(input_key));
340 params[p++] = OSSL_PARAM_construct_octet_string(
341 OSSL_KDF_PARAM_SALT, constants[i], sizeof(constants[i]));
342 params[p++] = OSSL_PARAM_construct_octet_string(
343 OSSL_KDF_PARAM_SEED, iv, sizeof(iv));
344 params[p] = OSSL_PARAM_construct_end();
345
346 kctx = get_kdfbyname("KBKDF");
347 ret = TEST_ptr(kctx)
348 && TEST_true(EVP_KDF_CTX_set_params(kctx, params))
349 && TEST_int_gt(EVP_KDF_derive(kctx, result, sizeof(result)), 0)
350 && TEST_mem_eq(result, sizeof(result), outputs[i],
351 sizeof(outputs[i]));
352 EVP_KDF_CTX_free(kctx);
353 if (ret != 1)
354 return ret;
355 }
356
357 return ret;
358 }
359
360 static int test_kdf_kbkdf_6803_256(void)
361 {
362 int ret = 0, i, p;
363 EVP_KDF_CTX *kctx;
364 OSSL_PARAM params[7];
365 static unsigned char input_key[] = {
366 0xB9, 0xD6, 0x82, 0x8B, 0x20, 0x56, 0xB7, 0xBE,
367 0x65, 0x6D, 0x88, 0xA1, 0x23, 0xB1, 0xFA, 0xC6,
368 0x82, 0x14, 0xAC, 0x2B, 0x72, 0x7E, 0xCF, 0x5F,
369 0x69, 0xAF, 0xE0, 0xC4, 0xDF, 0x2A, 0x6D, 0x2C,
370 };
371 static unsigned char constants[][5] = {
372 { 0x00, 0x00, 0x00, 0x02, 0x99 },
373 { 0x00, 0x00, 0x00, 0x02, 0xaa },
374 { 0x00, 0x00, 0x00, 0x02, 0x55 },
375 };
376 static unsigned char outputs[][32] = {
377 {0xE4, 0x67, 0xF9, 0xA9, 0x55, 0x2B, 0xC7, 0xD3,
378 0x15, 0x5A, 0x62, 0x20, 0xAF, 0x9C, 0x19, 0x22,
379 0x0E, 0xEE, 0xD4, 0xFF, 0x78, 0xB0, 0xD1, 0xE6,
380 0xA1, 0x54, 0x49, 0x91, 0x46, 0x1A, 0x9E, 0x50,
381 },
382 {0x41, 0x2A, 0xEF, 0xC3, 0x62, 0xA7, 0x28, 0x5F,
383 0xC3, 0x96, 0x6C, 0x6A, 0x51, 0x81, 0xE7, 0x60,
384 0x5A, 0xE6, 0x75, 0x23, 0x5B, 0x6D, 0x54, 0x9F,
385 0xBF, 0xC9, 0xAB, 0x66, 0x30, 0xA4, 0xC6, 0x04,
386 },
387 {0xFA, 0x62, 0x4F, 0xA0, 0xE5, 0x23, 0x99, 0x3F,
388 0xA3, 0x88, 0xAE, 0xFD, 0xC6, 0x7E, 0x67, 0xEB,
389 0xCD, 0x8C, 0x08, 0xE8, 0xA0, 0x24, 0x6B, 0x1D,
390 0x73, 0xB0, 0xD1, 0xDD, 0x9F, 0xC5, 0x82, 0xB0,
391 },
392 };
393 static unsigned char iv[16] = { 0 };
394 unsigned char result[32] = { 0 };
395
396 for (i = 0; i < 3; i++) {
397 p = 0;
398 params[p++] = OSSL_PARAM_construct_utf8_string(
399 OSSL_KDF_PARAM_CIPHER, "CAMELLIA-256-CBC", 0);
400 params[p++] = OSSL_PARAM_construct_utf8_string(
401 OSSL_KDF_PARAM_MAC, "CMAC", 0);
402 params[p++] = OSSL_PARAM_construct_utf8_string(
403 OSSL_KDF_PARAM_MODE, "FEEDBACK", 0);
404 params[p++] = OSSL_PARAM_construct_octet_string(
405 OSSL_KDF_PARAM_KEY, input_key, sizeof(input_key));
406 params[p++] = OSSL_PARAM_construct_octet_string(
407 OSSL_KDF_PARAM_SALT, constants[i], sizeof(constants[i]));
408 params[p++] = OSSL_PARAM_construct_octet_string(
409 OSSL_KDF_PARAM_SEED, iv, sizeof(iv));
410 params[p] = OSSL_PARAM_construct_end();
411
412 kctx = get_kdfbyname("KBKDF");
413 ret = TEST_ptr(kctx)
414 && TEST_true(EVP_KDF_CTX_set_params(kctx, params))
415 && TEST_int_gt(EVP_KDF_derive(kctx, result, sizeof(result)), 0)
416 && TEST_mem_eq(result, sizeof(result), outputs[i],
417 sizeof(outputs[i]));
418 EVP_KDF_CTX_free(kctx);
419 if (ret != 1)
420 return ret;
421 }
422
423 return ret;
424 }
425 #endif
426
427 /* Two test vectors from RFC 8009 (AES Encryption with HMAC-SHA2 for Kerberos
428 * 5) appendix A. */
429 static int test_kdf_kbkdf_8009_prf1(void)
430 {
431 int ret, i = 0;
432 EVP_KDF_CTX *kctx;
433 OSSL_PARAM params[6];
434 char *label = "prf", *digest = "sha256", *prf_input = "test",
435 *mac = "HMAC";
436 static unsigned char input_key[] = {
437 0x37, 0x05, 0xD9, 0x60, 0x80, 0xC1, 0x77, 0x28,
438 0xA0, 0xE8, 0x00, 0xEA, 0xB6, 0xE0, 0xD2, 0x3C,
439 };
440 static unsigned char output[] = {
441 0x9D, 0x18, 0x86, 0x16, 0xF6, 0x38, 0x52, 0xFE,
442 0x86, 0x91, 0x5B, 0xB8, 0x40, 0xB4, 0xA8, 0x86,
443 0xFF, 0x3E, 0x6B, 0xB0, 0xF8, 0x19, 0xB4, 0x9B,
444 0x89, 0x33, 0x93, 0xD3, 0x93, 0x85, 0x42, 0x95,
445 };
446 unsigned char result[sizeof(output)] = { 0 };
447
448 params[i++] = OSSL_PARAM_construct_utf8_string(
449 OSSL_KDF_PARAM_DIGEST, digest, strlen(digest) + 1);
450 params[i++] = OSSL_PARAM_construct_utf8_string(
451 OSSL_KDF_PARAM_MAC, mac, strlen(mac) + 1);
452 params[i++] = OSSL_PARAM_construct_octet_string(
453 OSSL_KDF_PARAM_KEY, input_key, sizeof(input_key));
454 params[i++] = OSSL_PARAM_construct_octet_string(
455 OSSL_KDF_PARAM_SALT, label, strlen(label));
456 params[i++] = OSSL_PARAM_construct_octet_string(
457 OSSL_KDF_PARAM_INFO, prf_input, strlen(prf_input));
458 params[i] = OSSL_PARAM_construct_end();
459
460 kctx = get_kdfbyname("KBKDF");
461 ret = TEST_ptr(kctx)
462 && TEST_true(EVP_KDF_CTX_set_params(kctx, params))
463 && TEST_int_gt(EVP_KDF_derive(kctx, result, sizeof(result)), 0)
464 && TEST_mem_eq(result, sizeof(result), output, sizeof(output));
465
466 EVP_KDF_CTX_free(kctx);
467 return ret;
468 }
469
470 static int test_kdf_kbkdf_8009_prf2(void)
471 {
472 int ret, i = 0;
473 EVP_KDF_CTX *kctx;
474 OSSL_PARAM params[6];
475 char *label = "prf", *digest = "sha384", *prf_input = "test",
476 *mac = "HMAC";
477 static unsigned char input_key[] = {
478 0x6D, 0x40, 0x4D, 0x37, 0xFA, 0xF7, 0x9F, 0x9D,
479 0xF0, 0xD3, 0x35, 0x68, 0xD3, 0x20, 0x66, 0x98,
480 0x00, 0xEB, 0x48, 0x36, 0x47, 0x2E, 0xA8, 0xA0,
481 0x26, 0xD1, 0x6B, 0x71, 0x82, 0x46, 0x0C, 0x52,
482 };
483 static unsigned char output[] = {
484 0x98, 0x01, 0xF6, 0x9A, 0x36, 0x8C, 0x2B, 0xF6,
485 0x75, 0xE5, 0x95, 0x21, 0xE1, 0x77, 0xD9, 0xA0,
486 0x7F, 0x67, 0xEF, 0xE1, 0xCF, 0xDE, 0x8D, 0x3C,
487 0x8D, 0x6F, 0x6A, 0x02, 0x56, 0xE3, 0xB1, 0x7D,
488 0xB3, 0xC1, 0xB6, 0x2A, 0xD1, 0xB8, 0x55, 0x33,
489 0x60, 0xD1, 0x73, 0x67, 0xEB, 0x15, 0x14, 0xD2,
490 };
491 unsigned char result[sizeof(output)] = { 0 };
492
493 params[i++] = OSSL_PARAM_construct_utf8_string(
494 OSSL_KDF_PARAM_DIGEST, digest, strlen(digest) + 1);
495 params[i++] = OSSL_PARAM_construct_utf8_string(
496 OSSL_KDF_PARAM_MAC, mac, strlen(mac) + 1);
497 params[i++] = OSSL_PARAM_construct_octet_string(
498 OSSL_KDF_PARAM_KEY, input_key, sizeof(input_key));
499 params[i++] = OSSL_PARAM_construct_octet_string(
500 OSSL_KDF_PARAM_SALT, label, strlen(label));
501 params[i++] = OSSL_PARAM_construct_octet_string(
502 OSSL_KDF_PARAM_INFO, prf_input, strlen(prf_input));
503 params[i] = OSSL_PARAM_construct_end();
504
505 kctx = get_kdfbyname("KBKDF");
506 ret = TEST_ptr(kctx)
507 && TEST_true(EVP_KDF_CTX_set_params(kctx, params))
508 && TEST_int_gt(EVP_KDF_derive(kctx, result, sizeof(result)), 0)
509 && TEST_mem_eq(result, sizeof(result), output, sizeof(output));
510
511 EVP_KDF_CTX_free(kctx);
512 return ret;
513 }
514
515 static int test_kdf_ss_hmac(void)
516 {
517 int ret;
518 EVP_KDF_CTX *kctx;
519 OSSL_PARAM params[6], *p = params;
520 unsigned char out[16];
521 static unsigned char z[] = {
522 0xb7,0x4a,0x14,0x9a,0x16,0x15,0x46,0xf8,0xc2,0x0b,0x06,0xac,0x4e,0xd4
523 };
524 static unsigned char other[] = {
525 0x34,0x8a,0x37,0xa2,0x7e,0xf1,0x28,0x2f,0x5f,0x02,0x0d,0xcc
526 };
527 static unsigned char salt[] = {
528 0x36,0x38,0x27,0x1c,0xcd,0x68,0xa2,0x5d,0xc2,0x4e,0xcd,0xdd,0x39,0xef,
529 0x3f,0x89
530 };
531 static const unsigned char expected[sizeof(out)] = {
532 0x44,0xf6,0x76,0xe8,0x5c,0x1b,0x1a,0x8b,0xbc,0x3d,0x31,0x92,0x18,0x63,
533 0x1c,0xa3
534 };
535
536 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_MAC,
537 (char *)OSSL_MAC_NAME_HMAC,
538 sizeof(OSSL_MAC_NAME_HMAC));
539 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST,
540 (char *)"sha256", sizeof("sha256"));
541 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, z, sizeof(z));
542 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO, other,
543 sizeof(other));
544 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT, salt,
545 sizeof(salt));
546 *p = OSSL_PARAM_construct_end();
547
548 ret =
549 TEST_ptr(kctx = get_kdfbyname(OSSL_KDF_NAME_SSKDF))
550 && TEST_true(EVP_KDF_CTX_set_params(kctx, params))
551 && TEST_int_gt(EVP_KDF_derive(kctx, out, sizeof(out)), 0)
552 && TEST_mem_eq(out, sizeof(out), expected, sizeof(expected));
553
554 EVP_KDF_CTX_free(kctx);
555 return ret;
556 }
557
558 static int test_kdf_ss_kmac(void)
559 {
560 int ret;
561 EVP_KDF_CTX *kctx;
562 OSSL_PARAM params[6], *p = params;
563 unsigned char out[64];
564 size_t mac_size = 20;
565 static unsigned char z[] = {
566 0xb7,0x4a,0x14,0x9a,0x16,0x15,0x46,0xf8,0xc2,0x0b,0x06,0xac,0x4e,0xd4
567 };
568 static unsigned char other[] = {
569 0x34,0x8a,0x37,0xa2,0x7e,0xf1,0x28,0x2f,0x5f,0x02,0x0d,0xcc
570 };
571 static unsigned char salt[] = {
572 0x36,0x38,0x27,0x1c,0xcd,0x68,0xa2,0x5d,0xc2,0x4e,0xcd,0xdd,0x39,0xef,
573 0x3f,0x89
574 };
575 static const unsigned char expected[sizeof(out)] = {
576 0xe9,0xc1,0x84,0x53,0xa0,0x62,0xb5,0x3b,0xdb,0xfc,0xbb,0x5a,0x34,0xbd,
577 0xb8,0xe5,0xe7,0x07,0xee,0xbb,0x5d,0xd1,0x34,0x42,0x43,0xd8,0xcf,0xc2,
578 0xc2,0xe6,0x33,0x2f,0x91,0xbd,0xa5,0x86,0xf3,0x7d,0xe4,0x8a,0x65,0xd4,
579 0xc5,0x14,0xfd,0xef,0xaa,0x1e,0x67,0x54,0xf3,0x73,0xd2,0x38,0xe1,0x95,
580 0xae,0x15,0x7e,0x1d,0xe8,0x14,0x98,0x03
581 };
582
583 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_MAC,
584 (char *)OSSL_MAC_NAME_KMAC128,
585 sizeof(OSSL_MAC_NAME_KMAC128));
586 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, z, sizeof(z));
587 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO, other,
588 sizeof(other));
589 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT, salt,
590 sizeof(salt));
591 *p++ = OSSL_PARAM_construct_size_t(OSSL_KDF_PARAM_MAC_SIZE, &mac_size);
592 *p = OSSL_PARAM_construct_end();
593
594 ret =
595 TEST_ptr(kctx = get_kdfbyname(OSSL_KDF_NAME_SSKDF))
596 && TEST_true(EVP_KDF_CTX_set_params(kctx, params))
597 && TEST_int_gt(EVP_KDF_derive(kctx, out, sizeof(out)), 0)
598 && TEST_mem_eq(out, sizeof(out), expected, sizeof(expected));
599
600 EVP_KDF_CTX_free(kctx);
601 return ret;
602 }
603
604 static int test_kdf_sshkdf(void)
605 {
606 int ret;
607 EVP_KDF_CTX *kctx;
608 OSSL_PARAM params[6], *p = params;
609 char kdftype = EVP_KDF_SSHKDF_TYPE_INITIAL_IV_CLI_TO_SRV;
610 unsigned char out[8];
611 /* Test data from NIST CAVS 14.1 test vectors */
612 static unsigned char key[] = {
613 0x00, 0x00, 0x00, 0x81, 0x00, 0x87, 0x5c, 0x55, 0x1c, 0xef, 0x52, 0x6a,
614 0x4a, 0x8b, 0xe1, 0xa7, 0xdf, 0x27, 0xe9, 0xed, 0x35, 0x4b, 0xac, 0x9a,
615 0xfb, 0x71, 0xf5, 0x3d, 0xba, 0xe9, 0x05, 0x67, 0x9d, 0x14, 0xf9, 0xfa,
616 0xf2, 0x46, 0x9c, 0x53, 0x45, 0x7c, 0xf8, 0x0a, 0x36, 0x6b, 0xe2, 0x78,
617 0x96, 0x5b, 0xa6, 0x25, 0x52, 0x76, 0xca, 0x2d, 0x9f, 0x4a, 0x97, 0xd2,
618 0x71, 0xf7, 0x1e, 0x50, 0xd8, 0xa9, 0xec, 0x46, 0x25, 0x3a, 0x6a, 0x90,
619 0x6a, 0xc2, 0xc5, 0xe4, 0xf4, 0x8b, 0x27, 0xa6, 0x3c, 0xe0, 0x8d, 0x80,
620 0x39, 0x0a, 0x49, 0x2a, 0xa4, 0x3b, 0xad, 0x9d, 0x88, 0x2c, 0xca, 0xc2,
621 0x3d, 0xac, 0x88, 0xbc, 0xad, 0xa4, 0xb4, 0xd4, 0x26, 0xa3, 0x62, 0x08,
622 0x3d, 0xab, 0x65, 0x69, 0xc5, 0x4c, 0x22, 0x4d, 0xd2, 0xd8, 0x76, 0x43,
623 0xaa, 0x22, 0x76, 0x93, 0xe1, 0x41, 0xad, 0x16, 0x30, 0xce, 0x13, 0x14,
624 0x4e
625 };
626 static unsigned char xcghash[] = {
627 0x0e, 0x68, 0x3f, 0xc8, 0xa9, 0xed, 0x7c, 0x2f, 0xf0, 0x2d, 0xef, 0x23,
628 0xb2, 0x74, 0x5e, 0xbc, 0x99, 0xb2, 0x67, 0xda, 0xa8, 0x6a, 0x4a, 0xa7,
629 0x69, 0x72, 0x39, 0x08, 0x82, 0x53, 0xf6, 0x42
630 };
631 static unsigned char sessid[] = {
632 0x0e, 0x68, 0x3f, 0xc8, 0xa9, 0xed, 0x7c, 0x2f, 0xf0, 0x2d, 0xef, 0x23,
633 0xb2, 0x74, 0x5e, 0xbc, 0x99, 0xb2, 0x67, 0xda, 0xa8, 0x6a, 0x4a, 0xa7,
634 0x69, 0x72, 0x39, 0x08, 0x82, 0x53, 0xf6, 0x42
635 };
636 static const unsigned char expected[sizeof(out)] = {
637 0x41, 0xff, 0x2e, 0xad, 0x16, 0x83, 0xf1, 0xe6
638 };
639
640 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST,
641 (char *)"sha256", sizeof("sha256"));
642 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, key,
643 sizeof(key));
644 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SSHKDF_XCGHASH,
645 xcghash, sizeof(xcghash));
646 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SSHKDF_SESSION_ID,
647 sessid, sizeof(sessid));
648 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_SSHKDF_TYPE,
649 &kdftype, sizeof(kdftype));
650 *p = OSSL_PARAM_construct_end();
651
652 ret =
653 TEST_ptr(kctx = get_kdfbyname(OSSL_KDF_NAME_SSHKDF))
654 && TEST_true(EVP_KDF_CTX_set_params(kctx, params))
655 && TEST_int_gt(EVP_KDF_derive(kctx, out, sizeof(out)), 0)
656 && TEST_mem_eq(out, sizeof(out), expected, sizeof(expected));
657
658 EVP_KDF_CTX_free(kctx);
659 return ret;
660 }
661
662 static int test_kdf_get_kdf(void)
663 {
664 EVP_KDF *kdf1 = NULL, *kdf2 = NULL;
665 ASN1_OBJECT *obj;
666 int ok = 1;
667
668 if (!TEST_ptr(obj = OBJ_nid2obj(NID_id_pbkdf2))
669 || !TEST_ptr(kdf1 = EVP_KDF_fetch(NULL, OSSL_KDF_NAME_PBKDF2, NULL))
670 || !TEST_ptr(kdf2 = EVP_KDF_fetch(NULL, OBJ_nid2sn(OBJ_obj2nid(obj)),
671 NULL))
672 || !TEST_ptr_eq(kdf1, kdf2))
673 ok = 0;
674 EVP_KDF_free(kdf1);
675 kdf1 = NULL;
676 EVP_KDF_free(kdf2);
677 kdf2 = NULL;
678
679 if (!TEST_ptr(kdf1 = EVP_KDF_fetch(NULL, SN_tls1_prf, NULL))
680 || !TEST_ptr(kdf2 = EVP_KDF_fetch(NULL, LN_tls1_prf, NULL))
681 || !TEST_ptr_eq(kdf1, kdf2))
682 ok = 0;
683 /* kdf1 is re-used below, so don't free it here */
684 EVP_KDF_free(kdf2);
685 kdf2 = NULL;
686
687 if (!TEST_ptr(kdf2 = EVP_KDF_fetch(NULL, OBJ_nid2sn(NID_tls1_prf), NULL))
688 || !TEST_ptr_eq(kdf1, kdf2))
689 ok = 0;
690 EVP_KDF_free(kdf1);
691 kdf1 = NULL;
692 EVP_KDF_free(kdf2);
693 kdf2 = NULL;
694
695 return ok;
696 }
697
698 #ifndef OPENSSL_NO_CMS
699 static int test_kdf_x942_asn1(void)
700 {
701 int ret;
702 EVP_KDF_CTX *kctx = NULL;
703 OSSL_PARAM params[4], *p = params;
704 const char *cek_alg = SN_id_smime_alg_CMS3DESwrap;
705 unsigned char out[24];
706 /* RFC2631 Section 2.1.6 Test data */
707 static unsigned char z[] = {
708 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,
709 0x0e,0x0f,0x10,0x11,0x12,0x13
710 };
711 static const unsigned char expected[sizeof(out)] = {
712 0xa0,0x96,0x61,0x39,0x23,0x76,0xf7,0x04,
713 0x4d,0x90,0x52,0xa3,0x97,0x88,0x32,0x46,
714 0xb6,0x7f,0x5f,0x1e,0xf6,0x3e,0xb5,0xfb
715 };
716
717 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST,
718 (char *)"sha1", sizeof("sha1"));
719 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, z,
720 sizeof(z));
721 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_CEK_ALG,
722 (char *)cek_alg,
723 strlen(cek_alg) + 1);
724 *p = OSSL_PARAM_construct_end();
725
726 ret =
727 TEST_ptr(kctx = get_kdfbyname(OSSL_KDF_NAME_X942KDF))
728 && TEST_true(EVP_KDF_CTX_set_params(kctx, params))
729 && TEST_int_gt(EVP_KDF_derive(kctx, out, sizeof(out)), 0)
730 && TEST_mem_eq(out, sizeof(out), expected, sizeof(expected));
731
732 EVP_KDF_CTX_free(kctx);
733 return ret;
734 }
735 #endif /* OPENSSL_NO_CMS */
736
737 static int test_kdf_krb5kdf(void)
738 {
739 int ret;
740 EVP_KDF_CTX *kctx;
741 OSSL_PARAM params[4], *p = params;
742 unsigned char out[16];
743 static unsigned char key[] = {
744 0x42, 0x26, 0x3C, 0x6E, 0x89, 0xF4, 0xFC, 0x28,
745 0xB8, 0xDF, 0x68, 0xEE, 0x09, 0x79, 0x9F, 0x15
746 };
747 static unsigned char constant[] = {
748 0x00, 0x00, 0x00, 0x02, 0x99
749 };
750 static const unsigned char expected[sizeof(out)] = {
751 0x34, 0x28, 0x0A, 0x38, 0x2B, 0xC9, 0x27, 0x69,
752 0xB2, 0xDA, 0x2F, 0x9E, 0xF0, 0x66, 0x85, 0x4B
753 };
754
755 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_CIPHER,
756 (char *)"AES-128-CBC",
757 sizeof("AES-128-CBC"));
758 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, key,
759 sizeof(key));
760 *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_CONSTANT,
761 constant, sizeof(constant));
762 *p = OSSL_PARAM_construct_end();
763
764 ret =
765 TEST_ptr(kctx = get_kdfbyname(OSSL_KDF_NAME_KRB5KDF))
766 && TEST_true(EVP_KDF_CTX_set_params(kctx, params))
767 && TEST_int_gt(EVP_KDF_derive(kctx, out, sizeof(out)), 0)
768 && TEST_mem_eq(out, sizeof(out), expected, sizeof(expected));
769
770 EVP_KDF_CTX_free(kctx);
771 return ret;
772 }
773
774 int setup_tests(void)
775 {
776 #if !defined(OPENSSL_NO_CMAC) && !defined(OPENSSL_NO_CAMELLIA)
777 ADD_TEST(test_kdf_kbkdf_6803_128);
778 ADD_TEST(test_kdf_kbkdf_6803_256);
779 #endif
780 ADD_TEST(test_kdf_kbkdf_8009_prf1);
781 ADD_TEST(test_kdf_kbkdf_8009_prf2);
782 ADD_TEST(test_kdf_get_kdf);
783 ADD_TEST(test_kdf_tls1_prf);
784 ADD_TEST(test_kdf_hkdf);
785 ADD_TEST(test_kdf_pbkdf2);
786 #ifndef OPENSSL_NO_SCRYPT
787 ADD_TEST(test_kdf_scrypt);
788 #endif
789 ADD_TEST(test_kdf_ss_hash);
790 ADD_TEST(test_kdf_ss_hmac);
791 ADD_TEST(test_kdf_ss_kmac);
792 ADD_TEST(test_kdf_sshkdf);
793 ADD_TEST(test_kdf_x963);
794 #ifndef OPENSSL_NO_CMS
795 ADD_TEST(test_kdf_x942_asn1);
796 #endif
797 ADD_TEST(test_kdf_krb5kdf);
798 return 1;
799 }