@@ -1164,7 +1164,7 @@ X509View X509View::From(const SSLCtxPointer& ctx) {
11641164}
11651165
11661166std::optional<std::string> X509View::getFingerprint (
1167- const EVP_MD* method) const {
1167+ const Digest& method) const {
11681168 unsigned int md_size;
11691169 unsigned char md[EVP_MAX_MD_SIZE];
11701170 static constexpr char hex[] = " 0123456789ABCDEF" ;
@@ -1692,8 +1692,11 @@ DataPointer hkdf(const Digest& md,
16921692 }
16931693
16941694 auto ctx = EVPKeyCtxPointer::NewFromID (EVP_PKEY_HKDF);
1695+ // OpenSSL < 3.0.0 accepted only a void* as the argument of
1696+ // EVP_PKEY_CTX_set_hkdf_md.
1697+ const EVP_MD* md_ptr = md;
16951698 if (!ctx || !EVP_PKEY_derive_init (ctx.get ()) ||
1696- !EVP_PKEY_CTX_set_hkdf_md (ctx.get (), md ) ||
1699+ !EVP_PKEY_CTX_set_hkdf_md (ctx.get (), md_ptr ) ||
16971700 !EVP_PKEY_CTX_add1_hkdf_info (ctx.get (), info.data , info.len )) {
16981701 return {};
16991702 }
@@ -1776,7 +1779,7 @@ DataPointer scrypt(const Buffer<const char>& pass,
17761779 return {};
17771780}
17781781
1779- DataPointer pbkdf2 (const EVP_MD* md,
1782+ DataPointer pbkdf2 (const Digest& md,
17801783 const Buffer<const char >& pass,
17811784 const Buffer<const unsigned char >& salt,
17821785 uint32_t iterations,
@@ -2728,6 +2731,17 @@ bool SSLCtxPointer::setGroups(const char* groups) {
27282731 return SSL_CTX_set1_groups_list (get (), groups) == 1 ;
27292732}
27302733
2734+ bool SSLCtxPointer::setCipherSuites (std::string_view ciphers) {
2735+ #ifndef OPENSSL_IS_BORINGSSL
2736+ if (!ctx_) return false ;
2737+ return SSL_CTX_set_ciphersuites (ctx_.get (), ciphers.data ());
2738+ #else
2739+ // BoringSSL does not allow API config of TLS 1.3 cipher suites.
2740+ // We treat this as a non-op.
2741+ return true ;
2742+ #endif
2743+ }
2744+
27312745// ============================================================================
27322746
27332747const Cipher Cipher::FromName (std::string_view name) {
@@ -3335,13 +3349,13 @@ bool EVPKeyCtxPointer::setEcParameters(int curve, int encoding) {
33353349 EVP_PKEY_CTX_set_ec_param_enc (ctx_.get (), encoding) == 1 ;
33363350}
33373351
3338- bool EVPKeyCtxPointer::setRsaOaepMd (const EVP_MD* md) {
3339- if (md == nullptr || !ctx_) return false ;
3352+ bool EVPKeyCtxPointer::setRsaOaepMd (const Digest& md) {
3353+ if (!md || !ctx_) return false ;
33403354 return EVP_PKEY_CTX_set_rsa_oaep_md (ctx_.get (), md) > 0 ;
33413355}
33423356
3343- bool EVPKeyCtxPointer::setRsaMgf1Md (const EVP_MD* md) {
3344- if (md == nullptr || !ctx_) return false ;
3357+ bool EVPKeyCtxPointer::setRsaMgf1Md (const Digest& md) {
3358+ if (!md || !ctx_) return false ;
33453359 return EVP_PKEY_CTX_set_rsa_mgf1_md (ctx_.get (), md) > 0 ;
33463360}
33473361
@@ -3377,13 +3391,15 @@ bool EVPKeyCtxPointer::setRsaKeygenPubExp(BignumPointer&& e) {
33773391 return false ;
33783392}
33793393
3380- bool EVPKeyCtxPointer::setRsaPssKeygenMd (const EVP_MD* md) {
3381- if (md == nullptr || !ctx_) return false ;
3382- return EVP_PKEY_CTX_set_rsa_pss_keygen_md (ctx_.get (), md) > 0 ;
3394+ bool EVPKeyCtxPointer::setRsaPssKeygenMd (const Digest& md) {
3395+ if (!md || !ctx_) return false ;
3396+ // OpenSSL < 3 accepts a void* for the md parameter.
3397+ const EVP_MD* md_ptr = md;
3398+ return EVP_PKEY_CTX_set_rsa_pss_keygen_md (ctx_.get (), md_ptr) > 0 ;
33833399}
33843400
3385- bool EVPKeyCtxPointer::setRsaPssKeygenMgf1Md (const EVP_MD* md) {
3386- if (md == nullptr || !ctx_) return false ;
3401+ bool EVPKeyCtxPointer::setRsaPssKeygenMgf1Md (const Digest& md) {
3402+ if (!md || !ctx_) return false ;
33873403 return EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md (ctx_.get (), md) > 0 ;
33883404}
33893405
@@ -3858,7 +3874,7 @@ EVP_MD_CTX* EVPMDCtxPointer::release() {
38583874 return ctx_.release ();
38593875}
38603876
3861- bool EVPMDCtxPointer::digestInit (const EVP_MD* digest) {
3877+ bool EVPMDCtxPointer::digestInit (const Digest& digest) {
38623878 if (!ctx_) return false ;
38633879 return EVP_DigestInit_ex (ctx_.get (), digest, nullptr ) > 0 ;
38643880}
@@ -3924,7 +3940,7 @@ bool EVPMDCtxPointer::copyTo(const EVPMDCtxPointer& other) const {
39243940}
39253941
39263942std::optional<EVP_PKEY_CTX*> EVPMDCtxPointer::signInit (const EVPKeyPointer& key,
3927- const EVP_MD* digest) {
3943+ const Digest& digest) {
39283944 EVP_PKEY_CTX* ctx = nullptr ;
39293945 if (!EVP_DigestSignInit (ctx_.get (), &ctx, digest, nullptr , key.get ())) {
39303946 return std::nullopt ;
@@ -3933,7 +3949,7 @@ std::optional<EVP_PKEY_CTX*> EVPMDCtxPointer::signInit(const EVPKeyPointer& key,
39333949}
39343950
39353951std::optional<EVP_PKEY_CTX*> EVPMDCtxPointer::verifyInit (
3936- const EVPKeyPointer& key, const EVP_MD* digest) {
3952+ const EVPKeyPointer& key, const Digest& digest) {
39373953 EVP_PKEY_CTX* ctx = nullptr ;
39383954 if (!EVP_DigestVerifyInit (ctx_.get (), &ctx, digest, nullptr , key.get ())) {
39393955 return std::nullopt ;
@@ -4030,7 +4046,7 @@ HMAC_CTX* HMACCtxPointer::release() {
40304046 return ctx_.release ();
40314047}
40324048
4033- bool HMACCtxPointer::init (const Buffer<const void >& buf, const EVP_MD* md) {
4049+ bool HMACCtxPointer::init (const Buffer<const void >& buf, const Digest& md) {
40344050 if (!ctx_) return false ;
40354051 return HMAC_Init_ex (ctx_.get (), buf.data , buf.len , md, nullptr ) == 1 ;
40364052}
0 commit comments