]>
Commit | Line | Data |
---|---|---|
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 | |
31 | typedef unsigned char SHA_BYTE;\r | |
32 | \r | |
33 | #if SIZEOF_INT == 4\r | |
34 | typedef 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 | |
46 | typedef 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 | |
58 | static 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 | |
74 | static 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 | |
160 | static void\r | |
161 | sha_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 | |
221 | static void\r | |
222 | sha_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 | |
238 | static void\r | |
239 | sha_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 | |
278 | static void\r | |
279 | sha_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 | |
338 | static PyTypeObject SHAtype;\r | |
339 | \r | |
340 | \r | |
341 | static SHAobject *\r | |
342 | newSHAobject(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 | |
349 | static void\r | |
350 | SHA_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 | |
358 | PyDoc_STRVAR(SHA_copy__doc__, "Return a copy of the hashing object.");\r | |
359 | \r | |
360 | static PyObject *\r | |
361 | SHA_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 | |
372 | PyDoc_STRVAR(SHA_digest__doc__,\r | |
373 | "Return the digest value as a string of binary data.");\r | |
374 | \r | |
375 | static PyObject *\r | |
376 | SHA_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 | |
386 | PyDoc_STRVAR(SHA_hexdigest__doc__,\r | |
387 | "Return the digest value as a string of hexadecimal digits.");\r | |
388 | \r | |
389 | static PyObject *\r | |
390 | SHA_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 | |
425 | PyDoc_STRVAR(SHA_update__doc__,\r | |
426 | "Update this hashing object's state with the provided string.");\r | |
427 | \r | |
428 | static PyObject *\r | |
429 | SHA_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 | |
443 | static 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 | |
451 | static PyObject *\r | |
452 | SHA_get_block_size(PyObject *self, void *closure)\r | |
453 | {\r | |
454 | return PyInt_FromLong(SHA_BLOCKSIZE);\r | |
455 | }\r | |
456 | \r | |
457 | static PyObject *\r | |
458 | SHA_get_digest_size(PyObject *self, void *closure)\r | |
459 | {\r | |
460 | return PyInt_FromLong(SHA_DIGESTSIZE);\r | |
461 | }\r | |
462 | \r | |
463 | static PyObject *\r | |
464 | SHA_get_name(PyObject *self, void *closure)\r | |
465 | {\r | |
466 | return PyString_FromStringAndSize("SHA1", 4);\r | |
467 | }\r | |
468 | \r | |
469 | static 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 | |
491 | static 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 | |
528 | PyDoc_STRVAR(SHA_new__doc__,\r | |
529 | "Return a new SHA hashing object. An optional string argument\n\\r | |
530 | may be provided; if present, this string will be automatically\n\\r | |
531 | hashed.");\r | |
532 | \r | |
533 | static PyObject *\r | |
534 | SHA_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 | |
569 | static 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 | |
579 | PyMODINIT_FUNC\r | |
580 | init_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 |