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-
4331typedef 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
987875static 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 ),
0 commit comments