shamodule.c revision 57b808d21a7651b303bf22264c4bc47824ab3b51
129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/*********************************************************** 229d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumCopyright 1999 by Stichting Mathematisch Centrum, Amsterdam, 329d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumThe Netherlands. 429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum All Rights Reserved 629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 7fd71b9e9d496caa510dec56a9b69966558d6ba5dGuido van RossumCopyright (c) 2000, BeOpen.com. 8fd71b9e9d496caa510dec56a9b69966558d6ba5dGuido van RossumCopyright (c) 1995-2000, Corporation for National Research Initiatives. 9fd71b9e9d496caa510dec56a9b69966558d6ba5dGuido van RossumCopyright (c) 1990-1995, Stichting Mathematisch Centrum. 10fd71b9e9d496caa510dec56a9b69966558d6ba5dGuido van RossumAll rights reserved. 1129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 12fd71b9e9d496caa510dec56a9b69966558d6ba5dGuido van RossumSee the file "Misc/COPYRIGHT" for information on usage and 13fd71b9e9d496caa510dec56a9b69966558d6ba5dGuido van Rossumredistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. 1429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 1529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum******************************************************************/ 1629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 1729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* SHA module */ 1829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 1929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* This module provides an interface to NIST's Secure Hash Algorithm */ 2029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 2129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* See below for information about the original code this module was 2229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum based upon. Additional work performed by: 2329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 24a4e9a333826297a87aaa77e2bbf78a2048d4c061Andrew M. Kuchling Andrew Kuchling (amk1@bigfoot.com) 2529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum Greg Stein (gstein@lyra.org) 2629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum*/ 2729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 2829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* SHA objects */ 2929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 3029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#include "Python.h" 3129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 3229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 3329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* Endianness testing and definitions */ 3429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define TestEndianness(variable) {int i=1; variable=PCT_BIG_ENDIAN;\ 3529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (*((char*)&i)==1) variable=PCT_LITTLE_ENDIAN;} 3629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 3729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define PCT_LITTLE_ENDIAN 1 3829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define PCT_BIG_ENDIAN 0 3929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 4029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* Some useful types */ 4129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 4229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumtypedef unsigned char SHA_BYTE; 4329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 4429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#if SIZEOF_INT == 4 4529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumtypedef unsigned int SHA_INT32; /* 32-bit integer */ 4629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#else 4729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* not defined. compilation will die. */ 4829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#endif 4929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* The SHA block size and message digest sizes, in bytes */ 5129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define SHA_BLOCKSIZE 64 5329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define SHA_DIGESTSIZE 20 5429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* The structure for storing SHS info */ 5629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumtypedef struct { 582c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake PyObject_HEAD 592c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake SHA_INT32 digest[5]; /* Message digest */ 602c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake SHA_INT32 count_lo, count_hi; /* 64-bit bit count */ 612c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake SHA_BYTE data[SHA_BLOCKSIZE]; /* SHA data buffer */ 622c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake int Endianness; 632c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake int local; /* unprocessed amount in data */ 6429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} SHAobject; 6529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 6629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* When run on a little-endian CPU we need to perform byte reversal on an 6729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum array of longwords. */ 6829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 692c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drakestatic void longReverse(SHA_INT32 *buffer, int byteCount, int Endianness) 7029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 7129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_INT32 value; 7229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 7329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if ( Endianness == PCT_BIG_ENDIAN ) 7429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return; 7529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 7629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum byteCount /= sizeof(*buffer); 772c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake while (byteCount--) { 7829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum value = *buffer; 7929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum value = ( ( value & 0xFF00FF00L ) >> 8 ) | \ 8029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum ( ( value & 0x00FF00FFL ) << 8 ); 8129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum *buffer++ = ( value << 16 ) | ( value >> 16 ); 8229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 8329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 8429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 852c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drakestatic void SHAcopy(SHAobject *src, SHAobject *dest) 8629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 872c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake dest->Endianness = src->Endianness; 882c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake dest->local = src->local; 892c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake dest->count_lo = src->count_lo; 902c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake dest->count_hi = src->count_hi; 912c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake memcpy(dest->digest, src->digest, sizeof(src->digest)); 922c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake memcpy(dest->data, src->data, sizeof(src->data)); 9329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 9429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 9529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 9629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* ------------------------------------------------------------------------ 9729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * 9829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * This code for the SHA algorithm was noted as public domain. The original 9929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * headers are pasted below. 10029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * 10129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * Several changes have been made to make it more compatible with the 10229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * Python environment and desired interface. 10329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * 10429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum */ 10529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 10629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* NIST Secure Hash Algorithm */ 10729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* heavily modified by Uwe Hollerbach <uh@alumni.caltech edu> */ 10829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* from Peter C. Gutmann's implementation as found in */ 10929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* Applied Cryptography by Bruce Schneier */ 11029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* Further modifications to include the "UNRAVEL" stuff, below */ 11129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 11229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* This code is in the public domain */ 11329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 11429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* UNRAVEL should be fastest & biggest */ 11529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* UNROLL_LOOPS should be just as big, but slightly slower */ 11629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* both undefined should be smallest and slowest */ 11729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 11829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define UNRAVEL 11929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* #define UNROLL_LOOPS */ 12029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 12129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* The SHA f()-functions. The f1 and f3 functions can be optimized to 12229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum save one boolean operation each - thanks to Rich Schroeppel, 12329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum rcs@cs.arizona.edu for discovering this */ 12429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 12529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/*#define f1(x,y,z) ((x & y) | (~x & z)) // Rounds 0-19 */ 12629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define f1(x,y,z) (z ^ (x & (y ^ z))) /* Rounds 0-19 */ 12729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define f2(x,y,z) (x ^ y ^ z) /* Rounds 20-39 */ 12829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/*#define f3(x,y,z) ((x & y) | (x & z) | (y & z)) // Rounds 40-59 */ 12929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define f3(x,y,z) ((x & y) | (z & (x | y))) /* Rounds 40-59 */ 13029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define f4(x,y,z) (x ^ y ^ z) /* Rounds 60-79 */ 13129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 13229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* SHA constants */ 13329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 13429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define CONST1 0x5a827999L /* Rounds 0-19 */ 13529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define CONST2 0x6ed9eba1L /* Rounds 20-39 */ 13629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define CONST3 0x8f1bbcdcL /* Rounds 40-59 */ 13729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define CONST4 0xca62c1d6L /* Rounds 60-79 */ 13829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 13929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* 32-bit rotate */ 14029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 14129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define R32(x,n) ((x << n) | (x >> (32 - n))) 14229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 14329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* the generic case, for when the overall rotation is not unraveled */ 14429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 14529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define FG(n) \ 14629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum T = R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n; \ 14729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum E = D; D = C; C = R32(B,30); B = A; A = T 14829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 14929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* specific cases, for when the overall rotation is unraveled */ 15029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 15129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define FA(n) \ 15229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum T = R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n; B = R32(B,30) 15329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 15429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define FB(n) \ 15529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum E = R32(T,5) + f##n(A,B,C) + D + *WP++ + CONST##n; A = R32(A,30) 15629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 15729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define FC(n) \ 15829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum D = R32(E,5) + f##n(T,A,B) + C + *WP++ + CONST##n; T = R32(T,30) 15929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 16029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define FD(n) \ 16129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum C = R32(D,5) + f##n(E,T,A) + B + *WP++ + CONST##n; E = R32(E,30) 16229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 16329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define FE(n) \ 16429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum B = R32(C,5) + f##n(D,E,T) + A + *WP++ + CONST##n; D = R32(D,30) 16529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 16629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define FT(n) \ 16729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum A = R32(B,5) + f##n(C,D,E) + T + *WP++ + CONST##n; C = R32(C,30) 16829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 16929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* do SHA transformation */ 17029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 17129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic void 1722c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drakesha_transform(SHAobject *sha_info) 17329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 17429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum int i; 17529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_INT32 T, A, B, C, D, E, W[80], *WP; 17629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 17729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum memcpy(W, sha_info->data, sizeof(sha_info->data)); 178ff1ccbfc2172c564c6ca93113e1a1cf9a271f6efGuido van Rossum longReverse(W, (int)sizeof(sha_info->data), sha_info->Endianness); 17929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 18029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum for (i = 16; i < 80; ++i) { 18129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16]; 18229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 18329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum /* extra rotation fix */ 18429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum W[i] = R32(W[i], 1); 18529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 18629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum A = sha_info->digest[0]; 18729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum B = sha_info->digest[1]; 18829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum C = sha_info->digest[2]; 18929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum D = sha_info->digest[3]; 19029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum E = sha_info->digest[4]; 19129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum WP = W; 19229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#ifdef UNRAVEL 19329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1); FC(1); FD(1); 19429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FE(1); FT(1); FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1); 19529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2); FE(2); FT(2); 19629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FA(2); FB(2); FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2); 19729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3); FA(3); FB(3); 19829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FC(3); FD(3); FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3); 19929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4); FC(4); FD(4); 20029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FE(4); FT(4); FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4); 20129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[0] += E; 20229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[1] += T; 20329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[2] += A; 20429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[3] += B; 20529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[4] += C; 20629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#else /* !UNRAVEL */ 20729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#ifdef UNROLL_LOOPS 20829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); 20929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); 21029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); 21129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); 21229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); 21329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); 21429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); 21529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); 21629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#else /* !UNROLL_LOOPS */ 21729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum for (i = 0; i < 20; ++i) { FG(1); } 21829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum for (i = 20; i < 40; ++i) { FG(2); } 21929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum for (i = 40; i < 60; ++i) { FG(3); } 22029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum for (i = 60; i < 80; ++i) { FG(4); } 22129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#endif /* !UNROLL_LOOPS */ 22229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[0] += A; 22329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[1] += B; 22429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[2] += C; 22529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[3] += D; 22629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[4] += E; 22729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#endif /* !UNRAVEL */ 22829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 22929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 23029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* initialize the SHA digest */ 23129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 23229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic void 2332c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drakesha_init(SHAobject *sha_info) 23429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 23529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum TestEndianness(sha_info->Endianness) 23629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 23729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[0] = 0x67452301L; 23829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[1] = 0xefcdab89L; 23929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[2] = 0x98badcfeL; 24029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[3] = 0x10325476L; 24129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[4] = 0xc3d2e1f0L; 24229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->count_lo = 0L; 24329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->count_hi = 0L; 24429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->local = 0; 24529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 24629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 24729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* update the SHA digest */ 24829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 24929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic void 2502c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drakesha_update(SHAobject *sha_info, SHA_BYTE *buffer, int count) 25129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 25229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum int i; 25329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_INT32 clo; 25429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 25529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum clo = sha_info->count_lo + ((SHA_INT32) count << 3); 25629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (clo < sha_info->count_lo) { 2572c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake ++sha_info->count_hi; 25829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 25929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->count_lo = clo; 26029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->count_hi += (SHA_INT32) count >> 29; 26129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (sha_info->local) { 2622c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake i = SHA_BLOCKSIZE - sha_info->local; 2632c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake if (i > count) { 2642c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake i = count; 2652c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake } 2662c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i); 2672c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake count -= i; 2682c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake buffer += i; 2692c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake sha_info->local += i; 2702c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake if (sha_info->local == SHA_BLOCKSIZE) { 2712c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake sha_transform(sha_info); 2722c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake } 2732c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake else { 2742c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return; 2752c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake } 27629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 27729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum while (count >= SHA_BLOCKSIZE) { 2782c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake memcpy(sha_info->data, buffer, SHA_BLOCKSIZE); 2792c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake buffer += SHA_BLOCKSIZE; 2802c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake count -= SHA_BLOCKSIZE; 2812c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake sha_transform(sha_info); 28229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 28329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum memcpy(sha_info->data, buffer, count); 28429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->local = count; 28529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 28629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 28729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* finish computing the SHA digest */ 28829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 28929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic void 2902c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drakesha_final(unsigned char digest[20], SHAobject *sha_info) 29129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 29229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum int count; 29329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_INT32 lo_bit_count, hi_bit_count; 29429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 29529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum lo_bit_count = sha_info->count_lo; 29629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum hi_bit_count = sha_info->count_hi; 29729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum count = (int) ((lo_bit_count >> 3) & 0x3f); 29829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum ((SHA_BYTE *) sha_info->data)[count++] = 0x80; 2992c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake if (count > SHA_BLOCKSIZE - 8) { 30029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum memset(((SHA_BYTE *) sha_info->data) + count, 0, 30129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_BLOCKSIZE - count); 30229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_transform(sha_info); 30329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum memset((SHA_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 8); 30429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 3052c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake else { 30629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum memset(((SHA_BYTE *) sha_info->data) + count, 0, 30729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_BLOCKSIZE - 8 - count); 30829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 30929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 31029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum /* GJS: note that we add the hi/lo in big-endian. sha_transform will 31129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum swap these values into host-order. */ 31229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[56] = (hi_bit_count >> 24) & 0xff; 31329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[57] = (hi_bit_count >> 16) & 0xff; 31429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[58] = (hi_bit_count >> 8) & 0xff; 31529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[59] = (hi_bit_count >> 0) & 0xff; 31629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[60] = (lo_bit_count >> 24) & 0xff; 31729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[61] = (lo_bit_count >> 16) & 0xff; 31829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[62] = (lo_bit_count >> 8) & 0xff; 31929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[63] = (lo_bit_count >> 0) & 0xff; 32029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_transform(sha_info); 32129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff); 32229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff); 32329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 2] = (unsigned char) ((sha_info->digest[0] >> 8) & 0xff); 32429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 3] = (unsigned char) ((sha_info->digest[0] ) & 0xff); 32529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 4] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff); 32629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 5] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff); 32729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 6] = (unsigned char) ((sha_info->digest[1] >> 8) & 0xff); 32829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 7] = (unsigned char) ((sha_info->digest[1] ) & 0xff); 32929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 8] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff); 33029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 9] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff); 33129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[10] = (unsigned char) ((sha_info->digest[2] >> 8) & 0xff); 33229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[11] = (unsigned char) ((sha_info->digest[2] ) & 0xff); 33329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[12] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff); 33429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[13] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff); 33529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[14] = (unsigned char) ((sha_info->digest[3] >> 8) & 0xff); 33629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[15] = (unsigned char) ((sha_info->digest[3] ) & 0xff); 33729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[16] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff); 33829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[17] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff); 33929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[18] = (unsigned char) ((sha_info->digest[4] >> 8) & 0xff); 34029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[19] = (unsigned char) ((sha_info->digest[4] ) & 0xff); 34129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 34229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 34329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* 34429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * End of copied SHA code. 34529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * 34629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * ------------------------------------------------------------------------ 34729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum */ 34829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 34929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstaticforward PyTypeObject SHAtype; 35029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 35129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 35229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic SHAobject * 353f3f33dcf03eaed3c4e720178f9d69205a66d6a91Thomas WoutersnewSHAobject(void) 35429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 3552c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return (SHAobject *)PyObject_New(SHAobject, &SHAtype); 35629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 35729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 35829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* Internal methods for a hashing object */ 35929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 36029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic void 3612c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred DrakeSHA_dealloc(PyObject *ptr) 36229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 3632c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake PyObject_Del(ptr); 36429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 36529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 36629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 36729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* External methods for a hashing object */ 36829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 36929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic char SHA_copy__doc__[] = 37029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum"Return a copy of the hashing object."; 37129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 37229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyObject * 3732c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred DrakeSHA_copy(SHAobject *self, PyObject *args) 37429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 3752c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake SHAobject *newobj; 37629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 3772c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake if (!PyArg_ParseTuple(args, ":copy")) { 3782c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return NULL; 3792c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake } 3802c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake if ( (newobj = newSHAobject())==NULL) 3812c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return NULL; 38229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 3832c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake SHAcopy(self, newobj); 3842c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return (PyObject *)newobj; 38529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 38629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 38729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic char SHA_digest__doc__[] = 38829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum"Return the digest value as a string of binary data."; 38929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 39029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyObject * 3912c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred DrakeSHA_digest(SHAobject *self, PyObject *args) 39229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 3932c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake unsigned char digest[SHA_DIGESTSIZE]; 3942c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake SHAobject temp; 39529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 3962c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake if (!PyArg_ParseTuple(args, ":digest")) 3972c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return NULL; 39829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 3992c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake SHAcopy(self, &temp); 4002c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake sha_final(digest, &temp); 4012c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return PyString_FromStringAndSize((const char *)digest, sizeof(digest)); 40229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 40329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 40429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic char SHA_hexdigest__doc__[] = 40529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum"Return the digest value as a string of hexadecimal digits."; 40629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 40729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyObject * 4082c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred DrakeSHA_hexdigest(SHAobject *self, PyObject *args) 40929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 4102c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake unsigned char digest[SHA_DIGESTSIZE]; 4112c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake SHAobject temp; 4122c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake PyObject *retval; 4132c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake char *hex_digest; 4142c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake int i, j; 4152c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake 4162c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake if (!PyArg_ParseTuple(args, ":hexdigest")) 4172c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return NULL; 4182c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake 4192c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake /* Get the raw (binary) digest value */ 4202c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake SHAcopy(self, &temp); 4212c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake sha_final(digest, &temp); 4222c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake 4232c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake /* Create a new string */ 4242c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake retval = PyString_FromStringAndSize(NULL, sizeof(digest) * 2); 42557b808d21a7651b303bf22264c4bc47824ab3b51Barry Warsaw if (!retval) 42657b808d21a7651b303bf22264c4bc47824ab3b51Barry Warsaw return NULL; 4272c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake hex_digest = PyString_AsString(retval); 42857b808d21a7651b303bf22264c4bc47824ab3b51Barry Warsaw if (!hex_digest) { 42957b808d21a7651b303bf22264c4bc47824ab3b51Barry Warsaw Py_DECREF(retval); 43057b808d21a7651b303bf22264c4bc47824ab3b51Barry Warsaw return NULL; 43157b808d21a7651b303bf22264c4bc47824ab3b51Barry Warsaw } 4322c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake 4332c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake /* Make hex version of the digest */ 4342c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake for(i=j=0; i<sizeof(digest); i++) { 4352c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake char c; 43657b808d21a7651b303bf22264c4bc47824ab3b51Barry Warsaw c = (digest[i] >> 4) & 0xf; 43757b808d21a7651b303bf22264c4bc47824ab3b51Barry Warsaw c = (c>9) ? c+'a'-10 : c + '0'; 4382c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake hex_digest[j++] = c; 43957b808d21a7651b303bf22264c4bc47824ab3b51Barry Warsaw c = (digest[i] & 0xf); 44057b808d21a7651b303bf22264c4bc47824ab3b51Barry Warsaw c = (c>9) ? c+'a'-10 : c + '0'; 4412c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake hex_digest[j++] = c; 4422c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake } 4432c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return retval; 44429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 44529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 44629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic char SHA_update__doc__[] = 44729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum"Update this hashing object's state with the provided string."; 44829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 44929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyObject * 4502c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred DrakeSHA_update(SHAobject *self, PyObject *args) 45129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 4522c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake unsigned char *cp; 4532c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake int len; 45429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 4552c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake if (!PyArg_ParseTuple(args, "s#:update", &cp, &len)) 4562c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return NULL; 45729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 4582c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake sha_update(self, cp, len); 45929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 4602c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake Py_INCREF(Py_None); 4612c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return Py_None; 46229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 46329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 46429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyMethodDef SHA_methods[] = { 4652c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake {"copy", (PyCFunction)SHA_copy, METH_VARARGS, SHA_copy__doc__}, 4662c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake {"digest", (PyCFunction)SHA_digest, METH_VARARGS, SHA_digest__doc__}, 4672c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake {"hexdigest", (PyCFunction)SHA_hexdigest, METH_VARARGS, SHA_hexdigest__doc__}, 4682c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake {"update", (PyCFunction)SHA_update, METH_VARARGS, SHA_update__doc__}, 4692c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake {NULL, NULL} /* sentinel */ 47029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum}; 47129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 47229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyObject * 4732c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred DrakeSHA_getattr(PyObject *self, char *name) 47429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 4752c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake if (strcmp(name, "blocksize")==0) 4762c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return PyInt_FromLong(1); 4772c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake if (strcmp(name, "digestsize")==0) 4782c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return PyInt_FromLong(20); 4792c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake 4802c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return Py_FindMethod(SHA_methods, self, name); 48129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 48229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 48329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyTypeObject SHAtype = { 4842c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake PyObject_HEAD_INIT(NULL) 4852c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake 0, /*ob_size*/ 4862c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake "SHA", /*tp_name*/ 4872c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake sizeof(SHAobject), /*tp_size*/ 4882c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake 0, /*tp_itemsize*/ 4892c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake /* methods */ 4902c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake SHA_dealloc, /*tp_dealloc*/ 4912c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake 0, /*tp_print*/ 4922c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake SHA_getattr, /*tp_getattr*/ 49329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum}; 49429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 49529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 49629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* The single module-level function: new() */ 49729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 49829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic char SHA_new__doc__[] = 49929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum "Return a new SHA hashing object. An optional string " 50029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum "argument may be provided; if present, this string will be " 50129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum " automatically hashed."; 50229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 50329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyObject * 5042c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred DrakeSHA_new(PyObject *self, PyObject *args, PyObject *kwdict) 50529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 5062c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake static char *kwlist[] = {"string", NULL}; 5072c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake SHAobject *new; 5082c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake unsigned char *cp = NULL; 5092c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake int len; 51029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5112c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake if ((new = newSHAobject()) == NULL) 5122c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return NULL; 51329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5142c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s#:new", kwlist, 5152c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake &cp, &len)) { 5162c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake Py_DECREF(new); 5172c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return NULL; 5182c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake } 51929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5202c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake sha_init(new); 52129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5222c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake if (PyErr_Occurred()) { 5232c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake Py_DECREF(new); 5242c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return NULL; 5252c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake } 5262c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake if (cp) 5272c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake sha_update(new, cp, len); 52829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5292c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake return (PyObject *)new; 53029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 53129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 53229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 53329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* List of functions exported by this module */ 53429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 53529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic struct PyMethodDef SHA_functions[] = { 5362c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake {"new", (PyCFunction)SHA_new, METH_VARARGS|METH_KEYWORDS, SHA_new__doc__}, 5372c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake {"sha", (PyCFunction)SHA_new, METH_VARARGS|METH_KEYWORDS, SHA_new__doc__}, 5382c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake {NULL, NULL} /* Sentinel */ 53929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum}; 54029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 54129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 54229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* Initialize this module. */ 54329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 54429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define insint(n,v) { PyObject *o=PyInt_FromLong(v); \ 54529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (o!=NULL) PyDict_SetItemString(d,n,o); \ 54629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum Py_XDECREF(o); } 54729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 54829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumvoid 549f3f33dcf03eaed3c4e720178f9d69205a66d6a91Thomas Woutersinitsha(void) 55029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 5512c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake PyObject *d, *m; 55229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5532c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake SHAtype.ob_type = &PyType_Type; 5542c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake m = Py_InitModule("sha", SHA_functions); 55529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5562c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake /* Add some symbolic constants to the module */ 5572c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake d = PyModule_GetDict(m); 5582c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake insint("blocksize", 1); /* For future use, in case some hash 5592c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake functions require an integral number of 5602c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake blocks */ 5612c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake insint("digestsize", 20); 56229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5632c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake /* Check for errors */ 5642c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake if (PyErr_Occurred()) 5652c4a3dceafeadd5821e36a6e1b7fc6b7d81338f0Fred Drake Py_FatalError("can't initialize module SHA"); 56629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 567