2 * Copyright 2017-2019 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 /* Tests of the EVP_PKEY_CTX_set_* macro family */
15 #include <openssl/evp.h>
16 #include <openssl/kdf.h>
19 static int test_kdf_tls1_prf(void)
23 unsigned char out[16];
24 size_t outlen = sizeof(out);
26 if ((pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_TLS1_PRF, NULL)) == NULL) {
27 TEST_error("EVP_PKEY_TLS1_PRF");
30 if (EVP_PKEY_derive_init(pctx) <= 0) {
31 TEST_error("EVP_PKEY_derive_init");
34 if (EVP_PKEY_CTX_set_tls1_prf_md(pctx, EVP_sha256()) <= 0) {
35 TEST_error("EVP_PKEY_CTX_set_tls1_prf_md");
38 if (EVP_PKEY_CTX_set1_tls1_prf_secret(pctx, "secret", 6) <= 0) {
39 TEST_error("EVP_PKEY_CTX_set1_tls1_prf_secret");
42 if (EVP_PKEY_CTX_add1_tls1_prf_seed(pctx, "seed", 4) <= 0) {
43 TEST_error("EVP_PKEY_CTX_add1_tls1_prf_seed");
46 if (EVP_PKEY_derive(pctx, out, &outlen) <= 0) {
47 TEST_error("EVP_PKEY_derive");
52 const unsigned char expected[sizeof(out)] = {
53 0x8e, 0x4d, 0x93, 0x25, 0x30, 0xd7, 0x65, 0xa0,
54 0xaa, 0xe9, 0x74, 0xc3, 0x04, 0x73, 0x5e, 0xcc
56 if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
62 EVP_PKEY_CTX_free(pctx);
66 static int test_kdf_hkdf(void)
70 unsigned char out[10];
71 size_t outlen = sizeof(out);
73 if ((pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL)) == NULL) {
74 TEST_error("EVP_PKEY_HKDF");
77 if (EVP_PKEY_derive_init(pctx) <= 0) {
78 TEST_error("EVP_PKEY_derive_init");
81 if (EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()) <= 0) {
82 TEST_error("EVP_PKEY_CTX_set_hkdf_md");
85 if (EVP_PKEY_CTX_set1_hkdf_salt(pctx, "salt", 4) <= 0) {
86 TEST_error("EVP_PKEY_CTX_set1_hkdf_salt");
89 if (EVP_PKEY_CTX_set1_hkdf_key(pctx, "secret", 6) <= 0) {
90 TEST_error("EVP_PKEY_CTX_set1_hkdf_key");
93 if (EVP_PKEY_CTX_add1_hkdf_info(pctx, "label", 5) <= 0) {
94 TEST_error("EVP_PKEY_CTX_set1_hkdf_info");
97 if (EVP_PKEY_derive(pctx, out, &outlen) <= 0) {
98 TEST_error("EVP_PKEY_derive");
103 const unsigned char expected[sizeof(out)] = {
104 0x2a, 0xc4, 0x36, 0x9f, 0x52, 0x59, 0x96, 0xf8, 0xde, 0x13
106 if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
112 EVP_PKEY_CTX_free(pctx);
116 #ifndef OPENSSL_NO_SCRYPT
117 static int test_kdf_scrypt(void)
121 unsigned char out[64];
122 size_t outlen = sizeof(out);
124 if ((pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_SCRYPT, NULL)) == NULL) {
125 TEST_error("EVP_PKEY_SCRYPT");
128 if (EVP_PKEY_derive_init(pctx) <= 0) {
129 TEST_error("EVP_PKEY_derive_init");
132 if (EVP_PKEY_CTX_set1_pbe_pass(pctx, "password", 8) <= 0) {
133 TEST_error("EVP_PKEY_CTX_set1_pbe_pass");
136 if (EVP_PKEY_CTX_set1_scrypt_salt(pctx, "NaCl", 4) <= 0) {
137 TEST_error("EVP_PKEY_CTX_set1_scrypt_salt");
140 if (EVP_PKEY_CTX_set_scrypt_N(pctx, 1024) <= 0) {
141 TEST_error("EVP_PKEY_CTX_set_scrypt_N");
144 if (EVP_PKEY_CTX_set_scrypt_r(pctx, 8) <= 0) {
145 TEST_error("EVP_PKEY_CTX_set_scrypt_r");
148 if (EVP_PKEY_CTX_set_scrypt_p(pctx, 16) <= 0) {
149 TEST_error("EVP_PKEY_CTX_set_scrypt_p");
152 if (EVP_PKEY_CTX_set_scrypt_maxmem_bytes(pctx, 16) <= 0) {
153 TEST_error("EVP_PKEY_CTX_set_maxmem_bytes");
156 if (EVP_PKEY_derive(pctx, out, &outlen) > 0) {
157 TEST_error("EVP_PKEY_derive should have failed");
160 if (EVP_PKEY_CTX_set_scrypt_maxmem_bytes(pctx, 10 * 1024 * 1024) <= 0) {
161 TEST_error("EVP_PKEY_CTX_set_maxmem_bytes");
164 if (EVP_PKEY_derive(pctx, out, &outlen) <= 0) {
165 TEST_error("EVP_PKEY_derive");
170 const unsigned char expected[sizeof(out)] = {
171 0xfd, 0xba, 0xbe, 0x1c, 0x9d, 0x34, 0x72, 0x00,
172 0x78, 0x56, 0xe7, 0x19, 0x0d, 0x01, 0xe9, 0xfe,
173 0x7c, 0x6a, 0xd7, 0xcb, 0xc8, 0x23, 0x78, 0x30,
174 0xe7, 0x73, 0x76, 0x63, 0x4b, 0x37, 0x31, 0x62,
175 0x2e, 0xaf, 0x30, 0xd9, 0x2e, 0x22, 0xa3, 0x88,
176 0x6f, 0xf1, 0x09, 0x27, 0x9d, 0x98, 0x30, 0xda,
177 0xc7, 0x27, 0xaf, 0xb9, 0x4a, 0x83, 0xee, 0x6d,
178 0x83, 0x60, 0xcb, 0xdf, 0xa2, 0xcc, 0x06, 0x40
180 if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
186 EVP_PKEY_CTX_free(pctx);
191 int setup_tests(void)
193 ADD_TEST(test_kdf_tls1_prf);
194 ADD_TEST(test_kdf_hkdf);
195 #ifndef OPENSSL_NO_SCRYPT
196 ADD_TEST(test_kdf_scrypt);