]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.10/Modules/sha256module.c
AppPkg/Applications/Python/Python-2.7.10: Initial Checkin part 2/5.
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.10 / Modules / sha256module.c
CommitLineData
7eb75bcc
DM
1/* SHA256 module */\r
2\r
3/* This module provides an interface to NIST's SHA-256 and SHA-224 Algorithms */\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 Trevor Perrin (trevp@trevp.net)\r
11\r
12 Copyright (C) 2005 Gregory P. Smith (greg@krypto.org)\r
13 Licensed to PSF under a Contributor Agreement.\r
14\r
15*/\r
16\r
17/* SHA objects */\r
18\r
19#include "Python.h"\r
20#include "structmember.h"\r
21\r
22\r
23/* Endianness testing and definitions */\r
24#define TestEndianness(variable) {int i=1; variable=PCT_BIG_ENDIAN;\\r
25 if (*((char*)&i)==1) variable=PCT_LITTLE_ENDIAN;}\r
26\r
27#define PCT_LITTLE_ENDIAN 1\r
28#define PCT_BIG_ENDIAN 0\r
29\r
30/* Some useful types */\r
31\r
32typedef unsigned char SHA_BYTE;\r
33\r
34#if SIZEOF_INT == 4\r
35typedef unsigned int SHA_INT32; /* 32-bit integer */\r
36#else\r
37/* not defined. compilation will die. */\r
38#endif\r
39\r
40/* The SHA block size and message digest sizes, in bytes */\r
41\r
42#define SHA_BLOCKSIZE 64\r
43#define SHA_DIGESTSIZE 32\r
44\r
45/* The structure for storing SHA info */\r
46\r
47typedef struct {\r
48 PyObject_HEAD\r
49 SHA_INT32 digest[8]; /* Message digest */\r
50 SHA_INT32 count_lo, count_hi; /* 64-bit bit count */\r
51 SHA_BYTE data[SHA_BLOCKSIZE]; /* SHA data buffer */\r
52 int Endianness;\r
53 int local; /* unprocessed amount in data */\r
54 int digestsize;\r
55} SHAobject;\r
56\r
57/* When run on a little-endian CPU we need to perform byte reversal on an\r
58 array of longwords. */\r
59\r
60static void longReverse(SHA_INT32 *buffer, int byteCount, int Endianness)\r
61{\r
62 SHA_INT32 value;\r
63\r
64 if ( Endianness == PCT_BIG_ENDIAN )\r
65 return;\r
66\r
67 byteCount /= sizeof(*buffer);\r
68 while (byteCount--) {\r
69 value = *buffer;\r
70 value = ( ( value & 0xFF00FF00L ) >> 8 ) | \\r
71 ( ( value & 0x00FF00FFL ) << 8 );\r
72 *buffer++ = ( value << 16 ) | ( value >> 16 );\r
73 }\r
74}\r
75\r
76static void SHAcopy(SHAobject *src, SHAobject *dest)\r
77{\r
78 dest->Endianness = src->Endianness;\r
79 dest->local = src->local;\r
80 dest->digestsize = src->digestsize;\r
81 dest->count_lo = src->count_lo;\r
82 dest->count_hi = src->count_hi;\r
83 memcpy(dest->digest, src->digest, sizeof(src->digest));\r
84 memcpy(dest->data, src->data, sizeof(src->data));\r
85}\r
86\r
87\r
88/* ------------------------------------------------------------------------\r
89 *\r
90 * This code for the SHA-256 algorithm was noted as public domain. The\r
91 * original headers are pasted below.\r
92 *\r
93 * Several changes have been made to make it more compatible with the\r
94 * Python environment and desired interface.\r
95 *\r
96 */\r
97\r
98/* LibTomCrypt, modular cryptographic library -- Tom St Denis\r
99 *\r
100 * LibTomCrypt is a library that provides various cryptographic\r
101 * algorithms in a highly modular and flexible manner.\r
102 *\r
103 * The library is free for all purposes without any express\r
104 * gurantee it works.\r
105 *\r
106 * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.org\r
107 */\r
108\r
109\r
110/* SHA256 by Tom St Denis */\r
111\r
112/* Various logical functions */\r
113#define ROR(x, y)\\r
114( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | \\r
115((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)\r
116#define Ch(x,y,z) (z ^ (x & (y ^ z)))\r
117#define Maj(x,y,z) (((x | y) & z) | (x & y))\r
118#define S(x, n) ROR((x),(n))\r
119#define R(x, n) (((x)&0xFFFFFFFFUL)>>(n))\r
120#define Sigma0(x) (S(x, 2) ^ S(x, 13) ^ S(x, 22))\r
121#define Sigma1(x) (S(x, 6) ^ S(x, 11) ^ S(x, 25))\r
122#define Gamma0(x) (S(x, 7) ^ S(x, 18) ^ R(x, 3))\r
123#define Gamma1(x) (S(x, 17) ^ S(x, 19) ^ R(x, 10))\r
124\r
125\r
126static void\r
127sha_transform(SHAobject *sha_info)\r
128{\r
129 int i;\r
130 SHA_INT32 S[8], W[64], t0, t1;\r
131\r
132 memcpy(W, sha_info->data, sizeof(sha_info->data));\r
133 longReverse(W, (int)sizeof(sha_info->data), sha_info->Endianness);\r
134\r
135 for (i = 16; i < 64; ++i) {\r
136 W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16];\r
137 }\r
138 for (i = 0; i < 8; ++i) {\r
139 S[i] = sha_info->digest[i];\r
140 }\r
141\r
142 /* Compress */\r
143#define RND(a,b,c,d,e,f,g,h,i,ki) \\r
144 t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; \\r
145 t1 = Sigma0(a) + Maj(a, b, c); \\r
146 d += t0; \\r
147 h = t0 + t1;\r
148\r
149 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98);\r
150 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x71374491);\r
151 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,0xb5c0fbcf);\r
152 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,0xe9b5dba5);\r
153 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,0x3956c25b);\r
154 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,0x59f111f1);\r
155 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,0x923f82a4);\r
156 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,0xab1c5ed5);\r
157 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,0xd807aa98);\r
158 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,0x12835b01);\r
159 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,0x243185be);\r
160 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,0x550c7dc3);\r
161 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,0x72be5d74);\r
162 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,0x80deb1fe);\r
163 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,0x9bdc06a7);\r
164 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,0xc19bf174);\r
165 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,0xe49b69c1);\r
166 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,0xefbe4786);\r
167 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,0x0fc19dc6);\r
168 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,0x240ca1cc);\r
169 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,0x2de92c6f);\r
170 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,0x4a7484aa);\r
171 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,0x5cb0a9dc);\r
172 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,0x76f988da);\r
173 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,0x983e5152);\r
174 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,0xa831c66d);\r
175 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,0xb00327c8);\r
176 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,0xbf597fc7);\r
177 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,0xc6e00bf3);\r
178 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,0xd5a79147);\r
179 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,0x06ca6351);\r
180 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,0x14292967);\r
181 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,0x27b70a85);\r
182 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,0x2e1b2138);\r
183 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,0x4d2c6dfc);\r
184 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,0x53380d13);\r
185 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,0x650a7354);\r
186 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,0x766a0abb);\r
187 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,0x81c2c92e);\r
188 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,0x92722c85);\r
189 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,0xa2bfe8a1);\r
190 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,0xa81a664b);\r
191 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,0xc24b8b70);\r
192 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,0xc76c51a3);\r
193 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,0xd192e819);\r
194 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,0xd6990624);\r
195 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,0xf40e3585);\r
196 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,0x106aa070);\r
197 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,0x19a4c116);\r
198 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,0x1e376c08);\r
199 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,0x2748774c);\r
200 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,0x34b0bcb5);\r
201 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,0x391c0cb3);\r
202 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,0x4ed8aa4a);\r
203 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,0x5b9cca4f);\r
204 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,0x682e6ff3);\r
205 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,0x748f82ee);\r
206 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,0x78a5636f);\r
207 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,0x84c87814);\r
208 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,0x8cc70208);\r
209 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,0x90befffa);\r
210 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,0xa4506ceb);\r
211 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,0xbef9a3f7);\r
212 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,0xc67178f2);\r
213\r
214#undef RND\r
215\r
216 /* feedback */\r
217 for (i = 0; i < 8; i++) {\r
218 sha_info->digest[i] = sha_info->digest[i] + S[i];\r
219 }\r
220\r
221}\r
222\r
223\r
224\r
225/* initialize the SHA digest */\r
226\r
227static void\r
228sha_init(SHAobject *sha_info)\r
229{\r
230 TestEndianness(sha_info->Endianness)\r
231 sha_info->digest[0] = 0x6A09E667L;\r
232 sha_info->digest[1] = 0xBB67AE85L;\r
233 sha_info->digest[2] = 0x3C6EF372L;\r
234 sha_info->digest[3] = 0xA54FF53AL;\r
235 sha_info->digest[4] = 0x510E527FL;\r
236 sha_info->digest[5] = 0x9B05688CL;\r
237 sha_info->digest[6] = 0x1F83D9ABL;\r
238 sha_info->digest[7] = 0x5BE0CD19L;\r
239 sha_info->count_lo = 0L;\r
240 sha_info->count_hi = 0L;\r
241 sha_info->local = 0;\r
242 sha_info->digestsize = 32;\r
243}\r
244\r
245static void\r
246sha224_init(SHAobject *sha_info)\r
247{\r
248 TestEndianness(sha_info->Endianness)\r
249 sha_info->digest[0] = 0xc1059ed8L;\r
250 sha_info->digest[1] = 0x367cd507L;\r
251 sha_info->digest[2] = 0x3070dd17L;\r
252 sha_info->digest[3] = 0xf70e5939L;\r
253 sha_info->digest[4] = 0xffc00b31L;\r
254 sha_info->digest[5] = 0x68581511L;\r
255 sha_info->digest[6] = 0x64f98fa7L;\r
256 sha_info->digest[7] = 0xbefa4fa4L;\r
257 sha_info->count_lo = 0L;\r
258 sha_info->count_hi = 0L;\r
259 sha_info->local = 0;\r
260 sha_info->digestsize = 28;\r
261}\r
262\r
263\r
264/* update the SHA digest */\r
265\r
266static void\r
267sha_update(SHAobject *sha_info, SHA_BYTE *buffer, int count)\r
268{\r
269 int i;\r
270 SHA_INT32 clo;\r
271\r
272 clo = sha_info->count_lo + ((SHA_INT32) count << 3);\r
273 if (clo < sha_info->count_lo) {\r
274 ++sha_info->count_hi;\r
275 }\r
276 sha_info->count_lo = clo;\r
277 sha_info->count_hi += (SHA_INT32) count >> 29;\r
278 if (sha_info->local) {\r
279 i = SHA_BLOCKSIZE - sha_info->local;\r
280 if (i > count) {\r
281 i = count;\r
282 }\r
283 memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i);\r
284 count -= i;\r
285 buffer += i;\r
286 sha_info->local += i;\r
287 if (sha_info->local == SHA_BLOCKSIZE) {\r
288 sha_transform(sha_info);\r
289 }\r
290 else {\r
291 return;\r
292 }\r
293 }\r
294 while (count >= SHA_BLOCKSIZE) {\r
295 memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);\r
296 buffer += SHA_BLOCKSIZE;\r
297 count -= SHA_BLOCKSIZE;\r
298 sha_transform(sha_info);\r
299 }\r
300 memcpy(sha_info->data, buffer, count);\r
301 sha_info->local = count;\r
302}\r
303\r
304/* finish computing the SHA digest */\r
305\r
306static void\r
307sha_final(unsigned char digest[SHA_DIGESTSIZE], SHAobject *sha_info)\r
308{\r
309 int count;\r
310 SHA_INT32 lo_bit_count, hi_bit_count;\r
311\r
312 lo_bit_count = sha_info->count_lo;\r
313 hi_bit_count = sha_info->count_hi;\r
314 count = (int) ((lo_bit_count >> 3) & 0x3f);\r
315 ((SHA_BYTE *) sha_info->data)[count++] = 0x80;\r
316 if (count > SHA_BLOCKSIZE - 8) {\r
317 memset(((SHA_BYTE *) sha_info->data) + count, 0,\r
318 SHA_BLOCKSIZE - count);\r
319 sha_transform(sha_info);\r
320 memset((SHA_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 8);\r
321 }\r
322 else {\r
323 memset(((SHA_BYTE *) sha_info->data) + count, 0,\r
324 SHA_BLOCKSIZE - 8 - count);\r
325 }\r
326\r
327 /* GJS: note that we add the hi/lo in big-endian. sha_transform will\r
328 swap these values into host-order. */\r
329 sha_info->data[56] = (hi_bit_count >> 24) & 0xff;\r
330 sha_info->data[57] = (hi_bit_count >> 16) & 0xff;\r
331 sha_info->data[58] = (hi_bit_count >> 8) & 0xff;\r
332 sha_info->data[59] = (hi_bit_count >> 0) & 0xff;\r
333 sha_info->data[60] = (lo_bit_count >> 24) & 0xff;\r
334 sha_info->data[61] = (lo_bit_count >> 16) & 0xff;\r
335 sha_info->data[62] = (lo_bit_count >> 8) & 0xff;\r
336 sha_info->data[63] = (lo_bit_count >> 0) & 0xff;\r
337 sha_transform(sha_info);\r
338 digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff);\r
339 digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff);\r
340 digest[ 2] = (unsigned char) ((sha_info->digest[0] >> 8) & 0xff);\r
341 digest[ 3] = (unsigned char) ((sha_info->digest[0] ) & 0xff);\r
342 digest[ 4] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff);\r
343 digest[ 5] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff);\r
344 digest[ 6] = (unsigned char) ((sha_info->digest[1] >> 8) & 0xff);\r
345 digest[ 7] = (unsigned char) ((sha_info->digest[1] ) & 0xff);\r
346 digest[ 8] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff);\r
347 digest[ 9] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff);\r
348 digest[10] = (unsigned char) ((sha_info->digest[2] >> 8) & 0xff);\r
349 digest[11] = (unsigned char) ((sha_info->digest[2] ) & 0xff);\r
350 digest[12] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff);\r
351 digest[13] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff);\r
352 digest[14] = (unsigned char) ((sha_info->digest[3] >> 8) & 0xff);\r
353 digest[15] = (unsigned char) ((sha_info->digest[3] ) & 0xff);\r
354 digest[16] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff);\r
355 digest[17] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff);\r
356 digest[18] = (unsigned char) ((sha_info->digest[4] >> 8) & 0xff);\r
357 digest[19] = (unsigned char) ((sha_info->digest[4] ) & 0xff);\r
358 digest[20] = (unsigned char) ((sha_info->digest[5] >> 24) & 0xff);\r
359 digest[21] = (unsigned char) ((sha_info->digest[5] >> 16) & 0xff);\r
360 digest[22] = (unsigned char) ((sha_info->digest[5] >> 8) & 0xff);\r
361 digest[23] = (unsigned char) ((sha_info->digest[5] ) & 0xff);\r
362 digest[24] = (unsigned char) ((sha_info->digest[6] >> 24) & 0xff);\r
363 digest[25] = (unsigned char) ((sha_info->digest[6] >> 16) & 0xff);\r
364 digest[26] = (unsigned char) ((sha_info->digest[6] >> 8) & 0xff);\r
365 digest[27] = (unsigned char) ((sha_info->digest[6] ) & 0xff);\r
366 digest[28] = (unsigned char) ((sha_info->digest[7] >> 24) & 0xff);\r
367 digest[29] = (unsigned char) ((sha_info->digest[7] >> 16) & 0xff);\r
368 digest[30] = (unsigned char) ((sha_info->digest[7] >> 8) & 0xff);\r
369 digest[31] = (unsigned char) ((sha_info->digest[7] ) & 0xff);\r
370}\r
371\r
372/*\r
373 * End of copied SHA code.\r
374 *\r
375 * ------------------------------------------------------------------------\r
376 */\r
377\r
378static PyTypeObject SHA224type;\r
379static PyTypeObject SHA256type;\r
380\r
381\r
382static SHAobject *\r
383newSHA224object(void)\r
384{\r
385 return (SHAobject *)PyObject_New(SHAobject, &SHA224type);\r
386}\r
387\r
388static SHAobject *\r
389newSHA256object(void)\r
390{\r
391 return (SHAobject *)PyObject_New(SHAobject, &SHA256type);\r
392}\r
393\r
394/* Internal methods for a hash object */\r
395\r
396static void\r
397SHA_dealloc(PyObject *ptr)\r
398{\r
399 PyObject_Del(ptr);\r
400}\r
401\r
402\r
403/* External methods for a hash object */\r
404\r
405PyDoc_STRVAR(SHA256_copy__doc__, "Return a copy of the hash object.");\r
406\r
407static PyObject *\r
408SHA256_copy(SHAobject *self, PyObject *unused)\r
409{\r
410 SHAobject *newobj;\r
411\r
412 if (Py_TYPE(self) == &SHA256type) {\r
413 if ( (newobj = newSHA256object())==NULL)\r
414 return NULL;\r
415 } else {\r
416 if ( (newobj = newSHA224object())==NULL)\r
417 return NULL;\r
418 }\r
419\r
420 SHAcopy(self, newobj);\r
421 return (PyObject *)newobj;\r
422}\r
423\r
424PyDoc_STRVAR(SHA256_digest__doc__,\r
425"Return the digest value as a string of binary data.");\r
426\r
427static PyObject *\r
428SHA256_digest(SHAobject *self, PyObject *unused)\r
429{\r
430 unsigned char digest[SHA_DIGESTSIZE];\r
431 SHAobject temp;\r
432\r
433 SHAcopy(self, &temp);\r
434 sha_final(digest, &temp);\r
435 return PyString_FromStringAndSize((const char *)digest, self->digestsize);\r
436}\r
437\r
438PyDoc_STRVAR(SHA256_hexdigest__doc__,\r
439"Return the digest value as a string of hexadecimal digits.");\r
440\r
441static PyObject *\r
442SHA256_hexdigest(SHAobject *self, PyObject *unused)\r
443{\r
444 unsigned char digest[SHA_DIGESTSIZE];\r
445 SHAobject temp;\r
446 PyObject *retval;\r
447 char *hex_digest;\r
448 int i, j;\r
449\r
450 /* Get the raw (binary) digest value */\r
451 SHAcopy(self, &temp);\r
452 sha_final(digest, &temp);\r
453\r
454 /* Create a new string */\r
455 retval = PyString_FromStringAndSize(NULL, self->digestsize * 2);\r
456 if (!retval)\r
457 return NULL;\r
458 hex_digest = PyString_AsString(retval);\r
459 if (!hex_digest) {\r
460 Py_DECREF(retval);\r
461 return NULL;\r
462 }\r
463\r
464 /* Make hex version of the digest */\r
465 for(i=j=0; i<self->digestsize; i++) {\r
466 char c;\r
467 c = (digest[i] >> 4) & 0xf;\r
468 c = (c>9) ? c+'a'-10 : c + '0';\r
469 hex_digest[j++] = c;\r
470 c = (digest[i] & 0xf);\r
471 c = (c>9) ? c+'a'-10 : c + '0';\r
472 hex_digest[j++] = c;\r
473 }\r
474 return retval;\r
475}\r
476\r
477PyDoc_STRVAR(SHA256_update__doc__,\r
478"Update this hash object's state with the provided string.");\r
479\r
480static PyObject *\r
481SHA256_update(SHAobject *self, PyObject *args)\r
482{\r
483 Py_buffer buf;\r
484\r
485 if (!PyArg_ParseTuple(args, "s*:update", &buf))\r
486 return NULL;\r
487\r
488 sha_update(self, buf.buf, buf.len);\r
489\r
490 PyBuffer_Release(&buf);\r
491 Py_RETURN_NONE;\r
492}\r
493\r
494static PyMethodDef SHA_methods[] = {\r
495 {"copy", (PyCFunction)SHA256_copy, METH_NOARGS, SHA256_copy__doc__},\r
496 {"digest", (PyCFunction)SHA256_digest, METH_NOARGS, SHA256_digest__doc__},\r
497 {"hexdigest", (PyCFunction)SHA256_hexdigest, METH_NOARGS, SHA256_hexdigest__doc__},\r
498 {"update", (PyCFunction)SHA256_update, METH_VARARGS, SHA256_update__doc__},\r
499 {NULL, NULL} /* sentinel */\r
500};\r
501\r
502static PyObject *\r
503SHA256_get_block_size(PyObject *self, void *closure)\r
504{\r
505 return PyInt_FromLong(SHA_BLOCKSIZE);\r
506}\r
507\r
508static PyObject *\r
509SHA256_get_name(PyObject *self, void *closure)\r
510{\r
511 if (((SHAobject *)self)->digestsize == 32)\r
512 return PyString_FromStringAndSize("SHA256", 6);\r
513 else\r
514 return PyString_FromStringAndSize("SHA224", 6);\r
515}\r
516\r
517static PyGetSetDef SHA_getseters[] = {\r
518 {"block_size",\r
519 (getter)SHA256_get_block_size, NULL,\r
520 NULL,\r
521 NULL},\r
522 {"name",\r
523 (getter)SHA256_get_name, NULL,\r
524 NULL,\r
525 NULL},\r
526 {NULL} /* Sentinel */\r
527};\r
528\r
529static PyMemberDef SHA_members[] = {\r
530 {"digest_size", T_INT, offsetof(SHAobject, digestsize), READONLY, NULL},\r
531 /* the old md5 and sha modules support 'digest_size' as in PEP 247.\r
532 * the old sha module also supported 'digestsize'. ugh. */\r
533 {"digestsize", T_INT, offsetof(SHAobject, digestsize), READONLY, NULL},\r
534 {NULL} /* Sentinel */\r
535};\r
536\r
537static PyTypeObject SHA224type = {\r
538 PyVarObject_HEAD_INIT(NULL, 0)\r
539 "_sha256.sha224", /*tp_name*/\r
540 sizeof(SHAobject), /*tp_size*/\r
541 0, /*tp_itemsize*/\r
542 /* methods */\r
543 SHA_dealloc, /*tp_dealloc*/\r
544 0, /*tp_print*/\r
545 0, /*tp_getattr*/\r
546 0, /*tp_setattr*/\r
547 0, /*tp_compare*/\r
548 0, /*tp_repr*/\r
549 0, /*tp_as_number*/\r
550 0, /*tp_as_sequence*/\r
551 0, /*tp_as_mapping*/\r
552 0, /*tp_hash*/\r
553 0, /*tp_call*/\r
554 0, /*tp_str*/\r
555 0, /*tp_getattro*/\r
556 0, /*tp_setattro*/\r
557 0, /*tp_as_buffer*/\r
558 Py_TPFLAGS_DEFAULT, /*tp_flags*/\r
559 0, /*tp_doc*/\r
560 0, /*tp_traverse*/\r
561 0, /*tp_clear*/\r
562 0, /*tp_richcompare*/\r
563 0, /*tp_weaklistoffset*/\r
564 0, /*tp_iter*/\r
565 0, /*tp_iternext*/\r
566 SHA_methods, /* tp_methods */\r
567 SHA_members, /* tp_members */\r
568 SHA_getseters, /* tp_getset */\r
569};\r
570\r
571static PyTypeObject SHA256type = {\r
572 PyVarObject_HEAD_INIT(NULL, 0)\r
573 "_sha256.sha256", /*tp_name*/\r
574 sizeof(SHAobject), /*tp_size*/\r
575 0, /*tp_itemsize*/\r
576 /* methods */\r
577 SHA_dealloc, /*tp_dealloc*/\r
578 0, /*tp_print*/\r
579 0, /*tp_getattr*/\r
580 0, /*tp_setattr*/\r
581 0, /*tp_compare*/\r
582 0, /*tp_repr*/\r
583 0, /*tp_as_number*/\r
584 0, /*tp_as_sequence*/\r
585 0, /*tp_as_mapping*/\r
586 0, /*tp_hash*/\r
587 0, /*tp_call*/\r
588 0, /*tp_str*/\r
589 0, /*tp_getattro*/\r
590 0, /*tp_setattro*/\r
591 0, /*tp_as_buffer*/\r
592 Py_TPFLAGS_DEFAULT, /*tp_flags*/\r
593 0, /*tp_doc*/\r
594 0, /*tp_traverse*/\r
595 0, /*tp_clear*/\r
596 0, /*tp_richcompare*/\r
597 0, /*tp_weaklistoffset*/\r
598 0, /*tp_iter*/\r
599 0, /*tp_iternext*/\r
600 SHA_methods, /* tp_methods */\r
601 SHA_members, /* tp_members */\r
602 SHA_getseters, /* tp_getset */\r
603};\r
604\r
605\r
606/* The single module-level function: new() */\r
607\r
608PyDoc_STRVAR(SHA256_new__doc__,\r
609"Return a new SHA-256 hash object; optionally initialized with a string.");\r
610\r
611static PyObject *\r
612SHA256_new(PyObject *self, PyObject *args, PyObject *kwdict)\r
613{\r
614 static char *kwlist[] = {"string", NULL};\r
615 SHAobject *new;\r
616 Py_buffer buf = { 0 };\r
617\r
618 if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist,\r
619 &buf)) {\r
620 return NULL;\r
621 }\r
622\r
623 if ((new = newSHA256object()) == NULL) {\r
624 PyBuffer_Release(&buf);\r
625 return NULL;\r
626 }\r
627\r
628 sha_init(new);\r
629\r
630 if (PyErr_Occurred()) {\r
631 Py_DECREF(new);\r
632 PyBuffer_Release(&buf);\r
633 return NULL;\r
634 }\r
635 if (buf.len > 0) {\r
636 sha_update(new, buf.buf, buf.len);\r
637 }\r
638 PyBuffer_Release(&buf);\r
639\r
640 return (PyObject *)new;\r
641}\r
642\r
643PyDoc_STRVAR(SHA224_new__doc__,\r
644"Return a new SHA-224 hash object; optionally initialized with a string.");\r
645\r
646static PyObject *\r
647SHA224_new(PyObject *self, PyObject *args, PyObject *kwdict)\r
648{\r
649 static char *kwlist[] = {"string", NULL};\r
650 SHAobject *new;\r
651 Py_buffer buf = { 0 };\r
652\r
653 if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist,\r
654 &buf)) {\r
655 return NULL;\r
656 }\r
657\r
658 if ((new = newSHA224object()) == NULL) {\r
659 PyBuffer_Release(&buf);\r
660 return NULL;\r
661 }\r
662\r
663 sha224_init(new);\r
664\r
665 if (PyErr_Occurred()) {\r
666 Py_DECREF(new);\r
667 PyBuffer_Release(&buf);\r
668 return NULL;\r
669 }\r
670 if (buf.len > 0) {\r
671 sha_update(new, buf.buf, buf.len);\r
672 }\r
673 PyBuffer_Release(&buf);\r
674\r
675 return (PyObject *)new;\r
676}\r
677\r
678\r
679/* List of functions exported by this module */\r
680\r
681static struct PyMethodDef SHA_functions[] = {\r
682 {"sha256", (PyCFunction)SHA256_new, METH_VARARGS|METH_KEYWORDS, SHA256_new__doc__},\r
683 {"sha224", (PyCFunction)SHA224_new, METH_VARARGS|METH_KEYWORDS, SHA224_new__doc__},\r
684 {NULL, NULL} /* Sentinel */\r
685};\r
686\r
687\r
688/* Initialize this module. */\r
689\r
690#define insint(n,v) { PyModule_AddIntConstant(m,n,v); }\r
691\r
692PyMODINIT_FUNC\r
693init_sha256(void)\r
694{\r
695 PyObject *m;\r
696\r
697 Py_TYPE(&SHA224type) = &PyType_Type;\r
698 if (PyType_Ready(&SHA224type) < 0)\r
699 return;\r
700 Py_TYPE(&SHA256type) = &PyType_Type;\r
701 if (PyType_Ready(&SHA256type) < 0)\r
702 return;\r
703 m = Py_InitModule("_sha256", SHA_functions);\r
704 if (m == NULL)\r
705 return;\r
706}\r