Skip to content

Commit 80e3365

Browse files
bpo-38134: Remove PKBDF2_HMAC_fast from _hashopenssl (GH-16028)
Signed-off-by: Christian Heimes <christian@python.org> (cherry picked from commit 64117e0) Co-authored-by: Christian Heimes <christian@python.org>
1 parent 648494b commit 80e3365

File tree

3 files changed

+3
-123
lines changed

3 files changed

+3
-123
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Remove obsolete copy of PBKDF2_HMAC_fast. All supported OpenSSL versions
2+
contain a fast implementation.

Modules/_hashopenssl.c

Lines changed: 0 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,6 @@
2828

2929
#define MUNCH_SIZE INT_MAX
3030

31-
#if (OPENSSL_VERSION_NUMBER < 0x10100000L) || defined(LIBRESSL_VERSION_NUMBER)
32-
/* OpenSSL < 1.1.0 */
33-
#define EVP_MD_CTX_new EVP_MD_CTX_create
34-
#define EVP_MD_CTX_free EVP_MD_CTX_destroy
35-
#define HAS_FAST_PKCS5_PBKDF2_HMAC 0
36-
#include <openssl/hmac.h>
37-
#else
38-
/* OpenSSL >= 1.1.0 */
39-
#define HAS_FAST_PKCS5_PBKDF2_HMAC 1
40-
#endif
41-
42-
4331
typedef struct {
4432
PyObject_HEAD
4533
PyObject *name; /* name of this hash algorithm */
@@ -481,97 +469,6 @@ EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj)
481469
return ret_obj;
482470
}
483471

484-
#if (OPENSSL_VERSION_NUMBER >= 0x10000000 && !defined(OPENSSL_NO_HMAC) \
485-
&& !defined(OPENSSL_NO_SHA))
486-
487-
#define PY_PBKDF2_HMAC 1
488-
489-
#if !HAS_FAST_PKCS5_PBKDF2_HMAC
490-
/* Improved implementation of PKCS5_PBKDF2_HMAC()
491-
*
492-
* PKCS5_PBKDF2_HMAC_fast() hashes the password exactly one time instead of
493-
* `iter` times. Today (2013) the iteration count is typically 100,000 or
494-
* more. The improved algorithm is not subject to a Denial-of-Service
495-
* vulnerability with overly large passwords.
496-
*
497-
* Also OpenSSL < 1.0 don't provide PKCS5_PBKDF2_HMAC(), only
498-
* PKCS5_PBKDF2_SHA1.
499-
*/
500-
static int
501-
PKCS5_PBKDF2_HMAC_fast(const char *pass, int passlen,
502-
const unsigned char *salt, int saltlen,
503-
int iter, const EVP_MD *digest,
504-
int keylen, unsigned char *out)
505-
{
506-
unsigned char digtmp[EVP_MAX_MD_SIZE], *p, itmp[4];
507-
int cplen, j, k, tkeylen, mdlen;
508-
unsigned long i = 1;
509-
HMAC_CTX hctx_tpl, hctx;
510-
511-
mdlen = EVP_MD_size(digest);
512-
if (mdlen < 0)
513-
return 0;
514-
515-
HMAC_CTX_init(&hctx_tpl);
516-
HMAC_CTX_init(&hctx);
517-
p = out;
518-
tkeylen = keylen;
519-
if (!HMAC_Init_ex(&hctx_tpl, pass, passlen, digest, NULL)) {
520-
HMAC_CTX_cleanup(&hctx_tpl);
521-
return 0;
522-
}
523-
while (tkeylen) {
524-
if (tkeylen > mdlen)
525-
cplen = mdlen;
526-
else
527-
cplen = tkeylen;
528-
/* We are unlikely to ever use more than 256 blocks (5120 bits!)
529-
* but just in case...
530-
*/
531-
itmp[0] = (unsigned char)((i >> 24) & 0xff);
532-
itmp[1] = (unsigned char)((i >> 16) & 0xff);
533-
itmp[2] = (unsigned char)((i >> 8) & 0xff);
534-
itmp[3] = (unsigned char)(i & 0xff);
535-
if (!HMAC_CTX_copy(&hctx, &hctx_tpl)) {
536-
HMAC_CTX_cleanup(&hctx_tpl);
537-
return 0;
538-
}
539-
if (!HMAC_Update(&hctx, salt, saltlen)
540-
|| !HMAC_Update(&hctx, itmp, 4)
541-
|| !HMAC_Final(&hctx, digtmp, NULL)) {
542-
HMAC_CTX_cleanup(&hctx_tpl);
543-
HMAC_CTX_cleanup(&hctx);
544-
return 0;
545-
}
546-
HMAC_CTX_cleanup(&hctx);
547-
memcpy(p, digtmp, cplen);
548-
for (j = 1; j < iter; j++) {
549-
if (!HMAC_CTX_copy(&hctx, &hctx_tpl)) {
550-
HMAC_CTX_cleanup(&hctx_tpl);
551-
return 0;
552-
}
553-
if (!HMAC_Update(&hctx, digtmp, mdlen)
554-
|| !HMAC_Final(&hctx, digtmp, NULL)) {
555-
HMAC_CTX_cleanup(&hctx_tpl);
556-
HMAC_CTX_cleanup(&hctx);
557-
return 0;
558-
}
559-
HMAC_CTX_cleanup(&hctx);
560-
for (k = 0; k < cplen; k++) {
561-
p[k] ^= digtmp[k];
562-
}
563-
}
564-
tkeylen-= cplen;
565-
i++;
566-
p+= cplen;
567-
}
568-
HMAC_CTX_cleanup(&hctx_tpl);
569-
return 1;
570-
}
571-
#endif
572-
573-
574-
575472
/*[clinic input]
576473
_hashlib.pbkdf2_hmac as pbkdf2_hmac
577474
@@ -652,17 +549,10 @@ pbkdf2_hmac_impl(PyObject *module, const char *hash_name,
652549
key = PyBytes_AS_STRING(key_obj);
653550

654551
Py_BEGIN_ALLOW_THREADS
655-
#if HAS_FAST_PKCS5_PBKDF2_HMAC
656552
retval = PKCS5_PBKDF2_HMAC((char*)password->buf, (int)password->len,
657553
(unsigned char *)salt->buf, (int)salt->len,
658554
iterations, digest, dklen,
659555
(unsigned char *)key);
660-
#else
661-
retval = PKCS5_PBKDF2_HMAC_fast((char*)password->buf, (int)password->len,
662-
(unsigned char *)salt->buf, (int)salt->len,
663-
iterations, digest, dklen,
664-
(unsigned char *)key);
665-
#endif
666556
Py_END_ALLOW_THREADS
667557

668558
if (!retval) {
@@ -675,8 +565,6 @@ pbkdf2_hmac_impl(PyObject *module, const char *hash_name,
675565
return key_obj;
676566
}
677567

678-
#endif
679-
680568
#if OPENSSL_VERSION_NUMBER > 0x10100000L && !defined(OPENSSL_NO_SCRYPT) && !defined(LIBRESSL_VERSION_NUMBER)
681569
#define PY_SCRYPT 1
682570

@@ -986,9 +874,7 @@ GEN_CONSTRUCTOR(sha512)
986874

987875
static struct PyMethodDef EVP_functions[] = {
988876
EVP_NEW_METHODDEF
989-
#ifdef PY_PBKDF2_HMAC
990877
PBKDF2_HMAC_METHODDEF
991-
#endif
992878
_HASHLIB_SCRYPT_METHODDEF
993879
_HASHLIB_HMAC_DIGEST_METHODDEF
994880
CONSTRUCTOR_METH_DEF(md5),

Modules/clinic/_hashopenssl.c.h

Lines changed: 1 addition & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)