xref: /freebsd/crypto/openssl/test/pkey_meth_kdf_test.c (revision 44096ebd22ddd0081a357011714eff8963614b65)
1e0c4386eSCy Schubert /*
2*44096ebdSEnji Cooper  * Copyright 2017-2024 The OpenSSL Project Authors. All Rights Reserved.
3e0c4386eSCy Schubert  *
4e0c4386eSCy Schubert  * Licensed under the Apache License 2.0 (the "License").  You may not use
5e0c4386eSCy Schubert  * this file except in compliance with the License.  You can obtain a copy
6e0c4386eSCy Schubert  * in the file LICENSE in the source distribution or at
7e0c4386eSCy Schubert  * https://www.openssl.org/source/license.html
8e0c4386eSCy Schubert  */
9e0c4386eSCy Schubert 
10e0c4386eSCy Schubert /* Tests of the EVP_PKEY_CTX_set_* macro family */
11e0c4386eSCy Schubert 
12e0c4386eSCy Schubert #include <stdio.h>
13e0c4386eSCy Schubert #include <string.h>
14e0c4386eSCy Schubert 
15e0c4386eSCy Schubert #include <openssl/evp.h>
16e0c4386eSCy Schubert #include <openssl/kdf.h>
17e0c4386eSCy Schubert #include "testutil.h"
18e0c4386eSCy Schubert 
19*44096ebdSEnji Cooper static int test_kdf_tls1_prf(int index)
20e0c4386eSCy Schubert {
21e0c4386eSCy Schubert     int ret = 0;
22e0c4386eSCy Schubert     EVP_PKEY_CTX *pctx;
23e0c4386eSCy Schubert     unsigned char out[16];
24e0c4386eSCy Schubert     size_t outlen = sizeof(out);
25e0c4386eSCy Schubert 
26e0c4386eSCy Schubert     if ((pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_TLS1_PRF, NULL)) == NULL) {
27e0c4386eSCy Schubert         TEST_error("EVP_PKEY_TLS1_PRF");
28e0c4386eSCy Schubert         goto err;
29e0c4386eSCy Schubert     }
30e0c4386eSCy Schubert     if (EVP_PKEY_derive_init(pctx) <= 0) {
31e0c4386eSCy Schubert         TEST_error("EVP_PKEY_derive_init");
32e0c4386eSCy Schubert         goto err;
33e0c4386eSCy Schubert     }
34e0c4386eSCy Schubert     if (EVP_PKEY_CTX_set_tls1_prf_md(pctx, EVP_sha256()) <= 0) {
35e0c4386eSCy Schubert         TEST_error("EVP_PKEY_CTX_set_tls1_prf_md");
36e0c4386eSCy Schubert         goto err;
37e0c4386eSCy Schubert     }
38e0c4386eSCy Schubert     if (EVP_PKEY_CTX_set1_tls1_prf_secret(pctx,
39e0c4386eSCy Schubert                                           (unsigned char *)"secret", 6) <= 0) {
40e0c4386eSCy Schubert         TEST_error("EVP_PKEY_CTX_set1_tls1_prf_secret");
41e0c4386eSCy Schubert         goto err;
42e0c4386eSCy Schubert     }
43*44096ebdSEnji Cooper     if (index == 0) {
44e0c4386eSCy Schubert         if (EVP_PKEY_CTX_add1_tls1_prf_seed(pctx,
45e0c4386eSCy Schubert                                             (unsigned char *)"seed", 4) <= 0) {
46e0c4386eSCy Schubert             TEST_error("EVP_PKEY_CTX_add1_tls1_prf_seed");
47e0c4386eSCy Schubert             goto err;
48e0c4386eSCy Schubert         }
49*44096ebdSEnji Cooper     } else {
50*44096ebdSEnji Cooper         if (EVP_PKEY_CTX_add1_tls1_prf_seed(pctx,
51*44096ebdSEnji Cooper                                             (unsigned char *)"se", 2) <= 0) {
52*44096ebdSEnji Cooper             TEST_error("EVP_PKEY_CTX_add1_tls1_prf_seed");
53*44096ebdSEnji Cooper             goto err;
54*44096ebdSEnji Cooper         }
55*44096ebdSEnji Cooper         if (EVP_PKEY_CTX_add1_tls1_prf_seed(pctx,
56*44096ebdSEnji Cooper                                             (unsigned char *)"ed", 2) <= 0) {
57*44096ebdSEnji Cooper             TEST_error("EVP_PKEY_CTX_add1_tls1_prf_seed");
58*44096ebdSEnji Cooper             goto err;
59*44096ebdSEnji Cooper         }
60*44096ebdSEnji Cooper     }
61e0c4386eSCy Schubert     if (EVP_PKEY_derive(pctx, out, &outlen) <= 0) {
62e0c4386eSCy Schubert         TEST_error("EVP_PKEY_derive");
63e0c4386eSCy Schubert         goto err;
64e0c4386eSCy Schubert     }
65e0c4386eSCy Schubert 
66e0c4386eSCy Schubert     {
67e0c4386eSCy Schubert         const unsigned char expected[sizeof(out)] = {
68e0c4386eSCy Schubert             0x8e, 0x4d, 0x93, 0x25, 0x30, 0xd7, 0x65, 0xa0,
69e0c4386eSCy Schubert             0xaa, 0xe9, 0x74, 0xc3, 0x04, 0x73, 0x5e, 0xcc
70e0c4386eSCy Schubert         };
71e0c4386eSCy Schubert         if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
72e0c4386eSCy Schubert             goto err;
73e0c4386eSCy Schubert         }
74e0c4386eSCy Schubert     }
75e0c4386eSCy Schubert     ret = 1;
76e0c4386eSCy Schubert err:
77e0c4386eSCy Schubert     EVP_PKEY_CTX_free(pctx);
78e0c4386eSCy Schubert     return ret;
79e0c4386eSCy Schubert }
80e0c4386eSCy Schubert 
81*44096ebdSEnji Cooper static int test_kdf_hkdf(int index)
82e0c4386eSCy Schubert {
83e0c4386eSCy Schubert     int ret = 0;
84e0c4386eSCy Schubert     EVP_PKEY_CTX *pctx;
85e0c4386eSCy Schubert     unsigned char out[10];
86e0c4386eSCy Schubert     size_t outlen = sizeof(out);
87e0c4386eSCy Schubert 
88e0c4386eSCy Schubert     if ((pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL)) == NULL) {
89e0c4386eSCy Schubert         TEST_error("EVP_PKEY_HKDF");
90e0c4386eSCy Schubert         goto err;
91e0c4386eSCy Schubert     }
92e0c4386eSCy Schubert     if (EVP_PKEY_derive_init(pctx) <= 0) {
93e0c4386eSCy Schubert         TEST_error("EVP_PKEY_derive_init");
94e0c4386eSCy Schubert         goto err;
95e0c4386eSCy Schubert     }
96e0c4386eSCy Schubert     if (EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()) <= 0) {
97e0c4386eSCy Schubert         TEST_error("EVP_PKEY_CTX_set_hkdf_md");
98e0c4386eSCy Schubert         goto err;
99e0c4386eSCy Schubert     }
100e0c4386eSCy Schubert     if (EVP_PKEY_CTX_set1_hkdf_salt(pctx, (const unsigned char *)"salt", 4)
101e0c4386eSCy Schubert             <= 0) {
102e0c4386eSCy Schubert         TEST_error("EVP_PKEY_CTX_set1_hkdf_salt");
103e0c4386eSCy Schubert         goto err;
104e0c4386eSCy Schubert     }
105e0c4386eSCy Schubert     if (EVP_PKEY_CTX_set1_hkdf_key(pctx, (const unsigned char *)"secret", 6)
106e0c4386eSCy Schubert             <= 0) {
107e0c4386eSCy Schubert         TEST_error("EVP_PKEY_CTX_set1_hkdf_key");
108e0c4386eSCy Schubert         goto err;
109e0c4386eSCy Schubert     }
110*44096ebdSEnji Cooper     if (index == 0) {
111e0c4386eSCy Schubert         if (EVP_PKEY_CTX_add1_hkdf_info(pctx, (const unsigned char *)"label", 5)
112e0c4386eSCy Schubert             <= 0) {
113*44096ebdSEnji Cooper             TEST_error("EVP_PKEY_CTX_add1_hkdf_info");
114e0c4386eSCy Schubert             goto err;
115e0c4386eSCy Schubert         }
116*44096ebdSEnji Cooper     } else {
117*44096ebdSEnji Cooper         if (EVP_PKEY_CTX_add1_hkdf_info(pctx, (const unsigned char *)"lab", 3)
118*44096ebdSEnji Cooper             <= 0) {
119*44096ebdSEnji Cooper             TEST_error("EVP_PKEY_CTX_add1_hkdf_info");
120*44096ebdSEnji Cooper             goto err;
121*44096ebdSEnji Cooper         }
122*44096ebdSEnji Cooper         if (EVP_PKEY_CTX_add1_hkdf_info(pctx, (const unsigned char *)"el", 2)
123*44096ebdSEnji Cooper             <= 0) {
124*44096ebdSEnji Cooper             TEST_error("EVP_PKEY_CTX_add1_hkdf_info");
125*44096ebdSEnji Cooper             goto err;
126*44096ebdSEnji Cooper         }
127*44096ebdSEnji Cooper     }
128e0c4386eSCy Schubert     if (EVP_PKEY_derive(pctx, out, &outlen) <= 0) {
129e0c4386eSCy Schubert         TEST_error("EVP_PKEY_derive");
130e0c4386eSCy Schubert         goto err;
131e0c4386eSCy Schubert     }
132e0c4386eSCy Schubert 
133e0c4386eSCy Schubert     {
134e0c4386eSCy Schubert         const unsigned char expected[sizeof(out)] = {
135e0c4386eSCy Schubert             0x2a, 0xc4, 0x36, 0x9f, 0x52, 0x59, 0x96, 0xf8, 0xde, 0x13
136e0c4386eSCy Schubert         };
137e0c4386eSCy Schubert         if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
138e0c4386eSCy Schubert             goto err;
139e0c4386eSCy Schubert         }
140e0c4386eSCy Schubert     }
141e0c4386eSCy Schubert     ret = 1;
142e0c4386eSCy Schubert err:
143e0c4386eSCy Schubert     EVP_PKEY_CTX_free(pctx);
144e0c4386eSCy Schubert     return ret;
145e0c4386eSCy Schubert }
146e0c4386eSCy Schubert 
147e0c4386eSCy Schubert #ifndef OPENSSL_NO_SCRYPT
148e0c4386eSCy Schubert static int test_kdf_scrypt(void)
149e0c4386eSCy Schubert {
150e0c4386eSCy Schubert     int ret = 0;
151e0c4386eSCy Schubert     EVP_PKEY_CTX *pctx;
152e0c4386eSCy Schubert     unsigned char out[64];
153e0c4386eSCy Schubert     size_t outlen = sizeof(out);
154e0c4386eSCy Schubert 
155e0c4386eSCy Schubert     if ((pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_SCRYPT, NULL)) == NULL) {
156e0c4386eSCy Schubert         TEST_error("EVP_PKEY_SCRYPT");
157e0c4386eSCy Schubert         goto err;
158e0c4386eSCy Schubert     }
159e0c4386eSCy Schubert     if (EVP_PKEY_derive_init(pctx) <= 0) {
160e0c4386eSCy Schubert         TEST_error("EVP_PKEY_derive_init");
161e0c4386eSCy Schubert         goto err;
162e0c4386eSCy Schubert     }
163e0c4386eSCy Schubert     if (EVP_PKEY_CTX_set1_pbe_pass(pctx, "password", 8) <= 0) {
164e0c4386eSCy Schubert         TEST_error("EVP_PKEY_CTX_set1_pbe_pass");
165e0c4386eSCy Schubert         goto err;
166e0c4386eSCy Schubert     }
167e0c4386eSCy Schubert     if (EVP_PKEY_CTX_set1_scrypt_salt(pctx, (unsigned char *)"NaCl", 4) <= 0) {
168e0c4386eSCy Schubert         TEST_error("EVP_PKEY_CTX_set1_scrypt_salt");
169e0c4386eSCy Schubert         goto err;
170e0c4386eSCy Schubert     }
171e0c4386eSCy Schubert     if (EVP_PKEY_CTX_set_scrypt_N(pctx, 1024) <= 0) {
172e0c4386eSCy Schubert         TEST_error("EVP_PKEY_CTX_set_scrypt_N");
173e0c4386eSCy Schubert         goto err;
174e0c4386eSCy Schubert     }
175e0c4386eSCy Schubert     if (EVP_PKEY_CTX_set_scrypt_r(pctx, 8) <= 0) {
176e0c4386eSCy Schubert         TEST_error("EVP_PKEY_CTX_set_scrypt_r");
177e0c4386eSCy Schubert         goto err;
178e0c4386eSCy Schubert     }
179e0c4386eSCy Schubert     if (EVP_PKEY_CTX_set_scrypt_p(pctx, 16) <= 0) {
180e0c4386eSCy Schubert         TEST_error("EVP_PKEY_CTX_set_scrypt_p");
181e0c4386eSCy Schubert         goto err;
182e0c4386eSCy Schubert     }
183e0c4386eSCy Schubert     if (EVP_PKEY_CTX_set_scrypt_maxmem_bytes(pctx, 16) <= 0) {
184e0c4386eSCy Schubert         TEST_error("EVP_PKEY_CTX_set_maxmem_bytes");
185e0c4386eSCy Schubert         goto err;
186e0c4386eSCy Schubert     }
187e0c4386eSCy Schubert     if (EVP_PKEY_derive(pctx, out, &outlen) > 0) {
188e0c4386eSCy Schubert         TEST_error("EVP_PKEY_derive should have failed");
189e0c4386eSCy Schubert         goto err;
190e0c4386eSCy Schubert     }
191e0c4386eSCy Schubert     if (EVP_PKEY_CTX_set_scrypt_maxmem_bytes(pctx, 10 * 1024 * 1024) <= 0) {
192e0c4386eSCy Schubert         TEST_error("EVP_PKEY_CTX_set_maxmem_bytes");
193e0c4386eSCy Schubert         goto err;
194e0c4386eSCy Schubert     }
195e0c4386eSCy Schubert     if (EVP_PKEY_derive(pctx, out, &outlen) <= 0) {
196e0c4386eSCy Schubert         TEST_error("EVP_PKEY_derive");
197e0c4386eSCy Schubert         goto err;
198e0c4386eSCy Schubert     }
199e0c4386eSCy Schubert 
200e0c4386eSCy Schubert     {
201e0c4386eSCy Schubert         const unsigned char expected[sizeof(out)] = {
202e0c4386eSCy Schubert             0xfd, 0xba, 0xbe, 0x1c, 0x9d, 0x34, 0x72, 0x00,
203e0c4386eSCy Schubert             0x78, 0x56, 0xe7, 0x19, 0x0d, 0x01, 0xe9, 0xfe,
204e0c4386eSCy Schubert             0x7c, 0x6a, 0xd7, 0xcb, 0xc8, 0x23, 0x78, 0x30,
205e0c4386eSCy Schubert             0xe7, 0x73, 0x76, 0x63, 0x4b, 0x37, 0x31, 0x62,
206e0c4386eSCy Schubert             0x2e, 0xaf, 0x30, 0xd9, 0x2e, 0x22, 0xa3, 0x88,
207e0c4386eSCy Schubert             0x6f, 0xf1, 0x09, 0x27, 0x9d, 0x98, 0x30, 0xda,
208e0c4386eSCy Schubert             0xc7, 0x27, 0xaf, 0xb9, 0x4a, 0x83, 0xee, 0x6d,
209e0c4386eSCy Schubert             0x83, 0x60, 0xcb, 0xdf, 0xa2, 0xcc, 0x06, 0x40
210e0c4386eSCy Schubert         };
211e0c4386eSCy Schubert         if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
212e0c4386eSCy Schubert             goto err;
213e0c4386eSCy Schubert         }
214e0c4386eSCy Schubert     }
215e0c4386eSCy Schubert     ret = 1;
216e0c4386eSCy Schubert err:
217e0c4386eSCy Schubert     EVP_PKEY_CTX_free(pctx);
218e0c4386eSCy Schubert     return ret;
219e0c4386eSCy Schubert }
220e0c4386eSCy Schubert #endif
221e0c4386eSCy Schubert 
222e0c4386eSCy Schubert int setup_tests(void)
223e0c4386eSCy Schubert {
224*44096ebdSEnji Cooper     int tests = 1;
225*44096ebdSEnji Cooper 
226*44096ebdSEnji Cooper     if (fips_provider_version_ge(NULL, 3, 3, 1))
227*44096ebdSEnji Cooper         tests = 2;
228*44096ebdSEnji Cooper 
229*44096ebdSEnji Cooper     ADD_ALL_TESTS(test_kdf_tls1_prf, tests);
230*44096ebdSEnji Cooper     ADD_ALL_TESTS(test_kdf_hkdf, tests);
231e0c4386eSCy Schubert #ifndef OPENSSL_NO_SCRYPT
232e0c4386eSCy Schubert     ADD_TEST(test_kdf_scrypt);
233e0c4386eSCy Schubert #endif
234e0c4386eSCy Schubert     return 1;
235e0c4386eSCy Schubert }
236