diff options
Diffstat (limited to 'Modules/sha256module.c')
-rw-r--r-- | Modules/sha256module.c | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/Modules/sha256module.c b/Modules/sha256module.c index 9f6b416..b05bfc1 100644 --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -21,13 +21,6 @@ #include "hashlib.h" -/* Endianness testing and definitions */ -#define TestEndianness(variable) {int i=1; variable=PCT_BIG_ENDIAN;\ - if (*((char*)&i)==1) variable=PCT_LITTLE_ENDIAN;} - -#define PCT_LITTLE_ENDIAN 1 -#define PCT_BIG_ENDIAN 0 - /* Some useful types */ typedef unsigned char SHA_BYTE; @@ -50,7 +43,6 @@ typedef struct { SHA_INT32 digest[8]; /* Message digest */ SHA_INT32 count_lo, count_hi; /* 64-bit bit count */ SHA_BYTE data[SHA_BLOCKSIZE]; /* SHA data buffer */ - int Endianness; int local; /* unprocessed amount in data */ int digestsize; } SHAobject; @@ -58,13 +50,11 @@ typedef struct { /* When run on a little-endian CPU we need to perform byte reversal on an array of longwords. */ -static void longReverse(SHA_INT32 *buffer, int byteCount, int Endianness) +#if PY_LITTLE_ENDIAN +static void longReverse(SHA_INT32 *buffer, int byteCount) { SHA_INT32 value; - if ( Endianness == PCT_BIG_ENDIAN ) - return; - byteCount /= sizeof(*buffer); while (byteCount--) { value = *buffer; @@ -73,10 +63,10 @@ static void longReverse(SHA_INT32 *buffer, int byteCount, int Endianness) *buffer++ = ( value << 16 ) | ( value >> 16 ); } } +#endif static void SHAcopy(SHAobject *src, SHAobject *dest) { - dest->Endianness = src->Endianness; dest->local = src->local; dest->digestsize = src->digestsize; dest->count_lo = src->count_lo; @@ -131,7 +121,9 @@ sha_transform(SHAobject *sha_info) SHA_INT32 S[8], W[64], t0, t1; memcpy(W, sha_info->data, sizeof(sha_info->data)); - longReverse(W, (int)sizeof(sha_info->data), sha_info->Endianness); +#if PY_LITTLE_ENDIAN + longReverse(W, (int)sizeof(sha_info->data)); +#endif for (i = 16; i < 64; ++i) { W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]; @@ -228,7 +220,6 @@ sha_transform(SHAobject *sha_info) static void sha_init(SHAobject *sha_info) { - TestEndianness(sha_info->Endianness) sha_info->digest[0] = 0x6A09E667L; sha_info->digest[1] = 0xBB67AE85L; sha_info->digest[2] = 0x3C6EF372L; @@ -246,7 +237,6 @@ sha_init(SHAobject *sha_info) static void sha224_init(SHAobject *sha_info) { - TestEndianness(sha_info->Endianness) sha_info->digest[0] = 0xc1059ed8L; sha_info->digest[1] = 0x367cd507L; sha_info->digest[2] = 0x3070dd17L; @@ -284,7 +274,7 @@ sha_update(SHAobject *sha_info, SHA_BYTE *buffer, Py_ssize_t count) memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i); count -= i; buffer += i; - sha_info->local += i; + sha_info->local += (int)i; if (sha_info->local == SHA_BLOCKSIZE) { sha_transform(sha_info); } @@ -299,7 +289,7 @@ sha_update(SHAobject *sha_info, SHA_BYTE *buffer, Py_ssize_t count) sha_transform(sha_info); } memcpy(sha_info->data, buffer, count); - sha_info->local = count; + sha_info->local = (int)count; } /* finish computing the SHA digest */ @@ -511,9 +501,9 @@ static PyObject * SHA256_get_name(PyObject *self, void *closure) { if (((SHAobject *)self)->digestsize == 32) - return PyUnicode_FromStringAndSize("SHA256", 6); + return PyUnicode_FromStringAndSize("sha256", 6); else - return PyUnicode_FromStringAndSize("SHA224", 6); + return PyUnicode_FromStringAndSize("sha224", 6); } static PyGetSetDef SHA_getseters[] = { @@ -716,11 +706,23 @@ static struct PyModuleDef _sha256module = { PyMODINIT_FUNC PyInit__sha256(void) { + PyObject *m; + Py_TYPE(&SHA224type) = &PyType_Type; if (PyType_Ready(&SHA224type) < 0) return NULL; Py_TYPE(&SHA256type) = &PyType_Type; if (PyType_Ready(&SHA256type) < 0) return NULL; - return PyModule_Create(&_sha256module); + + m = PyModule_Create(&_sha256module); + if (m == NULL) + return NULL; + + Py_INCREF((PyObject *)&SHA224type); + PyModule_AddObject(m, "SHA224Type", (PyObject *)&SHA224type); + Py_INCREF((PyObject *)&SHA256type); + PyModule_AddObject(m, "SHA256Type", (PyObject *)&SHA256type); + return m; + } |