34
34
35
35
#define MUNCH_SIZE INT_MAX
36
36
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
+
37
45
typedef struct {
38
46
PyObject_HEAD
39
47
EVP_MD_CTX * ctx ; /* OpenSSL message digest context */
@@ -82,6 +90,135 @@ _setException(PyObject *exc)
82
90
}
83
91
/* LCOV_EXCL_STOP */
84
92
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
+
85
222
static EVPobject *
86
223
newEVPobject (void )
87
224
{
@@ -304,16 +441,7 @@ EVP_get_digest_size(EVPobject *self, void *closure)
304
441
static PyObject *
305
442
EVP_get_name (EVPobject * self , void * closure )
306
443
{
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 ));
317
445
}
318
446
319
447
static PyGetSetDef EVP_getseters [] = {
@@ -337,7 +465,7 @@ static PyObject *
337
465
EVP_repr (EVPobject * self )
338
466
{
339
467
PyObject * name_obj , * repr ;
340
- name_obj = EVP_get_name ( self , NULL );
468
+ name_obj = py_digest_name ( EVP_MD_CTX_md ( self -> ctx ) );
341
469
if (!name_obj ) {
342
470
return NULL ;
343
471
}
@@ -403,6 +531,7 @@ static PyTypeObject EVPtype = {
403
531
0 , /* tp_dictoffset */
404
532
};
405
533
534
+ \
406
535
static PyObject *
407
536
EVPnew (const EVP_MD * digest ,
408
537
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,
485
614
if (data_obj )
486
615
GET_BUFFER_VIEW_OR_ERROUT (data_obj , & view );
487
616
488
- digest = EVP_get_digestbyname (name );
617
+ digest = py_digest_by_name (name );
489
618
490
619
ret_obj = EVPnew (digest ,
491
620
(unsigned char * )view .buf , view .len ,
@@ -922,21 +1051,17 @@ typedef struct _internal_name_mapper_state {
922
1051
923
1052
/* A callback function to pass to OpenSSL's OBJ_NAME_do_all(...) */
924
1053
static 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 )
926
1056
{
927
1057
_InternalNameMapperState * state = (_InternalNameMapperState * )arg ;
928
1058
PyObject * py_name ;
929
1059
930
1060
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 )
937
1062
return ;
938
1063
939
- py_name = PyUnicode_FromString ( openssl_obj_name -> name );
1064
+ py_name = py_digest_name ( md );
940
1065
if (py_name == NULL ) {
941
1066
state -> error = 1 ;
942
1067
} else {
@@ -958,7 +1083,7 @@ generate_hash_name_list(void)
958
1083
return NULL ;
959
1084
state .error = 0 ;
960
1085
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 );
962
1087
963
1088
if (state .error ) {
964
1089
Py_DECREF (state .set );
0 commit comments