Changeset 391 for python/trunk/Modules/sha512module.c
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Modules/sha512module.c
r2 r391 24 24 /* Endianness testing and definitions */ 25 25 #define TestEndianness(variable) {int i=1; variable=PCT_BIG_ENDIAN;\ 26 26 if (*((char*)&i)==1) variable=PCT_LITTLE_ENDIAN;} 27 27 28 28 #define PCT_LITTLE_ENDIAN 1 … … 34 34 35 35 #if SIZEOF_INT == 4 36 typedef unsigned int SHA_INT32; 37 typedef unsigned PY_LONG_LONG SHA_INT64; 36 typedef unsigned int SHA_INT32; /* 32-bit integer */ 37 typedef unsigned PY_LONG_LONG SHA_INT64; /* 64-bit integer */ 38 38 #else 39 39 /* not defined. compilation will die. */ … … 49 49 typedef struct { 50 50 PyObject_HEAD 51 SHA_INT64 digest[8]; 52 SHA_INT32 count_lo, count_hi; 53 SHA_BYTE data[SHA_BLOCKSIZE]; 51 SHA_INT64 digest[8]; /* Message digest */ 52 SHA_INT32 count_lo, count_hi; /* 64-bit bit count */ 53 SHA_BYTE data[SHA_BLOCKSIZE]; /* SHA data buffer */ 54 54 int Endianness; 55 int local; 55 int local; /* unprocessed amount in data */ 56 56 int digestsize; 57 57 } SHAobject; … … 65 65 66 66 if ( Endianness == PCT_BIG_ENDIAN ) 67 67 return; 68 68 69 69 byteCount /= sizeof(*buffer); … … 71 71 value = *buffer; 72 72 73 74 75 76 77 78 79 80 81 82 73 ((unsigned char*)buffer)[0] = (unsigned char)(value >> 56) & 0xff; 74 ((unsigned char*)buffer)[1] = (unsigned char)(value >> 48) & 0xff; 75 ((unsigned char*)buffer)[2] = (unsigned char)(value >> 40) & 0xff; 76 ((unsigned char*)buffer)[3] = (unsigned char)(value >> 32) & 0xff; 77 ((unsigned char*)buffer)[4] = (unsigned char)(value >> 24) & 0xff; 78 ((unsigned char*)buffer)[5] = (unsigned char)(value >> 16) & 0xff; 79 ((unsigned char*)buffer)[6] = (unsigned char)(value >> 8) & 0xff; 80 ((unsigned char*)buffer)[7] = (unsigned char)(value ) & 0xff; 81 82 buffer++; 83 83 } 84 84 } … … 125 125 ((x)<<((unsigned PY_LONG_LONG)(64-((y) & 63))))) & Py_ULL(0xFFFFFFFFFFFFFFFF)) 126 126 #define Ch(x,y,z) (z ^ (x & (y ^ z))) 127 #define Maj(x,y,z) (((x | y) & z) | (x & y)) 127 #define Maj(x,y,z) (((x | y) & z) | (x & y)) 128 128 #define S(x, n) ROR64((x),(n)) 129 129 #define R(x, n) (((x) & Py_ULL(0xFFFFFFFFFFFFFFFF)) >> ((unsigned PY_LONG_LONG)n)) … … 144 144 145 145 for (i = 16; i < 80; ++i) { 146 146 W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]; 147 147 } 148 148 for (i = 0; i < 8; ++i) { … … 238 238 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],79,Py_ULL(0x6c44198c4a475817)); 239 239 240 #undef RND 241 240 #undef RND 241 242 242 /* feedback */ 243 243 for (i = 0; i < 8; i++) { … … 341 341 ((SHA_BYTE *) sha_info->data)[count++] = 0x80; 342 342 if (count > SHA_BLOCKSIZE - 16) { 343 344 345 346 343 memset(((SHA_BYTE *) sha_info->data) + count, 0, 344 SHA_BLOCKSIZE - count); 345 sha512_transform(sha_info); 346 memset((SHA_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 16); 347 347 } 348 348 else { 349 350 349 memset(((SHA_BYTE *) sha_info->data) + count, 0, 350 SHA_BLOCKSIZE - 16 - count); 351 351 } 352 352 … … 521 521 retval = PyString_FromStringAndSize(NULL, self->digestsize * 2); 522 522 if (!retval) 523 523 return NULL; 524 524 hex_digest = PyString_AsString(retval); 525 525 if (!hex_digest) { 526 527 526 Py_DECREF(retval); 527 return NULL; 528 528 } 529 529 … … 532 532 char c; 533 533 c = (digest[i] >> 4) & 0xf; 534 534 c = (c>9) ? c+'a'-10 : c + '0'; 535 535 hex_digest[j++] = c; 536 536 c = (digest[i] & 0xf); 537 537 c = (c>9) ? c+'a'-10 : c + '0'; 538 538 hex_digest[j++] = c; 539 539 } … … 547 547 SHA512_update(SHAobject *self, PyObject *args) 548 548 { 549 unsigned char *cp; 550 int len; 551 552 if (!PyArg_ParseTuple(args, "s#:update", &cp, &len)) 549 Py_buffer buf; 550 551 if (!PyArg_ParseTuple(args, "s*:update", &buf)) 553 552 return NULL; 554 553 555 sha512_update(self, cp,len);556 557 Py _INCREF(Py_None);558 return Py_None;554 sha512_update(self, buf.buf, buf.len); 555 556 PyBuffer_Release(&buf); 557 Py_RETURN_NONE; 559 558 } 560 559 561 560 static PyMethodDef SHA_methods[] = { 562 {"copy", 563 {"digest", 561 {"copy", (PyCFunction)SHA512_copy, METH_NOARGS, SHA512_copy__doc__}, 562 {"digest", (PyCFunction)SHA512_digest, METH_NOARGS, SHA512_digest__doc__}, 564 563 {"hexdigest", (PyCFunction)SHA512_hexdigest, METH_NOARGS, SHA512_hexdigest__doc__}, 565 {"update", 566 {NULL, NULL}/* sentinel */564 {"update", (PyCFunction)SHA512_update, METH_VARARGS, SHA512_update__doc__}, 565 {NULL, NULL} /* sentinel */ 567 566 }; 568 567 … … 604 603 static PyTypeObject SHA384type = { 605 604 PyVarObject_HEAD_INIT(NULL, 0) 606 "_sha512.sha384", 607 sizeof(SHAobject), 608 0, 605 "_sha512.sha384", /*tp_name*/ 606 sizeof(SHAobject), /*tp_size*/ 607 0, /*tp_itemsize*/ 609 608 /* methods */ 610 SHA512_dealloc, 611 0, 612 0, 609 SHA512_dealloc, /*tp_dealloc*/ 610 0, /*tp_print*/ 611 0, /*tp_getattr*/ 613 612 0, /*tp_setattr*/ 614 613 0, /*tp_compare*/ … … 626 625 0, /*tp_doc*/ 627 626 0, /*tp_traverse*/ 628 0, 629 0, 630 0, 631 0, 632 0, 633 SHA_methods, 634 SHA_members, 627 0, /*tp_clear*/ 628 0, /*tp_richcompare*/ 629 0, /*tp_weaklistoffset*/ 630 0, /*tp_iter*/ 631 0, /*tp_iternext*/ 632 SHA_methods, /* tp_methods */ 633 SHA_members, /* tp_members */ 635 634 SHA_getseters, /* tp_getset */ 636 635 }; … … 638 637 static PyTypeObject SHA512type = { 639 638 PyVarObject_HEAD_INIT(NULL, 0) 640 "_sha512.sha512", 641 sizeof(SHAobject), 642 0, 639 "_sha512.sha512", /*tp_name*/ 640 sizeof(SHAobject), /*tp_size*/ 641 0, /*tp_itemsize*/ 643 642 /* methods */ 644 SHA512_dealloc, 645 0, 646 0, 643 SHA512_dealloc, /*tp_dealloc*/ 644 0, /*tp_print*/ 645 0, /*tp_getattr*/ 647 646 0, /*tp_setattr*/ 648 647 0, /*tp_compare*/ … … 660 659 0, /*tp_doc*/ 661 660 0, /*tp_traverse*/ 662 0, 663 0, 664 0, 665 0, 666 0, 667 SHA_methods, 668 SHA_members, 661 0, /*tp_clear*/ 662 0, /*tp_richcompare*/ 663 0, /*tp_weaklistoffset*/ 664 0, /*tp_iter*/ 665 0, /*tp_iternext*/ 666 SHA_methods, /* tp_methods */ 667 SHA_members, /* tp_members */ 669 668 SHA_getseters, /* tp_getset */ 670 669 }; … … 681 680 static char *kwlist[] = {"string", NULL}; 682 681 SHAobject *new; 683 unsigned char *cp = NULL; 684 int len; 685 686 if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s#:new", kwlist, 687 &cp, &len)) { 682 Py_buffer buf = { 0 }; 683 684 if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist, 685 &buf)) { 688 686 return NULL; 689 687 } 690 688 691 if ((new = newSHA512object()) == NULL) 689 if ((new = newSHA512object()) == NULL) { 690 PyBuffer_Release(&buf); 692 691 return NULL; 692 } 693 693 694 694 sha512_init(new); … … 696 696 if (PyErr_Occurred()) { 697 697 Py_DECREF(new); 698 PyBuffer_Release(&buf); 698 699 return NULL; 699 700 } 700 if (cp) 701 sha512_update(new, cp, len); 701 if (buf.len > 0) { 702 sha512_update(new, buf.buf, buf.len); 703 } 704 PyBuffer_Release(&buf); 702 705 703 706 return (PyObject *)new; … … 712 715 static char *kwlist[] = {"string", NULL}; 713 716 SHAobject *new; 714 unsigned char *cp = NULL; 715 int len; 716 717 if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s#:new", kwlist, 718 &cp, &len)) { 717 Py_buffer buf = { 0 }; 718 719 if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist, 720 &buf)) { 719 721 return NULL; 720 722 } 721 723 722 if ((new = newSHA384object()) == NULL) 724 if ((new = newSHA384object()) == NULL) { 725 PyBuffer_Release(&buf); 723 726 return NULL; 727 } 724 728 725 729 sha384_init(new); … … 727 731 if (PyErr_Occurred()) { 728 732 Py_DECREF(new); 733 PyBuffer_Release(&buf); 729 734 return NULL; 730 735 } 731 if (cp) 732 sha512_update(new, cp, len); 736 if (buf.len > 0) { 737 sha512_update(new, buf.buf, buf.len); 738 } 739 PyBuffer_Release(&buf); 733 740 734 741 return (PyObject *)new; … … 741 748 {"sha512", (PyCFunction)SHA512_new, METH_VARARGS|METH_KEYWORDS, SHA512_new__doc__}, 742 749 {"sha384", (PyCFunction)SHA384_new, METH_VARARGS|METH_KEYWORDS, SHA384_new__doc__}, 743 {NULL, NULL}/* Sentinel */750 {NULL, NULL} /* Sentinel */ 744 751 }; 745 752 … … 762 769 m = Py_InitModule("_sha512", SHA_functions); 763 770 if (m == NULL) 764 771 return; 765 772 } 766 773
Note:
See TracChangeset
for help on using the changeset viewer.