git: 56b664aa3d2c - main - dns/powerdns-recursor: update to 4.6.1

From: Fernando Apesteguía <fernape_at_FreeBSD.org>
Date: Wed, 06 Apr 2022 10:37:43 UTC
The branch main has been updated by fernape:

URL: https://cgit.FreeBSD.org/ports/commit/?id=56b664aa3d2cd0e8dbf48d26d0839d0b1aa5998f

commit 56b664aa3d2cd0e8dbf48d26d0839d0b1aa5998f
Author:     Ralf van der Enden <tremere@cainites.net>
AuthorDate: 2022-04-05 10:21:08 +0000
Commit:     Fernando Apesteguía <fernape@FreeBSD.org>
CommitDate: 2022-04-06 10:35:45 +0000

    dns/powerdns-recursor: update to 4.6.1
    
    Fixes CVE-2022-27227
    
    PR:     262879
    Reported by:    Ralf van der Enden <tremere@cainites.net> (maintainer)
    MFH:    2022Q2 (security fix)
    Security:       CVE-2022-27227
---
 dns/powerdns-recursor/Makefile                   |   2 +-
 dns/powerdns-recursor/distinfo                   |   6 +-
 dns/powerdns-recursor/files/patch-credentials.cc | 101 +++++++++++++++++++++++
 3 files changed, 105 insertions(+), 4 deletions(-)

diff --git a/dns/powerdns-recursor/Makefile b/dns/powerdns-recursor/Makefile
index fa938d9f3cb8..068f21266b00 100644
--- a/dns/powerdns-recursor/Makefile
+++ b/dns/powerdns-recursor/Makefile
@@ -1,7 +1,7 @@
 # Created by: sten@blinkenlights.nl
 
 PORTNAME=	recursor
-DISTVERSION=	4.6.0
+DISTVERSION=	4.6.1
 CATEGORIES=	dns
 MASTER_SITES=	http://downloads.powerdns.com/releases/
 PKGNAMEPREFIX=	powerdns-
diff --git a/dns/powerdns-recursor/distinfo b/dns/powerdns-recursor/distinfo
index 4103f40bb370..aa8ef2398908 100644
--- a/dns/powerdns-recursor/distinfo
+++ b/dns/powerdns-recursor/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1639754437
-SHA256 (pdns-recursor-4.6.0.tar.bz2) = df06559398aebc594d2e1e27d177f981bdbbc17f968d6306a52aa7d1119fbcf2
-SIZE (pdns-recursor-4.6.0.tar.bz2) = 1549434
+TIMESTAMP = 1648224655
+SHA256 (pdns-recursor-4.6.1.tar.bz2) = 7b8500908b84a87ea8a021cbff3f6c1f9ff95f0199e7c972b15b93dfb1561ceb
+SIZE (pdns-recursor-4.6.1.tar.bz2) = 1541000
diff --git a/dns/powerdns-recursor/files/patch-credentials.cc b/dns/powerdns-recursor/files/patch-credentials.cc
new file mode 100644
index 000000000000..4d71e65ad7aa
--- /dev/null
+++ b/dns/powerdns-recursor/files/patch-credentials.cc
@@ -0,0 +1,101 @@
+--- credentials.cc.orig	2021-11-23 18:39:17 UTC
++++ credentials.cc
+@@ -28,7 +28,7 @@
+ #include <sodium.h>
+ #endif
+ 
+-#ifdef HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT
++#if defined(HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT) && defined(EVP_PKEY_SCRYPT)
+ #include <openssl/evp.h>
+ #include <openssl/kdf.h>
+ #include <openssl/rand.h>
+@@ -42,7 +42,7 @@
+ #include "credentials.hh"
+ #include "misc.hh"
+ 
+-#ifdef HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT
++#if defined(HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT) && defined(EVP_PKEY_SCRYPT)
+ static size_t const pwhash_max_size = 128U; /* maximum size of the output */
+ static size_t const pwhash_output_size = 32U; /* size of the hashed output (before base64 encoding) */
+ static unsigned int const pwhash_salt_size = 16U; /* size of the salt (before base64 encoding */
+@@ -95,7 +95,7 @@ void SensitiveData::clear()
+ 
+ static std::string hashPasswordInternal(const std::string& password, const std::string& salt, uint64_t workFactor, uint64_t parallelFactor, uint64_t blockSize)
+ {
+-#ifdef HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT
++#if defined(HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT) && defined(EVP_PKEY_SCRYPT)
+   auto pctx = std::unique_ptr<EVP_PKEY_CTX, void (*)(EVP_PKEY_CTX*)>(EVP_PKEY_CTX_new_id(EVP_PKEY_SCRYPT, nullptr), EVP_PKEY_CTX_free);
+   if (!pctx) {
+     throw std::runtime_error("Error getting a scrypt context to hash the supplied password");
+@@ -142,7 +142,7 @@ static std::string hashPasswordInternal(const std::str
+ 
+ static std::string generateRandomSalt()
+ {
+-#ifdef HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT
++#if defined(HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT) && defined(EVP_PKEY_SCRYPT)
+   /* generate a random salt */
+   std::string salt;
+   salt.resize(pwhash_salt_size);
+@@ -159,7 +159,7 @@ static std::string generateRandomSalt()
+ 
+ std::string hashPassword(const std::string& password, uint64_t workFactor, uint64_t parallelFactor, uint64_t blockSize)
+ {
+-#ifdef HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT
++#if defined(HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT) && defined(EVP_PKEY_SCRYPT)
+   std::string result;
+   result.reserve(pwhash_max_size);
+ 
+@@ -187,7 +187,7 @@ std::string hashPassword(const std::string& password, 
+ 
+ std::string hashPassword(const std::string& password)
+ {
+-#ifdef HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT
++#if defined(HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT) && defined(EVP_PKEY_SCRYPT)
+   return hashPassword(password, CredentialsHolder::s_defaultWorkFactor, CredentialsHolder::s_defaultParallelFactor, CredentialsHolder::s_defaultBlockSize);
+ #else
+   throw std::runtime_error("Hashing a password requires scrypt support in OpenSSL, and it is not available");
+@@ -196,7 +196,7 @@ std::string hashPassword(const std::string& password)
+ 
+ bool verifyPassword(const std::string& binaryHash, const std::string& salt, uint64_t workFactor, uint64_t parallelFactor, uint64_t blockSize, const std::string& binaryPassword)
+ {
+-#ifdef HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT
++#if defined(HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT) && defined(EVP_PKEY_SCRYPT)
+   auto expected = hashPasswordInternal(binaryPassword, salt, workFactor, parallelFactor, blockSize);
+   return constantTimeStringEquals(expected, binaryHash);
+ #else
+@@ -207,7 +207,7 @@ bool verifyPassword(const std::string& binaryHash, con
+ /* parse a hashed password in PHC string format */
+ static void parseHashed(const std::string& hash, std::string& salt, std::string& hashedPassword, uint64_t& workFactor, uint64_t& parallelFactor, uint64_t& blockSize)
+ {
+-#ifdef HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT
++#if defined(HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT) && defined(EVP_PKEY_SCRYPT)
+   auto parametersEnd = hash.find('$', pwhash_prefix.size());
+   if (parametersEnd == std::string::npos || parametersEnd == hash.size()) {
+     throw std::runtime_error("Invalid hashed password format, no parameters");
+@@ -276,7 +276,7 @@ bool verifyPassword(const std::string& hash, const std
+     return false;
+   }
+ 
+-#ifdef HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT
++#if defined(HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT) && defined(EVP_PKEY_SCRYPT)
+   std::string salt;
+   std::string hashedPassword;
+   uint64_t workFactor = 0;
+@@ -294,7 +294,7 @@ bool verifyPassword(const std::string& hash, const std
+ 
+ bool isPasswordHashed(const std::string& password)
+ {
+-#ifdef HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT
++#if defined(HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT) && defined(EVP_PKEY_SCRYPT)
+   if (password.size() < pwhash_prefix_size || password.size() > pwhash_max_size) {
+     return false;
+   }
+@@ -389,7 +389,7 @@ bool CredentialsHolder::matches(const std::string& pas
+ 
+ bool CredentialsHolder::isHashingAvailable()
+ {
+-#ifdef HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT
++#if defined(HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT) && defined(EVP_PKEY_SCRYPT)
+   return true;
+ #else
+   return false;