29#if OPENSSL_VERSION_NUMBER >= 0x30000000L
30 static bool PRF(
unsigned char *label,
31 const size_t label_len,
32 const unsigned char *sec,
38 using EVP_KDF_ptr = std::unique_ptr<EVP_KDF,
decltype(&::EVP_KDF_free)>;
39 using EVP_KDF_CTX_ptr = std::unique_ptr<EVP_KDF_CTX,
decltype(&::EVP_KDF_CTX_free)>;
41 EVP_KDF_ptr kdf{::EVP_KDF_fetch(NULL,
"TLS1-PRF", NULL), ::EVP_KDF_free};
47 EVP_KDF_CTX_ptr kctx{::EVP_KDF_CTX_new(kdf.get()), ::EVP_KDF_CTX_free};
55 params[0] = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST,
56 const_cast<char *
>(SN_md5_sha1),
58 params[1] = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SECRET,
59 const_cast<unsigned char *
>(sec),
61 params[2] = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SEED,
64 params[3] = OSSL_PARAM_construct_end();
66 if (::EVP_KDF_derive(kctx.get(),
out1, olen, params) <= 0)
74 static bool PRF(
unsigned char *label,
75 const size_t label_len,
76 const unsigned char *sec,
83 using EVP_PKEY_CTX_ptr = std::unique_ptr<EVP_PKEY_CTX,
decltype(&::EVP_PKEY_CTX_free)>;
85 EVP_PKEY_CTX_ptr pctx(EVP_PKEY_CTX_new_id(EVP_PKEY_TLS1_PRF, NULL), ::EVP_PKEY_CTX_free);
90 if (!EVP_PKEY_derive_init(pctx.get()))
93 if (!EVP_PKEY_CTX_set_tls1_prf_md(pctx.get(), EVP_md5_sha1()))
95 if (!is_safe_conversion<int>(slen)
96 || !EVP_PKEY_CTX_set1_tls1_prf_secret(pctx.get(), sec,
static_cast<int>(slen)))
99 if (!is_safe_conversion<int>(label_len)
100 || !EVP_PKEY_CTX_add1_tls1_prf_seed(pctx.get(), label,
static_cast<int>(label_len)))
103 size_t out_len = olen;
104 if (!EVP_PKEY_derive(pctx.get(),
out1, &out_len))
static bool PRF(unsigned char *label, const size_t label_len, const unsigned char *sec, const size_t slen, unsigned char *out1, const size_t olen)