@@ -1343,7 +1343,7 @@ X509View X509View::From(const SSLCtxPointer& ctx) {
13431343}
13441344
13451345std::optional<std::string> X509View::getFingerprint (
1346- const EVP_MD* method) const {
1346+ const Digest& method) const {
13471347 unsigned int md_size;
13481348 unsigned char md[EVP_MAX_MD_SIZE];
13491349 static constexpr char hex[] = " 0123456789ABCDEF" ;
@@ -1859,17 +1859,17 @@ const EVP_CIPHER* getCipherByName(const char* name) {
18591859 return EVP_get_cipherbyname (name);
18601860}
18611861
1862- bool checkHkdfLength (const EVP_MD* md, size_t length) {
1862+ bool checkHkdfLength (const Digest& md, size_t length) {
18631863 // HKDF-Expand computes up to 255 HMAC blocks, each having as many bits as
18641864 // the output of the hash function. 255 is a hard limit because HKDF appends
18651865 // an 8-bit counter to each HMAC'd message, starting at 1.
18661866 static constexpr size_t kMaxDigestMultiplier = 255 ;
1867- size_t max_length = EVP_MD_size (md ) * kMaxDigestMultiplier ;
1867+ size_t max_length = md. size ( ) * kMaxDigestMultiplier ;
18681868 if (length > max_length) return false ;
18691869 return true ;
18701870}
18711871
1872- bool hkdfInfo (const EVP_MD* md,
1872+ bool hkdfInfo (const Digest& md,
18731873 const Buffer<const unsigned char >& key,
18741874 const Buffer<const unsigned char >& info,
18751875 const Buffer<const unsigned char >& salt,
@@ -1887,7 +1887,15 @@ bool hkdfInfo(const EVP_MD* md,
18871887 if (salt.len > 0 ) {
18881888 actual_salt = {reinterpret_cast <const char *>(salt.data ), salt.len };
18891889 } else {
1890- actual_salt = {default_salt, static_cast <unsigned >(EVP_MD_size (md))};
1890+ actual_salt = {default_salt, static_cast <unsigned >(md.size ())};
1891+ }
1892+
1893+ #ifndef NCRYPTO_NO_KDF_H
1894+ auto ctx = EVPKeyCtxPointer::NewFromID (EVP_PKEY_HKDF);
1895+ if (!ctx || !EVP_PKEY_derive_init (ctx.get ()) ||
1896+ !EVP_PKEY_CTX_set_hkdf_md (ctx.get (), md) ||
1897+ !EVP_PKEY_CTX_add1_hkdf_info (ctx.get (), info.data , info.len )) {
1898+ return false ;
18911899 }
18921900
18931901#ifndef NCRYPTO_NO_KDF_H
@@ -2003,7 +2011,7 @@ DataPointer scrypt(const Buffer<const char>& pass,
20032011 return {};
20042012}
20052013
2006- bool pbkdf2Into (const EVP_MD* md,
2014+ bool pbkdf2Into (const Digest& md,
20072015 const Buffer<const char >& pass,
20082016 const Buffer<const unsigned char >& salt,
20092017 uint32_t iterations,
@@ -2016,12 +2024,13 @@ bool pbkdf2Into(const EVP_MD* md,
20162024 return false ;
20172025 }
20182026
2027+ const EVP_MD* md_ptr = md;
20192028 if (PKCS5_PBKDF2_HMAC (pass.data ,
20202029 pass.len ,
20212030 salt.data ,
20222031 salt.len ,
20232032 iterations,
2024- md ,
2033+ md_ptr ,
20252034 length,
20262035 out->data )) {
20272036 return true ;
@@ -3358,6 +3367,14 @@ bool Cipher::isSupportedAuthenticatedMode() const {
33583367 }
33593368}
33603369
3370+ int Cipher::bytesToKey (const Digest& digest,
3371+ const Buffer<const unsigned char >& input,
3372+ unsigned char * key,
3373+ unsigned char * iv) const {
3374+ return EVP_BytesToKey (
3375+ *this , Digest::MD5, nullptr , input.data , input.len , 1 , key, iv);
3376+ }
3377+
33613378// ============================================================================
33623379
33633380CipherCtxPointer CipherCtxPointer::New () {
@@ -3391,9 +3408,9 @@ EVP_CIPHER_CTX* CipherCtxPointer::release() {
33913408 return ctx_.release ();
33923409}
33933410
3394- void CipherCtxPointer::setFlags ( int flags ) {
3411+ void CipherCtxPointer::setAllowWrap ( ) {
33953412 if (!ctx_) return ;
3396- EVP_CIPHER_CTX_set_flags (ctx_.get (), flags );
3413+ EVP_CIPHER_CTX_set_flags (ctx_.get (), EVP_CIPHER_CTX_FLAG_WRAP_ALLOW );
33973414}
33983415
33993416bool CipherCtxPointer::setKeyLength (size_t length) {
@@ -3832,14 +3849,16 @@ bool EVPKeyCtxPointer::setEcParameters(int curve, int encoding) {
38323849 EVP_PKEY_CTX_set_ec_param_enc (ctx_.get (), encoding) == 1 ;
38333850}
38343851
3835- bool EVPKeyCtxPointer::setRsaOaepMd (const EVP_MD* md) {
3836- if (md == nullptr || !ctx_) return false ;
3837- return EVP_PKEY_CTX_set_rsa_oaep_md (ctx_.get (), md) > 0 ;
3852+ bool EVPKeyCtxPointer::setRsaOaepMd (const Digest& md) {
3853+ if (!md || !ctx_) return false ;
3854+ const EVP_MD* md_ptr = md;
3855+ return EVP_PKEY_CTX_set_rsa_oaep_md (ctx_.get (), md_ptr) > 0 ;
38383856}
38393857
3840- bool EVPKeyCtxPointer::setRsaMgf1Md (const EVP_MD* md) {
3841- if (md == nullptr || !ctx_) return false ;
3842- return EVP_PKEY_CTX_set_rsa_mgf1_md (ctx_.get (), md) > 0 ;
3858+ bool EVPKeyCtxPointer::setRsaMgf1Md (const Digest& md) {
3859+ if (!md || !ctx_) return false ;
3860+ const EVP_MD* md_ptr = md;
3861+ return EVP_PKEY_CTX_set_rsa_mgf1_md (ctx_.get (), md_ptr) > 0 ;
38433862}
38443863
38453864bool EVPKeyCtxPointer::setRsaPadding (int padding) {
@@ -3874,14 +3893,17 @@ bool EVPKeyCtxPointer::setRsaKeygenPubExp(BignumPointer&& e) {
38743893 return false ;
38753894}
38763895
3877- bool EVPKeyCtxPointer::setRsaPssKeygenMd (const EVP_MD* md) {
3878- if (md == nullptr || !ctx_) return false ;
3879- return EVP_PKEY_CTX_set_rsa_pss_keygen_md (ctx_.get (), md) > 0 ;
3896+ bool EVPKeyCtxPointer::setRsaPssKeygenMd (const Digest& md) {
3897+ if (!md || !ctx_) return false ;
3898+ // OpenSSL < 3 accepts a void* for the md parameter.
3899+ const EVP_MD* md_ptr = md;
3900+ return EVP_PKEY_CTX_set_rsa_pss_keygen_md (ctx_.get (), md_ptr) > 0 ;
38803901}
38813902
3882- bool EVPKeyCtxPointer::setRsaPssKeygenMgf1Md (const EVP_MD* md) {
3883- if (md == nullptr || !ctx_) return false ;
3884- return EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md (ctx_.get (), md) > 0 ;
3903+ bool EVPKeyCtxPointer::setRsaPssKeygenMgf1Md (const Digest& md) {
3904+ if (!md || !ctx_) return false ;
3905+ const EVP_MD* md_ptr = md;
3906+ return EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md (ctx_.get (), md_ptr) > 0 ;
38853907}
38863908
38873909bool EVPKeyCtxPointer::setRsaPssSaltlen (int salt_len) {
@@ -4400,7 +4422,7 @@ EVP_MD_CTX* EVPMDCtxPointer::release() {
44004422 return ctx_.release ();
44014423}
44024424
4403- bool EVPMDCtxPointer::digestInit (const EVP_MD* digest) {
4425+ bool EVPMDCtxPointer::digestInit (const Digest& digest) {
44044426 if (!ctx_) return false ;
44054427 return EVP_DigestInit_ex (ctx_.get (), digest, nullptr ) > 0 ;
44064428}
@@ -4466,7 +4488,7 @@ bool EVPMDCtxPointer::copyTo(const EVPMDCtxPointer& other) const {
44664488}
44674489
44684490std::optional<EVP_PKEY_CTX*> EVPMDCtxPointer::signInit (const EVPKeyPointer& key,
4469- const EVP_MD* digest) {
4491+ const Digest& digest) {
44704492 EVP_PKEY_CTX* ctx = nullptr ;
44714493 if (!EVP_DigestSignInit (ctx_.get (), &ctx, digest, nullptr , key.get ())) {
44724494 return std::nullopt ;
@@ -4475,7 +4497,7 @@ std::optional<EVP_PKEY_CTX*> EVPMDCtxPointer::signInit(const EVPKeyPointer& key,
44754497}
44764498
44774499std::optional<EVP_PKEY_CTX*> EVPMDCtxPointer::verifyInit (
4478- const EVPKeyPointer& key, const EVP_MD* digest) {
4500+ const EVPKeyPointer& key, const Digest& digest) {
44794501 EVP_PKEY_CTX* ctx = nullptr ;
44804502 if (!EVP_DigestVerifyInit (ctx_.get (), &ctx, digest, nullptr , key.get ())) {
44814503 return std::nullopt ;
@@ -4620,9 +4642,10 @@ HMAC_CTX* HMACCtxPointer::release() {
46204642 return ctx_.release ();
46214643}
46224644
4623- bool HMACCtxPointer::init (const Buffer<const void >& buf, const EVP_MD* md) {
4645+ bool HMACCtxPointer::init (const Buffer<const void >& buf, const Digest& md) {
46244646 if (!ctx_) return false ;
4625- return HMAC_Init_ex (ctx_.get (), buf.data , buf.len , md, nullptr ) == 1 ;
4647+ const EVP_MD* md_ptr = md;
4648+ return HMAC_Init_ex (ctx_.get (), buf.data , buf.len , md_ptr, nullptr ) == 1 ;
46264649}
46274650
46284651bool HMACCtxPointer::update (const Buffer<const void >& buf) {
0 commit comments