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