3434
3535#define MUNCH_SIZE INT_MAX
3636
37+ #if defined(NID_sha3_224 ) && defined(EVP_MD_FLAG_XOF )
38+ #define PY_OPENSSL_HAS_SHA3 1
39+ #endif
40+
41+ #ifdef NID_blake2b512
42+ #define PY_OPENSSL_HAS_BLAKE2 1
43+ #endif
44+
3745typedef struct {
3846 PyObject_HEAD
3947 EVP_MD_CTX * ctx ; /* OpenSSL message digest context */
@@ -82,6 +90,135 @@ _setException(PyObject *exc)
8290}
8391/* LCOV_EXCL_STOP */
8492
93+ static PyObject *
94+ py_digest_name (const EVP_MD * md )
95+ {
96+ int nid = EVP_MD_nid (md );
97+ const char * name = NULL ;
98+
99+ /* Hard-coded names for well-known hashing algorithms.
100+ * OpenSSL uses slightly different names algorithms like SHA3.
101+ */
102+ switch (nid ) {
103+ case NID_md5 :
104+ name = "md5" ;
105+ break ;
106+ case NID_sha1 :
107+ name = "sha1" ;
108+ break ;
109+ case NID_sha224 :
110+ name = "sha224" ;
111+ break ;
112+ case NID_sha256 :
113+ name = "sha256" ;
114+ break ;
115+ case NID_sha384 :
116+ name = "sha384" ;
117+ break ;
118+ case NID_sha512 :
119+ name = "sha512" ;
120+ break ;
121+ #ifdef NID_sha512_224
122+ case NID_sha512_224 :
123+ name = "sha512_224" ;
124+ break ;
125+ case NID_sha512_256 :
126+ name = "sha512_256" ;
127+ break ;
128+ #endif
129+ #ifdef PY_OPENSSL_HAS_SHA3
130+ case NID_sha3_224 :
131+ name = "sha3_224" ;
132+ break ;
133+ case NID_sha3_256 :
134+ name = "sha3_256" ;
135+ break ;
136+ case NID_sha3_384 :
137+ name = "sha3_384" ;
138+ break ;
139+ case NID_sha3_512 :
140+ name = "sha3_512" ;
141+ break ;
142+ case NID_shake128 :
143+ name = "shake_128" ;
144+ break ;
145+ case NID_shake256 :
146+ name = "shake_256" ;
147+ break ;
148+ #endif
149+ #ifdef PY_OPENSSL_HAS_BLAKE2
150+ case NID_blake2s256 :
151+ name = "blake2s" ;
152+ break ;
153+ case NID_blake2b512 :
154+ name = "blake2b" ;
155+ break ;
156+ #endif
157+ default :
158+ /* Ignore aliased names and only use long, lowercase name. The aliases
159+ * pollute the list and OpenSSL appears to have its own definition of
160+ * alias as the resulting list still contains duplicate and alternate
161+ * names for several algorithms.
162+ */
163+ name = OBJ_nid2ln (nid );
164+ if (name == NULL )
165+ name = OBJ_nid2sn (nid );
166+ break ;
167+ }
168+
169+ return PyUnicode_FromString (name );
170+ }
171+
172+ static const EVP_MD *
173+ py_digest_by_name (const char * name )
174+ {
175+ const EVP_MD * digest = EVP_get_digestbyname (name );
176+
177+ /* OpenSSL uses dash instead of underscore in names of some algorithms
178+ * like SHA3 and SHAKE. Detect different spellings. */
179+ if (digest == NULL ) {
180+ #ifdef NID_sha512_224
181+ if (!strcmp (name , "sha512_224" ) || !strcmp (name , "SHA512_224" )) {
182+ digest = EVP_sha512_224 ();
183+ }
184+ else if (!strcmp (name , "sha512_256" ) || !strcmp (name , "SHA512_256" )) {
185+ digest = EVP_sha512_256 ();
186+ }
187+ #endif
188+ #ifdef PY_OPENSSL_HAS_SHA3
189+ /* could be sha3_ or shake_, Python never defined upper case */
190+ else if (!strcmp (name , "sha3_224 ")) {
191+ digest = EVP_sha3_224 ();
192+ }
193+ else if (!strcmp (name , "sha3_256 ")) {
194+ digest = EVP_sha3_256 ();
195+ }
196+ else if (!strcmp (name , "sha3_384 ")) {
197+ digest = EVP_sha3_384 ();
198+ }
199+ else if (!strcmp (name , "sha3_512 ")) {
200+ digest = EVP_sha3_512 ();
201+ }
202+ else if (!strcmp (name , "shake_128 ")) {
203+ digest = EVP_shake128 ();
204+ }
205+ else if (!strcmp (name , "shake_256 ")) {
206+ digest = EVP_shake256 ();
207+ }
208+ #endif
209+ #ifdef PY_OPENSSL_HAS_BLAKE2
210+ else if (!strcmp (name , "blake2s256 ")) {
211+ digest = EVP_blake2s256 ();
212+ }
213+ else if (!strcmp (name , "blake2b512 ")) {
214+ digest = EVP_blake2b512 ();
215+ }
216+ #endif
217+ }
218+
219+ return digest ;
220+ }
221+
85222static EVPobject *
86223newEVPobject (void )
87224{
@@ -304,16 +441,7 @@ EVP_get_digest_size(EVPobject *self, void *closure)
304441static PyObject *
305442EVP_get_name (EVPobject * self , void * closure )
306443{
307- const char * name = EVP_MD_name (EVP_MD_CTX_md (self -> ctx ));
308- PyObject * name_obj , * name_lower ;
309-
310- name_obj = PyUnicode_FromString (name );
311- if (!name_obj ) {
312- return NULL ;
313- }
314- name_lower = PyObject_CallMethod (name_obj , "lower" , NULL );
315- Py_DECREF (name_obj );
316- return name_lower ;
444+ return py_digest_name (EVP_MD_CTX_md (self -> ctx ));
317445}
318446
319447static PyGetSetDef EVP_getseters [] = {
@@ -337,7 +465,7 @@ static PyObject *
337465EVP_repr (EVPobject * self )
338466{
339467 PyObject * name_obj , * repr ;
340- name_obj = EVP_get_name ( self , NULL );
468+ name_obj = py_digest_name ( EVP_MD_CTX_md ( self -> ctx ) );
341469 if (!name_obj ) {
342470 return NULL ;
343471 }
@@ -403,6 +531,7 @@ static PyTypeObject EVPtype = {
403531 0 , /* tp_dictoffset */
404532};
405533
534+ \
406535static PyObject *
407536EVPnew (const EVP_MD * digest ,
408537 const unsigned char * cp , Py_ssize_t len , int usedforsecurity )
@@ -485,7 +614,7 @@ EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj,
485614 if (data_obj )
486615 GET_BUFFER_VIEW_OR_ERROUT (data_obj , & view );
487616
488- digest = EVP_get_digestbyname (name );
617+ digest = py_digest_by_name (name );
489618
490619 ret_obj = EVPnew (digest ,
491620 (unsigned char * )view .buf , view .len ,
@@ -922,21 +1051,17 @@ typedef struct _internal_name_mapper_state {
9221051
9231052/* A callback function to pass to OpenSSL's OBJ_NAME_do_all(...) */
9241053static void
925- _openssl_hash_name_mapper (const OBJ_NAME * openssl_obj_name , void * arg )
1054+ _openssl_hash_name_mapper (const EVP_MD * md , const char * from ,
1055+ const char * to , void * arg )
9261056{
9271057 _InternalNameMapperState * state = (_InternalNameMapperState * )arg ;
9281058 PyObject * py_name ;
9291059
9301060 assert (state != NULL );
931- if (openssl_obj_name == NULL )
932- return ;
933- /* Ignore aliased names, they pollute the list and OpenSSL appears to
934- * have its own definition of alias as the resulting list still
935- * contains duplicate and alternate names for several algorithms. */
936- if (openssl_obj_name -> alias )
1061+ if (md == NULL )
9371062 return ;
9381063
939- py_name = PyUnicode_FromString ( openssl_obj_name -> name );
1064+ py_name = py_digest_name ( md );
9401065 if (py_name == NULL ) {
9411066 state -> error = 1 ;
9421067 } else {
@@ -958,7 +1083,7 @@ generate_hash_name_list(void)
9581083 return NULL ;
9591084 state .error = 0 ;
9601085
961- OBJ_NAME_do_all ( OBJ_NAME_TYPE_MD_METH , & _openssl_hash_name_mapper , & state );
1086+ EVP_MD_do_all ( & _openssl_hash_name_mapper , & state );
9621087
9631088 if (state .error ) {
9641089 Py_DECREF (state .set );
0 commit comments