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