]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Modules/sha512module.c
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Modules / sha512module.c
CommitLineData
4710c53d 1/* SHA512 module */\r
2\r
3/* This module provides an interface to NIST's SHA-512 and SHA-384 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#ifdef PY_LONG_LONG /* If no PY_LONG_LONG, don't compile anything! */\r
23\r
24/* Endianness testing and definitions */\r
25#define TestEndianness(variable) {int i=1; variable=PCT_BIG_ENDIAN;\\r
26 if (*((char*)&i)==1) variable=PCT_LITTLE_ENDIAN;}\r
27\r
28#define PCT_LITTLE_ENDIAN 1\r
29#define PCT_BIG_ENDIAN 0\r
30\r
31/* Some useful types */\r
32\r
33typedef unsigned char SHA_BYTE;\r
34\r
35#if SIZEOF_INT == 4\r
36typedef unsigned int SHA_INT32; /* 32-bit integer */\r
37typedef unsigned PY_LONG_LONG SHA_INT64; /* 64-bit integer */\r
38#else\r
39/* not defined. compilation will die. */\r
40#endif\r
41\r
42/* The SHA block size and message digest sizes, in bytes */\r
43\r
44#define SHA_BLOCKSIZE 128\r
45#define SHA_DIGESTSIZE 64\r
46\r
47/* The structure for storing SHA info */\r
48\r
49typedef struct {\r
50 PyObject_HEAD\r
51 SHA_INT64 digest[8]; /* Message digest */\r
52 SHA_INT32 count_lo, count_hi; /* 64-bit bit count */\r
53 SHA_BYTE data[SHA_BLOCKSIZE]; /* SHA data buffer */\r
54 int Endianness;\r
55 int local; /* unprocessed amount in data */\r
56 int digestsize;\r
57} SHAobject;\r
58\r
59/* When run on a little-endian CPU we need to perform byte reversal on an\r
60 array of longwords. */\r
61\r
62static void longReverse(SHA_INT64 *buffer, int byteCount, int Endianness)\r
63{\r
64 SHA_INT64 value;\r
65\r
66 if ( Endianness == PCT_BIG_ENDIAN )\r
67 return;\r
68\r
69 byteCount /= sizeof(*buffer);\r
70 while (byteCount--) {\r
71 value = *buffer;\r
72\r
73 ((unsigned char*)buffer)[0] = (unsigned char)(value >> 56) & 0xff;\r
74 ((unsigned char*)buffer)[1] = (unsigned char)(value >> 48) & 0xff;\r
75 ((unsigned char*)buffer)[2] = (unsigned char)(value >> 40) & 0xff;\r
76 ((unsigned char*)buffer)[3] = (unsigned char)(value >> 32) & 0xff;\r
77 ((unsigned char*)buffer)[4] = (unsigned char)(value >> 24) & 0xff;\r
78 ((unsigned char*)buffer)[5] = (unsigned char)(value >> 16) & 0xff;\r
79 ((unsigned char*)buffer)[6] = (unsigned char)(value >> 8) & 0xff;\r
80 ((unsigned char*)buffer)[7] = (unsigned char)(value ) & 0xff;\r
81\r
82 buffer++;\r
83 }\r
84}\r
85\r
86static void SHAcopy(SHAobject *src, SHAobject *dest)\r
87{\r
88 dest->Endianness = src->Endianness;\r
89 dest->local = src->local;\r
90 dest->digestsize = src->digestsize;\r
91 dest->count_lo = src->count_lo;\r
92 dest->count_hi = src->count_hi;\r
93 memcpy(dest->digest, src->digest, sizeof(src->digest));\r
94 memcpy(dest->data, src->data, sizeof(src->data));\r
95}\r
96\r
97\r
98/* ------------------------------------------------------------------------\r
99 *\r
100 * This code for the SHA-512 algorithm was noted as public domain. The\r
101 * original headers are pasted below.\r
102 *\r
103 * Several changes have been made to make it more compatible with the\r
104 * Python environment and desired interface.\r
105 *\r
106 */\r
107\r
108/* LibTomCrypt, modular cryptographic library -- Tom St Denis\r
109 *\r
110 * LibTomCrypt is a library that provides various cryptographic\r
111 * algorithms in a highly modular and flexible manner.\r
112 *\r
113 * The library is free for all purposes without any express\r
114 * gurantee it works.\r
115 *\r
116 * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.org\r
117 */\r
118\r
119\r
120/* SHA512 by Tom St Denis */\r
121\r
122/* Various logical functions */\r
123#define ROR64(x, y) \\r
124 ( ((((x) & Py_ULL(0xFFFFFFFFFFFFFFFF))>>((unsigned PY_LONG_LONG)(y) & 63)) | \\r
125 ((x)<<((unsigned PY_LONG_LONG)(64-((y) & 63))))) & Py_ULL(0xFFFFFFFFFFFFFFFF))\r
126#define Ch(x,y,z) (z ^ (x & (y ^ z)))\r
127#define Maj(x,y,z) (((x | y) & z) | (x & y))\r
128#define S(x, n) ROR64((x),(n))\r
129#define R(x, n) (((x) & Py_ULL(0xFFFFFFFFFFFFFFFF)) >> ((unsigned PY_LONG_LONG)n))\r
130#define Sigma0(x) (S(x, 28) ^ S(x, 34) ^ S(x, 39))\r
131#define Sigma1(x) (S(x, 14) ^ S(x, 18) ^ S(x, 41))\r
132#define Gamma0(x) (S(x, 1) ^ S(x, 8) ^ R(x, 7))\r
133#define Gamma1(x) (S(x, 19) ^ S(x, 61) ^ R(x, 6))\r
134\r
135\r
136static void\r
137sha512_transform(SHAobject *sha_info)\r
138{\r
139 int i;\r
140 SHA_INT64 S[8], W[80], t0, t1;\r
141\r
142 memcpy(W, sha_info->data, sizeof(sha_info->data));\r
143 longReverse(W, (int)sizeof(sha_info->data), sha_info->Endianness);\r
144\r
145 for (i = 16; i < 80; ++i) {\r
146 W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16];\r
147 }\r
148 for (i = 0; i < 8; ++i) {\r
149 S[i] = sha_info->digest[i];\r
150 }\r
151\r
152 /* Compress */\r
153#define RND(a,b,c,d,e,f,g,h,i,ki) \\r
154 t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; \\r
155 t1 = Sigma0(a) + Maj(a, b, c); \\r
156 d += t0; \\r
157 h = t0 + t1;\r
158\r
159 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,Py_ULL(0x428a2f98d728ae22));\r
160 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,Py_ULL(0x7137449123ef65cd));\r
161 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,Py_ULL(0xb5c0fbcfec4d3b2f));\r
162 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,Py_ULL(0xe9b5dba58189dbbc));\r
163 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,Py_ULL(0x3956c25bf348b538));\r
164 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,Py_ULL(0x59f111f1b605d019));\r
165 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,Py_ULL(0x923f82a4af194f9b));\r
166 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,Py_ULL(0xab1c5ed5da6d8118));\r
167 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,Py_ULL(0xd807aa98a3030242));\r
168 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,Py_ULL(0x12835b0145706fbe));\r
169 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,Py_ULL(0x243185be4ee4b28c));\r
170 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,Py_ULL(0x550c7dc3d5ffb4e2));\r
171 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,Py_ULL(0x72be5d74f27b896f));\r
172 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,Py_ULL(0x80deb1fe3b1696b1));\r
173 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,Py_ULL(0x9bdc06a725c71235));\r
174 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,Py_ULL(0xc19bf174cf692694));\r
175 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,Py_ULL(0xe49b69c19ef14ad2));\r
176 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,Py_ULL(0xefbe4786384f25e3));\r
177 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,Py_ULL(0x0fc19dc68b8cd5b5));\r
178 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,Py_ULL(0x240ca1cc77ac9c65));\r
179 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,Py_ULL(0x2de92c6f592b0275));\r
180 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,Py_ULL(0x4a7484aa6ea6e483));\r
181 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,Py_ULL(0x5cb0a9dcbd41fbd4));\r
182 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,Py_ULL(0x76f988da831153b5));\r
183 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,Py_ULL(0x983e5152ee66dfab));\r
184 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,Py_ULL(0xa831c66d2db43210));\r
185 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,Py_ULL(0xb00327c898fb213f));\r
186 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,Py_ULL(0xbf597fc7beef0ee4));\r
187 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,Py_ULL(0xc6e00bf33da88fc2));\r
188 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,Py_ULL(0xd5a79147930aa725));\r
189 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,Py_ULL(0x06ca6351e003826f));\r
190 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,Py_ULL(0x142929670a0e6e70));\r
191 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,Py_ULL(0x27b70a8546d22ffc));\r
192 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,Py_ULL(0x2e1b21385c26c926));\r
193 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,Py_ULL(0x4d2c6dfc5ac42aed));\r
194 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,Py_ULL(0x53380d139d95b3df));\r
195 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,Py_ULL(0x650a73548baf63de));\r
196 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,Py_ULL(0x766a0abb3c77b2a8));\r
197 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,Py_ULL(0x81c2c92e47edaee6));\r
198 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,Py_ULL(0x92722c851482353b));\r
199 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,Py_ULL(0xa2bfe8a14cf10364));\r
200 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,Py_ULL(0xa81a664bbc423001));\r
201 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,Py_ULL(0xc24b8b70d0f89791));\r
202 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,Py_ULL(0xc76c51a30654be30));\r
203 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,Py_ULL(0xd192e819d6ef5218));\r
204 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,Py_ULL(0xd69906245565a910));\r
205 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,Py_ULL(0xf40e35855771202a));\r
206 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,Py_ULL(0x106aa07032bbd1b8));\r
207 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,Py_ULL(0x19a4c116b8d2d0c8));\r
208 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,Py_ULL(0x1e376c085141ab53));\r
209 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,Py_ULL(0x2748774cdf8eeb99));\r
210 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,Py_ULL(0x34b0bcb5e19b48a8));\r
211 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,Py_ULL(0x391c0cb3c5c95a63));\r
212 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,Py_ULL(0x4ed8aa4ae3418acb));\r
213 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,Py_ULL(0x5b9cca4f7763e373));\r
214 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,Py_ULL(0x682e6ff3d6b2b8a3));\r
215 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,Py_ULL(0x748f82ee5defb2fc));\r
216 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,Py_ULL(0x78a5636f43172f60));\r
217 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,Py_ULL(0x84c87814a1f0ab72));\r
218 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,Py_ULL(0x8cc702081a6439ec));\r
219 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,Py_ULL(0x90befffa23631e28));\r
220 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,Py_ULL(0xa4506cebde82bde9));\r
221 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,Py_ULL(0xbef9a3f7b2c67915));\r
222 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,Py_ULL(0xc67178f2e372532b));\r
223 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],64,Py_ULL(0xca273eceea26619c));\r
224 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],65,Py_ULL(0xd186b8c721c0c207));\r
225 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],66,Py_ULL(0xeada7dd6cde0eb1e));\r
226 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],67,Py_ULL(0xf57d4f7fee6ed178));\r
227 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],68,Py_ULL(0x06f067aa72176fba));\r
228 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],69,Py_ULL(0x0a637dc5a2c898a6));\r
229 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],70,Py_ULL(0x113f9804bef90dae));\r
230 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],71,Py_ULL(0x1b710b35131c471b));\r
231 RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],72,Py_ULL(0x28db77f523047d84));\r
232 RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],73,Py_ULL(0x32caab7b40c72493));\r
233 RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],74,Py_ULL(0x3c9ebe0a15c9bebc));\r
234 RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],75,Py_ULL(0x431d67c49c100d4c));\r
235 RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],76,Py_ULL(0x4cc5d4becb3e42b6));\r
236 RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],77,Py_ULL(0x597f299cfc657e2a));\r
237 RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],78,Py_ULL(0x5fcb6fab3ad6faec));\r
238 RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],79,Py_ULL(0x6c44198c4a475817));\r
239\r
240#undef RND\r
241\r
242 /* feedback */\r
243 for (i = 0; i < 8; i++) {\r
244 sha_info->digest[i] = sha_info->digest[i] + S[i];\r
245 }\r
246\r
247}\r
248\r
249\r
250\r
251/* initialize the SHA digest */\r
252\r
253static void\r
254sha512_init(SHAobject *sha_info)\r
255{\r
256 TestEndianness(sha_info->Endianness)\r
257 sha_info->digest[0] = Py_ULL(0x6a09e667f3bcc908);\r
258 sha_info->digest[1] = Py_ULL(0xbb67ae8584caa73b);\r
259 sha_info->digest[2] = Py_ULL(0x3c6ef372fe94f82b);\r
260 sha_info->digest[3] = Py_ULL(0xa54ff53a5f1d36f1);\r
261 sha_info->digest[4] = Py_ULL(0x510e527fade682d1);\r
262 sha_info->digest[5] = Py_ULL(0x9b05688c2b3e6c1f);\r
263 sha_info->digest[6] = Py_ULL(0x1f83d9abfb41bd6b);\r
264 sha_info->digest[7] = Py_ULL(0x5be0cd19137e2179);\r
265 sha_info->count_lo = 0L;\r
266 sha_info->count_hi = 0L;\r
267 sha_info->local = 0;\r
268 sha_info->digestsize = 64;\r
269}\r
270\r
271static void\r
272sha384_init(SHAobject *sha_info)\r
273{\r
274 TestEndianness(sha_info->Endianness)\r
275 sha_info->digest[0] = Py_ULL(0xcbbb9d5dc1059ed8);\r
276 sha_info->digest[1] = Py_ULL(0x629a292a367cd507);\r
277 sha_info->digest[2] = Py_ULL(0x9159015a3070dd17);\r
278 sha_info->digest[3] = Py_ULL(0x152fecd8f70e5939);\r
279 sha_info->digest[4] = Py_ULL(0x67332667ffc00b31);\r
280 sha_info->digest[5] = Py_ULL(0x8eb44a8768581511);\r
281 sha_info->digest[6] = Py_ULL(0xdb0c2e0d64f98fa7);\r
282 sha_info->digest[7] = Py_ULL(0x47b5481dbefa4fa4);\r
283 sha_info->count_lo = 0L;\r
284 sha_info->count_hi = 0L;\r
285 sha_info->local = 0;\r
286 sha_info->digestsize = 48;\r
287}\r
288\r
289\r
290/* update the SHA digest */\r
291\r
292static void\r
293sha512_update(SHAobject *sha_info, SHA_BYTE *buffer, int count)\r
294{\r
295 int i;\r
296 SHA_INT32 clo;\r
297\r
298 clo = sha_info->count_lo + ((SHA_INT32) count << 3);\r
299 if (clo < sha_info->count_lo) {\r
300 ++sha_info->count_hi;\r
301 }\r
302 sha_info->count_lo = clo;\r
303 sha_info->count_hi += (SHA_INT32) count >> 29;\r
304 if (sha_info->local) {\r
305 i = SHA_BLOCKSIZE - sha_info->local;\r
306 if (i > count) {\r
307 i = count;\r
308 }\r
309 memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i);\r
310 count -= i;\r
311 buffer += i;\r
312 sha_info->local += i;\r
313 if (sha_info->local == SHA_BLOCKSIZE) {\r
314 sha512_transform(sha_info);\r
315 }\r
316 else {\r
317 return;\r
318 }\r
319 }\r
320 while (count >= SHA_BLOCKSIZE) {\r
321 memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);\r
322 buffer += SHA_BLOCKSIZE;\r
323 count -= SHA_BLOCKSIZE;\r
324 sha512_transform(sha_info);\r
325 }\r
326 memcpy(sha_info->data, buffer, count);\r
327 sha_info->local = count;\r
328}\r
329\r
330/* finish computing the SHA digest */\r
331\r
332static void\r
333sha512_final(unsigned char digest[SHA_DIGESTSIZE], SHAobject *sha_info)\r
334{\r
335 int count;\r
336 SHA_INT32 lo_bit_count, hi_bit_count;\r
337\r
338 lo_bit_count = sha_info->count_lo;\r
339 hi_bit_count = sha_info->count_hi;\r
340 count = (int) ((lo_bit_count >> 3) & 0x7f);\r
341 ((SHA_BYTE *) sha_info->data)[count++] = 0x80;\r
342 if (count > SHA_BLOCKSIZE - 16) {\r
343 memset(((SHA_BYTE *) sha_info->data) + count, 0,\r
344 SHA_BLOCKSIZE - count);\r
345 sha512_transform(sha_info);\r
346 memset((SHA_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 16);\r
347 }\r
348 else {\r
349 memset(((SHA_BYTE *) sha_info->data) + count, 0,\r
350 SHA_BLOCKSIZE - 16 - count);\r
351 }\r
352\r
353 /* GJS: note that we add the hi/lo in big-endian. sha512_transform will\r
354 swap these values into host-order. */\r
355 sha_info->data[112] = 0;\r
356 sha_info->data[113] = 0;\r
357 sha_info->data[114] = 0;\r
358 sha_info->data[115] = 0;\r
359 sha_info->data[116] = 0;\r
360 sha_info->data[117] = 0;\r
361 sha_info->data[118] = 0;\r
362 sha_info->data[119] = 0;\r
363 sha_info->data[120] = (hi_bit_count >> 24) & 0xff;\r
364 sha_info->data[121] = (hi_bit_count >> 16) & 0xff;\r
365 sha_info->data[122] = (hi_bit_count >> 8) & 0xff;\r
366 sha_info->data[123] = (hi_bit_count >> 0) & 0xff;\r
367 sha_info->data[124] = (lo_bit_count >> 24) & 0xff;\r
368 sha_info->data[125] = (lo_bit_count >> 16) & 0xff;\r
369 sha_info->data[126] = (lo_bit_count >> 8) & 0xff;\r
370 sha_info->data[127] = (lo_bit_count >> 0) & 0xff;\r
371 sha512_transform(sha_info);\r
372 digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 56) & 0xff);\r
373 digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 48) & 0xff);\r
374 digest[ 2] = (unsigned char) ((sha_info->digest[0] >> 40) & 0xff);\r
375 digest[ 3] = (unsigned char) ((sha_info->digest[0] >> 32) & 0xff);\r
376 digest[ 4] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff);\r
377 digest[ 5] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff);\r
378 digest[ 6] = (unsigned char) ((sha_info->digest[0] >> 8) & 0xff);\r
379 digest[ 7] = (unsigned char) ((sha_info->digest[0] ) & 0xff);\r
380 digest[ 8] = (unsigned char) ((sha_info->digest[1] >> 56) & 0xff);\r
381 digest[ 9] = (unsigned char) ((sha_info->digest[1] >> 48) & 0xff);\r
382 digest[10] = (unsigned char) ((sha_info->digest[1] >> 40) & 0xff);\r
383 digest[11] = (unsigned char) ((sha_info->digest[1] >> 32) & 0xff);\r
384 digest[12] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff);\r
385 digest[13] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff);\r
386 digest[14] = (unsigned char) ((sha_info->digest[1] >> 8) & 0xff);\r
387 digest[15] = (unsigned char) ((sha_info->digest[1] ) & 0xff);\r
388 digest[16] = (unsigned char) ((sha_info->digest[2] >> 56) & 0xff);\r
389 digest[17] = (unsigned char) ((sha_info->digest[2] >> 48) & 0xff);\r
390 digest[18] = (unsigned char) ((sha_info->digest[2] >> 40) & 0xff);\r
391 digest[19] = (unsigned char) ((sha_info->digest[2] >> 32) & 0xff);\r
392 digest[20] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff);\r
393 digest[21] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff);\r
394 digest[22] = (unsigned char) ((sha_info->digest[2] >> 8) & 0xff);\r
395 digest[23] = (unsigned char) ((sha_info->digest[2] ) & 0xff);\r
396 digest[24] = (unsigned char) ((sha_info->digest[3] >> 56) & 0xff);\r
397 digest[25] = (unsigned char) ((sha_info->digest[3] >> 48) & 0xff);\r
398 digest[26] = (unsigned char) ((sha_info->digest[3] >> 40) & 0xff);\r
399 digest[27] = (unsigned char) ((sha_info->digest[3] >> 32) & 0xff);\r
400 digest[28] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff);\r
401 digest[29] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff);\r
402 digest[30] = (unsigned char) ((sha_info->digest[3] >> 8) & 0xff);\r
403 digest[31] = (unsigned char) ((sha_info->digest[3] ) & 0xff);\r
404 digest[32] = (unsigned char) ((sha_info->digest[4] >> 56) & 0xff);\r
405 digest[33] = (unsigned char) ((sha_info->digest[4] >> 48) & 0xff);\r
406 digest[34] = (unsigned char) ((sha_info->digest[4] >> 40) & 0xff);\r
407 digest[35] = (unsigned char) ((sha_info->digest[4] >> 32) & 0xff);\r
408 digest[36] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff);\r
409 digest[37] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff);\r
410 digest[38] = (unsigned char) ((sha_info->digest[4] >> 8) & 0xff);\r
411 digest[39] = (unsigned char) ((sha_info->digest[4] ) & 0xff);\r
412 digest[40] = (unsigned char) ((sha_info->digest[5] >> 56) & 0xff);\r
413 digest[41] = (unsigned char) ((sha_info->digest[5] >> 48) & 0xff);\r
414 digest[42] = (unsigned char) ((sha_info->digest[5] >> 40) & 0xff);\r
415 digest[43] = (unsigned char) ((sha_info->digest[5] >> 32) & 0xff);\r
416 digest[44] = (unsigned char) ((sha_info->digest[5] >> 24) & 0xff);\r
417 digest[45] = (unsigned char) ((sha_info->digest[5] >> 16) & 0xff);\r
418 digest[46] = (unsigned char) ((sha_info->digest[5] >> 8) & 0xff);\r
419 digest[47] = (unsigned char) ((sha_info->digest[5] ) & 0xff);\r
420 digest[48] = (unsigned char) ((sha_info->digest[6] >> 56) & 0xff);\r
421 digest[49] = (unsigned char) ((sha_info->digest[6] >> 48) & 0xff);\r
422 digest[50] = (unsigned char) ((sha_info->digest[6] >> 40) & 0xff);\r
423 digest[51] = (unsigned char) ((sha_info->digest[6] >> 32) & 0xff);\r
424 digest[52] = (unsigned char) ((sha_info->digest[6] >> 24) & 0xff);\r
425 digest[53] = (unsigned char) ((sha_info->digest[6] >> 16) & 0xff);\r
426 digest[54] = (unsigned char) ((sha_info->digest[6] >> 8) & 0xff);\r
427 digest[55] = (unsigned char) ((sha_info->digest[6] ) & 0xff);\r
428 digest[56] = (unsigned char) ((sha_info->digest[7] >> 56) & 0xff);\r
429 digest[57] = (unsigned char) ((sha_info->digest[7] >> 48) & 0xff);\r
430 digest[58] = (unsigned char) ((sha_info->digest[7] >> 40) & 0xff);\r
431 digest[59] = (unsigned char) ((sha_info->digest[7] >> 32) & 0xff);\r
432 digest[60] = (unsigned char) ((sha_info->digest[7] >> 24) & 0xff);\r
433 digest[61] = (unsigned char) ((sha_info->digest[7] >> 16) & 0xff);\r
434 digest[62] = (unsigned char) ((sha_info->digest[7] >> 8) & 0xff);\r
435 digest[63] = (unsigned char) ((sha_info->digest[7] ) & 0xff);\r
436}\r
437\r
438/*\r
439 * End of copied SHA code.\r
440 *\r
441 * ------------------------------------------------------------------------\r
442 */\r
443\r
444static PyTypeObject SHA384type;\r
445static PyTypeObject SHA512type;\r
446\r
447\r
448static SHAobject *\r
449newSHA384object(void)\r
450{\r
451 return (SHAobject *)PyObject_New(SHAobject, &SHA384type);\r
452}\r
453\r
454static SHAobject *\r
455newSHA512object(void)\r
456{\r
457 return (SHAobject *)PyObject_New(SHAobject, &SHA512type);\r
458}\r
459\r
460/* Internal methods for a hash object */\r
461\r
462static void\r
463SHA512_dealloc(PyObject *ptr)\r
464{\r
465 PyObject_Del(ptr);\r
466}\r
467\r
468\r
469/* External methods for a hash object */\r
470\r
471PyDoc_STRVAR(SHA512_copy__doc__, "Return a copy of the hash object.");\r
472\r
473static PyObject *\r
474SHA512_copy(SHAobject *self, PyObject *unused)\r
475{\r
476 SHAobject *newobj;\r
477\r
478 if (((PyObject*)self)->ob_type == &SHA512type) {\r
479 if ( (newobj = newSHA512object())==NULL)\r
480 return NULL;\r
481 } else {\r
482 if ( (newobj = newSHA384object())==NULL)\r
483 return NULL;\r
484 }\r
485\r
486 SHAcopy(self, newobj);\r
487 return (PyObject *)newobj;\r
488}\r
489\r
490PyDoc_STRVAR(SHA512_digest__doc__,\r
491"Return the digest value as a string of binary data.");\r
492\r
493static PyObject *\r
494SHA512_digest(SHAobject *self, PyObject *unused)\r
495{\r
496 unsigned char digest[SHA_DIGESTSIZE];\r
497 SHAobject temp;\r
498\r
499 SHAcopy(self, &temp);\r
500 sha512_final(digest, &temp);\r
501 return PyString_FromStringAndSize((const char *)digest, self->digestsize);\r
502}\r
503\r
504PyDoc_STRVAR(SHA512_hexdigest__doc__,\r
505"Return the digest value as a string of hexadecimal digits.");\r
506\r
507static PyObject *\r
508SHA512_hexdigest(SHAobject *self, PyObject *unused)\r
509{\r
510 unsigned char digest[SHA_DIGESTSIZE];\r
511 SHAobject temp;\r
512 PyObject *retval;\r
513 char *hex_digest;\r
514 int i, j;\r
515\r
516 /* Get the raw (binary) digest value */\r
517 SHAcopy(self, &temp);\r
518 sha512_final(digest, &temp);\r
519\r
520 /* Create a new string */\r
521 retval = PyString_FromStringAndSize(NULL, self->digestsize * 2);\r
522 if (!retval)\r
523 return NULL;\r
524 hex_digest = PyString_AsString(retval);\r
525 if (!hex_digest) {\r
526 Py_DECREF(retval);\r
527 return NULL;\r
528 }\r
529\r
530 /* Make hex version of the digest */\r
531 for (i=j=0; i<self->digestsize; i++) {\r
532 char c;\r
533 c = (digest[i] >> 4) & 0xf;\r
534 c = (c>9) ? c+'a'-10 : c + '0';\r
535 hex_digest[j++] = c;\r
536 c = (digest[i] & 0xf);\r
537 c = (c>9) ? c+'a'-10 : c + '0';\r
538 hex_digest[j++] = c;\r
539 }\r
540 return retval;\r
541}\r
542\r
543PyDoc_STRVAR(SHA512_update__doc__,\r
544"Update this hash object's state with the provided string.");\r
545\r
546static PyObject *\r
547SHA512_update(SHAobject *self, PyObject *args)\r
548{\r
549 Py_buffer buf;\r
550\r
551 if (!PyArg_ParseTuple(args, "s*:update", &buf))\r
552 return NULL;\r
553\r
554 sha512_update(self, buf.buf, buf.len);\r
555\r
556 PyBuffer_Release(&buf);\r
557 Py_RETURN_NONE;\r
558}\r
559\r
560static PyMethodDef SHA_methods[] = {\r
561 {"copy", (PyCFunction)SHA512_copy, METH_NOARGS, SHA512_copy__doc__},\r
562 {"digest", (PyCFunction)SHA512_digest, METH_NOARGS, SHA512_digest__doc__},\r
563 {"hexdigest", (PyCFunction)SHA512_hexdigest, METH_NOARGS, SHA512_hexdigest__doc__},\r
564 {"update", (PyCFunction)SHA512_update, METH_VARARGS, SHA512_update__doc__},\r
565 {NULL, NULL} /* sentinel */\r
566};\r
567\r
568static PyObject *\r
569SHA512_get_block_size(PyObject *self, void *closure)\r
570{\r
571 return PyInt_FromLong(SHA_BLOCKSIZE);\r
572}\r
573\r
574static PyObject *\r
575SHA512_get_name(PyObject *self, void *closure)\r
576{\r
577 if (((SHAobject *)self)->digestsize == 64)\r
578 return PyString_FromStringAndSize("SHA512", 6);\r
579 else\r
580 return PyString_FromStringAndSize("SHA384", 6);\r
581}\r
582\r
583static PyGetSetDef SHA_getseters[] = {\r
584 {"block_size",\r
585 (getter)SHA512_get_block_size, NULL,\r
586 NULL,\r
587 NULL},\r
588 {"name",\r
589 (getter)SHA512_get_name, NULL,\r
590 NULL,\r
591 NULL},\r
592 {NULL} /* Sentinel */\r
593};\r
594\r
595static PyMemberDef SHA_members[] = {\r
596 {"digest_size", T_INT, offsetof(SHAobject, digestsize), READONLY, NULL},\r
597 /* the old md5 and sha modules support 'digest_size' as in PEP 247.\r
598 * the old sha module also supported 'digestsize'. ugh. */\r
599 {"digestsize", T_INT, offsetof(SHAobject, digestsize), READONLY, NULL},\r
600 {NULL} /* Sentinel */\r
601};\r
602\r
603static PyTypeObject SHA384type = {\r
604 PyVarObject_HEAD_INIT(NULL, 0)\r
605 "_sha512.sha384", /*tp_name*/\r
606 sizeof(SHAobject), /*tp_size*/\r
607 0, /*tp_itemsize*/\r
608 /* methods */\r
609 SHA512_dealloc, /*tp_dealloc*/\r
610 0, /*tp_print*/\r
611 0, /*tp_getattr*/\r
612 0, /*tp_setattr*/\r
613 0, /*tp_compare*/\r
614 0, /*tp_repr*/\r
615 0, /*tp_as_number*/\r
616 0, /*tp_as_sequence*/\r
617 0, /*tp_as_mapping*/\r
618 0, /*tp_hash*/\r
619 0, /*tp_call*/\r
620 0, /*tp_str*/\r
621 0, /*tp_getattro*/\r
622 0, /*tp_setattro*/\r
623 0, /*tp_as_buffer*/\r
624 Py_TPFLAGS_DEFAULT, /*tp_flags*/\r
625 0, /*tp_doc*/\r
626 0, /*tp_traverse*/\r
627 0, /*tp_clear*/\r
628 0, /*tp_richcompare*/\r
629 0, /*tp_weaklistoffset*/\r
630 0, /*tp_iter*/\r
631 0, /*tp_iternext*/\r
632 SHA_methods, /* tp_methods */\r
633 SHA_members, /* tp_members */\r
634 SHA_getseters, /* tp_getset */\r
635};\r
636\r
637static PyTypeObject SHA512type = {\r
638 PyVarObject_HEAD_INIT(NULL, 0)\r
639 "_sha512.sha512", /*tp_name*/\r
640 sizeof(SHAobject), /*tp_size*/\r
641 0, /*tp_itemsize*/\r
642 /* methods */\r
643 SHA512_dealloc, /*tp_dealloc*/\r
644 0, /*tp_print*/\r
645 0, /*tp_getattr*/\r
646 0, /*tp_setattr*/\r
647 0, /*tp_compare*/\r
648 0, /*tp_repr*/\r
649 0, /*tp_as_number*/\r
650 0, /*tp_as_sequence*/\r
651 0, /*tp_as_mapping*/\r
652 0, /*tp_hash*/\r
653 0, /*tp_call*/\r
654 0, /*tp_str*/\r
655 0, /*tp_getattro*/\r
656 0, /*tp_setattro*/\r
657 0, /*tp_as_buffer*/\r
658 Py_TPFLAGS_DEFAULT, /*tp_flags*/\r
659 0, /*tp_doc*/\r
660 0, /*tp_traverse*/\r
661 0, /*tp_clear*/\r
662 0, /*tp_richcompare*/\r
663 0, /*tp_weaklistoffset*/\r
664 0, /*tp_iter*/\r
665 0, /*tp_iternext*/\r
666 SHA_methods, /* tp_methods */\r
667 SHA_members, /* tp_members */\r
668 SHA_getseters, /* tp_getset */\r
669};\r
670\r
671\r
672/* The single module-level function: new() */\r
673\r
674PyDoc_STRVAR(SHA512_new__doc__,\r
675"Return a new SHA-512 hash object; optionally initialized with a string.");\r
676\r
677static PyObject *\r
678SHA512_new(PyObject *self, PyObject *args, PyObject *kwdict)\r
679{\r
680 static char *kwlist[] = {"string", NULL};\r
681 SHAobject *new;\r
682 Py_buffer buf = { 0 };\r
683\r
684 if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist,\r
685 &buf)) {\r
686 return NULL;\r
687 }\r
688\r
689 if ((new = newSHA512object()) == NULL) {\r
690 PyBuffer_Release(&buf);\r
691 return NULL;\r
692 }\r
693\r
694 sha512_init(new);\r
695\r
696 if (PyErr_Occurred()) {\r
697 Py_DECREF(new);\r
698 PyBuffer_Release(&buf);\r
699 return NULL;\r
700 }\r
701 if (buf.len > 0) {\r
702 sha512_update(new, buf.buf, buf.len);\r
703 }\r
704 PyBuffer_Release(&buf);\r
705\r
706 return (PyObject *)new;\r
707}\r
708\r
709PyDoc_STRVAR(SHA384_new__doc__,\r
710"Return a new SHA-384 hash object; optionally initialized with a string.");\r
711\r
712static PyObject *\r
713SHA384_new(PyObject *self, PyObject *args, PyObject *kwdict)\r
714{\r
715 static char *kwlist[] = {"string", NULL};\r
716 SHAobject *new;\r
717 Py_buffer buf = { 0 };\r
718\r
719 if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist,\r
720 &buf)) {\r
721 return NULL;\r
722 }\r
723\r
724 if ((new = newSHA384object()) == NULL) {\r
725 PyBuffer_Release(&buf);\r
726 return NULL;\r
727 }\r
728\r
729 sha384_init(new);\r
730\r
731 if (PyErr_Occurred()) {\r
732 Py_DECREF(new);\r
733 PyBuffer_Release(&buf);\r
734 return NULL;\r
735 }\r
736 if (buf.len > 0) {\r
737 sha512_update(new, buf.buf, buf.len);\r
738 }\r
739 PyBuffer_Release(&buf);\r
740\r
741 return (PyObject *)new;\r
742}\r
743\r
744\r
745/* List of functions exported by this module */\r
746\r
747static struct PyMethodDef SHA_functions[] = {\r
748 {"sha512", (PyCFunction)SHA512_new, METH_VARARGS|METH_KEYWORDS, SHA512_new__doc__},\r
749 {"sha384", (PyCFunction)SHA384_new, METH_VARARGS|METH_KEYWORDS, SHA384_new__doc__},\r
750 {NULL, NULL} /* Sentinel */\r
751};\r
752\r
753\r
754/* Initialize this module. */\r
755\r
756#define insint(n,v) { PyModule_AddIntConstant(m,n,v); }\r
757\r
758PyMODINIT_FUNC\r
759init_sha512(void)\r
760{\r
761 PyObject *m;\r
762\r
763 Py_TYPE(&SHA384type) = &PyType_Type;\r
764 if (PyType_Ready(&SHA384type) < 0)\r
765 return;\r
766 Py_TYPE(&SHA512type) = &PyType_Type;\r
767 if (PyType_Ready(&SHA512type) < 0)\r
768 return;\r
769 m = Py_InitModule("_sha512", SHA_functions);\r
770 if (m == NULL)\r
771 return;\r
772}\r
773\r
774#endif\r