]> git.ipfire.org Git - thirdparty/openssl.git/blob - test/evp_kdf_test.c
Added new EVP/KDF API.
[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 "testutil.h"
19
20 static int test_kdf_tls1_prf(void)
21 {
22 int ret = 0;
23 EVP_KDF_CTX *kctx;
24 unsigned char out[16];
25
26 if ((kctx = EVP_KDF_CTX_new_id(EVP_KDF_TLS1_PRF)) == NULL) {
27 TEST_error("EVP_KDF_TLS1_PRF");
28 goto err;
29 }
30 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_MD, EVP_sha256()) <= 0) {
31 TEST_error("EVP_KDF_CTRL_SET_MD");
32 goto err;
33 }
34 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_TLS_SECRET,
35 "secret", (size_t)6) <= 0) {
36 TEST_error("EVP_KDF_CTRL_SET_TLS_SECRET");
37 goto err;
38 }
39 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_ADD_TLS_SEED, "seed", (size_t)4) <= 0) {
40 TEST_error("EVP_KDF_CTRL_ADD_TLS_SEED");
41 goto err;
42 }
43 if (EVP_KDF_derive(kctx, out, sizeof(out)) <= 0) {
44 TEST_error("EVP_KDF_derive");
45 goto err;
46 }
47
48 {
49 const unsigned char expected[sizeof(out)] = {
50 0x8e, 0x4d, 0x93, 0x25, 0x30, 0xd7, 0x65, 0xa0,
51 0xaa, 0xe9, 0x74, 0xc3, 0x04, 0x73, 0x5e, 0xcc
52 };
53 if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
54 goto err;
55 }
56 }
57 ret = 1;
58 err:
59 EVP_KDF_CTX_free(kctx);
60 return ret;
61 }
62
63 static int test_kdf_hkdf(void)
64 {
65 int ret = 0;
66 EVP_KDF_CTX *kctx;
67 unsigned char out[10];
68
69 if ((kctx = EVP_KDF_CTX_new_id(EVP_KDF_HKDF)) == NULL) {
70 TEST_error("EVP_KDF_HKDF");
71 goto err;
72 }
73 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_MD, EVP_sha256()) <= 0) {
74 TEST_error("EVP_KDF_CTRL_SET_MD");
75 goto err;
76 }
77 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_SALT, "salt", (size_t)4) <= 0) {
78 TEST_error("EVP_KDF_CTRL_SET_SALT");
79 goto err;
80 }
81 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_KEY, "secret", (size_t)6) <= 0) {
82 TEST_error("EVP_KDF_CTRL_SET_KEY");
83 goto err;
84 }
85 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_ADD_HKDF_INFO,
86 "label", (size_t)5) <= 0) {
87 TEST_error("EVP_KDF_CTRL_ADD_HKDF_INFO");
88 goto err;
89 }
90 if (EVP_KDF_derive(kctx, out, sizeof(out)) <= 0) {
91 TEST_error("EVP_KDF_derive");
92 goto err;
93 }
94
95 {
96 const unsigned char expected[sizeof(out)] = {
97 0x2a, 0xc4, 0x36, 0x9f, 0x52, 0x59, 0x96, 0xf8, 0xde, 0x13
98 };
99 if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
100 goto err;
101 }
102 }
103 ret = 1;
104 err:
105 EVP_KDF_CTX_free(kctx);
106 return ret;
107 }
108
109 static int test_kdf_pbkdf2(void)
110 {
111 int ret = 0;
112 EVP_KDF_CTX *kctx;
113 unsigned char out[32];
114
115 if ((kctx = EVP_KDF_CTX_new_id(EVP_KDF_PBKDF2)) == NULL) {
116 TEST_error("EVP_KDF_PBKDF2");
117 goto err;
118 }
119 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_PASS, "password", (size_t)8) <= 0) {
120 TEST_error("EVP_KDF_CTRL_SET_PASS");
121 goto err;
122 }
123 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_SALT, "salt", (size_t)4) <= 0) {
124 TEST_error("EVP_KDF_CTRL_SET_SALT");
125 goto err;
126 }
127 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_ITER, 2) <= 0) {
128 TEST_error("EVP_KDF_CTRL_SET_ITER");
129 goto err;
130 }
131 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_MD, EVP_sha256()) <= 0) {
132 TEST_error("EVP_KDF_CTRL_SET_MD");
133 goto err;
134 }
135 if (EVP_KDF_derive(kctx, out, sizeof(out)) <= 0) {
136 TEST_error("EVP_KDF_derive");
137 goto err;
138 }
139
140 {
141 const unsigned char expected[sizeof(out)] = {
142 0xae, 0x4d, 0x0c, 0x95, 0xaf, 0x6b, 0x46, 0xd3,
143 0x2d, 0x0a, 0xdf, 0xf9, 0x28, 0xf0, 0x6d, 0xd0,
144 0x2a, 0x30, 0x3f, 0x8e, 0xf3, 0xc2, 0x51, 0xdf,
145 0xd6, 0xe2, 0xd8, 0x5a, 0x95, 0x47, 0x4c, 0x43
146 };
147 if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
148 goto err;
149 }
150 }
151 ret = 1;
152 err:
153 EVP_KDF_CTX_free(kctx);
154 return ret;
155 }
156
157 #ifndef OPENSSL_NO_SCRYPT
158 static int test_kdf_scrypt(void)
159 {
160 int ret = 0;
161 EVP_KDF_CTX *kctx;
162 unsigned char out[64];
163
164 if ((kctx = EVP_KDF_CTX_new_id(EVP_KDF_SCRYPT)) == NULL) {
165 TEST_error("EVP_KDF_SCRYPT");
166 goto err;
167 }
168 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_PASS, "password", (size_t)8) <= 0) {
169 TEST_error("EVP_KDF_CTRL_SET_PASS");
170 goto err;
171 }
172 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_SALT, "NaCl", (size_t)4) <= 0) {
173 TEST_error("EVP_KDF_CTRL_SET_SALT");
174 goto err;
175 }
176 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_SCRYPT_N, (uint64_t)1024) <= 0) {
177 TEST_error("EVP_KDF_CTRL_SET_SCRYPT_N");
178 goto err;
179 }
180 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_SCRYPT_R, (uint32_t)8) <= 0) {
181 TEST_error("EVP_KDF_CTRL_SET_SCRYPT_R");
182 goto err;
183 }
184 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_SCRYPT_P, (uint32_t)16) <= 0) {
185 TEST_error("EVP_KDF_CTRL_SET_SCRYPT_P");
186 goto err;
187 }
188 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_MAXMEM_BYTES, (uint64_t)16) <= 0) {
189 TEST_error("EVP_KDF_CTRL_SET_MAXMEM_BYTES");
190 goto err;
191 }
192 if (EVP_KDF_derive(kctx, out, sizeof(out)) > 0) {
193 TEST_error("EVP_KDF_derive should have failed");
194 goto err;
195 }
196 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_MAXMEM_BYTES,
197 (uint64_t)(10 * 1024 * 1024)) <= 0) {
198 TEST_error("EVP_KDF_CTRL_SET_MAXMEM_BYTES");
199 goto err;
200 }
201 if (EVP_KDF_derive(kctx, out, sizeof(out)) <= 0) {
202 TEST_error("EVP_KDF_derive");
203 goto err;
204 }
205
206 {
207 const unsigned char expected[sizeof(out)] = {
208 0xfd, 0xba, 0xbe, 0x1c, 0x9d, 0x34, 0x72, 0x00,
209 0x78, 0x56, 0xe7, 0x19, 0x0d, 0x01, 0xe9, 0xfe,
210 0x7c, 0x6a, 0xd7, 0xcb, 0xc8, 0x23, 0x78, 0x30,
211 0xe7, 0x73, 0x76, 0x63, 0x4b, 0x37, 0x31, 0x62,
212 0x2e, 0xaf, 0x30, 0xd9, 0x2e, 0x22, 0xa3, 0x88,
213 0x6f, 0xf1, 0x09, 0x27, 0x9d, 0x98, 0x30, 0xda,
214 0xc7, 0x27, 0xaf, 0xb9, 0x4a, 0x83, 0xee, 0x6d,
215 0x83, 0x60, 0xcb, 0xdf, 0xa2, 0xcc, 0x06, 0x40
216 };
217 if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
218 goto err;
219 }
220 }
221 ret = 1;
222 err:
223 EVP_KDF_CTX_free(kctx);
224 return ret;
225 }
226 #endif
227
228 int setup_tests(void)
229 {
230 ADD_TEST(test_kdf_tls1_prf);
231 ADD_TEST(test_kdf_hkdf);
232 ADD_TEST(test_kdf_pbkdf2);
233 #ifndef OPENSSL_NO_SCRYPT
234 ADD_TEST(test_kdf_scrypt);
235 #endif
236 return 1;
237 }