2 * Copyright 2017-2018 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)
22 unsigned char out[16];
23 size_t outlen = sizeof(out);
24 pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_TLS1_PRF, NULL);
26 if (EVP_PKEY_derive_init(pctx) <= 0) {
27 TEST_error("EVP_PKEY_derive_init");
30 if (EVP_PKEY_CTX_set_tls1_prf_md(pctx, EVP_sha256()) <= 0) {
31 TEST_error("EVP_PKEY_CTX_set_tls1_prf_md");
34 if (EVP_PKEY_CTX_set1_tls1_prf_secret(pctx, "secret", 6) <= 0) {
35 TEST_error("EVP_PKEY_CTX_set1_tls1_prf_secret");
38 if (EVP_PKEY_CTX_add1_tls1_prf_seed(pctx, "seed", 4) <= 0) {
39 TEST_error("EVP_PKEY_CTX_add1_tls1_prf_seed");
42 if (EVP_PKEY_derive(pctx, out, &outlen) <= 0) {
43 TEST_error("EVP_PKEY_derive");
48 const unsigned char expected[sizeof(out)] = {
49 0x8e, 0x4d, 0x93, 0x25, 0x30, 0xd7, 0x65, 0xa0,
50 0xaa, 0xe9, 0x74, 0xc3, 0x04, 0x73, 0x5e, 0xcc
52 if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
56 EVP_PKEY_CTX_free(pctx);
60 static int test_kdf_hkdf(void)
63 unsigned char out[10];
64 size_t outlen = sizeof(out);
65 pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL);
67 if (EVP_PKEY_derive_init(pctx) <= 0) {
68 TEST_error("EVP_PKEY_derive_init");
71 if (EVP_PKEY_CTX_set_hkdf_md(pctx, EVP_sha256()) <= 0) {
72 TEST_error("EVP_PKEY_CTX_set_hkdf_md");
75 if (EVP_PKEY_CTX_set1_hkdf_salt(pctx, "salt", 4) <= 0) {
76 TEST_error("EVP_PKEY_CTX_set1_hkdf_salt");
79 if (EVP_PKEY_CTX_set1_hkdf_key(pctx, "secret", 6) <= 0) {
80 TEST_error("EVP_PKEY_CTX_set1_hkdf_key");
83 if (EVP_PKEY_CTX_add1_hkdf_info(pctx, "label", 5) <= 0) {
84 TEST_error("EVP_PKEY_CTX_set1_hkdf_info");
87 if (EVP_PKEY_derive(pctx, out, &outlen) <= 0) {
88 TEST_error("EVP_PKEY_derive");
93 const unsigned char expected[sizeof(out)] = {
94 0x2a, 0xc4, 0x36, 0x9f, 0x52, 0x59, 0x96, 0xf8, 0xde, 0x13
96 if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
100 EVP_PKEY_CTX_free(pctx);
104 #ifndef OPENSSL_NO_SCRYPT
105 static int test_kdf_scrypt(void)
108 unsigned char out[64];
109 size_t outlen = sizeof(out);
110 pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_SCRYPT, NULL);
112 if (EVP_PKEY_derive_init(pctx) <= 0) {
113 TEST_error("EVP_PKEY_derive_init");
116 if (EVP_PKEY_CTX_set1_pbe_pass(pctx, "password", 8) <= 0) {
117 TEST_error("EVP_PKEY_CTX_set1_pbe_pass");
120 if (EVP_PKEY_CTX_set1_scrypt_salt(pctx, "NaCl", 4) <= 0) {
121 TEST_error("EVP_PKEY_CTX_set1_scrypt_salt");
124 if (EVP_PKEY_CTX_set_scrypt_N(pctx, 1024) <= 0) {
125 TEST_error("EVP_PKEY_CTX_set_scrypt_N");
128 if (EVP_PKEY_CTX_set_scrypt_r(pctx, 8) <= 0) {
129 TEST_error("EVP_PKEY_CTX_set_scrypt_r");
132 if (EVP_PKEY_CTX_set_scrypt_p(pctx, 16) <= 0) {
133 TEST_error("EVP_PKEY_CTX_set_scrypt_p");
136 if (EVP_PKEY_CTX_set_scrypt_maxmem_bytes(pctx, 16) <= 0) {
137 TEST_error("EVP_PKEY_CTX_set_maxmem_bytes");
140 if (EVP_PKEY_derive(pctx, out, &outlen) > 0) {
141 TEST_error("EVP_PKEY_derive should have failed");
144 if (EVP_PKEY_CTX_set_scrypt_maxmem_bytes(pctx, 10 * 1024 * 1024) <= 0) {
145 TEST_error("EVP_PKEY_CTX_set_maxmem_bytes");
148 if (EVP_PKEY_derive(pctx, out, &outlen) <= 0) {
149 TEST_error("EVP_PKEY_derive");
154 const unsigned char expected[sizeof(out)] = {
155 0xfd, 0xba, 0xbe, 0x1c, 0x9d, 0x34, 0x72, 0x00,
156 0x78, 0x56, 0xe7, 0x19, 0x0d, 0x01, 0xe9, 0xfe,
157 0x7c, 0x6a, 0xd7, 0xcb, 0xc8, 0x23, 0x78, 0x30,
158 0xe7, 0x73, 0x76, 0x63, 0x4b, 0x37, 0x31, 0x62,
159 0x2e, 0xaf, 0x30, 0xd9, 0x2e, 0x22, 0xa3, 0x88,
160 0x6f, 0xf1, 0x09, 0x27, 0x9d, 0x98, 0x30, 0xda,
161 0xc7, 0x27, 0xaf, 0xb9, 0x4a, 0x83, 0xee, 0x6d,
162 0x83, 0x60, 0xcb, 0xdf, 0xa2, 0xcc, 0x06, 0x40
164 if (!TEST_mem_eq(out, sizeof(out), expected, sizeof(expected))) {
168 EVP_PKEY_CTX_free(pctx);
173 int setup_tests(void)
175 ADD_TEST(test_kdf_tls1_prf);
176 ADD_TEST(test_kdf_hkdf);
177 #ifndef OPENSSL_NO_SCRYPT
178 ADD_TEST(test_kdf_scrypt);