]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Modules/shamodule.c
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Modules / shamodule.c
CommitLineData
4710c53d 1/* SHA module */\r
2\r
3/* This module provides an interface to NIST's Secure Hash Algorithm */\r
4\r
5/* See below for information about the original code this module was\r
6 based upon. Additional work performed by:\r
7\r
8 Andrew Kuchling (amk@amk.ca)\r
9 Greg Stein (gstein@lyra.org)\r
10\r
11 Copyright (C) 2005 Gregory P. Smith (greg@krypto.org)\r
12 Licensed to PSF under a Contributor Agreement.\r
13\r
14*/\r
15\r
16/* SHA objects */\r
17\r
18#include "Python.h"\r
19#include "structmember.h"\r
20\r
21\r
22/* Endianness testing and definitions */\r
23#define TestEndianness(variable) {int i=1; variable=PCT_BIG_ENDIAN;\\r
24 if (*((char*)&i)==1) variable=PCT_LITTLE_ENDIAN;}\r
25\r
26#define PCT_LITTLE_ENDIAN 1\r
27#define PCT_BIG_ENDIAN 0\r
28\r
29/* Some useful types */\r
30\r
31typedef unsigned char SHA_BYTE;\r
32\r
33#if SIZEOF_INT == 4\r
34typedef unsigned int SHA_INT32; /* 32-bit integer */\r
35#else\r
36/* not defined. compilation will die. */\r
37#endif\r
38\r
39/* The SHA block size and message digest sizes, in bytes */\r
40\r
41#define SHA_BLOCKSIZE 64\r
42#define SHA_DIGESTSIZE 20\r
43\r
44/* The structure for storing SHS info */\r
45\r
46typedef struct {\r
47 PyObject_HEAD\r
48 SHA_INT32 digest[5]; /* Message digest */\r
49 SHA_INT32 count_lo, count_hi; /* 64-bit bit count */\r
50 SHA_BYTE data[SHA_BLOCKSIZE]; /* SHA data buffer */\r
51 int Endianness;\r
52 int local; /* unprocessed amount in data */\r
53} SHAobject;\r
54\r
55/* When run on a little-endian CPU we need to perform byte reversal on an\r
56 array of longwords. */\r
57\r
58static void longReverse(SHA_INT32 *buffer, int byteCount, int Endianness)\r
59{\r
60 SHA_INT32 value;\r
61\r
62 if ( Endianness == PCT_BIG_ENDIAN )\r
63 return;\r
64\r
65 byteCount /= sizeof(*buffer);\r
66 while (byteCount--) {\r
67 value = *buffer;\r
68 value = ( ( value & 0xFF00FF00L ) >> 8 ) | \\r
69 ( ( value & 0x00FF00FFL ) << 8 );\r
70 *buffer++ = ( value << 16 ) | ( value >> 16 );\r
71 }\r
72}\r
73\r
74static void SHAcopy(SHAobject *src, SHAobject *dest)\r
75{\r
76 dest->Endianness = src->Endianness;\r
77 dest->local = src->local;\r
78 dest->count_lo = src->count_lo;\r
79 dest->count_hi = src->count_hi;\r
80 memcpy(dest->digest, src->digest, sizeof(src->digest));\r
81 memcpy(dest->data, src->data, sizeof(src->data));\r
82}\r
83\r
84\r
85/* ------------------------------------------------------------------------\r
86 *\r
87 * This code for the SHA algorithm was noted as public domain. The original\r
88 * headers are pasted below.\r
89 *\r
90 * Several changes have been made to make it more compatible with the\r
91 * Python environment and desired interface.\r
92 *\r
93 */\r
94\r
95/* NIST Secure Hash Algorithm */\r
96/* heavily modified by Uwe Hollerbach <uh@alumni.caltech edu> */\r
97/* from Peter C. Gutmann's implementation as found in */\r
98/* Applied Cryptography by Bruce Schneier */\r
99/* Further modifications to include the "UNRAVEL" stuff, below */\r
100\r
101/* This code is in the public domain */\r
102\r
103/* UNRAVEL should be fastest & biggest */\r
104/* UNROLL_LOOPS should be just as big, but slightly slower */\r
105/* both undefined should be smallest and slowest */\r
106\r
107#define UNRAVEL\r
108/* #define UNROLL_LOOPS */\r
109\r
110/* The SHA f()-functions. The f1 and f3 functions can be optimized to\r
111 save one boolean operation each - thanks to Rich Schroeppel,\r
112 rcs@cs.arizona.edu for discovering this */\r
113\r
114/*#define f1(x,y,z) ((x & y) | (~x & z)) // Rounds 0-19 */\r
115#define f1(x,y,z) (z ^ (x & (y ^ z))) /* Rounds 0-19 */\r
116#define f2(x,y,z) (x ^ y ^ z) /* Rounds 20-39 */\r
117/*#define f3(x,y,z) ((x & y) | (x & z) | (y & z)) // Rounds 40-59 */\r
118#define f3(x,y,z) ((x & y) | (z & (x | y))) /* Rounds 40-59 */\r
119#define f4(x,y,z) (x ^ y ^ z) /* Rounds 60-79 */\r
120\r
121/* SHA constants */\r
122\r
123#define CONST1 0x5a827999L /* Rounds 0-19 */\r
124#define CONST2 0x6ed9eba1L /* Rounds 20-39 */\r
125#define CONST3 0x8f1bbcdcL /* Rounds 40-59 */\r
126#define CONST4 0xca62c1d6L /* Rounds 60-79 */\r
127\r
128/* 32-bit rotate */\r
129\r
130#define R32(x,n) ((x << n) | (x >> (32 - n)))\r
131\r
132/* the generic case, for when the overall rotation is not unraveled */\r
133\r
134#define FG(n) \\r
135 T = R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n; \\r
136 E = D; D = C; C = R32(B,30); B = A; A = T\r
137\r
138/* specific cases, for when the overall rotation is unraveled */\r
139\r
140#define FA(n) \\r
141 T = R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n; B = R32(B,30)\r
142\r
143#define FB(n) \\r
144 E = R32(T,5) + f##n(A,B,C) + D + *WP++ + CONST##n; A = R32(A,30)\r
145\r
146#define FC(n) \\r
147 D = R32(E,5) + f##n(T,A,B) + C + *WP++ + CONST##n; T = R32(T,30)\r
148\r
149#define FD(n) \\r
150 C = R32(D,5) + f##n(E,T,A) + B + *WP++ + CONST##n; E = R32(E,30)\r
151\r
152#define FE(n) \\r
153 B = R32(C,5) + f##n(D,E,T) + A + *WP++ + CONST##n; D = R32(D,30)\r
154\r
155#define FT(n) \\r
156 A = R32(B,5) + f##n(C,D,E) + T + *WP++ + CONST##n; C = R32(C,30)\r
157\r
158/* do SHA transformation */\r
159\r
160static void\r
161sha_transform(SHAobject *sha_info)\r
162{\r
163 int i;\r
164 SHA_INT32 T, A, B, C, D, E, W[80], *WP;\r
165\r
166 memcpy(W, sha_info->data, sizeof(sha_info->data));\r
167 longReverse(W, (int)sizeof(sha_info->data), sha_info->Endianness);\r
168\r
169 for (i = 16; i < 80; ++i) {\r
170 W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16];\r
171\r
172 /* extra rotation fix */\r
173 W[i] = R32(W[i], 1);\r
174 }\r
175 A = sha_info->digest[0];\r
176 B = sha_info->digest[1];\r
177 C = sha_info->digest[2];\r
178 D = sha_info->digest[3];\r
179 E = sha_info->digest[4];\r
180 WP = W;\r
181#ifdef UNRAVEL\r
182 FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1); FC(1); FD(1);\r
183 FE(1); FT(1); FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1);\r
184 FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2); FE(2); FT(2);\r
185 FA(2); FB(2); FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2);\r
186 FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3); FA(3); FB(3);\r
187 FC(3); FD(3); FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3);\r
188 FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4); FC(4); FD(4);\r
189 FE(4); FT(4); FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4);\r
190 sha_info->digest[0] += E;\r
191 sha_info->digest[1] += T;\r
192 sha_info->digest[2] += A;\r
193 sha_info->digest[3] += B;\r
194 sha_info->digest[4] += C;\r
195#else /* !UNRAVEL */\r
196#ifdef UNROLL_LOOPS\r
197 FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1);\r
198 FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1);\r
199 FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2);\r
200 FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2);\r
201 FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3);\r
202 FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3);\r
203 FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4);\r
204 FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4);\r
205#else /* !UNROLL_LOOPS */\r
206 for (i = 0; i < 20; ++i) { FG(1); }\r
207 for (i = 20; i < 40; ++i) { FG(2); }\r
208 for (i = 40; i < 60; ++i) { FG(3); }\r
209 for (i = 60; i < 80; ++i) { FG(4); }\r
210#endif /* !UNROLL_LOOPS */\r
211 sha_info->digest[0] += A;\r
212 sha_info->digest[1] += B;\r
213 sha_info->digest[2] += C;\r
214 sha_info->digest[3] += D;\r
215 sha_info->digest[4] += E;\r
216#endif /* !UNRAVEL */\r
217}\r
218\r
219/* initialize the SHA digest */\r
220\r
221static void\r
222sha_init(SHAobject *sha_info)\r
223{\r
224 TestEndianness(sha_info->Endianness)\r
225\r
226 sha_info->digest[0] = 0x67452301L;\r
227 sha_info->digest[1] = 0xefcdab89L;\r
228 sha_info->digest[2] = 0x98badcfeL;\r
229 sha_info->digest[3] = 0x10325476L;\r
230 sha_info->digest[4] = 0xc3d2e1f0L;\r
231 sha_info->count_lo = 0L;\r
232 sha_info->count_hi = 0L;\r
233 sha_info->local = 0;\r
234}\r
235\r
236/* update the SHA digest */\r
237\r
238static void\r
239sha_update(SHAobject *sha_info, SHA_BYTE *buffer, unsigned int count)\r
240{\r
241 unsigned int i;\r
242 SHA_INT32 clo;\r
243\r
244 clo = sha_info->count_lo + ((SHA_INT32) count << 3);\r
245 if (clo < sha_info->count_lo) {\r
246 ++sha_info->count_hi;\r
247 }\r
248 sha_info->count_lo = clo;\r
249 sha_info->count_hi += (SHA_INT32) count >> 29;\r
250 if (sha_info->local) {\r
251 i = SHA_BLOCKSIZE - sha_info->local;\r
252 if (i > count) {\r
253 i = count;\r
254 }\r
255 memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i);\r
256 count -= i;\r
257 buffer += i;\r
258 sha_info->local += i;\r
259 if (sha_info->local == SHA_BLOCKSIZE) {\r
260 sha_transform(sha_info);\r
261 }\r
262 else {\r
263 return;\r
264 }\r
265 }\r
266 while (count >= SHA_BLOCKSIZE) {\r
267 memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);\r
268 buffer += SHA_BLOCKSIZE;\r
269 count -= SHA_BLOCKSIZE;\r
270 sha_transform(sha_info);\r
271 }\r
272 memcpy(sha_info->data, buffer, count);\r
273 sha_info->local = count;\r
274}\r
275\r
276/* finish computing the SHA digest */\r
277\r
278static void\r
279sha_final(unsigned char digest[20], SHAobject *sha_info)\r
280{\r
281 int count;\r
282 SHA_INT32 lo_bit_count, hi_bit_count;\r
283\r
284 lo_bit_count = sha_info->count_lo;\r
285 hi_bit_count = sha_info->count_hi;\r
286 count = (int) ((lo_bit_count >> 3) & 0x3f);\r
287 ((SHA_BYTE *) sha_info->data)[count++] = 0x80;\r
288 if (count > SHA_BLOCKSIZE - 8) {\r
289 memset(((SHA_BYTE *) sha_info->data) + count, 0,\r
290 SHA_BLOCKSIZE - count);\r
291 sha_transform(sha_info);\r
292 memset((SHA_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 8);\r
293 }\r
294 else {\r
295 memset(((SHA_BYTE *) sha_info->data) + count, 0,\r
296 SHA_BLOCKSIZE - 8 - count);\r
297 }\r
298\r
299 /* GJS: note that we add the hi/lo in big-endian. sha_transform will\r
300 swap these values into host-order. */\r
301 sha_info->data[56] = (hi_bit_count >> 24) & 0xff;\r
302 sha_info->data[57] = (hi_bit_count >> 16) & 0xff;\r
303 sha_info->data[58] = (hi_bit_count >> 8) & 0xff;\r
304 sha_info->data[59] = (hi_bit_count >> 0) & 0xff;\r
305 sha_info->data[60] = (lo_bit_count >> 24) & 0xff;\r
306 sha_info->data[61] = (lo_bit_count >> 16) & 0xff;\r
307 sha_info->data[62] = (lo_bit_count >> 8) & 0xff;\r
308 sha_info->data[63] = (lo_bit_count >> 0) & 0xff;\r
309 sha_transform(sha_info);\r
310 digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff);\r
311 digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff);\r
312 digest[ 2] = (unsigned char) ((sha_info->digest[0] >> 8) & 0xff);\r
313 digest[ 3] = (unsigned char) ((sha_info->digest[0] ) & 0xff);\r
314 digest[ 4] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff);\r
315 digest[ 5] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff);\r
316 digest[ 6] = (unsigned char) ((sha_info->digest[1] >> 8) & 0xff);\r
317 digest[ 7] = (unsigned char) ((sha_info->digest[1] ) & 0xff);\r
318 digest[ 8] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff);\r
319 digest[ 9] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff);\r
320 digest[10] = (unsigned char) ((sha_info->digest[2] >> 8) & 0xff);\r
321 digest[11] = (unsigned char) ((sha_info->digest[2] ) & 0xff);\r
322 digest[12] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff);\r
323 digest[13] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff);\r
324 digest[14] = (unsigned char) ((sha_info->digest[3] >> 8) & 0xff);\r
325 digest[15] = (unsigned char) ((sha_info->digest[3] ) & 0xff);\r
326 digest[16] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff);\r
327 digest[17] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff);\r
328 digest[18] = (unsigned char) ((sha_info->digest[4] >> 8) & 0xff);\r
329 digest[19] = (unsigned char) ((sha_info->digest[4] ) & 0xff);\r
330}\r
331\r
332/*\r
333 * End of copied SHA code.\r
334 *\r
335 * ------------------------------------------------------------------------\r
336 */\r
337\r
338static PyTypeObject SHAtype;\r
339\r
340\r
341static SHAobject *\r
342newSHAobject(void)\r
343{\r
344 return (SHAobject *)PyObject_New(SHAobject, &SHAtype);\r
345}\r
346\r
347/* Internal methods for a hashing object */\r
348\r
349static void\r
350SHA_dealloc(PyObject *ptr)\r
351{\r
352 PyObject_Del(ptr);\r
353}\r
354\r
355\r
356/* External methods for a hashing object */\r
357\r
358PyDoc_STRVAR(SHA_copy__doc__, "Return a copy of the hashing object.");\r
359\r
360static PyObject *\r
361SHA_copy(SHAobject *self, PyObject *unused)\r
362{\r
363 SHAobject *newobj;\r
364\r
365 if ( (newobj = newSHAobject())==NULL)\r
366 return NULL;\r
367\r
368 SHAcopy(self, newobj);\r
369 return (PyObject *)newobj;\r
370}\r
371\r
372PyDoc_STRVAR(SHA_digest__doc__,\r
373"Return the digest value as a string of binary data.");\r
374\r
375static PyObject *\r
376SHA_digest(SHAobject *self, PyObject *unused)\r
377{\r
378 unsigned char digest[SHA_DIGESTSIZE];\r
379 SHAobject temp;\r
380\r
381 SHAcopy(self, &temp);\r
382 sha_final(digest, &temp);\r
383 return PyString_FromStringAndSize((const char *)digest, sizeof(digest));\r
384}\r
385\r
386PyDoc_STRVAR(SHA_hexdigest__doc__,\r
387"Return the digest value as a string of hexadecimal digits.");\r
388\r
389static PyObject *\r
390SHA_hexdigest(SHAobject *self, PyObject *unused)\r
391{\r
392 unsigned char digest[SHA_DIGESTSIZE];\r
393 SHAobject temp;\r
394 PyObject *retval;\r
395 char *hex_digest;\r
396 int i, j;\r
397\r
398 /* Get the raw (binary) digest value */\r
399 SHAcopy(self, &temp);\r
400 sha_final(digest, &temp);\r
401\r
402 /* Create a new string */\r
403 retval = PyString_FromStringAndSize(NULL, sizeof(digest) * 2);\r
404 if (!retval)\r
405 return NULL;\r
406 hex_digest = PyString_AsString(retval);\r
407 if (!hex_digest) {\r
408 Py_DECREF(retval);\r
409 return NULL;\r
410 }\r
411\r
412 /* Make hex version of the digest */\r
413 for(i=j=0; i<sizeof(digest); i++) {\r
414 char c;\r
415 c = (digest[i] >> 4) & 0xf;\r
416 c = (c>9) ? c+'a'-10 : c + '0';\r
417 hex_digest[j++] = c;\r
418 c = (digest[i] & 0xf);\r
419 c = (c>9) ? c+'a'-10 : c + '0';\r
420 hex_digest[j++] = c;\r
421 }\r
422 return retval;\r
423}\r
424\r
425PyDoc_STRVAR(SHA_update__doc__,\r
426"Update this hashing object's state with the provided string.");\r
427\r
428static PyObject *\r
429SHA_update(SHAobject *self, PyObject *args)\r
430{\r
431 Py_buffer view;\r
432\r
433 if (!PyArg_ParseTuple(args, "s*:update", &view))\r
434 return NULL;\r
435\r
436 sha_update(self, (unsigned char*)view.buf,\r
437 Py_SAFE_DOWNCAST(view.len, Py_ssize_t, unsigned int));\r
438\r
439 PyBuffer_Release(&view);\r
440 Py_RETURN_NONE;\r
441}\r
442\r
443static PyMethodDef SHA_methods[] = {\r
444 {"copy", (PyCFunction)SHA_copy, METH_NOARGS, SHA_copy__doc__},\r
445 {"digest", (PyCFunction)SHA_digest, METH_NOARGS, SHA_digest__doc__},\r
446 {"hexdigest", (PyCFunction)SHA_hexdigest, METH_NOARGS, SHA_hexdigest__doc__},\r
447 {"update", (PyCFunction)SHA_update, METH_VARARGS, SHA_update__doc__},\r
448 {NULL, NULL} /* sentinel */\r
449};\r
450\r
451static PyObject *\r
452SHA_get_block_size(PyObject *self, void *closure)\r
453{\r
454 return PyInt_FromLong(SHA_BLOCKSIZE);\r
455}\r
456\r
457static PyObject *\r
458SHA_get_digest_size(PyObject *self, void *closure)\r
459{\r
460 return PyInt_FromLong(SHA_DIGESTSIZE);\r
461}\r
462\r
463static PyObject *\r
464SHA_get_name(PyObject *self, void *closure)\r
465{\r
466 return PyString_FromStringAndSize("SHA1", 4);\r
467}\r
468\r
469static PyGetSetDef SHA_getseters[] = {\r
470 {"digest_size",\r
471 (getter)SHA_get_digest_size, NULL,\r
472 NULL,\r
473 NULL},\r
474 {"block_size",\r
475 (getter)SHA_get_block_size, NULL,\r
476 NULL,\r
477 NULL},\r
478 {"name",\r
479 (getter)SHA_get_name, NULL,\r
480 NULL,\r
481 NULL},\r
482 /* the old md5 and sha modules support 'digest_size' as in PEP 247.\r
483 * the old sha module also supported 'digestsize'. ugh. */\r
484 {"digestsize",\r
485 (getter)SHA_get_digest_size, NULL,\r
486 NULL,\r
487 NULL},\r
488 {NULL} /* Sentinel */\r
489};\r
490\r
491static PyTypeObject SHAtype = {\r
492 PyVarObject_HEAD_INIT(NULL, 0)\r
493 "_sha.sha", /*tp_name*/\r
494 sizeof(SHAobject), /*tp_size*/\r
495 0, /*tp_itemsize*/\r
496 /* methods */\r
497 SHA_dealloc, /*tp_dealloc*/\r
498 0, /*tp_print*/\r
499 0, /*tp_getattr*/\r
500 0, /*tp_setattr*/\r
501 0, /*tp_compare*/\r
502 0, /*tp_repr*/\r
503 0, /*tp_as_number*/\r
504 0, /*tp_as_sequence*/\r
505 0, /*tp_as_mapping*/\r
506 0, /*tp_hash*/\r
507 0, /*tp_call*/\r
508 0, /*tp_str*/\r
509 0, /*tp_getattro*/\r
510 0, /*tp_setattro*/\r
511 0, /*tp_as_buffer*/\r
512 Py_TPFLAGS_DEFAULT, /*tp_flags*/\r
513 0, /*tp_doc*/\r
514 0, /*tp_traverse*/\r
515 0, /*tp_clear*/\r
516 0, /*tp_richcompare*/\r
517 0, /*tp_weaklistoffset*/\r
518 0, /*tp_iter*/\r
519 0, /*tp_iternext*/\r
520 SHA_methods, /* tp_methods */\r
521 0, /* tp_members */\r
522 SHA_getseters, /* tp_getset */\r
523};\r
524\r
525\r
526/* The single module-level function: new() */\r
527\r
528PyDoc_STRVAR(SHA_new__doc__,\r
529"Return a new SHA hashing object. An optional string argument\n\\r
530may be provided; if present, this string will be automatically\n\\r
531hashed.");\r
532\r
533static PyObject *\r
534SHA_new(PyObject *self, PyObject *args, PyObject *kwdict)\r
535{\r
536 static char *kwlist[] = {"string", NULL};\r
537 SHAobject *new;\r
538 Py_buffer view = { 0 };\r
539\r
540 if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist,\r
541 &view)) {\r
542 return NULL;\r
543 }\r
544\r
545 if ((new = newSHAobject()) == NULL) {\r
546 PyBuffer_Release(&view);\r
547 return NULL;\r
548 }\r
549\r
550 sha_init(new);\r
551\r
552 if (PyErr_Occurred()) {\r
553 Py_DECREF(new);\r
554 PyBuffer_Release(&view);\r
555 return NULL;\r
556 }\r
557 if (view.len > 0) {\r
558 sha_update(new, (unsigned char*)view.buf,\r
559 Py_SAFE_DOWNCAST(view.len, Py_ssize_t, unsigned int));\r
560 }\r
561 PyBuffer_Release(&view);\r
562\r
563 return (PyObject *)new;\r
564}\r
565\r
566\r
567/* List of functions exported by this module */\r
568\r
569static struct PyMethodDef SHA_functions[] = {\r
570 {"new", (PyCFunction)SHA_new, METH_VARARGS|METH_KEYWORDS, SHA_new__doc__},\r
571 {NULL, NULL} /* Sentinel */\r
572};\r
573\r
574\r
575/* Initialize this module. */\r
576\r
577#define insint(n,v) { PyModule_AddIntConstant(m,n,v); }\r
578\r
579PyMODINIT_FUNC\r
580init_sha(void)\r
581{\r
582 PyObject *m;\r
583\r
584 Py_TYPE(&SHAtype) = &PyType_Type;\r
585 if (PyType_Ready(&SHAtype) < 0)\r
586 return;\r
587 m = Py_InitModule("_sha", SHA_functions);\r
588 if (m == NULL)\r
589 return;\r
590\r
591 /* Add some symbolic constants to the module */\r
592 insint("blocksize", 1); /* For future use, in case some hash\r
593 functions require an integral number of\r
594 blocks */\r
595 insint("digestsize", 20);\r
596 insint("digest_size", 20);\r
597}\r