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