shamodule.c revision ff1ccbfc2172c564c6ca93113e1a1cf9a271f6ef
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 729d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumPermission to use, copy, modify, and distribute this software and its 829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumdocumentation for any purpose and without fee is hereby granted, 929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumprovided that the above copyright notice appear in all copies and that 1029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumboth that copyright notice and this permission notice appear in 1129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumsupporting documentation, and that the names of Stichting Mathematisch 1229d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumCentrum or CWI or Corporation for National Research Initiatives or 1329d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumCNRI not be used in advertising or publicity pertaining to 1429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumdistribution of the software without specific, written prior 1529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumpermission. 1629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 1729d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumWhile CWI is the initial source for this software, a modified version 1829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumis made available by the Corporation for National Research Initiatives 1929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum(CNRI) at the Internet address ftp://ftp.python.org. 2029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 2129d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumSTICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH 2229d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumREGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF 2329d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumMERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH 2429d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumCENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 2529d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 2629d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumPROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 2729d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 2829d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumPERFORMANCE OF THIS SOFTWARE. 2929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 3029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum******************************************************************/ 3129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 3229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* SHA module */ 3329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 3429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* This module provides an interface to NIST's Secure Hash Algorithm */ 3529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 3629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* See below for information about the original code this module was 3729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum based upon. Additional work performed by: 3829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 3929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum Andrew Kuchling (amk1@erols.com) 4029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum Greg Stein (gstein@lyra.org) 4129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum*/ 4229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 4329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* SHA objects */ 4429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 4529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#include "Python.h" 4629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 4729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 4829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* Endianness testing and definitions */ 4929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define TestEndianness(variable) {int i=1; variable=PCT_BIG_ENDIAN;\ 5029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (*((char*)&i)==1) variable=PCT_LITTLE_ENDIAN;} 5129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define PCT_LITTLE_ENDIAN 1 5329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define PCT_BIG_ENDIAN 0 5429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* Some useful types */ 5629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumtypedef unsigned char SHA_BYTE; 5829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 5929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#if SIZEOF_INT == 4 6029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumtypedef unsigned int SHA_INT32; /* 32-bit integer */ 6129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#else 6229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* not defined. compilation will die. */ 6329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#endif 6429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 6529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* The SHA block size and message digest sizes, in bytes */ 6629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 6729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define SHA_BLOCKSIZE 64 6829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define SHA_DIGESTSIZE 20 6929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 7029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* The structure for storing SHS info */ 7129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 7229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumtypedef struct { 7329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum PyObject_HEAD 7429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_INT32 digest[5]; /* Message digest */ 7529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_INT32 count_lo, count_hi; /* 64-bit bit count */ 7629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_BYTE data[SHA_BLOCKSIZE]; /* SHA data buffer */ 7729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum int Endianness; 7829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum int local; /* unprocessed amount in data */ 7929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} SHAobject; 8029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 8129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* When run on a little-endian CPU we need to perform byte reversal on an 8229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum array of longwords. */ 8329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 8429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic void longReverse(buffer, byteCount, Endianness) 8529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_INT32 *buffer; 8629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum int byteCount, Endianness; 8729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 8829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_INT32 value; 8929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 9029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if ( Endianness == PCT_BIG_ENDIAN ) 9129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return; 9229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 9329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum byteCount /= sizeof(*buffer); 9429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum while( byteCount-- ) 9529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum { 9629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum value = *buffer; 9729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum value = ( ( value & 0xFF00FF00L ) >> 8 ) | \ 9829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum ( ( value & 0x00FF00FFL ) << 8 ); 9929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum *buffer++ = ( value << 16 ) | ( value >> 16 ); 10029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 10129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 10229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 10329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic void SHAcopy(src, dest) 10429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAobject *src, *dest; 10529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 10629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum dest->Endianness = src->Endianness; 10729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum dest->local = src->local; 10829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum dest->count_lo = src->count_lo; 10929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum dest->count_hi = src->count_hi; 11029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum memcpy(dest->digest, src->digest, sizeof(src->digest)); 11129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum memcpy(dest->data, src->data, sizeof(src->data)); 11229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 11329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 11429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 11529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* ------------------------------------------------------------------------ 11629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * 11729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * This code for the SHA algorithm was noted as public domain. The original 11829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * headers are pasted below. 11929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * 12029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * Several changes have been made to make it more compatible with the 12129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * Python environment and desired interface. 12229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * 12329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum */ 12429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 12529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* NIST Secure Hash Algorithm */ 12629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* heavily modified by Uwe Hollerbach <uh@alumni.caltech edu> */ 12729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* from Peter C. Gutmann's implementation as found in */ 12829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* Applied Cryptography by Bruce Schneier */ 12929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* Further modifications to include the "UNRAVEL" stuff, below */ 13029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 13129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* This code is in the public domain */ 13229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 13329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* UNRAVEL should be fastest & biggest */ 13429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* UNROLL_LOOPS should be just as big, but slightly slower */ 13529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* both undefined should be smallest and slowest */ 13629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 13729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define UNRAVEL 13829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* #define UNROLL_LOOPS */ 13929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 14029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* The SHA f()-functions. The f1 and f3 functions can be optimized to 14129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum save one boolean operation each - thanks to Rich Schroeppel, 14229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum rcs@cs.arizona.edu for discovering this */ 14329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 14429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/*#define f1(x,y,z) ((x & y) | (~x & z)) // Rounds 0-19 */ 14529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define f1(x,y,z) (z ^ (x & (y ^ z))) /* Rounds 0-19 */ 14629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define f2(x,y,z) (x ^ y ^ z) /* Rounds 20-39 */ 14729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/*#define f3(x,y,z) ((x & y) | (x & z) | (y & z)) // Rounds 40-59 */ 14829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define f3(x,y,z) ((x & y) | (z & (x | y))) /* Rounds 40-59 */ 14929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define f4(x,y,z) (x ^ y ^ z) /* Rounds 60-79 */ 15029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 15129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* SHA constants */ 15229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 15329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define CONST1 0x5a827999L /* Rounds 0-19 */ 15429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define CONST2 0x6ed9eba1L /* Rounds 20-39 */ 15529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define CONST3 0x8f1bbcdcL /* Rounds 40-59 */ 15629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define CONST4 0xca62c1d6L /* Rounds 60-79 */ 15729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 15829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* 32-bit rotate */ 15929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 16029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define R32(x,n) ((x << n) | (x >> (32 - n))) 16129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 16229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* the generic case, for when the overall rotation is not unraveled */ 16329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 16429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define FG(n) \ 16529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum T = R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n; \ 16629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum E = D; D = C; C = R32(B,30); B = A; A = T 16729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 16829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* specific cases, for when the overall rotation is unraveled */ 16929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 17029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define FA(n) \ 17129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum T = R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n; B = R32(B,30) 17229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 17329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define FB(n) \ 17429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum E = R32(T,5) + f##n(A,B,C) + D + *WP++ + CONST##n; A = R32(A,30) 17529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 17629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define FC(n) \ 17729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum D = R32(E,5) + f##n(T,A,B) + C + *WP++ + CONST##n; T = R32(T,30) 17829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 17929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define FD(n) \ 18029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum C = R32(D,5) + f##n(E,T,A) + B + *WP++ + CONST##n; E = R32(E,30) 18129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 18229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define FE(n) \ 18329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum B = R32(C,5) + f##n(D,E,T) + A + *WP++ + CONST##n; D = R32(D,30) 18429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 18529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define FT(n) \ 18629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum A = R32(B,5) + f##n(C,D,E) + T + *WP++ + CONST##n; C = R32(C,30) 18729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 18829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* do SHA transformation */ 18929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 19029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic void 19129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumsha_transform(sha_info) 19229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAobject *sha_info; 19329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 19429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum int i; 19529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_INT32 T, A, B, C, D, E, W[80], *WP; 19629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 19729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum memcpy(W, sha_info->data, sizeof(sha_info->data)); 198ff1ccbfc2172c564c6ca93113e1a1cf9a271f6efGuido van Rossum longReverse(W, (int)sizeof(sha_info->data), sha_info->Endianness); 19929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 20029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum for (i = 16; i < 80; ++i) { 20129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16]; 20229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 20329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum /* extra rotation fix */ 20429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum W[i] = R32(W[i], 1); 20529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 20629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum A = sha_info->digest[0]; 20729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum B = sha_info->digest[1]; 20829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum C = sha_info->digest[2]; 20929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum D = sha_info->digest[3]; 21029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum E = sha_info->digest[4]; 21129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum WP = W; 21229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#ifdef UNRAVEL 21329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1); FC(1); FD(1); 21429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FE(1); FT(1); FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1); 21529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2); FE(2); FT(2); 21629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FA(2); FB(2); FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2); 21729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3); FA(3); FB(3); 21829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FC(3); FD(3); FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3); 21929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4); FC(4); FD(4); 22029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FE(4); FT(4); FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4); 22129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[0] += E; 22229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[1] += T; 22329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[2] += A; 22429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[3] += B; 22529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[4] += C; 22629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#else /* !UNRAVEL */ 22729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#ifdef UNROLL_LOOPS 22829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); 22929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); 23029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); 23129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); 23229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); 23329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); 23429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); 23529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); 23629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#else /* !UNROLL_LOOPS */ 23729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum for (i = 0; i < 20; ++i) { FG(1); } 23829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum for (i = 20; i < 40; ++i) { FG(2); } 23929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum for (i = 40; i < 60; ++i) { FG(3); } 24029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum for (i = 60; i < 80; ++i) { FG(4); } 24129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#endif /* !UNROLL_LOOPS */ 24229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[0] += A; 24329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[1] += B; 24429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[2] += C; 24529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[3] += D; 24629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[4] += E; 24729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#endif /* !UNRAVEL */ 24829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 24929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 25029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* initialize the SHA digest */ 25129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 25229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic void 25329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumsha_init(sha_info) 25429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAobject *sha_info; 25529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 25629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum TestEndianness(sha_info->Endianness) 25729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 25829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[0] = 0x67452301L; 25929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[1] = 0xefcdab89L; 26029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[2] = 0x98badcfeL; 26129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[3] = 0x10325476L; 26229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->digest[4] = 0xc3d2e1f0L; 26329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->count_lo = 0L; 26429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->count_hi = 0L; 26529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->local = 0; 26629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 26729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 26829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* update the SHA digest */ 26929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 27029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic void 27129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumsha_update(sha_info, buffer, count) 27229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAobject *sha_info; 27329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_BYTE *buffer; 27429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum int count; 27529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 27629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum int i; 27729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_INT32 clo; 27829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 27929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum clo = sha_info->count_lo + ((SHA_INT32) count << 3); 28029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (clo < sha_info->count_lo) { 28129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum ++sha_info->count_hi; 28229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 28329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->count_lo = clo; 28429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->count_hi += (SHA_INT32) count >> 29; 28529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (sha_info->local) { 28629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum i = SHA_BLOCKSIZE - sha_info->local; 28729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (i > count) { 28829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum i = count; 28929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 29029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, 29129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum buffer, i); 29229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum count -= i; 29329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum buffer += i; 29429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->local += i; 29529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (sha_info->local == SHA_BLOCKSIZE) { 29629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_transform(sha_info); 29729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } else { 29829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return; 29929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 30029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 30129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum while (count >= SHA_BLOCKSIZE) { 30229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum memcpy(sha_info->data, buffer, SHA_BLOCKSIZE); 30329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum buffer += SHA_BLOCKSIZE; 30429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum count -= SHA_BLOCKSIZE; 30529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_transform(sha_info); 30629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 30729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum memcpy(sha_info->data, buffer, count); 30829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->local = count; 30929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 31029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 31129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* finish computing the SHA digest */ 31229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 31329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic void 31429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumsha_final(digest, sha_info) 31529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum unsigned char digest[20]; 31629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAobject *sha_info; 31729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 31829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum int count; 31929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_INT32 lo_bit_count, hi_bit_count; 32029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 32129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum lo_bit_count = sha_info->count_lo; 32229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum hi_bit_count = sha_info->count_hi; 32329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum count = (int) ((lo_bit_count >> 3) & 0x3f); 32429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum ((SHA_BYTE *) sha_info->data)[count++] = 0x80; 32529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (count > SHA_BLOCKSIZE - 8) 32629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum { 32729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum memset(((SHA_BYTE *) sha_info->data) + count, 0, 32829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_BLOCKSIZE - count); 32929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_transform(sha_info); 33029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum memset((SHA_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 8); 33129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 33229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum else 33329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum { 33429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum memset(((SHA_BYTE *) sha_info->data) + count, 0, 33529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_BLOCKSIZE - 8 - count); 33629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 33729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 33829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum /* GJS: note that we add the hi/lo in big-endian. sha_transform will 33929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum swap these values into host-order. */ 34029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[56] = (hi_bit_count >> 24) & 0xff; 34129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[57] = (hi_bit_count >> 16) & 0xff; 34229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[58] = (hi_bit_count >> 8) & 0xff; 34329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[59] = (hi_bit_count >> 0) & 0xff; 34429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[60] = (lo_bit_count >> 24) & 0xff; 34529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[61] = (lo_bit_count >> 16) & 0xff; 34629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[62] = (lo_bit_count >> 8) & 0xff; 34729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_info->data[63] = (lo_bit_count >> 0) & 0xff; 34829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_transform(sha_info); 34929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff); 35029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff); 35129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 2] = (unsigned char) ((sha_info->digest[0] >> 8) & 0xff); 35229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 3] = (unsigned char) ((sha_info->digest[0] ) & 0xff); 35329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 4] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff); 35429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 5] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff); 35529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 6] = (unsigned char) ((sha_info->digest[1] >> 8) & 0xff); 35629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 7] = (unsigned char) ((sha_info->digest[1] ) & 0xff); 35729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 8] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff); 35829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[ 9] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff); 35929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[10] = (unsigned char) ((sha_info->digest[2] >> 8) & 0xff); 36029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[11] = (unsigned char) ((sha_info->digest[2] ) & 0xff); 36129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[12] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff); 36229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[13] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff); 36329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[14] = (unsigned char) ((sha_info->digest[3] >> 8) & 0xff); 36429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[15] = (unsigned char) ((sha_info->digest[3] ) & 0xff); 36529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[16] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff); 36629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[17] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff); 36729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[18] = (unsigned char) ((sha_info->digest[4] >> 8) & 0xff); 36829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum digest[19] = (unsigned char) ((sha_info->digest[4] ) & 0xff); 36929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 37029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 37129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* 37229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * End of copied SHA code. 37329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * 37429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum * ------------------------------------------------------------------------ 37529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum */ 37629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 37729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstaticforward PyTypeObject SHAtype; 37829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 37929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 38029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic SHAobject * 38129d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumnewSHAobject() 38229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 38329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return (SHAobject *)PyObject_NEW(SHAobject, &SHAtype); 38429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 38529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 38629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* Internal methods for a hashing object */ 38729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 38829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic void 38929d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumSHA_dealloc(ptr) 39029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum PyObject *ptr; 39129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 39229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum PyMem_DEL(ptr); 39329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 39429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 39529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 39629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* External methods for a hashing object */ 39729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 39829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic char SHA_copy__doc__[] = 39929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum"Return a copy of the hashing object."; 40029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 40129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyObject * 40229d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumSHA_copy(self, args) 40329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAobject *self; 40429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum PyObject *args; 40529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 40629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAobject *newobj; 40729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 40829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (!PyArg_NoArgs(args)) { 40929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return NULL; 41029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 41129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 41229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if ( (newobj = newSHAobject())==NULL) 41329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return NULL; 41429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 41529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAcopy(self, newobj); 41629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return (PyObject *)newobj; 41729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 41829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 41929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic char SHA_digest__doc__[] = 42029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum"Return the digest value as a string of binary data."; 42129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 42229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyObject * 42329d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumSHA_digest(self, args) 42429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAobject *self; 42529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum PyObject *args; 42629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 42729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum unsigned char digest[SHA_DIGESTSIZE]; 42829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAobject temp; 42929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 43029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (!PyArg_NoArgs(args)) 43129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return NULL; 43229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 43329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAcopy(self, &temp); 43429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_final(digest, &temp); 435cf95b0f44a8104af2deae937686374c204c09740Guido van Rossum return PyString_FromStringAndSize((const char *)digest, sizeof(digest)); 43629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 43729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 43829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic char SHA_hexdigest__doc__[] = 43929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum"Return the digest value as a string of hexadecimal digits."; 44029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 44129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyObject * 44229d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumSHA_hexdigest(self, args) 44329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAobject *self; 44429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum PyObject *args; 44529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 44629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum unsigned char digest[SHA_DIGESTSIZE]; 44729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAobject temp; 44829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum PyObject *retval; 44929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum char *hex_digest; 45029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum int i, j; 45129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 45229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (!PyArg_NoArgs(args)) 45329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return NULL; 45429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 45529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum /* Get the raw (binary) digest value */ 45629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAcopy(self, &temp); 45729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_final(digest, &temp); 45829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 45929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum /* Create a new string */ 46029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum retval = PyString_FromStringAndSize(NULL, sizeof(digest) * 2); 46129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum hex_digest = PyString_AsString(retval); 46229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 46329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum /* Make hex version of the digest */ 46429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum for(i=j=0; i<sizeof(digest); i++) 46529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum { 46629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum char c; 46729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum c = digest[i] / 16; c = (c>9) ? c+'a'-10 : c + '0'; 46829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum hex_digest[j++] = c; 46929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum c = digest[i] % 16; c = (c>9) ? c+'a'-10 : c + '0'; 47029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum hex_digest[j++] = c; 47129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 47229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 47329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return retval; 47429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 47529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 47629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic char SHA_update__doc__[] = 47729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum"Update this hashing object's state with the provided string."; 47829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 47929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyObject * 48029d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumSHA_update(self, args) 48129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAobject *self; 48229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum PyObject *args; 48329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 48429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum unsigned char *cp; 48529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum int len; 48629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 48729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (!PyArg_Parse(args, "s#", &cp, &len)) 48829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return NULL; 48929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 49029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_update(self, cp, len); 49129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 49229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum Py_INCREF(Py_None); 49329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return Py_None; 49429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 49529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 49629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyMethodDef SHA_methods[] = { 49729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum {"copy", (PyCFunction)SHA_copy, 0, SHA_copy__doc__}, 49829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum {"digest", (PyCFunction)SHA_digest, 0, SHA_digest__doc__}, 49929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum {"hexdigest", (PyCFunction)SHA_hexdigest, 0, SHA_hexdigest__doc__}, 50029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum {"update", (PyCFunction)SHA_update, 0, SHA_update__doc__}, 50129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum {NULL, NULL} /* sentinel */ 50229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum}; 50329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 50429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyObject * 50529d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumSHA_getattr(self, name) 506cf95b0f44a8104af2deae937686374c204c09740Guido van Rossum PyObject *self; 50729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum char *name; 50829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 50929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (strcmp(name, "blocksize")==0) 51029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return PyInt_FromLong(1); 51129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (strcmp(name, "digestsize")==0) 51229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return PyInt_FromLong(20); 51329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 514cf95b0f44a8104af2deae937686374c204c09740Guido van Rossum return Py_FindMethod(SHA_methods, self, name); 51529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 51629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 51729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyTypeObject SHAtype = { 51829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum PyObject_HEAD_INIT(NULL) 51929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 0, /*ob_size*/ 52029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum "SHA", /*tp_name*/ 52129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sizeof(SHAobject), /*tp_size*/ 52229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 0, /*tp_itemsize*/ 52329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum /* methods */ 52429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_dealloc, /*tp_dealloc*/ 52529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 0, /*tp_print*/ 52629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHA_getattr, /*tp_getattr*/ 52729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum}; 52829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 52929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 53029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* The single module-level function: new() */ 53129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 53229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic char SHA_new__doc__[] = 53329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum "Return a new SHA hashing object. An optional string " 53429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum "argument may be provided; if present, this string will be " 53529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum " automatically hashed."; 53629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 53729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic PyObject * 53829d2acc17096bd63d882a87591d336ea5682eab9Guido van RossumSHA_new(self, args, kwdict) 53929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum PyObject *self; 54029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum PyObject *args; 54129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum PyObject *kwdict; 54229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 54329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum static char *kwlist[] = {"string", NULL}; 54429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAobject *new; 54529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum unsigned char *cp = NULL; 54629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum int len; 54729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 54829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if ((new = newSHAobject()) == NULL) 54929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return NULL; 55029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 55129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s#", kwlist, 55229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum &cp, &len)) { 55329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum Py_DECREF(new); 55429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return NULL; 55529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 55629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 55729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_init(new); 55829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 55929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (PyErr_Occurred()) { 56029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum Py_DECREF(new); 56129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return NULL; 56229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum } 56329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (cp) 56429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum sha_update(new, cp, len); 56529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 56629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum return (PyObject *)new; 56729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 56829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 56929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 57029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* List of functions exported by this module */ 57129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 57229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumstatic struct PyMethodDef SHA_functions[] = { 57329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum {"new", (PyCFunction)SHA_new, METH_VARARGS|METH_KEYWORDS, SHA_new__doc__}, 57429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum {"sha", (PyCFunction)SHA_new, METH_VARARGS|METH_KEYWORDS, SHA_new__doc__}, 57529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum {NULL, NULL} /* Sentinel */ 57629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum}; 57729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 57829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 57929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum/* Initialize this module. */ 58029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 58129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum#define insint(n,v) { PyObject *o=PyInt_FromLong(v); \ 58229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (o!=NULL) PyDict_SetItemString(d,n,o); \ 58329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum Py_XDECREF(o); } 58429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 58529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossumvoid 58629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossuminitsha() 58729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum{ 58829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum PyObject *d, *m; 58929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 59029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum SHAtype.ob_type = &PyType_Type; 59129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum m = Py_InitModule("sha", SHA_functions); 59229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 59329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum /* Add some symbolic constants to the module */ 59429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum d = PyModule_GetDict(m); 59529d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum insint("blocksize", 1); /* For future use, in case some hash 59629d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum functions require an integral number of 59729d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum blocks */ 59829d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum insint("digestsize", 20); 59929d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 60029d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum /* Check for errors */ 60129d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum if (PyErr_Occurred()) 60229d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum Py_FatalError("can't initialize module SHA"); 60329d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum} 60429d2acc17096bd63d882a87591d336ea5682eab9Guido van Rossum 605