1/* Module that wraps all OpenSSL hash algorithms */ 2 3/* 4 * Copyright (C) 2005-2010 Gregory P. Smith (greg@krypto.org) 5 * Licensed to PSF under a Contributor Agreement. 6 * 7 * Derived from a skeleton of shamodule.c containing work performed by: 8 * 9 * Andrew Kuchling (amk@amk.ca) 10 * Greg Stein (gstein@lyra.org) 11 * 12 */ 13 14/* Don't warn about deprecated functions, */ 15#ifndef OPENSSL_API_COMPAT 16 // 0x10101000L == 1.1.1, 30000 == 3.0.0 17 #define OPENSSL_API_COMPAT 0x10101000L 18#endif 19#define OPENSSL_NO_DEPRECATED 1 20 21#ifndef Py_BUILD_CORE_BUILTIN 22# define Py_BUILD_CORE_MODULE 1 23#endif 24 25#define PY_SSIZE_T_CLEAN 26 27#include "Python.h" 28#include "pycore_hashtable.h" 29#include "hashlib.h" 30#include "pycore_strhex.h" // _Py_strhex() 31 32/* EVP is the preferred interface to hashing in OpenSSL */ 33#include <openssl/evp.h> 34#include <openssl/hmac.h> 35#include <openssl/crypto.h> 36/* We use the object interface to discover what hashes OpenSSL supports. */ 37#include <openssl/objects.h> 38#include <openssl/err.h> 39 40#include <openssl/crypto.h> // FIPS_mode() 41 42#ifndef OPENSSL_THREADS 43# error "OPENSSL_THREADS is not defined, Python requires thread-safe OpenSSL" 44#endif 45 46#define MUNCH_SIZE INT_MAX 47 48#define PY_OPENSSL_HAS_SCRYPT 1 49#define PY_OPENSSL_HAS_SHA3 1 50#define PY_OPENSSL_HAS_SHAKE 1 51#define PY_OPENSSL_HAS_BLAKE2 1 52 53#if OPENSSL_VERSION_NUMBER >= 0x30000000L 54#define PY_EVP_MD EVP_MD 55#define PY_EVP_MD_fetch(algorithm, properties) EVP_MD_fetch(NULL, algorithm, properties) 56#define PY_EVP_MD_up_ref(md) EVP_MD_up_ref(md) 57#define PY_EVP_MD_free(md) EVP_MD_free(md) 58#else 59#define PY_EVP_MD const EVP_MD 60#define PY_EVP_MD_fetch(algorithm, properties) EVP_get_digestbyname(algorithm) 61#define PY_EVP_MD_up_ref(md) do {} while(0) 62#define PY_EVP_MD_free(md) do {} while(0) 63#endif 64 65/* hash alias map and fast lookup 66 * 67 * Map between Python's preferred names and OpenSSL internal names. Maintain 68 * cache of fetched EVP MD objects. The EVP_get_digestbyname() and 69 * EVP_MD_fetch() API calls have a performance impact. 70 * 71 * The py_hashentry_t items are stored in a _Py_hashtable_t with py_name and 72 * py_alias as keys. 73 */ 74 75enum Py_hash_type { 76 Py_ht_evp, // usedforsecurity=True / default 77 Py_ht_evp_nosecurity, // usedforsecurity=False 78 Py_ht_mac, // HMAC 79 Py_ht_pbkdf2, // PKBDF2 80}; 81 82typedef struct { 83 const char *py_name; 84 const char *py_alias; 85 const char *ossl_name; 86 int ossl_nid; 87 int refcnt; 88 PY_EVP_MD *evp; 89 PY_EVP_MD *evp_nosecurity; 90} py_hashentry_t; 91 92#define Py_hash_md5 "md5" 93#define Py_hash_sha1 "sha1" 94#define Py_hash_sha224 "sha224" 95#define Py_hash_sha256 "sha256" 96#define Py_hash_sha384 "sha384" 97#define Py_hash_sha512 "sha512" 98#define Py_hash_sha512_224 "sha512_224" 99#define Py_hash_sha512_256 "sha512_256" 100#define Py_hash_sha3_224 "sha3_224" 101#define Py_hash_sha3_256 "sha3_256" 102#define Py_hash_sha3_384 "sha3_384" 103#define Py_hash_sha3_512 "sha3_512" 104#define Py_hash_shake_128 "shake_128" 105#define Py_hash_shake_256 "shake_256" 106#define Py_hash_blake2s "blake2s" 107#define Py_hash_blake2b "blake2b" 108 109#define PY_HASH_ENTRY(py_name, py_alias, ossl_name, ossl_nid) \ 110 {py_name, py_alias, ossl_name, ossl_nid, 0, NULL, NULL} 111 112static const py_hashentry_t py_hashes[] = { 113 /* md5 */ 114 PY_HASH_ENTRY(Py_hash_md5, "MD5", SN_md5, NID_md5), 115 /* sha1 */ 116 PY_HASH_ENTRY(Py_hash_sha1, "SHA1", SN_sha1, NID_sha1), 117 /* sha2 family */ 118 PY_HASH_ENTRY(Py_hash_sha224, "SHA224", SN_sha224, NID_sha224), 119 PY_HASH_ENTRY(Py_hash_sha256, "SHA256", SN_sha256, NID_sha256), 120 PY_HASH_ENTRY(Py_hash_sha384, "SHA384", SN_sha384, NID_sha384), 121 PY_HASH_ENTRY(Py_hash_sha512, "SHA512", SN_sha512, NID_sha512), 122 /* truncated sha2 */ 123 PY_HASH_ENTRY(Py_hash_sha512_224, "SHA512_224", SN_sha512_224, NID_sha512_224), 124 PY_HASH_ENTRY(Py_hash_sha512_256, "SHA512_256", SN_sha512_256, NID_sha512_256), 125 /* sha3 */ 126 PY_HASH_ENTRY(Py_hash_sha3_224, NULL, SN_sha3_224, NID_sha3_224), 127 PY_HASH_ENTRY(Py_hash_sha3_256, NULL, SN_sha3_256, NID_sha3_256), 128 PY_HASH_ENTRY(Py_hash_sha3_384, NULL, SN_sha3_384, NID_sha3_384), 129 PY_HASH_ENTRY(Py_hash_sha3_512, NULL, SN_sha3_512, NID_sha3_512), 130 /* sha3 shake */ 131 PY_HASH_ENTRY(Py_hash_shake_128, NULL, SN_shake128, NID_shake128), 132 PY_HASH_ENTRY(Py_hash_shake_256, NULL, SN_shake256, NID_shake256), 133 /* blake2 digest */ 134 PY_HASH_ENTRY(Py_hash_blake2s, "blake2s256", SN_blake2s256, NID_blake2s256), 135 PY_HASH_ENTRY(Py_hash_blake2b, "blake2b512", SN_blake2b512, NID_blake2b512), 136 PY_HASH_ENTRY(NULL, NULL, NULL, 0), 137}; 138 139static Py_uhash_t 140py_hashentry_t_hash_name(const void *key) { 141 return _Py_HashBytes(key, strlen((const char *)key)); 142} 143 144static int 145py_hashentry_t_compare_name(const void *key1, const void *key2) { 146 return strcmp((const char *)key1, (const char *)key2) == 0; 147} 148 149static void 150py_hashentry_t_destroy_value(void *entry) { 151 py_hashentry_t *h = (py_hashentry_t *)entry; 152 if (--(h->refcnt) == 0) { 153 if (h->evp != NULL) { 154 PY_EVP_MD_free(h->evp); 155 h->evp = NULL; 156 } 157 if (h->evp_nosecurity != NULL) { 158 PY_EVP_MD_free(h->evp_nosecurity); 159 h->evp_nosecurity = NULL; 160 } 161 PyMem_Free(entry); 162 } 163} 164 165static _Py_hashtable_t * 166py_hashentry_table_new(void) { 167 _Py_hashtable_t *ht = _Py_hashtable_new_full( 168 py_hashentry_t_hash_name, 169 py_hashentry_t_compare_name, 170 NULL, 171 py_hashentry_t_destroy_value, 172 NULL 173 ); 174 if (ht == NULL) { 175 return NULL; 176 } 177 178 for (const py_hashentry_t *h = py_hashes; h->py_name != NULL; h++) { 179 py_hashentry_t *entry = (py_hashentry_t *)PyMem_Malloc(sizeof(py_hashentry_t)); 180 if (entry == NULL) { 181 goto error; 182 } 183 memcpy(entry, h, sizeof(py_hashentry_t)); 184 185 if (_Py_hashtable_set(ht, (const void*)entry->py_name, (void*)entry) < 0) { 186 PyMem_Free(entry); 187 goto error; 188 } 189 entry->refcnt = 1; 190 191 if (h->py_alias != NULL) { 192 if (_Py_hashtable_set(ht, (const void*)entry->py_alias, (void*)entry) < 0) { 193 PyMem_Free(entry); 194 goto error; 195 } 196 entry->refcnt++; 197 } 198 } 199 200 return ht; 201 error: 202 _Py_hashtable_destroy(ht); 203 return NULL; 204} 205 206/* Module state */ 207static PyModuleDef _hashlibmodule; 208 209typedef struct { 210 PyTypeObject *EVPtype; 211 PyTypeObject *HMACtype; 212#ifdef PY_OPENSSL_HAS_SHAKE 213 PyTypeObject *EVPXOFtype; 214#endif 215 PyObject *constructs; 216 PyObject *unsupported_digestmod_error; 217 _Py_hashtable_t *hashtable; 218} _hashlibstate; 219 220static inline _hashlibstate* 221get_hashlib_state(PyObject *module) 222{ 223 void *state = PyModule_GetState(module); 224 assert(state != NULL); 225 return (_hashlibstate *)state; 226} 227 228typedef struct { 229 PyObject_HEAD 230 EVP_MD_CTX *ctx; /* OpenSSL message digest context */ 231 PyThread_type_lock lock; /* OpenSSL context lock */ 232} EVPobject; 233 234typedef struct { 235 PyObject_HEAD 236 HMAC_CTX *ctx; /* OpenSSL hmac context */ 237 PyThread_type_lock lock; /* HMAC context lock */ 238} HMACobject; 239 240#include "clinic/_hashopenssl.c.h" 241/*[clinic input] 242module _hashlib 243class _hashlib.HASH "EVPobject *" "((_hashlibstate *)PyModule_GetState(module))->EVPtype" 244class _hashlib.HASHXOF "EVPobject *" "((_hashlibstate *)PyModule_GetState(module))->EVPXOFtype" 245class _hashlib.HMAC "HMACobject *" "((_hashlibstate *)PyModule_GetState(module))->HMACtype" 246[clinic start generated code]*/ 247/*[clinic end generated code: output=da39a3ee5e6b4b0d input=7df1bcf6f75cb8ef]*/ 248 249 250/* LCOV_EXCL_START */ 251static PyObject * 252_setException(PyObject *exc, const char* altmsg, ...) 253{ 254 unsigned long errcode = ERR_peek_last_error(); 255 const char *lib, *func, *reason; 256 va_list vargs; 257 258#ifdef HAVE_STDARG_PROTOTYPES 259 va_start(vargs, altmsg); 260#else 261 va_start(vargs); 262#endif 263 if (!errcode) { 264 if (altmsg == NULL) { 265 PyErr_SetString(exc, "no reason supplied"); 266 } else { 267 PyErr_FormatV(exc, altmsg, vargs); 268 } 269 va_end(vargs); 270 return NULL; 271 } 272 va_end(vargs); 273 ERR_clear_error(); 274 275 lib = ERR_lib_error_string(errcode); 276 func = ERR_func_error_string(errcode); 277 reason = ERR_reason_error_string(errcode); 278 279 if (lib && func) { 280 PyErr_Format(exc, "[%s: %s] %s", lib, func, reason); 281 } 282 else if (lib) { 283 PyErr_Format(exc, "[%s] %s", lib, reason); 284 } 285 else { 286 PyErr_SetString(exc, reason); 287 } 288 return NULL; 289} 290/* LCOV_EXCL_STOP */ 291 292static PyObject* 293py_digest_name(const EVP_MD *md) 294{ 295 int nid = EVP_MD_nid(md); 296 const char *name = NULL; 297 const py_hashentry_t *h; 298 299 for (h = py_hashes; h->py_name != NULL; h++) { 300 if (h->ossl_nid == nid) { 301 name = h->py_name; 302 break; 303 } 304 } 305 if (name == NULL) { 306 /* Ignore aliased names and only use long, lowercase name. The aliases 307 * pollute the list and OpenSSL appears to have its own definition of 308 * alias as the resulting list still contains duplicate and alternate 309 * names for several algorithms. 310 */ 311 name = OBJ_nid2ln(nid); 312 if (name == NULL) 313 name = OBJ_nid2sn(nid); 314 } 315 316 return PyUnicode_FromString(name); 317} 318 319/* Get EVP_MD by HID and purpose */ 320static PY_EVP_MD* 321py_digest_by_name(PyObject *module, const char *name, enum Py_hash_type py_ht) 322{ 323 PY_EVP_MD *digest = NULL; 324 _hashlibstate *state = get_hashlib_state(module); 325 py_hashentry_t *entry = (py_hashentry_t *)_Py_hashtable_get( 326 state->hashtable, (const void*)name 327 ); 328 329 if (entry != NULL) { 330 switch (py_ht) { 331 case Py_ht_evp: 332 case Py_ht_mac: 333 case Py_ht_pbkdf2: 334 if (entry->evp == NULL) { 335 entry->evp = PY_EVP_MD_fetch(entry->ossl_name, NULL); 336 } 337 digest = entry->evp; 338 break; 339 case Py_ht_evp_nosecurity: 340 if (entry->evp_nosecurity == NULL) { 341 entry->evp_nosecurity = PY_EVP_MD_fetch(entry->ossl_name, "-fips"); 342 } 343 digest = entry->evp_nosecurity; 344 break; 345 } 346 if (digest != NULL) { 347 PY_EVP_MD_up_ref(digest); 348 } 349 } else { 350 // Fall back for looking up an unindexed OpenSSL specific name. 351 switch (py_ht) { 352 case Py_ht_evp: 353 case Py_ht_mac: 354 case Py_ht_pbkdf2: 355 digest = PY_EVP_MD_fetch(name, NULL); 356 break; 357 case Py_ht_evp_nosecurity: 358 digest = PY_EVP_MD_fetch(name, "-fips"); 359 break; 360 } 361 } 362 if (digest == NULL) { 363 _setException(state->unsupported_digestmod_error, "unsupported hash type %s", name); 364 return NULL; 365 } 366 return digest; 367} 368 369/* Get digest EVP from object 370 * 371 * * string 372 * * _hashopenssl builtin function 373 * 374 * on error returns NULL with exception set. 375 */ 376static PY_EVP_MD* 377py_digest_by_digestmod(PyObject *module, PyObject *digestmod, enum Py_hash_type py_ht) { 378 PY_EVP_MD* evp; 379 PyObject *name_obj = NULL; 380 const char *name; 381 382 if (PyUnicode_Check(digestmod)) { 383 name_obj = digestmod; 384 } else { 385 _hashlibstate *state = get_hashlib_state(module); 386 // borrowed ref 387 name_obj = PyDict_GetItem(state->constructs, digestmod); 388 } 389 if (name_obj == NULL) { 390 _hashlibstate *state = get_hashlib_state(module); 391 PyErr_Clear(); 392 PyErr_Format( 393 state->unsupported_digestmod_error, 394 "Unsupported digestmod %R", digestmod); 395 return NULL; 396 } 397 398 name = PyUnicode_AsUTF8(name_obj); 399 if (name == NULL) { 400 return NULL; 401 } 402 403 evp = py_digest_by_name(module, name, py_ht); 404 if (evp == NULL) { 405 return NULL; 406 } 407 408 return evp; 409} 410 411static EVPobject * 412newEVPobject(PyTypeObject *type) 413{ 414 EVPobject *retval = (EVPobject *)PyObject_New(EVPobject, type); 415 if (retval == NULL) { 416 return NULL; 417 } 418 419 retval->lock = NULL; 420 421 retval->ctx = EVP_MD_CTX_new(); 422 if (retval->ctx == NULL) { 423 Py_DECREF(retval); 424 PyErr_NoMemory(); 425 return NULL; 426 } 427 428 return retval; 429} 430 431static int 432EVP_hash(EVPobject *self, const void *vp, Py_ssize_t len) 433{ 434 unsigned int process; 435 const unsigned char *cp = (const unsigned char *)vp; 436 while (0 < len) { 437 if (len > (Py_ssize_t)MUNCH_SIZE) 438 process = MUNCH_SIZE; 439 else 440 process = Py_SAFE_DOWNCAST(len, Py_ssize_t, unsigned int); 441 if (!EVP_DigestUpdate(self->ctx, (const void*)cp, process)) { 442 _setException(PyExc_ValueError, NULL); 443 return -1; 444 } 445 len -= process; 446 cp += process; 447 } 448 return 0; 449} 450 451/* Internal methods for a hash object */ 452 453static void 454EVP_dealloc(EVPobject *self) 455{ 456 PyTypeObject *tp = Py_TYPE(self); 457 if (self->lock != NULL) 458 PyThread_free_lock(self->lock); 459 EVP_MD_CTX_free(self->ctx); 460 PyObject_Free(self); 461 Py_DECREF(tp); 462} 463 464static int 465locked_EVP_MD_CTX_copy(EVP_MD_CTX *new_ctx_p, EVPobject *self) 466{ 467 int result; 468 ENTER_HASHLIB(self); 469 result = EVP_MD_CTX_copy(new_ctx_p, self->ctx); 470 LEAVE_HASHLIB(self); 471 return result; 472} 473 474/* External methods for a hash object */ 475 476/*[clinic input] 477_hashlib.HASH.copy as EVP_copy 478 479Return a copy of the hash object. 480[clinic start generated code]*/ 481 482static PyObject * 483EVP_copy_impl(EVPobject *self) 484/*[clinic end generated code: output=b370c21cdb8ca0b4 input=31455b6a3e638069]*/ 485{ 486 EVPobject *newobj; 487 488 if ((newobj = newEVPobject(Py_TYPE(self))) == NULL) 489 return NULL; 490 491 if (!locked_EVP_MD_CTX_copy(newobj->ctx, self)) { 492 Py_DECREF(newobj); 493 return _setException(PyExc_ValueError, NULL); 494 } 495 return (PyObject *)newobj; 496} 497 498/*[clinic input] 499_hashlib.HASH.digest as EVP_digest 500 501Return the digest value as a bytes object. 502[clinic start generated code]*/ 503 504static PyObject * 505EVP_digest_impl(EVPobject *self) 506/*[clinic end generated code: output=0f6a3a0da46dc12d input=03561809a419bf00]*/ 507{ 508 unsigned char digest[EVP_MAX_MD_SIZE]; 509 EVP_MD_CTX *temp_ctx; 510 PyObject *retval; 511 unsigned int digest_size; 512 513 temp_ctx = EVP_MD_CTX_new(); 514 if (temp_ctx == NULL) { 515 PyErr_NoMemory(); 516 return NULL; 517 } 518 519 if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) { 520 return _setException(PyExc_ValueError, NULL); 521 } 522 digest_size = EVP_MD_CTX_size(temp_ctx); 523 if (!EVP_DigestFinal(temp_ctx, digest, NULL)) { 524 _setException(PyExc_ValueError, NULL); 525 return NULL; 526 } 527 528 retval = PyBytes_FromStringAndSize((const char *)digest, digest_size); 529 EVP_MD_CTX_free(temp_ctx); 530 return retval; 531} 532 533/*[clinic input] 534_hashlib.HASH.hexdigest as EVP_hexdigest 535 536Return the digest value as a string of hexadecimal digits. 537[clinic start generated code]*/ 538 539static PyObject * 540EVP_hexdigest_impl(EVPobject *self) 541/*[clinic end generated code: output=18e6decbaf197296 input=aff9cf0e4c741a9a]*/ 542{ 543 unsigned char digest[EVP_MAX_MD_SIZE]; 544 EVP_MD_CTX *temp_ctx; 545 unsigned int digest_size; 546 547 temp_ctx = EVP_MD_CTX_new(); 548 if (temp_ctx == NULL) { 549 PyErr_NoMemory(); 550 return NULL; 551 } 552 553 /* Get the raw (binary) digest value */ 554 if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) { 555 return _setException(PyExc_ValueError, NULL); 556 } 557 digest_size = EVP_MD_CTX_size(temp_ctx); 558 if (!EVP_DigestFinal(temp_ctx, digest, NULL)) { 559 _setException(PyExc_ValueError, NULL); 560 return NULL; 561 } 562 563 EVP_MD_CTX_free(temp_ctx); 564 565 return _Py_strhex((const char *)digest, (Py_ssize_t)digest_size); 566} 567 568/*[clinic input] 569_hashlib.HASH.update as EVP_update 570 571 obj: object 572 / 573 574Update this hash object's state with the provided string. 575[clinic start generated code]*/ 576 577static PyObject * 578EVP_update(EVPobject *self, PyObject *obj) 579/*[clinic end generated code: output=ec1d55ed2432e966 input=9b30ec848f015501]*/ 580{ 581 int result; 582 Py_buffer view; 583 584 GET_BUFFER_VIEW_OR_ERROUT(obj, &view); 585 586 if (self->lock == NULL && view.len >= HASHLIB_GIL_MINSIZE) { 587 self->lock = PyThread_allocate_lock(); 588 /* fail? lock = NULL and we fail over to non-threaded code. */ 589 } 590 591 if (self->lock != NULL) { 592 Py_BEGIN_ALLOW_THREADS 593 PyThread_acquire_lock(self->lock, 1); 594 result = EVP_hash(self, view.buf, view.len); 595 PyThread_release_lock(self->lock); 596 Py_END_ALLOW_THREADS 597 } else { 598 result = EVP_hash(self, view.buf, view.len); 599 } 600 601 PyBuffer_Release(&view); 602 603 if (result == -1) 604 return NULL; 605 Py_RETURN_NONE; 606} 607 608static PyMethodDef EVP_methods[] = { 609 EVP_UPDATE_METHODDEF 610 EVP_DIGEST_METHODDEF 611 EVP_HEXDIGEST_METHODDEF 612 EVP_COPY_METHODDEF 613 {NULL, NULL} /* sentinel */ 614}; 615 616static PyObject * 617EVP_get_block_size(EVPobject *self, void *closure) 618{ 619 long block_size; 620 block_size = EVP_MD_CTX_block_size(self->ctx); 621 return PyLong_FromLong(block_size); 622} 623 624static PyObject * 625EVP_get_digest_size(EVPobject *self, void *closure) 626{ 627 long size; 628 size = EVP_MD_CTX_size(self->ctx); 629 return PyLong_FromLong(size); 630} 631 632static PyObject * 633EVP_get_name(EVPobject *self, void *closure) 634{ 635 return py_digest_name(EVP_MD_CTX_md(self->ctx)); 636} 637 638static PyGetSetDef EVP_getseters[] = { 639 {"digest_size", 640 (getter)EVP_get_digest_size, NULL, 641 NULL, 642 NULL}, 643 {"block_size", 644 (getter)EVP_get_block_size, NULL, 645 NULL, 646 NULL}, 647 {"name", 648 (getter)EVP_get_name, NULL, 649 NULL, 650 PyDoc_STR("algorithm name.")}, 651 {NULL} /* Sentinel */ 652}; 653 654 655static PyObject * 656EVP_repr(EVPobject *self) 657{ 658 PyObject *name_obj, *repr; 659 name_obj = py_digest_name(EVP_MD_CTX_md(self->ctx)); 660 if (!name_obj) { 661 return NULL; 662 } 663 repr = PyUnicode_FromFormat("<%U %s object @ %p>", 664 name_obj, Py_TYPE(self)->tp_name, self); 665 Py_DECREF(name_obj); 666 return repr; 667} 668 669PyDoc_STRVAR(hashtype_doc, 670"HASH(name, string=b\'\')\n" 671"--\n" 672"\n" 673"A hash is an object used to calculate a checksum of a string of information.\n" 674"\n" 675"Methods:\n" 676"\n" 677"update() -- updates the current digest with an additional string\n" 678"digest() -- return the current digest value\n" 679"hexdigest() -- return the current digest as a string of hexadecimal digits\n" 680"copy() -- return a copy of the current hash object\n" 681"\n" 682"Attributes:\n" 683"\n" 684"name -- the hash algorithm being used by this object\n" 685"digest_size -- number of bytes in this hashes output"); 686 687static PyType_Slot EVPtype_slots[] = { 688 {Py_tp_dealloc, EVP_dealloc}, 689 {Py_tp_repr, EVP_repr}, 690 {Py_tp_doc, (char *)hashtype_doc}, 691 {Py_tp_methods, EVP_methods}, 692 {Py_tp_getset, EVP_getseters}, 693 {0, 0}, 694}; 695 696static PyType_Spec EVPtype_spec = { 697 "_hashlib.HASH", /*tp_name*/ 698 sizeof(EVPobject), /*tp_basicsize*/ 699 0, /*tp_itemsize*/ 700 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE, 701 EVPtype_slots 702}; 703 704#ifdef PY_OPENSSL_HAS_SHAKE 705 706/*[clinic input] 707_hashlib.HASHXOF.digest as EVPXOF_digest 708 709 length: Py_ssize_t 710 711Return the digest value as a bytes object. 712[clinic start generated code]*/ 713 714static PyObject * 715EVPXOF_digest_impl(EVPobject *self, Py_ssize_t length) 716/*[clinic end generated code: output=ef9320c23280efad input=816a6537cea3d1db]*/ 717{ 718 EVP_MD_CTX *temp_ctx; 719 PyObject *retval = PyBytes_FromStringAndSize(NULL, length); 720 721 if (retval == NULL) { 722 return NULL; 723 } 724 725 temp_ctx = EVP_MD_CTX_new(); 726 if (temp_ctx == NULL) { 727 Py_DECREF(retval); 728 PyErr_NoMemory(); 729 return NULL; 730 } 731 732 if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) { 733 Py_DECREF(retval); 734 EVP_MD_CTX_free(temp_ctx); 735 return _setException(PyExc_ValueError, NULL); 736 } 737 if (!EVP_DigestFinalXOF(temp_ctx, 738 (unsigned char*)PyBytes_AS_STRING(retval), 739 length)) { 740 Py_DECREF(retval); 741 EVP_MD_CTX_free(temp_ctx); 742 _setException(PyExc_ValueError, NULL); 743 return NULL; 744 } 745 746 EVP_MD_CTX_free(temp_ctx); 747 return retval; 748} 749 750/*[clinic input] 751_hashlib.HASHXOF.hexdigest as EVPXOF_hexdigest 752 753 length: Py_ssize_t 754 755Return the digest value as a string of hexadecimal digits. 756[clinic start generated code]*/ 757 758static PyObject * 759EVPXOF_hexdigest_impl(EVPobject *self, Py_ssize_t length) 760/*[clinic end generated code: output=eb3e6ee7788bf5b2 input=5f9d6a8f269e34df]*/ 761{ 762 unsigned char *digest; 763 EVP_MD_CTX *temp_ctx; 764 PyObject *retval; 765 766 digest = (unsigned char*)PyMem_Malloc(length); 767 if (digest == NULL) { 768 PyErr_NoMemory(); 769 return NULL; 770 } 771 772 temp_ctx = EVP_MD_CTX_new(); 773 if (temp_ctx == NULL) { 774 PyMem_Free(digest); 775 PyErr_NoMemory(); 776 return NULL; 777 } 778 779 /* Get the raw (binary) digest value */ 780 if (!locked_EVP_MD_CTX_copy(temp_ctx, self)) { 781 PyMem_Free(digest); 782 EVP_MD_CTX_free(temp_ctx); 783 return _setException(PyExc_ValueError, NULL); 784 } 785 if (!EVP_DigestFinalXOF(temp_ctx, digest, length)) { 786 PyMem_Free(digest); 787 EVP_MD_CTX_free(temp_ctx); 788 _setException(PyExc_ValueError, NULL); 789 return NULL; 790 } 791 792 EVP_MD_CTX_free(temp_ctx); 793 794 retval = _Py_strhex((const char *)digest, length); 795 PyMem_Free(digest); 796 return retval; 797} 798 799static PyMethodDef EVPXOF_methods[] = { 800 EVPXOF_DIGEST_METHODDEF 801 EVPXOF_HEXDIGEST_METHODDEF 802 {NULL, NULL} /* sentinel */ 803}; 804 805 806static PyObject * 807EVPXOF_get_digest_size(EVPobject *self, void *closure) 808{ 809 return PyLong_FromLong(0); 810} 811 812static PyGetSetDef EVPXOF_getseters[] = { 813 {"digest_size", 814 (getter)EVPXOF_get_digest_size, NULL, 815 NULL, 816 NULL}, 817 {NULL} /* Sentinel */ 818}; 819 820PyDoc_STRVAR(hashxoftype_doc, 821"HASHXOF(name, string=b\'\')\n" 822"--\n" 823"\n" 824"A hash is an object used to calculate a checksum of a string of information.\n" 825"\n" 826"Methods:\n" 827"\n" 828"update() -- updates the current digest with an additional string\n" 829"digest(length) -- return the current digest value\n" 830"hexdigest(length) -- return the current digest as a string of hexadecimal digits\n" 831"copy() -- return a copy of the current hash object\n" 832"\n" 833"Attributes:\n" 834"\n" 835"name -- the hash algorithm being used by this object\n" 836"digest_size -- number of bytes in this hashes output"); 837 838static PyType_Slot EVPXOFtype_slots[] = { 839 {Py_tp_doc, (char *)hashxoftype_doc}, 840 {Py_tp_methods, EVPXOF_methods}, 841 {Py_tp_getset, EVPXOF_getseters}, 842 {0, 0}, 843}; 844 845static PyType_Spec EVPXOFtype_spec = { 846 "_hashlib.HASHXOF", /*tp_name*/ 847 sizeof(EVPobject), /*tp_basicsize*/ 848 0, /*tp_itemsize*/ 849 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE, 850 EVPXOFtype_slots 851}; 852 853 854#endif 855 856static PyObject* 857py_evp_fromname(PyObject *module, const char *digestname, PyObject *data_obj, 858 int usedforsecurity) 859{ 860 Py_buffer view = { 0 }; 861 PY_EVP_MD *digest = NULL; 862 PyTypeObject *type; 863 EVPobject *self = NULL; 864 865 if (data_obj != NULL) { 866 GET_BUFFER_VIEW_OR_ERROUT(data_obj, &view); 867 } 868 869 digest = py_digest_by_name( 870 module, digestname, usedforsecurity ? Py_ht_evp : Py_ht_evp_nosecurity 871 ); 872 if (digest == NULL) { 873 goto exit; 874 } 875 876 if ((EVP_MD_flags(digest) & EVP_MD_FLAG_XOF) == EVP_MD_FLAG_XOF) { 877 type = get_hashlib_state(module)->EVPXOFtype; 878 } else { 879 type = get_hashlib_state(module)->EVPtype; 880 } 881 882 self = newEVPobject(type); 883 if (self == NULL) { 884 goto exit; 885 } 886 887#if defined(EVP_MD_CTX_FLAG_NON_FIPS_ALLOW) && OPENSSL_VERSION_NUMBER < 0x30000000L 888 // In OpenSSL 1.1.1 the non FIPS allowed flag is context specific while 889 // in 3.0.0 it is a different EVP_MD provider. 890 if (!usedforsecurity) { 891 EVP_MD_CTX_set_flags(self->ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); 892 } 893#endif 894 895 int result = EVP_DigestInit_ex(self->ctx, digest, NULL); 896 if (!result) { 897 _setException(PyExc_ValueError, NULL); 898 Py_CLEAR(self); 899 goto exit; 900 } 901 902 if (view.buf && view.len) { 903 if (view.len >= HASHLIB_GIL_MINSIZE) { 904 Py_BEGIN_ALLOW_THREADS 905 result = EVP_hash(self, view.buf, view.len); 906 Py_END_ALLOW_THREADS 907 } else { 908 result = EVP_hash(self, view.buf, view.len); 909 } 910 if (result == -1) { 911 Py_CLEAR(self); 912 goto exit; 913 } 914 } 915 916 exit: 917 if (data_obj != NULL) { 918 PyBuffer_Release(&view); 919 } 920 if (digest != NULL) { 921 PY_EVP_MD_free(digest); 922 } 923 924 return (PyObject *)self; 925} 926 927 928/* The module-level function: new() */ 929 930/*[clinic input] 931_hashlib.new as EVP_new 932 933 name as name_obj: object 934 string as data_obj: object(c_default="NULL") = b'' 935 * 936 usedforsecurity: bool = True 937 938Return a new hash object using the named algorithm. 939 940An optional string argument may be provided and will be 941automatically hashed. 942 943The MD5 and SHA1 algorithms are always supported. 944[clinic start generated code]*/ 945 946static PyObject * 947EVP_new_impl(PyObject *module, PyObject *name_obj, PyObject *data_obj, 948 int usedforsecurity) 949/*[clinic end generated code: output=ddd5053f92dffe90 input=c24554d0337be1b0]*/ 950{ 951 char *name; 952 if (!PyArg_Parse(name_obj, "s", &name)) { 953 PyErr_SetString(PyExc_TypeError, "name must be a string"); 954 return NULL; 955 } 956 return py_evp_fromname(module, name, data_obj, usedforsecurity); 957} 958 959 960/*[clinic input] 961_hashlib.openssl_md5 962 963 string as data_obj: object(py_default="b''") = NULL 964 * 965 usedforsecurity: bool = True 966 967Returns a md5 hash object; optionally initialized with a string 968 969[clinic start generated code]*/ 970 971static PyObject * 972_hashlib_openssl_md5_impl(PyObject *module, PyObject *data_obj, 973 int usedforsecurity) 974/*[clinic end generated code: output=87b0186440a44f8c input=990e36d5e689b16e]*/ 975{ 976 return py_evp_fromname(module, Py_hash_md5, data_obj, usedforsecurity); 977} 978 979 980/*[clinic input] 981_hashlib.openssl_sha1 982 983 string as data_obj: object(py_default="b''") = NULL 984 * 985 usedforsecurity: bool = True 986 987Returns a sha1 hash object; optionally initialized with a string 988 989[clinic start generated code]*/ 990 991static PyObject * 992_hashlib_openssl_sha1_impl(PyObject *module, PyObject *data_obj, 993 int usedforsecurity) 994/*[clinic end generated code: output=6813024cf690670d input=948f2f4b6deabc10]*/ 995{ 996 return py_evp_fromname(module, Py_hash_sha1, data_obj, usedforsecurity); 997} 998 999 1000/*[clinic input] 1001_hashlib.openssl_sha224 1002 1003 string as data_obj: object(py_default="b''") = NULL 1004 * 1005 usedforsecurity: bool = True 1006 1007Returns a sha224 hash object; optionally initialized with a string 1008 1009[clinic start generated code]*/ 1010 1011static PyObject * 1012_hashlib_openssl_sha224_impl(PyObject *module, PyObject *data_obj, 1013 int usedforsecurity) 1014/*[clinic end generated code: output=a2dfe7cc4eb14ebb input=f9272821fadca505]*/ 1015{ 1016 return py_evp_fromname(module, Py_hash_sha224, data_obj, usedforsecurity); 1017} 1018 1019 1020/*[clinic input] 1021_hashlib.openssl_sha256 1022 1023 string as data_obj: object(py_default="b''") = NULL 1024 * 1025 usedforsecurity: bool = True 1026 1027Returns a sha256 hash object; optionally initialized with a string 1028 1029[clinic start generated code]*/ 1030 1031static PyObject * 1032_hashlib_openssl_sha256_impl(PyObject *module, PyObject *data_obj, 1033 int usedforsecurity) 1034/*[clinic end generated code: output=1f874a34870f0a68 input=549fad9d2930d4c5]*/ 1035{ 1036 return py_evp_fromname(module, Py_hash_sha256, data_obj, usedforsecurity); 1037} 1038 1039 1040/*[clinic input] 1041_hashlib.openssl_sha384 1042 1043 string as data_obj: object(py_default="b''") = NULL 1044 * 1045 usedforsecurity: bool = True 1046 1047Returns a sha384 hash object; optionally initialized with a string 1048 1049[clinic start generated code]*/ 1050 1051static PyObject * 1052_hashlib_openssl_sha384_impl(PyObject *module, PyObject *data_obj, 1053 int usedforsecurity) 1054/*[clinic end generated code: output=58529eff9ca457b2 input=48601a6e3bf14ad7]*/ 1055{ 1056 return py_evp_fromname(module, Py_hash_sha384, data_obj, usedforsecurity); 1057} 1058 1059 1060/*[clinic input] 1061_hashlib.openssl_sha512 1062 1063 string as data_obj: object(py_default="b''") = NULL 1064 * 1065 usedforsecurity: bool = True 1066 1067Returns a sha512 hash object; optionally initialized with a string 1068 1069[clinic start generated code]*/ 1070 1071static PyObject * 1072_hashlib_openssl_sha512_impl(PyObject *module, PyObject *data_obj, 1073 int usedforsecurity) 1074/*[clinic end generated code: output=2c744c9e4a40d5f6 input=c5c46a2a817aa98f]*/ 1075{ 1076 return py_evp_fromname(module, Py_hash_sha512, data_obj, usedforsecurity); 1077} 1078 1079 1080#ifdef PY_OPENSSL_HAS_SHA3 1081 1082/*[clinic input] 1083_hashlib.openssl_sha3_224 1084 1085 string as data_obj: object(py_default="b''") = NULL 1086 * 1087 usedforsecurity: bool = True 1088 1089Returns a sha3-224 hash object; optionally initialized with a string 1090 1091[clinic start generated code]*/ 1092 1093static PyObject * 1094_hashlib_openssl_sha3_224_impl(PyObject *module, PyObject *data_obj, 1095 int usedforsecurity) 1096/*[clinic end generated code: output=144641c1d144b974 input=e3a01b2888916157]*/ 1097{ 1098 return py_evp_fromname(module, Py_hash_sha3_224, data_obj, usedforsecurity); 1099} 1100 1101/*[clinic input] 1102_hashlib.openssl_sha3_256 1103 1104 string as data_obj: object(py_default="b''") = NULL 1105 * 1106 usedforsecurity: bool = True 1107 1108Returns a sha3-256 hash object; optionally initialized with a string 1109 1110[clinic start generated code]*/ 1111 1112static PyObject * 1113_hashlib_openssl_sha3_256_impl(PyObject *module, PyObject *data_obj, 1114 int usedforsecurity) 1115/*[clinic end generated code: output=c61f1ab772d06668 input=e2908126c1b6deed]*/ 1116{ 1117 return py_evp_fromname(module, Py_hash_sha3_256, data_obj , usedforsecurity); 1118} 1119 1120/*[clinic input] 1121_hashlib.openssl_sha3_384 1122 1123 string as data_obj: object(py_default="b''") = NULL 1124 * 1125 usedforsecurity: bool = True 1126 1127Returns a sha3-384 hash object; optionally initialized with a string 1128 1129[clinic start generated code]*/ 1130 1131static PyObject * 1132_hashlib_openssl_sha3_384_impl(PyObject *module, PyObject *data_obj, 1133 int usedforsecurity) 1134/*[clinic end generated code: output=f68e4846858cf0ee input=ec0edf5c792f8252]*/ 1135{ 1136 return py_evp_fromname(module, Py_hash_sha3_384, data_obj , usedforsecurity); 1137} 1138 1139/*[clinic input] 1140_hashlib.openssl_sha3_512 1141 1142 string as data_obj: object(py_default="b''") = NULL 1143 * 1144 usedforsecurity: bool = True 1145 1146Returns a sha3-512 hash object; optionally initialized with a string 1147 1148[clinic start generated code]*/ 1149 1150static PyObject * 1151_hashlib_openssl_sha3_512_impl(PyObject *module, PyObject *data_obj, 1152 int usedforsecurity) 1153/*[clinic end generated code: output=2eede478c159354a input=64e2cc0c094d56f4]*/ 1154{ 1155 return py_evp_fromname(module, Py_hash_sha3_512, data_obj , usedforsecurity); 1156} 1157#endif /* PY_OPENSSL_HAS_SHA3 */ 1158 1159#ifdef PY_OPENSSL_HAS_SHAKE 1160/*[clinic input] 1161_hashlib.openssl_shake_128 1162 1163 string as data_obj: object(py_default="b''") = NULL 1164 * 1165 usedforsecurity: bool = True 1166 1167Returns a shake-128 variable hash object; optionally initialized with a string 1168 1169[clinic start generated code]*/ 1170 1171static PyObject * 1172_hashlib_openssl_shake_128_impl(PyObject *module, PyObject *data_obj, 1173 int usedforsecurity) 1174/*[clinic end generated code: output=bc49cdd8ada1fa97 input=6c9d67440eb33ec8]*/ 1175{ 1176 return py_evp_fromname(module, Py_hash_shake_128, data_obj , usedforsecurity); 1177} 1178 1179/*[clinic input] 1180_hashlib.openssl_shake_256 1181 1182 string as data_obj: object(py_default="b''") = NULL 1183 * 1184 usedforsecurity: bool = True 1185 1186Returns a shake-256 variable hash object; optionally initialized with a string 1187 1188[clinic start generated code]*/ 1189 1190static PyObject * 1191_hashlib_openssl_shake_256_impl(PyObject *module, PyObject *data_obj, 1192 int usedforsecurity) 1193/*[clinic end generated code: output=358d213be8852df7 input=479cbe9fefd4a9f8]*/ 1194{ 1195 return py_evp_fromname(module, Py_hash_shake_256, data_obj , usedforsecurity); 1196} 1197#endif /* PY_OPENSSL_HAS_SHAKE */ 1198 1199/*[clinic input] 1200_hashlib.pbkdf2_hmac as pbkdf2_hmac 1201 1202 hash_name: str 1203 password: Py_buffer 1204 salt: Py_buffer 1205 iterations: long 1206 dklen as dklen_obj: object = None 1207 1208Password based key derivation function 2 (PKCS #5 v2.0) with HMAC as pseudorandom function. 1209[clinic start generated code]*/ 1210 1211static PyObject * 1212pbkdf2_hmac_impl(PyObject *module, const char *hash_name, 1213 Py_buffer *password, Py_buffer *salt, long iterations, 1214 PyObject *dklen_obj) 1215/*[clinic end generated code: output=144b76005416599b input=ed3ab0d2d28b5d5c]*/ 1216{ 1217 PyObject *key_obj = NULL; 1218 char *key; 1219 long dklen; 1220 int retval; 1221 1222 PY_EVP_MD *digest = py_digest_by_name(module, hash_name, Py_ht_pbkdf2); 1223 if (digest == NULL) { 1224 goto end; 1225 } 1226 1227 if (password->len > INT_MAX) { 1228 PyErr_SetString(PyExc_OverflowError, 1229 "password is too long."); 1230 goto end; 1231 } 1232 1233 if (salt->len > INT_MAX) { 1234 PyErr_SetString(PyExc_OverflowError, 1235 "salt is too long."); 1236 goto end; 1237 } 1238 1239 if (iterations < 1) { 1240 PyErr_SetString(PyExc_ValueError, 1241 "iteration value must be greater than 0."); 1242 goto end; 1243 } 1244 if (iterations > INT_MAX) { 1245 PyErr_SetString(PyExc_OverflowError, 1246 "iteration value is too great."); 1247 goto end; 1248 } 1249 1250 if (dklen_obj == Py_None) { 1251 dklen = EVP_MD_size(digest); 1252 } else { 1253 dklen = PyLong_AsLong(dklen_obj); 1254 if ((dklen == -1) && PyErr_Occurred()) { 1255 goto end; 1256 } 1257 } 1258 if (dklen < 1) { 1259 PyErr_SetString(PyExc_ValueError, 1260 "key length must be greater than 0."); 1261 goto end; 1262 } 1263 if (dklen > INT_MAX) { 1264 /* INT_MAX is always smaller than dkLen max (2^32 - 1) * hLen */ 1265 PyErr_SetString(PyExc_OverflowError, 1266 "key length is too great."); 1267 goto end; 1268 } 1269 1270 key_obj = PyBytes_FromStringAndSize(NULL, dklen); 1271 if (key_obj == NULL) { 1272 goto end; 1273 } 1274 key = PyBytes_AS_STRING(key_obj); 1275 1276 Py_BEGIN_ALLOW_THREADS 1277 retval = PKCS5_PBKDF2_HMAC((char*)password->buf, (int)password->len, 1278 (unsigned char *)salt->buf, (int)salt->len, 1279 iterations, digest, dklen, 1280 (unsigned char *)key); 1281 Py_END_ALLOW_THREADS 1282 1283 if (!retval) { 1284 Py_CLEAR(key_obj); 1285 _setException(PyExc_ValueError, NULL); 1286 goto end; 1287 } 1288 1289 end: 1290 if (digest != NULL) { 1291 PY_EVP_MD_free(digest); 1292 } 1293 return key_obj; 1294} 1295 1296#ifdef PY_OPENSSL_HAS_SCRYPT 1297 1298/* XXX: Parameters salt, n, r and p should be required keyword-only parameters. 1299 They are optional in the Argument Clinic declaration only due to a 1300 limitation of PyArg_ParseTupleAndKeywords. */ 1301 1302/*[clinic input] 1303_hashlib.scrypt 1304 1305 password: Py_buffer 1306 * 1307 salt: Py_buffer = None 1308 n as n_obj: object(subclass_of='&PyLong_Type') = None 1309 r as r_obj: object(subclass_of='&PyLong_Type') = None 1310 p as p_obj: object(subclass_of='&PyLong_Type') = None 1311 maxmem: long = 0 1312 dklen: long = 64 1313 1314 1315scrypt password-based key derivation function. 1316[clinic start generated code]*/ 1317 1318static PyObject * 1319_hashlib_scrypt_impl(PyObject *module, Py_buffer *password, Py_buffer *salt, 1320 PyObject *n_obj, PyObject *r_obj, PyObject *p_obj, 1321 long maxmem, long dklen) 1322/*[clinic end generated code: output=14849e2aa2b7b46c input=48a7d63bf3f75c42]*/ 1323{ 1324 PyObject *key_obj = NULL; 1325 char *key; 1326 int retval; 1327 unsigned long n, r, p; 1328 1329 if (password->len > INT_MAX) { 1330 PyErr_SetString(PyExc_OverflowError, 1331 "password is too long."); 1332 return NULL; 1333 } 1334 1335 if (salt->buf == NULL) { 1336 PyErr_SetString(PyExc_TypeError, 1337 "salt is required"); 1338 return NULL; 1339 } 1340 if (salt->len > INT_MAX) { 1341 PyErr_SetString(PyExc_OverflowError, 1342 "salt is too long."); 1343 return NULL; 1344 } 1345 1346 n = PyLong_AsUnsignedLong(n_obj); 1347 if (n == (unsigned long) -1 && PyErr_Occurred()) { 1348 PyErr_SetString(PyExc_TypeError, 1349 "n is required and must be an unsigned int"); 1350 return NULL; 1351 } 1352 if (n < 2 || n & (n - 1)) { 1353 PyErr_SetString(PyExc_ValueError, 1354 "n must be a power of 2."); 1355 return NULL; 1356 } 1357 1358 r = PyLong_AsUnsignedLong(r_obj); 1359 if (r == (unsigned long) -1 && PyErr_Occurred()) { 1360 PyErr_SetString(PyExc_TypeError, 1361 "r is required and must be an unsigned int"); 1362 return NULL; 1363 } 1364 1365 p = PyLong_AsUnsignedLong(p_obj); 1366 if (p == (unsigned long) -1 && PyErr_Occurred()) { 1367 PyErr_SetString(PyExc_TypeError, 1368 "p is required and must be an unsigned int"); 1369 return NULL; 1370 } 1371 1372 if (maxmem < 0 || maxmem > INT_MAX) { 1373 /* OpenSSL 1.1.0 restricts maxmem to 32 MiB. It may change in the 1374 future. The maxmem constant is private to OpenSSL. */ 1375 PyErr_Format(PyExc_ValueError, 1376 "maxmem must be positive and smaller than %d", 1377 INT_MAX); 1378 return NULL; 1379 } 1380 1381 if (dklen < 1 || dklen > INT_MAX) { 1382 PyErr_Format(PyExc_ValueError, 1383 "dklen must be greater than 0 and smaller than %d", 1384 INT_MAX); 1385 return NULL; 1386 } 1387 1388 /* let OpenSSL validate the rest */ 1389 retval = EVP_PBE_scrypt(NULL, 0, NULL, 0, n, r, p, maxmem, NULL, 0); 1390 if (!retval) { 1391 _setException(PyExc_ValueError, "Invalid parameter combination for n, r, p, maxmem."); 1392 return NULL; 1393 } 1394 1395 key_obj = PyBytes_FromStringAndSize(NULL, dklen); 1396 if (key_obj == NULL) { 1397 return NULL; 1398 } 1399 key = PyBytes_AS_STRING(key_obj); 1400 1401 Py_BEGIN_ALLOW_THREADS 1402 retval = EVP_PBE_scrypt( 1403 (const char*)password->buf, (size_t)password->len, 1404 (const unsigned char *)salt->buf, (size_t)salt->len, 1405 n, r, p, maxmem, 1406 (unsigned char *)key, (size_t)dklen 1407 ); 1408 Py_END_ALLOW_THREADS 1409 1410 if (!retval) { 1411 Py_CLEAR(key_obj); 1412 _setException(PyExc_ValueError, NULL); 1413 return NULL; 1414 } 1415 return key_obj; 1416} 1417#endif /* PY_OPENSSL_HAS_SCRYPT */ 1418 1419/* Fast HMAC for hmac.digest() 1420 */ 1421 1422/*[clinic input] 1423_hashlib.hmac_digest as _hashlib_hmac_singleshot 1424 1425 key: Py_buffer 1426 msg: Py_buffer 1427 digest: object 1428 1429Single-shot HMAC. 1430[clinic start generated code]*/ 1431 1432static PyObject * 1433_hashlib_hmac_singleshot_impl(PyObject *module, Py_buffer *key, 1434 Py_buffer *msg, PyObject *digest) 1435/*[clinic end generated code: output=82f19965d12706ac input=0a0790cc3db45c2e]*/ 1436{ 1437 unsigned char md[EVP_MAX_MD_SIZE] = {0}; 1438 unsigned int md_len = 0; 1439 unsigned char *result; 1440 PY_EVP_MD *evp; 1441 1442 if (key->len > INT_MAX) { 1443 PyErr_SetString(PyExc_OverflowError, 1444 "key is too long."); 1445 return NULL; 1446 } 1447 if (msg->len > INT_MAX) { 1448 PyErr_SetString(PyExc_OverflowError, 1449 "msg is too long."); 1450 return NULL; 1451 } 1452 1453 evp = py_digest_by_digestmod(module, digest, Py_ht_mac); 1454 if (evp == NULL) { 1455 return NULL; 1456 } 1457 1458 Py_BEGIN_ALLOW_THREADS 1459 result = HMAC( 1460 evp, 1461 (const void*)key->buf, (int)key->len, 1462 (const unsigned char*)msg->buf, (int)msg->len, 1463 md, &md_len 1464 ); 1465 Py_END_ALLOW_THREADS 1466 PY_EVP_MD_free(evp); 1467 1468 if (result == NULL) { 1469 _setException(PyExc_ValueError, NULL); 1470 return NULL; 1471 } 1472 return PyBytes_FromStringAndSize((const char*)md, md_len); 1473} 1474 1475/* OpenSSL-based HMAC implementation 1476 */ 1477 1478static int _hmac_update(HMACobject*, PyObject*); 1479 1480/*[clinic input] 1481_hashlib.hmac_new 1482 1483 key: Py_buffer 1484 msg as msg_obj: object(c_default="NULL") = b'' 1485 digestmod: object(c_default="NULL") = None 1486 1487Return a new hmac object. 1488[clinic start generated code]*/ 1489 1490static PyObject * 1491_hashlib_hmac_new_impl(PyObject *module, Py_buffer *key, PyObject *msg_obj, 1492 PyObject *digestmod) 1493/*[clinic end generated code: output=c20d9e4d9ed6d219 input=5f4071dcc7f34362]*/ 1494{ 1495 PyTypeObject *type = get_hashlib_state(module)->HMACtype; 1496 PY_EVP_MD *digest; 1497 HMAC_CTX *ctx = NULL; 1498 HMACobject *self = NULL; 1499 int r; 1500 1501 if (key->len > INT_MAX) { 1502 PyErr_SetString(PyExc_OverflowError, 1503 "key is too long."); 1504 return NULL; 1505 } 1506 1507 if (digestmod == NULL) { 1508 PyErr_SetString( 1509 PyExc_TypeError, "Missing required parameter 'digestmod'."); 1510 return NULL; 1511 } 1512 1513 digest = py_digest_by_digestmod(module, digestmod, Py_ht_mac); 1514 if (digest == NULL) { 1515 return NULL; 1516 } 1517 1518 ctx = HMAC_CTX_new(); 1519 if (ctx == NULL) { 1520 _setException(PyExc_ValueError, NULL); 1521 goto error; 1522 } 1523 1524 r = HMAC_Init_ex( 1525 ctx, 1526 (const char*)key->buf, 1527 (int)key->len, 1528 digest, 1529 NULL /*impl*/); 1530 PY_EVP_MD_free(digest); 1531 if (r == 0) { 1532 _setException(PyExc_ValueError, NULL); 1533 goto error; 1534 } 1535 1536 self = (HMACobject *)PyObject_New(HMACobject, type); 1537 if (self == NULL) { 1538 goto error; 1539 } 1540 1541 self->ctx = ctx; 1542 self->lock = NULL; 1543 1544 if ((msg_obj != NULL) && (msg_obj != Py_None)) { 1545 if (!_hmac_update(self, msg_obj)) 1546 goto error; 1547 } 1548 1549 return (PyObject*)self; 1550 1551error: 1552 if (ctx) HMAC_CTX_free(ctx); 1553 if (self) PyObject_Free(self); 1554 return NULL; 1555} 1556 1557/* helper functions */ 1558static int 1559locked_HMAC_CTX_copy(HMAC_CTX *new_ctx_p, HMACobject *self) 1560{ 1561 int result; 1562 ENTER_HASHLIB(self); 1563 result = HMAC_CTX_copy(new_ctx_p, self->ctx); 1564 LEAVE_HASHLIB(self); 1565 return result; 1566} 1567 1568static unsigned int 1569_hmac_digest_size(HMACobject *self) 1570{ 1571 unsigned int digest_size = EVP_MD_size(HMAC_CTX_get_md(self->ctx)); 1572 assert(digest_size <= EVP_MAX_MD_SIZE); 1573 return digest_size; 1574} 1575 1576static int 1577_hmac_update(HMACobject *self, PyObject *obj) 1578{ 1579 int r; 1580 Py_buffer view = {0}; 1581 1582 GET_BUFFER_VIEW_OR_ERROR(obj, &view, return 0); 1583 1584 if (self->lock == NULL && view.len >= HASHLIB_GIL_MINSIZE) { 1585 self->lock = PyThread_allocate_lock(); 1586 /* fail? lock = NULL and we fail over to non-threaded code. */ 1587 } 1588 1589 if (self->lock != NULL) { 1590 Py_BEGIN_ALLOW_THREADS 1591 PyThread_acquire_lock(self->lock, 1); 1592 r = HMAC_Update(self->ctx, (const unsigned char*)view.buf, view.len); 1593 PyThread_release_lock(self->lock); 1594 Py_END_ALLOW_THREADS 1595 } else { 1596 r = HMAC_Update(self->ctx, (const unsigned char*)view.buf, view.len); 1597 } 1598 1599 PyBuffer_Release(&view); 1600 1601 if (r == 0) { 1602 _setException(PyExc_ValueError, NULL); 1603 return 0; 1604 } 1605 return 1; 1606} 1607 1608/*[clinic input] 1609_hashlib.HMAC.copy 1610 1611Return a copy ("clone") of the HMAC object. 1612[clinic start generated code]*/ 1613 1614static PyObject * 1615_hashlib_HMAC_copy_impl(HMACobject *self) 1616/*[clinic end generated code: output=29aa28b452833127 input=e2fa6a05db61a4d6]*/ 1617{ 1618 HMACobject *retval; 1619 1620 HMAC_CTX *ctx = HMAC_CTX_new(); 1621 if (ctx == NULL) { 1622 return _setException(PyExc_ValueError, NULL); 1623 } 1624 if (!locked_HMAC_CTX_copy(ctx, self)) { 1625 HMAC_CTX_free(ctx); 1626 return _setException(PyExc_ValueError, NULL); 1627 } 1628 1629 retval = (HMACobject *)PyObject_New(HMACobject, Py_TYPE(self)); 1630 if (retval == NULL) { 1631 HMAC_CTX_free(ctx); 1632 return NULL; 1633 } 1634 retval->ctx = ctx; 1635 retval->lock = NULL; 1636 1637 return (PyObject *)retval; 1638} 1639 1640static void 1641_hmac_dealloc(HMACobject *self) 1642{ 1643 PyTypeObject *tp = Py_TYPE(self); 1644 if (self->lock != NULL) { 1645 PyThread_free_lock(self->lock); 1646 } 1647 HMAC_CTX_free(self->ctx); 1648 PyObject_Free(self); 1649 Py_DECREF(tp); 1650} 1651 1652static PyObject * 1653_hmac_repr(HMACobject *self) 1654{ 1655 PyObject *digest_name = py_digest_name(HMAC_CTX_get_md(self->ctx)); 1656 if (digest_name == NULL) { 1657 return NULL; 1658 } 1659 PyObject *repr = PyUnicode_FromFormat( 1660 "<%U HMAC object @ %p>", digest_name, self 1661 ); 1662 Py_DECREF(digest_name); 1663 return repr; 1664} 1665 1666/*[clinic input] 1667_hashlib.HMAC.update 1668 msg: object 1669 1670Update the HMAC object with msg. 1671[clinic start generated code]*/ 1672 1673static PyObject * 1674_hashlib_HMAC_update_impl(HMACobject *self, PyObject *msg) 1675/*[clinic end generated code: output=f31f0ace8c625b00 input=1829173bb3cfd4e6]*/ 1676{ 1677 if (!_hmac_update(self, msg)) { 1678 return NULL; 1679 } 1680 Py_RETURN_NONE; 1681} 1682 1683static int 1684_hmac_digest(HMACobject *self, unsigned char *buf, unsigned int len) 1685{ 1686 HMAC_CTX *temp_ctx = HMAC_CTX_new(); 1687 if (temp_ctx == NULL) { 1688 PyErr_NoMemory(); 1689 return 0; 1690 } 1691 if (!locked_HMAC_CTX_copy(temp_ctx, self)) { 1692 _setException(PyExc_ValueError, NULL); 1693 return 0; 1694 } 1695 int r = HMAC_Final(temp_ctx, buf, &len); 1696 HMAC_CTX_free(temp_ctx); 1697 if (r == 0) { 1698 _setException(PyExc_ValueError, NULL); 1699 return 0; 1700 } 1701 return 1; 1702} 1703 1704/*[clinic input] 1705_hashlib.HMAC.digest 1706Return the digest of the bytes passed to the update() method so far. 1707[clinic start generated code]*/ 1708 1709static PyObject * 1710_hashlib_HMAC_digest_impl(HMACobject *self) 1711/*[clinic end generated code: output=1b1424355af7a41e input=bff07f74da318fb4]*/ 1712{ 1713 unsigned char digest[EVP_MAX_MD_SIZE]; 1714 unsigned int digest_size = _hmac_digest_size(self); 1715 if (digest_size == 0) { 1716 return _setException(PyExc_ValueError, NULL); 1717 } 1718 int r = _hmac_digest(self, digest, digest_size); 1719 if (r == 0) { 1720 return NULL; 1721 } 1722 return PyBytes_FromStringAndSize((const char *)digest, digest_size); 1723} 1724 1725/*[clinic input] 1726_hashlib.HMAC.hexdigest 1727 1728Return hexadecimal digest of the bytes passed to the update() method so far. 1729 1730This may be used to exchange the value safely in email or other non-binary 1731environments. 1732[clinic start generated code]*/ 1733 1734static PyObject * 1735_hashlib_HMAC_hexdigest_impl(HMACobject *self) 1736/*[clinic end generated code: output=80d825be1eaae6a7 input=5abc42702874ddcf]*/ 1737{ 1738 unsigned char digest[EVP_MAX_MD_SIZE]; 1739 unsigned int digest_size = _hmac_digest_size(self); 1740 if (digest_size == 0) { 1741 return _setException(PyExc_ValueError, NULL); 1742 } 1743 int r = _hmac_digest(self, digest, digest_size); 1744 if (r == 0) { 1745 return NULL; 1746 } 1747 return _Py_strhex((const char *)digest, digest_size); 1748} 1749 1750static PyObject * 1751_hashlib_hmac_get_digest_size(HMACobject *self, void *closure) 1752{ 1753 unsigned int digest_size = _hmac_digest_size(self); 1754 if (digest_size == 0) { 1755 return _setException(PyExc_ValueError, NULL); 1756 } 1757 return PyLong_FromLong(digest_size); 1758} 1759 1760static PyObject * 1761_hashlib_hmac_get_block_size(HMACobject *self, void *closure) 1762{ 1763 const EVP_MD *md = HMAC_CTX_get_md(self->ctx); 1764 if (md == NULL) { 1765 return _setException(PyExc_ValueError, NULL); 1766 } 1767 return PyLong_FromLong(EVP_MD_block_size(md)); 1768} 1769 1770static PyObject * 1771_hashlib_hmac_get_name(HMACobject *self, void *closure) 1772{ 1773 PyObject *digest_name = py_digest_name(HMAC_CTX_get_md(self->ctx)); 1774 if (digest_name == NULL) { 1775 return NULL; 1776 } 1777 PyObject *name = PyUnicode_FromFormat("hmac-%U", digest_name); 1778 Py_DECREF(digest_name); 1779 return name; 1780} 1781 1782static PyMethodDef HMAC_methods[] = { 1783 _HASHLIB_HMAC_UPDATE_METHODDEF 1784 _HASHLIB_HMAC_DIGEST_METHODDEF 1785 _HASHLIB_HMAC_HEXDIGEST_METHODDEF 1786 _HASHLIB_HMAC_COPY_METHODDEF 1787 {NULL, NULL} /* sentinel */ 1788}; 1789 1790static PyGetSetDef HMAC_getset[] = { 1791 {"digest_size", (getter)_hashlib_hmac_get_digest_size, NULL, NULL, NULL}, 1792 {"block_size", (getter)_hashlib_hmac_get_block_size, NULL, NULL, NULL}, 1793 {"name", (getter)_hashlib_hmac_get_name, NULL, NULL, NULL}, 1794 {NULL} /* Sentinel */ 1795}; 1796 1797 1798PyDoc_STRVAR(hmactype_doc, 1799"The object used to calculate HMAC of a message.\n\ 1800\n\ 1801Methods:\n\ 1802\n\ 1803update() -- updates the current digest with an additional string\n\ 1804digest() -- return the current digest value\n\ 1805hexdigest() -- return the current digest as a string of hexadecimal digits\n\ 1806copy() -- return a copy of the current hash object\n\ 1807\n\ 1808Attributes:\n\ 1809\n\ 1810name -- the name, including the hash algorithm used by this object\n\ 1811digest_size -- number of bytes in digest() output\n"); 1812 1813static PyType_Slot HMACtype_slots[] = { 1814 {Py_tp_doc, (char *)hmactype_doc}, 1815 {Py_tp_repr, (reprfunc)_hmac_repr}, 1816 {Py_tp_dealloc,(destructor)_hmac_dealloc}, 1817 {Py_tp_methods, HMAC_methods}, 1818 {Py_tp_getset, HMAC_getset}, 1819 {0, NULL} 1820}; 1821 1822PyType_Spec HMACtype_spec = { 1823 "_hashlib.HMAC", /* name */ 1824 sizeof(HMACobject), /* basicsize */ 1825 .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE, 1826 .slots = HMACtype_slots, 1827}; 1828 1829 1830/* State for our callback function so that it can accumulate a result. */ 1831typedef struct _internal_name_mapper_state { 1832 PyObject *set; 1833 int error; 1834} _InternalNameMapperState; 1835 1836 1837/* A callback function to pass to OpenSSL's OBJ_NAME_do_all(...) */ 1838static void 1839#if OPENSSL_VERSION_NUMBER >= 0x30000000L 1840_openssl_hash_name_mapper(EVP_MD *md, void *arg) 1841#else 1842_openssl_hash_name_mapper(const EVP_MD *md, const char *from, 1843 const char *to, void *arg) 1844#endif 1845{ 1846 _InternalNameMapperState *state = (_InternalNameMapperState *)arg; 1847 PyObject *py_name; 1848 1849 assert(state != NULL); 1850 // ignore all undefined providers 1851 if ((md == NULL) || (EVP_MD_nid(md) == NID_undef)) { 1852 return; 1853 } 1854 1855 py_name = py_digest_name(md); 1856 if (py_name == NULL) { 1857 state->error = 1; 1858 } else { 1859 if (PySet_Add(state->set, py_name) != 0) { 1860 state->error = 1; 1861 } 1862 Py_DECREF(py_name); 1863 } 1864} 1865 1866 1867/* Ask OpenSSL for a list of supported ciphers, filling in a Python set. */ 1868static int 1869hashlib_md_meth_names(PyObject *module) 1870{ 1871 _InternalNameMapperState state = { 1872 .set = PyFrozenSet_New(NULL), 1873 .error = 0 1874 }; 1875 if (state.set == NULL) { 1876 return -1; 1877 } 1878 1879#if OPENSSL_VERSION_NUMBER >= 0x30000000L 1880 // get algorithms from all activated providers in default context 1881 EVP_MD_do_all_provided(NULL, &_openssl_hash_name_mapper, &state); 1882#else 1883 EVP_MD_do_all(&_openssl_hash_name_mapper, &state); 1884#endif 1885 1886 if (state.error) { 1887 Py_DECREF(state.set); 1888 return -1; 1889 } 1890 1891 if (PyModule_AddObject(module, "openssl_md_meth_names", state.set) < 0) { 1892 Py_DECREF(state.set); 1893 return -1; 1894 } 1895 1896 return 0; 1897} 1898 1899/*[clinic input] 1900_hashlib.get_fips_mode -> int 1901 1902Determine the OpenSSL FIPS mode of operation. 1903 1904For OpenSSL 3.0.0 and newer it returns the state of the default provider 1905in the default OSSL context. It's not quite the same as FIPS_mode() but good 1906enough for unittests. 1907 1908Effectively any non-zero return value indicates FIPS mode; 1909values other than 1 may have additional significance. 1910[clinic start generated code]*/ 1911 1912static int 1913_hashlib_get_fips_mode_impl(PyObject *module) 1914/*[clinic end generated code: output=87eece1bab4d3fa9 input=2db61538c41c6fef]*/ 1915 1916{ 1917#if OPENSSL_VERSION_NUMBER >= 0x30000000L 1918 return EVP_default_properties_is_fips_enabled(NULL); 1919#else 1920 ERR_clear_error(); 1921 int result = FIPS_mode(); 1922 if (result == 0) { 1923 // "If the library was built without support of the FIPS Object Module, 1924 // then the function will return 0 with an error code of 1925 // CRYPTO_R_FIPS_MODE_NOT_SUPPORTED (0x0f06d065)." 1926 // But 0 is also a valid result value. 1927 unsigned long errcode = ERR_peek_last_error(); 1928 if (errcode) { 1929 _setException(PyExc_ValueError, NULL); 1930 return -1; 1931 } 1932 } 1933 return result; 1934#endif 1935} 1936 1937 1938static int 1939_tscmp(const unsigned char *a, const unsigned char *b, 1940 Py_ssize_t len_a, Py_ssize_t len_b) 1941{ 1942 /* loop count depends on length of b. Might leak very little timing 1943 * information if sizes are different. 1944 */ 1945 Py_ssize_t length = len_b; 1946 const void *left = a; 1947 const void *right = b; 1948 int result = 0; 1949 1950 if (len_a != length) { 1951 left = b; 1952 result = 1; 1953 } 1954 1955 result |= CRYPTO_memcmp(left, right, length); 1956 1957 return (result == 0); 1958} 1959 1960/* NOTE: Keep in sync with _operator.c implementation. */ 1961 1962/*[clinic input] 1963_hashlib.compare_digest 1964 1965 a: object 1966 b: object 1967 / 1968 1969Return 'a == b'. 1970 1971This function uses an approach designed to prevent 1972timing analysis, making it appropriate for cryptography. 1973 1974a and b must both be of the same type: either str (ASCII only), 1975or any bytes-like object. 1976 1977Note: If a and b are of different lengths, or if an error occurs, 1978a timing attack could theoretically reveal information about the 1979types and lengths of a and b--but not their values. 1980[clinic start generated code]*/ 1981 1982static PyObject * 1983_hashlib_compare_digest_impl(PyObject *module, PyObject *a, PyObject *b) 1984/*[clinic end generated code: output=6f1c13927480aed9 input=9c40c6e566ca12f5]*/ 1985{ 1986 int rc; 1987 1988 /* ASCII unicode string */ 1989 if(PyUnicode_Check(a) && PyUnicode_Check(b)) { 1990 if (PyUnicode_READY(a) == -1 || PyUnicode_READY(b) == -1) { 1991 return NULL; 1992 } 1993 if (!PyUnicode_IS_ASCII(a) || !PyUnicode_IS_ASCII(b)) { 1994 PyErr_SetString(PyExc_TypeError, 1995 "comparing strings with non-ASCII characters is " 1996 "not supported"); 1997 return NULL; 1998 } 1999 2000 rc = _tscmp(PyUnicode_DATA(a), 2001 PyUnicode_DATA(b), 2002 PyUnicode_GET_LENGTH(a), 2003 PyUnicode_GET_LENGTH(b)); 2004 } 2005 /* fallback to buffer interface for bytes, bytearray and other */ 2006 else { 2007 Py_buffer view_a; 2008 Py_buffer view_b; 2009 2010 if (PyObject_CheckBuffer(a) == 0 && PyObject_CheckBuffer(b) == 0) { 2011 PyErr_Format(PyExc_TypeError, 2012 "unsupported operand types(s) or combination of types: " 2013 "'%.100s' and '%.100s'", 2014 Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name); 2015 return NULL; 2016 } 2017 2018 if (PyObject_GetBuffer(a, &view_a, PyBUF_SIMPLE) == -1) { 2019 return NULL; 2020 } 2021 if (view_a.ndim > 1) { 2022 PyErr_SetString(PyExc_BufferError, 2023 "Buffer must be single dimension"); 2024 PyBuffer_Release(&view_a); 2025 return NULL; 2026 } 2027 2028 if (PyObject_GetBuffer(b, &view_b, PyBUF_SIMPLE) == -1) { 2029 PyBuffer_Release(&view_a); 2030 return NULL; 2031 } 2032 if (view_b.ndim > 1) { 2033 PyErr_SetString(PyExc_BufferError, 2034 "Buffer must be single dimension"); 2035 PyBuffer_Release(&view_a); 2036 PyBuffer_Release(&view_b); 2037 return NULL; 2038 } 2039 2040 rc = _tscmp((const unsigned char*)view_a.buf, 2041 (const unsigned char*)view_b.buf, 2042 view_a.len, 2043 view_b.len); 2044 2045 PyBuffer_Release(&view_a); 2046 PyBuffer_Release(&view_b); 2047 } 2048 2049 return PyBool_FromLong(rc); 2050} 2051 2052/* List of functions exported by this module */ 2053 2054static struct PyMethodDef EVP_functions[] = { 2055 EVP_NEW_METHODDEF 2056 PBKDF2_HMAC_METHODDEF 2057 _HASHLIB_SCRYPT_METHODDEF 2058 _HASHLIB_GET_FIPS_MODE_METHODDEF 2059 _HASHLIB_COMPARE_DIGEST_METHODDEF 2060 _HASHLIB_HMAC_SINGLESHOT_METHODDEF 2061 _HASHLIB_HMAC_NEW_METHODDEF 2062 _HASHLIB_OPENSSL_MD5_METHODDEF 2063 _HASHLIB_OPENSSL_SHA1_METHODDEF 2064 _HASHLIB_OPENSSL_SHA224_METHODDEF 2065 _HASHLIB_OPENSSL_SHA256_METHODDEF 2066 _HASHLIB_OPENSSL_SHA384_METHODDEF 2067 _HASHLIB_OPENSSL_SHA512_METHODDEF 2068 _HASHLIB_OPENSSL_SHA3_224_METHODDEF 2069 _HASHLIB_OPENSSL_SHA3_256_METHODDEF 2070 _HASHLIB_OPENSSL_SHA3_384_METHODDEF 2071 _HASHLIB_OPENSSL_SHA3_512_METHODDEF 2072 _HASHLIB_OPENSSL_SHAKE_128_METHODDEF 2073 _HASHLIB_OPENSSL_SHAKE_256_METHODDEF 2074 {NULL, NULL} /* Sentinel */ 2075}; 2076 2077 2078/* Initialize this module. */ 2079 2080static int 2081hashlib_traverse(PyObject *m, visitproc visit, void *arg) 2082{ 2083 _hashlibstate *state = get_hashlib_state(m); 2084 Py_VISIT(state->EVPtype); 2085 Py_VISIT(state->HMACtype); 2086#ifdef PY_OPENSSL_HAS_SHAKE 2087 Py_VISIT(state->EVPXOFtype); 2088#endif 2089 Py_VISIT(state->constructs); 2090 Py_VISIT(state->unsupported_digestmod_error); 2091 return 0; 2092} 2093 2094static int 2095hashlib_clear(PyObject *m) 2096{ 2097 _hashlibstate *state = get_hashlib_state(m); 2098 Py_CLEAR(state->EVPtype); 2099 Py_CLEAR(state->HMACtype); 2100#ifdef PY_OPENSSL_HAS_SHAKE 2101 Py_CLEAR(state->EVPXOFtype); 2102#endif 2103 Py_CLEAR(state->constructs); 2104 Py_CLEAR(state->unsupported_digestmod_error); 2105 2106 if (state->hashtable != NULL) { 2107 _Py_hashtable_destroy(state->hashtable); 2108 state->hashtable = NULL; 2109 } 2110 2111 return 0; 2112} 2113 2114static void 2115hashlib_free(void *m) 2116{ 2117 hashlib_clear((PyObject *)m); 2118} 2119 2120/* Py_mod_exec functions */ 2121static int 2122hashlib_init_hashtable(PyObject *module) 2123{ 2124 _hashlibstate *state = get_hashlib_state(module); 2125 2126 state->hashtable = py_hashentry_table_new(); 2127 if (state->hashtable == NULL) { 2128 PyErr_NoMemory(); 2129 return -1; 2130 } 2131 return 0; 2132} 2133 2134static int 2135hashlib_init_evptype(PyObject *module) 2136{ 2137 _hashlibstate *state = get_hashlib_state(module); 2138 2139 state->EVPtype = (PyTypeObject *)PyType_FromSpec(&EVPtype_spec); 2140 if (state->EVPtype == NULL) { 2141 return -1; 2142 } 2143 if (PyModule_AddType(module, state->EVPtype) < 0) { 2144 return -1; 2145 } 2146 return 0; 2147} 2148 2149static int 2150hashlib_init_evpxoftype(PyObject *module) 2151{ 2152#ifdef PY_OPENSSL_HAS_SHAKE 2153 _hashlibstate *state = get_hashlib_state(module); 2154 2155 if (state->EVPtype == NULL) { 2156 return -1; 2157 } 2158 2159 state->EVPXOFtype = (PyTypeObject *)PyType_FromSpecWithBases( 2160 &EVPXOFtype_spec, (PyObject *)state->EVPtype 2161 ); 2162 if (state->EVPXOFtype == NULL) { 2163 return -1; 2164 } 2165 if (PyModule_AddType(module, state->EVPXOFtype) < 0) { 2166 return -1; 2167 } 2168#endif 2169 return 0; 2170} 2171 2172static int 2173hashlib_init_hmactype(PyObject *module) 2174{ 2175 _hashlibstate *state = get_hashlib_state(module); 2176 2177 state->HMACtype = (PyTypeObject *)PyType_FromSpec(&HMACtype_spec); 2178 if (state->HMACtype == NULL) { 2179 return -1; 2180 } 2181 if (PyModule_AddType(module, state->HMACtype) < 0) { 2182 return -1; 2183 } 2184 return 0; 2185} 2186 2187static int 2188hashlib_init_constructors(PyObject *module) 2189{ 2190 /* Create dict from builtin openssl_hash functions to name 2191 * {_hashlib.openssl_sha256: "sha256", ...} 2192 */ 2193 PyModuleDef *mdef; 2194 PyMethodDef *fdef; 2195 PyObject *proxy; 2196 PyObject *func, *name_obj; 2197 _hashlibstate *state = get_hashlib_state(module); 2198 2199 mdef = PyModule_GetDef(module); 2200 if (mdef == NULL) { 2201 return -1; 2202 } 2203 2204 state->constructs = PyDict_New(); 2205 if (state->constructs == NULL) { 2206 return -1; 2207 } 2208 2209 for (fdef = mdef->m_methods; fdef->ml_name != NULL; fdef++) { 2210 if (strncmp(fdef->ml_name, "openssl_", 8)) { 2211 continue; 2212 } 2213 name_obj = PyUnicode_FromString(fdef->ml_name + 8); 2214 if (name_obj == NULL) { 2215 return -1; 2216 } 2217 func = PyObject_GetAttrString(module, fdef->ml_name); 2218 if (func == NULL) { 2219 Py_DECREF(name_obj); 2220 return -1; 2221 } 2222 int rc = PyDict_SetItem(state->constructs, func, name_obj); 2223 Py_DECREF(func); 2224 Py_DECREF(name_obj); 2225 if (rc < 0) { 2226 return -1; 2227 } 2228 } 2229 2230 proxy = PyDictProxy_New(state->constructs); 2231 if (proxy == NULL) { 2232 return -1; 2233 } 2234 2235 int rc = PyModule_AddObjectRef(module, "_constructors", proxy); 2236 Py_DECREF(proxy); 2237 if (rc < 0) { 2238 return -1; 2239 } 2240 return 0; 2241} 2242 2243static int 2244hashlib_exception(PyObject *module) 2245{ 2246 _hashlibstate *state = get_hashlib_state(module); 2247 state->unsupported_digestmod_error = PyErr_NewException( 2248 "_hashlib.UnsupportedDigestmodError", PyExc_ValueError, NULL); 2249 if (state->unsupported_digestmod_error == NULL) { 2250 return -1; 2251 } 2252 if (PyModule_AddObjectRef(module, "UnsupportedDigestmodError", 2253 state->unsupported_digestmod_error) < 0) { 2254 return -1; 2255 } 2256 return 0; 2257} 2258 2259 2260static PyModuleDef_Slot hashlib_slots[] = { 2261 {Py_mod_exec, hashlib_init_hashtable}, 2262 {Py_mod_exec, hashlib_init_evptype}, 2263 {Py_mod_exec, hashlib_init_evpxoftype}, 2264 {Py_mod_exec, hashlib_init_hmactype}, 2265 {Py_mod_exec, hashlib_md_meth_names}, 2266 {Py_mod_exec, hashlib_init_constructors}, 2267 {Py_mod_exec, hashlib_exception}, 2268 {0, NULL} 2269}; 2270 2271static struct PyModuleDef _hashlibmodule = { 2272 PyModuleDef_HEAD_INIT, 2273 .m_name = "_hashlib", 2274 .m_doc = "OpenSSL interface for hashlib module", 2275 .m_size = sizeof(_hashlibstate), 2276 .m_methods = EVP_functions, 2277 .m_slots = hashlib_slots, 2278 .m_traverse = hashlib_traverse, 2279 .m_clear = hashlib_clear, 2280 .m_free = hashlib_free 2281}; 2282 2283PyMODINIT_FUNC 2284PyInit__hashlib(void) 2285{ 2286 return PyModuleDef_Init(&_hashlibmodule); 2287} 2288