@@ -1950,7 +1950,11 @@ py_openssl_wrapper_HMAC_CTX_new(void)
19501950 }
19511951 return ctx ;
19521952}
1953+ #endif
1954+
1955+ static int _hmac_update (HMACobject * , PyObject * );
19531956
1957+ #ifndef Py_HAS_OPENSSL3_SUPPORT
19541958static const EVP_MD *
19551959_hashlib_hmac_get_md (HMACobject * self )
19561960{
@@ -1994,20 +1998,6 @@ hashlib_openssl_HMAC_CTX_free(PY_HMAC_CTX_TYPE *ctx)
19941998 }
19951999}
19962000
1997- static int
1998- _hmac_update (HMACobject * self , PyObject * data )
1999- {
2000- int r ;
2001- Py_buffer view = {0 };
2002- GET_BUFFER_VIEW_OR_ERROR (data , & view , return - 1 );
2003- HASHLIB_EXTERNAL_INSTRUCTIONS_LOCKED (
2004- self , view .len ,
2005- r = hashlib_openssl_HMAC_update_once (self -> ctx , & view )
2006- );
2007- PyBuffer_Release (& view );
2008- return r ;
2009- }
2010-
20112001static PY_HMAC_CTX_TYPE *
20122002hashlib_openssl_HMAC_ctx_copy_with_lock (HMACobject * self )
20132003{
@@ -2205,6 +2195,55 @@ _hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj,
22052195 return NULL ;
22062196}
22072197
2198+ /* helper functions */
2199+ #define BAD_DIGEST_SIZE 0
2200+
2201+ /*
2202+ * Return the digest size in bytes.
2203+ *
2204+ * On error, set an exception and return BAD_DIGEST_SIZE.
2205+ */
2206+ static unsigned int
2207+ _hashlib_hmac_digest_size (HMACobject * self )
2208+ {
2209+ assert (EVP_MAX_MD_SIZE < INT_MAX );
2210+ #ifdef Py_HAS_OPENSSL3_SUPPORT
2211+ assert (self -> ctx != NULL );
2212+ size_t digest_size = EVP_MAC_CTX_get_mac_size (self -> ctx );
2213+ assert (digest_size <= (size_t )EVP_MAX_MD_SIZE );
2214+ #else
2215+ const EVP_MD * md = _hashlib_hmac_get_md (self );
2216+ if (md == NULL ) {
2217+ return BAD_DIGEST_SIZE ;
2218+ }
2219+ int digest_size = EVP_MD_size (md );
2220+ /* digest_size < 0 iff EVP_MD context is NULL (which is impossible here) */
2221+ assert (digest_size >= 0 );
2222+ assert (digest_size <= (int )EVP_MAX_MD_SIZE );
2223+ #endif
2224+ /* digest_size == 0 means that the context is not entirely initialized */
2225+ if (digest_size == 0 ) {
2226+ raise_ssl_error (PyExc_ValueError , "missing digest size" );
2227+ return BAD_DIGEST_SIZE ;
2228+ }
2229+ return (unsigned int )digest_size ;
2230+ }
2231+
2232+
2233+ static int
2234+ _hmac_update (HMACobject * self , PyObject * data )
2235+ {
2236+ int r ;
2237+ Py_buffer view = {0 };
2238+ GET_BUFFER_VIEW_OR_ERROR (data , & view , return - 1 );
2239+ HASHLIB_EXTERNAL_INSTRUCTIONS_LOCKED (
2240+ self , view .len ,
2241+ r = hashlib_openssl_HMAC_update_once (self -> ctx , & view )
2242+ );
2243+ PyBuffer_Release (& view );
2244+ return r ;
2245+ }
2246+
22082247/*[clinic input]
22092248_hashlib.HMAC.copy
22102249
@@ -2272,39 +2311,6 @@ _hashlib_HMAC_update_impl(HMACobject *self, PyObject *msg)
22722311 Py_RETURN_NONE ;
22732312}
22742313
2275- #define BAD_DIGEST_SIZE 0
2276-
2277- /*
2278- * Return the digest size in bytes.
2279- *
2280- * On error, set an exception and return BAD_DIGEST_SIZE.
2281- */
2282- static unsigned int
2283- _hashlib_hmac_digest_size (HMACobject * self )
2284- {
2285- assert (EVP_MAX_MD_SIZE < INT_MAX );
2286- #ifdef Py_HAS_OPENSSL3_SUPPORT
2287- assert (self -> ctx != NULL );
2288- size_t digest_size = EVP_MAC_CTX_get_mac_size (self -> ctx );
2289- assert (digest_size <= (size_t )EVP_MAX_MD_SIZE );
2290- #else
2291- const EVP_MD * md = _hashlib_hmac_get_md (self );
2292- if (md == NULL ) {
2293- return BAD_DIGEST_SIZE ;
2294- }
2295- int digest_size = EVP_MD_size (md );
2296- /* digest_size < 0 iff EVP_MD context is NULL (which is impossible here) */
2297- assert (digest_size >= 0 );
2298- assert (digest_size <= (int )EVP_MAX_MD_SIZE );
2299- #endif
2300- /* digest_size == 0 means that the context is not entirely initialized */
2301- if (digest_size == 0 ) {
2302- raise_ssl_error (PyExc_ValueError , "missing digest size" );
2303- return BAD_DIGEST_SIZE ;
2304- }
2305- return (unsigned int )digest_size ;
2306- }
2307-
23082314/*
23092315 * Extract the MAC value to 'buf' and return the digest size.
23102316 *
0 commit comments