@@ -495,8 +495,8 @@ raise_unsupported_algorithm_impl(PyObject *exc_type,
495
495
{
496
496
// Since OpenSSL 3.0, if the algorithm is not supported or fetching fails,
497
497
// the reason lacks the algorithm name.
498
- int errcode = ERR_peek_last_error (), reason_id ;
499
- switch (reason_id = ERR_GET_REASON (errcode )) {
498
+ int errcode = ERR_peek_last_error ();
499
+ switch (ERR_GET_REASON (errcode )) {
500
500
case ERR_R_UNSUPPORTED : {
501
501
PyObject * text = PyUnicode_FromFormat (fallback_format , format_arg );
502
502
if (text != NULL ) {
@@ -651,14 +651,11 @@ disable_fips_property(Py_hash_type py_ht)
651
651
* If 'name' is an OpenSSL indexed name, the return value is cached.
652
652
*/
653
653
static PY_EVP_MD *
654
- get_openssl_evp_md_by_utf8name (PyObject * module , const char * name ,
654
+ get_openssl_evp_md_by_utf8name (_hashlibstate * state , const char * name ,
655
655
Py_hash_type py_ht )
656
656
{
657
657
PY_EVP_MD * digest = NULL , * other_digest = NULL ;
658
- _hashlibstate * state = get_hashlib_state (module );
659
- py_hashentry_t * entry = (py_hashentry_t * )_Py_hashtable_get (
660
- state -> hashtable , (const void * )name
661
- );
658
+ py_hashentry_t * entry = _Py_hashtable_get (state -> hashtable , name );
662
659
663
660
if (entry != NULL ) {
664
661
if (!disable_fips_property (py_ht )) {
@@ -715,26 +712,25 @@ get_openssl_evp_md_by_utf8name(PyObject *module, const char *name,
715
712
* py_ht The message digest purpose.
716
713
*/
717
714
static PY_EVP_MD *
718
- get_openssl_evp_md (PyObject * module , PyObject * digestmod , Py_hash_type py_ht )
715
+ get_openssl_evp_md (_hashlibstate * state , PyObject * digestmod , Py_hash_type py_ht )
719
716
{
720
717
const char * name ;
721
718
if (PyUnicode_Check (digestmod )) {
722
719
name = PyUnicode_AsUTF8 (digestmod );
723
720
}
724
721
else {
725
- PyObject * dict = get_hashlib_state ( module ) -> constructs ;
722
+ PyObject * dict = state -> constructs ;
726
723
assert (dict != NULL );
727
724
PyObject * borrowed_ref = PyDict_GetItemWithError (dict , digestmod );
728
725
name = borrowed_ref == NULL ? NULL : PyUnicode_AsUTF8 (borrowed_ref );
729
726
}
730
727
if (name == NULL ) {
731
728
if (!PyErr_Occurred ()) {
732
- _hashlibstate * state = get_hashlib_state (module );
733
729
raise_unsupported_algorithm_error (state , digestmod );
734
730
}
735
731
return NULL ;
736
732
}
737
- return get_openssl_evp_md_by_utf8name (module , name , py_ht );
733
+ return get_openssl_evp_md_by_utf8name (state , name , py_ht );
738
734
}
739
735
740
736
// --- OpenSSL HASH wrappers --------------------------------------------------
@@ -1191,7 +1187,7 @@ static PyType_Spec HASHXOFobject_type_spec = {
1191
1187
#endif
1192
1188
1193
1189
static PyObject *
1194
- _hashlib_HASH (PyObject * module , const char * digestname , PyObject * data_obj ,
1190
+ _hashlib_HASH (_hashlibstate * state , const char * digestname , PyObject * data_obj ,
1195
1191
int usedforsecurity )
1196
1192
{
1197
1193
Py_buffer view = { 0 };
@@ -1203,19 +1199,13 @@ _hashlib_HASH(PyObject *module, const char *digestname, PyObject *data_obj,
1203
1199
GET_BUFFER_VIEW_OR_ERROUT (data_obj , & view );
1204
1200
}
1205
1201
1206
- digest = get_openssl_evp_md_by_utf8name (
1207
- module , digestname , usedforsecurity ? Py_ht_evp : Py_ht_evp_nosecurity
1208
- );
1202
+ Py_hash_type purpose = usedforsecurity ? Py_ht_evp : Py_ht_evp_nosecurity ;
1203
+ digest = get_openssl_evp_md_by_utf8name (state , digestname , purpose );
1209
1204
if (digest == NULL ) {
1210
1205
goto exit ;
1211
1206
}
1212
1207
1213
- if ((EVP_MD_flags (digest ) & EVP_MD_FLAG_XOF ) == EVP_MD_FLAG_XOF ) {
1214
- type = get_hashlib_state (module )-> HASHXOF_type ;
1215
- } else {
1216
- type = get_hashlib_state (module )-> HASH_type ;
1217
- }
1218
-
1208
+ type = PY_EVP_MD_xof (digest ) ? state -> HASHXOF_type : state -> HASH_type ;
1219
1209
self = new_hash_object (type );
1220
1210
if (self == NULL ) {
1221
1211
goto exit ;
@@ -1267,7 +1257,8 @@ _hashlib_HASH(PyObject *module, const char *digestname, PyObject *data_obj,
1267
1257
if (_Py_hashlib_data_argument(&data_obj, DATA, STRING) < 0) { \
1268
1258
return NULL; \
1269
1259
} \
1270
- return _hashlib_HASH(MODULE, NAME, data_obj, USEDFORSECURITY); \
1260
+ _hashlibstate *state = get_hashlib_state(MODULE); \
1261
+ return _hashlib_HASH(state, NAME, data_obj, USEDFORSECURITY); \
1271
1262
} while (0)
1272
1263
1273
1264
/* The module-level function: new() */
@@ -1569,12 +1560,14 @@ pbkdf2_hmac_impl(PyObject *module, const char *hash_name,
1569
1560
PyObject * dklen_obj )
1570
1561
/*[clinic end generated code: output=144b76005416599b input=ed3ab0d2d28b5d5c]*/
1571
1562
{
1563
+ _hashlibstate * state = get_hashlib_state (module );
1572
1564
PyObject * key_obj = NULL ;
1573
1565
char * key ;
1574
1566
long dklen ;
1575
1567
int retval ;
1576
1568
1577
- PY_EVP_MD * digest = get_openssl_evp_md_by_utf8name (module , hash_name , Py_ht_pbkdf2 );
1569
+ PY_EVP_MD * digest = get_openssl_evp_md_by_utf8name (state , hash_name ,
1570
+ Py_ht_pbkdf2 );
1578
1571
if (digest == NULL ) {
1579
1572
goto end ;
1580
1573
}
@@ -1773,6 +1766,7 @@ _hashlib_hmac_singleshot_impl(PyObject *module, Py_buffer *key,
1773
1766
Py_buffer * msg , PyObject * digest )
1774
1767
/*[clinic end generated code: output=82f19965d12706ac input=0a0790cc3db45c2e]*/
1775
1768
{
1769
+ _hashlibstate * state = get_hashlib_state (module );
1776
1770
unsigned char md [EVP_MAX_MD_SIZE ] = {0 };
1777
1771
unsigned int md_len = 0 ;
1778
1772
unsigned char * result ;
@@ -1790,7 +1784,7 @@ _hashlib_hmac_singleshot_impl(PyObject *module, Py_buffer *key,
1790
1784
return NULL ;
1791
1785
}
1792
1786
1793
- evp = get_openssl_evp_md (module , digest , Py_ht_mac );
1787
+ evp = get_openssl_evp_md (state , digest , Py_ht_mac );
1794
1788
if (evp == NULL ) {
1795
1789
return NULL ;
1796
1790
}
@@ -1808,7 +1802,6 @@ _hashlib_hmac_singleshot_impl(PyObject *module, Py_buffer *key,
1808
1802
1809
1803
if (result == NULL ) {
1810
1804
if (is_xof ) {
1811
- _hashlibstate * state = get_hashlib_state (module );
1812
1805
/* use a better default error message if an XOF is used */
1813
1806
raise_unsupported_algorithm_error (state , digest );
1814
1807
}
@@ -1862,6 +1855,7 @@ _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj,
1862
1855
PyObject * digestmod )
1863
1856
/*[clinic end generated code: output=c20d9e4d9ed6d219 input=5f4071dcc7f34362]*/
1864
1857
{
1858
+ _hashlibstate * state = get_hashlib_state (module );
1865
1859
PY_EVP_MD * digest ;
1866
1860
HMAC_CTX * ctx = NULL ;
1867
1861
HMACobject * self = NULL ;
@@ -1879,7 +1873,7 @@ _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj,
1879
1873
return NULL ;
1880
1874
}
1881
1875
1882
- digest = get_openssl_evp_md (module , digestmod , Py_ht_mac );
1876
+ digest = get_openssl_evp_md (state , digestmod , Py_ht_mac );
1883
1877
if (digest == NULL ) {
1884
1878
return NULL ;
1885
1879
}
@@ -1895,7 +1889,6 @@ _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj,
1895
1889
PY_EVP_MD_free (digest );
1896
1890
if (r == 0 ) {
1897
1891
if (is_xof ) {
1898
- _hashlibstate * state = get_hashlib_state (module );
1899
1892
/* use a better default error message if an XOF is used */
1900
1893
raise_unsupported_algorithm_error (state , digestmod );
1901
1894
}
@@ -1905,7 +1898,6 @@ _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj,
1905
1898
goto error ;
1906
1899
}
1907
1900
1908
- _hashlibstate * state = get_hashlib_state (module );
1909
1901
self = PyObject_New (HMACobject , state -> HMAC_type );
1910
1902
if (self == NULL ) {
1911
1903
goto error ;
0 commit comments