sha256module.c revision 743e0cd6b5d59767aae2524700857f188ca1e80e
1f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* SHA256 module */
2f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
3f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* This module provides an interface to NIST's SHA-256 and SHA-224 Algorithms */
4f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
5f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* See below for information about the original code this module was
6f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith   based upon. Additional work performed by:
7f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
8f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith   Andrew Kuchling (amk@amk.ca)
9f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith   Greg Stein (gstein@lyra.org)
10f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith   Trevor Perrin (trevp@trevp.net)
11f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
122f21eb3a153ee09e333300a837be86a37cd22d28Gregory P. Smith   Copyright (C) 2005-2007   Gregory P. Smith (greg@krypto.org)
13f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith   Licensed to PSF under a Contributor Agreement.
14f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
15f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith*/
16f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
17f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* SHA objects */
18f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
19f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#include "Python.h"
20f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#include "structmember.h"
21365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith#include "hashlib.h"
22f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
23f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
24f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* Some useful types */
25f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
26f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithtypedef unsigned char SHA_BYTE;
27f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
28f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#if SIZEOF_INT == 4
29f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitroutypedef unsigned int SHA_INT32; /* 32-bit integer */
30f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#else
31f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* not defined. compilation will die. */
32f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#endif
33f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
34f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* The SHA block size and message digest sizes, in bytes */
35f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
36f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#define SHA_BLOCKSIZE    64
37f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#define SHA_DIGESTSIZE  32
38f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
39f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* The structure for storing SHA info */
40f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
41f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithtypedef struct {
42f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    PyObject_HEAD
43f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    SHA_INT32 digest[8];                /* Message digest */
44f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    SHA_INT32 count_lo, count_hi;       /* 64-bit bit count */
45f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    SHA_BYTE data[SHA_BLOCKSIZE];       /* SHA data buffer */
46f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int local;                          /* unprocessed amount in data */
47f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    int digestsize;
48f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith} SHAobject;
49f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
50f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* When run on a little-endian CPU we need to perform byte reversal on an
51f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith   array of longwords. */
52f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
53743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes#if PY_LITTLE_ENDIAN
54743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimesstatic void longReverse(SHA_INT32 *buffer, int byteCount)
55f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
56f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    SHA_INT32 value;
57f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
58f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    byteCount /= sizeof(*buffer);
59f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    while (byteCount--) {
60f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        value = *buffer;
61f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        value = ( ( value & 0xFF00FF00L ) >> 8  ) | \
62f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith                ( ( value & 0x00FF00FFL ) << 8 );
63f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        *buffer++ = ( value << 16 ) | ( value >> 16 );
64f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    }
65f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
66743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes#endif
67f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
68f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic void SHAcopy(SHAobject *src, SHAobject *dest)
69f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
70f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    dest->local = src->local;
71f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    dest->digestsize = src->digestsize;
72f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    dest->count_lo = src->count_lo;
73f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    dest->count_hi = src->count_hi;
74f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    memcpy(dest->digest, src->digest, sizeof(src->digest));
75f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    memcpy(dest->data, src->data, sizeof(src->data));
76f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
77f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
78f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
79f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* ------------------------------------------------------------------------
80f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith *
81f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith * This code for the SHA-256 algorithm was noted as public domain. The
82f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith * original headers are pasted below.
83f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith *
84f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith * Several changes have been made to make it more compatible with the
85f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith * Python environment and desired interface.
86f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith *
87f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith */
88f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
89f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* LibTomCrypt, modular cryptographic library -- Tom St Denis
90f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith *
91f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith * LibTomCrypt is a library that provides various cryptographic
92f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith * algorithms in a highly modular and flexible manner.
93f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith *
94f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith * The library is free for all purposes without any express
95f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith * gurantee it works.
96f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith *
972f21eb3a153ee09e333300a837be86a37cd22d28Gregory P. Smith * Tom St Denis, tomstdenis@iahu.ca, http://libtom.org
98f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith */
99f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
100f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
101f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* SHA256 by Tom St Denis */
102f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
103f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* Various logical functions */
104f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#define ROR(x, y)\
105f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | \
106f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
107f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#define Ch(x,y,z)       (z ^ (x & (y ^ z)))
108f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#define Maj(x,y,z)      (((x | y) & z) | (x & y))
109f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#define S(x, n)         ROR((x),(n))
110f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#define R(x, n)         (((x)&0xFFFFFFFFUL)>>(n))
111f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#define Sigma0(x)       (S(x, 2) ^ S(x, 13) ^ S(x, 22))
112f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#define Sigma1(x)       (S(x, 6) ^ S(x, 11) ^ S(x, 25))
113f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#define Gamma0(x)       (S(x, 7) ^ S(x, 18) ^ R(x, 3))
114f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#define Gamma1(x)       (S(x, 17) ^ S(x, 19) ^ R(x, 10))
115f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
116f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
117f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic void
118f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithsha_transform(SHAobject *sha_info)
119f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
120f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    int i;
121f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        SHA_INT32 S[8], W[64], t0, t1;
122f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
123f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    memcpy(W, sha_info->data, sizeof(sha_info->data));
124743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes#if PY_LITTLE_ENDIAN
125743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes    longReverse(W, (int)sizeof(sha_info->data));
126743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes#endif
127f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
128f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    for (i = 16; i < 64; ++i) {
129f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16];
130f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    }
131f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    for (i = 0; i < 8; ++i) {
132f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        S[i] = sha_info->digest[i];
133f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    }
134f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
135f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    /* Compress */
136f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#define RND(a,b,c,d,e,f,g,h,i,ki)                    \
137f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith     t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i];   \
138f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith     t1 = Sigma0(a) + Maj(a, b, c);                  \
139f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith     d += t0;                                        \
140f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith     h  = t0 + t1;
141f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
142f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98);
143f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x71374491);
144f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,0xb5c0fbcf);
145f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,0xe9b5dba5);
146f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,0x3956c25b);
147f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,0x59f111f1);
148f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,0x923f82a4);
149f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,0xab1c5ed5);
150f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,0xd807aa98);
151f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,0x12835b01);
152f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,0x243185be);
153f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,0x550c7dc3);
154f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,0x72be5d74);
155f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,0x80deb1fe);
156f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,0x9bdc06a7);
157f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,0xc19bf174);
158f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,0xe49b69c1);
159f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,0xefbe4786);
160f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,0x0fc19dc6);
161f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,0x240ca1cc);
162f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,0x2de92c6f);
163f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,0x4a7484aa);
164f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,0x5cb0a9dc);
165f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,0x76f988da);
166f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,0x983e5152);
167f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,0xa831c66d);
168f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,0xb00327c8);
169f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,0xbf597fc7);
170f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,0xc6e00bf3);
171f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,0xd5a79147);
172f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,0x06ca6351);
173f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,0x14292967);
174f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,0x27b70a85);
175f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,0x2e1b2138);
176f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,0x4d2c6dfc);
177f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,0x53380d13);
178f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,0x650a7354);
179f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,0x766a0abb);
180f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,0x81c2c92e);
181f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,0x92722c85);
182f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,0xa2bfe8a1);
183f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,0xa81a664b);
184f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,0xc24b8b70);
185f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,0xc76c51a3);
186f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,0xd192e819);
187f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,0xd6990624);
188f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,0xf40e3585);
189f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,0x106aa070);
190f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,0x19a4c116);
191f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,0x1e376c08);
192f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,0x2748774c);
193f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,0x34b0bcb5);
194f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,0x391c0cb3);
195f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,0x4ed8aa4a);
196f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,0x5b9cca4f);
197f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,0x682e6ff3);
198f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,0x748f82ee);
199f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,0x78a5636f);
200f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,0x84c87814);
201f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,0x8cc70208);
202f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,0x90befffa);
203f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,0xa4506ceb);
204f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,0xbef9a3f7);
205f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,0xc67178f2);
206f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
207f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#undef RND
208f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
209f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    /* feedback */
210f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    for (i = 0; i < 8; i++) {
211f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        sha_info->digest[i] = sha_info->digest[i] + S[i];
212f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    }
213f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
214f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
215f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
216f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
217f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
218f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* initialize the SHA digest */
219f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
220f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic void
221f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithsha_init(SHAobject *sha_info)
222f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
223f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[0] = 0x6A09E667L;
224f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[1] = 0xBB67AE85L;
225f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[2] = 0x3C6EF372L;
226f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[3] = 0xA54FF53AL;
227f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[4] = 0x510E527FL;
228f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[5] = 0x9B05688CL;
229f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[6] = 0x1F83D9ABL;
230f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[7] = 0x5BE0CD19L;
231f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->count_lo = 0L;
232f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->count_hi = 0L;
233f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->local = 0;
234f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digestsize = 32;
235f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
236f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
237f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic void
238f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithsha224_init(SHAobject *sha_info)
239f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
240f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[0] = 0xc1059ed8L;
241f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[1] = 0x367cd507L;
242f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[2] = 0x3070dd17L;
243f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[3] = 0xf70e5939L;
244f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[4] = 0xffc00b31L;
245f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[5] = 0x68581511L;
246f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[6] = 0x64f98fa7L;
247f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digest[7] = 0xbefa4fa4L;
248f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->count_lo = 0L;
249f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->count_hi = 0L;
250f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->local = 0;
251f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->digestsize = 28;
252f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
253f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
254f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
255f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* update the SHA digest */
256f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
257f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic void
2580fcab4a3ed5e39769609b60d6179c4c801e45985Victor Stinnersha_update(SHAobject *sha_info, SHA_BYTE *buffer, Py_ssize_t count)
259f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
2600fcab4a3ed5e39769609b60d6179c4c801e45985Victor Stinner    Py_ssize_t i;
261f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    SHA_INT32 clo;
262f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
263f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    clo = sha_info->count_lo + ((SHA_INT32) count << 3);
264f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    if (clo < sha_info->count_lo) {
265f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        ++sha_info->count_hi;
266f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    }
267f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->count_lo = clo;
268f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->count_hi += (SHA_INT32) count >> 29;
269f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    if (sha_info->local) {
270f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        i = SHA_BLOCKSIZE - sha_info->local;
271f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        if (i > count) {
272f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            i = count;
273f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        }
274f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i);
275f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        count -= i;
276f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        buffer += i;
277f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        sha_info->local += i;
278f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        if (sha_info->local == SHA_BLOCKSIZE) {
279f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            sha_transform(sha_info);
280f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        }
281f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        else {
282f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            return;
283f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        }
284f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    }
285f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    while (count >= SHA_BLOCKSIZE) {
286f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);
287f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        buffer += SHA_BLOCKSIZE;
288f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        count -= SHA_BLOCKSIZE;
289f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        sha_transform(sha_info);
290f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    }
291f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    memcpy(sha_info->data, buffer, count);
292f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->local = count;
293f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
294f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
295f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* finish computing the SHA digest */
296f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
297f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic void
298f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithsha_final(unsigned char digest[SHA_DIGESTSIZE], SHAobject *sha_info)
299f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
300f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    int count;
301f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    SHA_INT32 lo_bit_count, hi_bit_count;
302f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
303f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    lo_bit_count = sha_info->count_lo;
304f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    hi_bit_count = sha_info->count_hi;
305f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    count = (int) ((lo_bit_count >> 3) & 0x3f);
306f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    ((SHA_BYTE *) sha_info->data)[count++] = 0x80;
307f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    if (count > SHA_BLOCKSIZE - 8) {
308f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        memset(((SHA_BYTE *) sha_info->data) + count, 0,
309f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               SHA_BLOCKSIZE - count);
310f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sha_transform(sha_info);
311f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        memset((SHA_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 8);
312f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    }
313f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    else {
314f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        memset(((SHA_BYTE *) sha_info->data) + count, 0,
315f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               SHA_BLOCKSIZE - 8 - count);
316f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    }
317f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
318f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    /* GJS: note that we add the hi/lo in big-endian. sha_transform will
319f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith       swap these values into host-order. */
320f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->data[56] = (hi_bit_count >> 24) & 0xff;
321f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->data[57] = (hi_bit_count >> 16) & 0xff;
322f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->data[58] = (hi_bit_count >>  8) & 0xff;
323f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->data[59] = (hi_bit_count >>  0) & 0xff;
324f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->data[60] = (lo_bit_count >> 24) & 0xff;
325f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->data[61] = (lo_bit_count >> 16) & 0xff;
326f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->data[62] = (lo_bit_count >>  8) & 0xff;
327f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_info->data[63] = (lo_bit_count >>  0) & 0xff;
328f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_transform(sha_info);
329f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff);
330f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff);
331f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[ 2] = (unsigned char) ((sha_info->digest[0] >>  8) & 0xff);
332f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[ 3] = (unsigned char) ((sha_info->digest[0]      ) & 0xff);
333f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[ 4] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff);
334f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[ 5] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff);
335f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[ 6] = (unsigned char) ((sha_info->digest[1] >>  8) & 0xff);
336f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[ 7] = (unsigned char) ((sha_info->digest[1]      ) & 0xff);
337f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[ 8] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff);
338f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[ 9] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff);
339f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[10] = (unsigned char) ((sha_info->digest[2] >>  8) & 0xff);
340f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[11] = (unsigned char) ((sha_info->digest[2]      ) & 0xff);
341f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[12] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff);
342f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[13] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff);
343f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[14] = (unsigned char) ((sha_info->digest[3] >>  8) & 0xff);
344f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[15] = (unsigned char) ((sha_info->digest[3]      ) & 0xff);
345f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[16] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff);
346f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[17] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff);
347f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[18] = (unsigned char) ((sha_info->digest[4] >>  8) & 0xff);
348f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[19] = (unsigned char) ((sha_info->digest[4]      ) & 0xff);
349f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[20] = (unsigned char) ((sha_info->digest[5] >> 24) & 0xff);
350f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[21] = (unsigned char) ((sha_info->digest[5] >> 16) & 0xff);
351f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[22] = (unsigned char) ((sha_info->digest[5] >>  8) & 0xff);
352f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[23] = (unsigned char) ((sha_info->digest[5]      ) & 0xff);
353f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[24] = (unsigned char) ((sha_info->digest[6] >> 24) & 0xff);
354f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[25] = (unsigned char) ((sha_info->digest[6] >> 16) & 0xff);
355f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[26] = (unsigned char) ((sha_info->digest[6] >>  8) & 0xff);
356f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[27] = (unsigned char) ((sha_info->digest[6]      ) & 0xff);
357f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[28] = (unsigned char) ((sha_info->digest[7] >> 24) & 0xff);
358f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[29] = (unsigned char) ((sha_info->digest[7] >> 16) & 0xff);
359f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[30] = (unsigned char) ((sha_info->digest[7] >>  8) & 0xff);
360f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    digest[31] = (unsigned char) ((sha_info->digest[7]      ) & 0xff);
361f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
362f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
363f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/*
364f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith * End of copied SHA code.
365f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith *
366f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith * ------------------------------------------------------------------------
367f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith */
368f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
369f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic PyTypeObject SHA224type;
370f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic PyTypeObject SHA256type;
371f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
372f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
373f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic SHAobject *
374f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. SmithnewSHA224object(void)
375f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
376f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    return (SHAobject *)PyObject_New(SHAobject, &SHA224type);
377f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
378f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
379f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic SHAobject *
380f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. SmithnewSHA256object(void)
381f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
382f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    return (SHAobject *)PyObject_New(SHAobject, &SHA256type);
383f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
384f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
385f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* Internal methods for a hash object */
386f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
387f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic void
388f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. SmithSHA_dealloc(PyObject *ptr)
389f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
390f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    PyObject_Del(ptr);
391f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
392f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
393f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
394f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* External methods for a hash object */
395f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
396f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. SmithPyDoc_STRVAR(SHA256_copy__doc__, "Return a copy of the hash object.");
397f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
398f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic PyObject *
3994d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas WoutersSHA256_copy(SHAobject *self, PyObject *unused)
400f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
401f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    SHAobject *newobj;
402f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
40390aa7646affbaee9628ca6ea6a702aec17b3b550Christian Heimes    if (Py_TYPE(self) == &SHA256type) {
404f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        if ( (newobj = newSHA256object())==NULL)
405f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            return NULL;
406f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    } else {
407f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        if ( (newobj = newSHA224object())==NULL)
408f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            return NULL;
409f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    }
410f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
411f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    SHAcopy(self, newobj);
412f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    return (PyObject *)newobj;
413f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
414f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
415f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. SmithPyDoc_STRVAR(SHA256_digest__doc__,
416f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith"Return the digest value as a string of binary data.");
417f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
418f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic PyObject *
4194d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas WoutersSHA256_digest(SHAobject *self, PyObject *unused)
420f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
421f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    unsigned char digest[SHA_DIGESTSIZE];
422f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    SHAobject temp;
423f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
424f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    SHAcopy(self, &temp);
425f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_final(digest, &temp);
42672b710a59617ebe6dd1c41613d2c7eb81702efd9Christian Heimes    return PyBytes_FromStringAndSize((const char *)digest, self->digestsize);
427f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
428f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
429f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. SmithPyDoc_STRVAR(SHA256_hexdigest__doc__,
430f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith"Return the digest value as a string of hexadecimal digits.");
431f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
432f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic PyObject *
4334d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas WoutersSHA256_hexdigest(SHAobject *self, PyObject *unused)
434f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
435f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    unsigned char digest[SHA_DIGESTSIZE];
436f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    SHAobject temp;
437f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    PyObject *retval;
438d63a3b8beb4a0841cb59fb3515347ccaab34b733Martin v. Löwis    Py_UCS1 *hex_digest;
439f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    int i, j;
440f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
441f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    /* Get the raw (binary) digest value */
442f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    SHAcopy(self, &temp);
443f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_final(digest, &temp);
444f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
445f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    /* Create a new string */
446d63a3b8beb4a0841cb59fb3515347ccaab34b733Martin v. Löwis    retval = PyUnicode_New(self->digestsize * 2, 127);
447f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    if (!retval)
448f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return NULL;
449d63a3b8beb4a0841cb59fb3515347ccaab34b733Martin v. Löwis    hex_digest = PyUnicode_1BYTE_DATA(retval);
450f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
451f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    /* Make hex version of the digest */
452f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    for(i=j=0; i<self->digestsize; i++) {
453f5cff56a1be70d2c4e5cde5fa4e5d5d92e620ddaVictor Stinner        unsigned char c;
454f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        c = (digest[i] >> 4) & 0xf;
455f5cff56a1be70d2c4e5cde5fa4e5d5d92e620ddaVictor Stinner        hex_digest[j++] = Py_hexdigits[c];
456f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        c = (digest[i] & 0xf);
457f5cff56a1be70d2c4e5cde5fa4e5d5d92e620ddaVictor Stinner        hex_digest[j++] = Py_hexdigits[c];
458f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    }
4598f825060f1c168b913f2ac299ca48d4e9375f34dVictor Stinner    assert(_PyUnicode_CheckConsistency(retval, 1));
460f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    return retval;
461f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
462f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
463f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. SmithPyDoc_STRVAR(SHA256_update__doc__,
464f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith"Update this hash object's state with the provided string.");
465f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
466f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic PyObject *
467f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. SmithSHA256_update(SHAobject *self, PyObject *args)
468f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
469365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    PyObject *obj;
470365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    Py_buffer buf;
471f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
472365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    if (!PyArg_ParseTuple(args, "O:update", &obj))
473f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        return NULL;
474f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
475365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    GET_BUFFER_VIEW_OR_ERROUT(obj, &buf);
476f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
477365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    sha_update(self, buf.buf, buf.len);
478365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith
479365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    PyBuffer_Release(&buf);
480f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    Py_INCREF(Py_None);
481f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    return Py_None;
482f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
483f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
484f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic PyMethodDef SHA_methods[] = {
485f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {"copy",      (PyCFunction)SHA256_copy,      METH_NOARGS,  SHA256_copy__doc__},
486f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {"digest",    (PyCFunction)SHA256_digest,    METH_NOARGS,  SHA256_digest__doc__},
4874d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas Wouters    {"hexdigest", (PyCFunction)SHA256_hexdigest, METH_NOARGS,  SHA256_hexdigest__doc__},
488f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {"update",    (PyCFunction)SHA256_update,    METH_VARARGS, SHA256_update__doc__},
489f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {NULL,        NULL}         /* sentinel */
490f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith};
491f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
492f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic PyObject *
493f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. SmithSHA256_get_block_size(PyObject *self, void *closure)
494f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
495217cfd1c86c59ed8a55ce6d6b88bbe37309e7ba2Christian Heimes    return PyLong_FromLong(SHA_BLOCKSIZE);
496f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
497f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
498f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic PyObject *
499f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. SmithSHA256_get_name(PyObject *self, void *closure)
500f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
501f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    if (((SHAobject *)self)->digestsize == 32)
5025ed033b5a21d56db0dbb0b2535b83afd5cad143dGuido van Rossum        return PyUnicode_FromStringAndSize("SHA256", 6);
503f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    else
5045ed033b5a21d56db0dbb0b2535b83afd5cad143dGuido van Rossum        return PyUnicode_FromStringAndSize("SHA224", 6);
505f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
506f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
507f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic PyGetSetDef SHA_getseters[] = {
508f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    {"block_size",
509f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith     (getter)SHA256_get_block_size, NULL,
510f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith     NULL,
511f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith     NULL},
512f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    {"name",
513f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith     (getter)SHA256_get_name, NULL,
514f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith     NULL,
515f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith     NULL},
516f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    {NULL}  /* Sentinel */
517f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith};
518f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
519f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic PyMemberDef SHA_members[] = {
520f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    {"digest_size", T_INT, offsetof(SHAobject, digestsize), READONLY, NULL},
521f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    {NULL}  /* Sentinel */
522f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith};
523f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
524f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic PyTypeObject SHA224type = {
5259f2e346911988cda95fec7c901e8d10d34fa9563Martin v. Löwis    PyVarObject_HEAD_INIT(NULL, 0)
526f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    "_sha256.sha224",   /*tp_name*/
527f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    sizeof(SHAobject),  /*tp_size*/
528f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_itemsize*/
529f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    /* methods */
530f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    SHA_dealloc,        /*tp_dealloc*/
531f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_print*/
532f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_getattr*/
533f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_setattr*/
534e94c679df0b632bc929936ca54f0de006e1a6dc2Mark Dickinson    0,                  /*tp_reserved*/
535f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_repr*/
536f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_as_number*/
537f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_as_sequence*/
538f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_as_mapping*/
539f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_hash*/
540f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_call*/
541f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_str*/
542f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_getattro*/
543f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_setattro*/
544f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_as_buffer*/
545f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    Py_TPFLAGS_DEFAULT, /*tp_flags*/
546f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_doc*/
547f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_traverse*/
548f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_clear*/
549f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_richcompare*/
550f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_weaklistoffset*/
551f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_iter*/
552f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_iternext*/
553f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    SHA_methods,        /* tp_methods */
554f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    SHA_members,        /* tp_members */
555f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    SHA_getseters,      /* tp_getset */
556f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith};
557f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
558f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic PyTypeObject SHA256type = {
5599f2e346911988cda95fec7c901e8d10d34fa9563Martin v. Löwis    PyVarObject_HEAD_INIT(NULL, 0)
560f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    "_sha256.sha256",   /*tp_name*/
561f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    sizeof(SHAobject),  /*tp_size*/
562f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_itemsize*/
563f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    /* methods */
564f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    SHA_dealloc,        /*tp_dealloc*/
565f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_print*/
566f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_getattr*/
567f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_setattr*/
568e94c679df0b632bc929936ca54f0de006e1a6dc2Mark Dickinson    0,                  /*tp_reserved*/
569f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_repr*/
570f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_as_number*/
571f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_as_sequence*/
572f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_as_mapping*/
573f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_hash*/
574f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_call*/
575f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_str*/
576f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_getattro*/
577f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_setattro*/
578f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_as_buffer*/
579f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    Py_TPFLAGS_DEFAULT, /*tp_flags*/
580f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_doc*/
581f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    0,                  /*tp_traverse*/
582f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_clear*/
583f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_richcompare*/
584f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_weaklistoffset*/
585f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_iter*/
586f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    0,                  /*tp_iternext*/
587f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    SHA_methods,        /* tp_methods */
588f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    SHA_members,        /* tp_members */
589f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    SHA_getseters,      /* tp_getset */
590f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith};
591f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
592f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
593f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* The single module-level function: new() */
594f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
595f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. SmithPyDoc_STRVAR(SHA256_new__doc__,
596f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith"Return a new SHA-256 hash object; optionally initialized with a string.");
597f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
598f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic PyObject *
599f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. SmithSHA256_new(PyObject *self, PyObject *args, PyObject *kwdict)
600f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
60115e62742fad688b026ba80bf17d1345c4cbd423bMartin v. Löwis    static char *kwlist[] = {"string", NULL};
602f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    SHAobject *new;
603365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    PyObject *data_obj = NULL;
604365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    Py_buffer buf;
605f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
606365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist,
607365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith                                     &data_obj)) {
608f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        return NULL;
609f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    }
610f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
611365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    if (data_obj)
612365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith        GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf);
613365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith
6148404749e4b65f23a7d84c3940ea061eee0b4b344Hirokazu Yamamoto    if ((new = newSHA256object()) == NULL) {
6158404749e4b65f23a7d84c3940ea061eee0b4b344Hirokazu Yamamoto        if (data_obj)
6168404749e4b65f23a7d84c3940ea061eee0b4b344Hirokazu Yamamoto            PyBuffer_Release(&buf);
617f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        return NULL;
6188404749e4b65f23a7d84c3940ea061eee0b4b344Hirokazu Yamamoto    }
619f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
620f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha_init(new);
621f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
622f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    if (PyErr_Occurred()) {
623f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        Py_DECREF(new);
6248404749e4b65f23a7d84c3940ea061eee0b4b344Hirokazu Yamamoto        if (data_obj)
6258404749e4b65f23a7d84c3940ea061eee0b4b344Hirokazu Yamamoto            PyBuffer_Release(&buf);
626f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        return NULL;
627f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    }
628365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    if (data_obj) {
629365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith        sha_update(new, buf.buf, buf.len);
630365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith        PyBuffer_Release(&buf);
631365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    }
632f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
633f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    return (PyObject *)new;
634f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
635f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
636f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. SmithPyDoc_STRVAR(SHA224_new__doc__,
637f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith"Return a new SHA-224 hash object; optionally initialized with a string.");
638f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
639f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic PyObject *
640f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. SmithSHA224_new(PyObject *self, PyObject *args, PyObject *kwdict)
641f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
64215e62742fad688b026ba80bf17d1345c4cbd423bMartin v. Löwis    static char *kwlist[] = {"string", NULL};
643f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    SHAobject *new;
644365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    PyObject *data_obj = NULL;
645365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    Py_buffer buf;
646f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
647365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist,
648365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith                                     &data_obj)) {
649f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        return NULL;
650f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    }
651f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
652365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    if (data_obj)
653365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith        GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf);
654365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith
6558404749e4b65f23a7d84c3940ea061eee0b4b344Hirokazu Yamamoto    if ((new = newSHA224object()) == NULL) {
6568404749e4b65f23a7d84c3940ea061eee0b4b344Hirokazu Yamamoto        if (data_obj)
6578404749e4b65f23a7d84c3940ea061eee0b4b344Hirokazu Yamamoto            PyBuffer_Release(&buf);
658f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        return NULL;
6598404749e4b65f23a7d84c3940ea061eee0b4b344Hirokazu Yamamoto    }
660f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
661f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    sha224_init(new);
662f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
663f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    if (PyErr_Occurred()) {
664f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        Py_DECREF(new);
6658404749e4b65f23a7d84c3940ea061eee0b4b344Hirokazu Yamamoto        if (data_obj)
6668404749e4b65f23a7d84c3940ea061eee0b4b344Hirokazu Yamamoto            PyBuffer_Release(&buf);
667f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        return NULL;
668f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    }
669365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    if (data_obj) {
670365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith        sha_update(new, buf.buf, buf.len);
671365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith        PyBuffer_Release(&buf);
672365a1864fd285fc6ee9d9fa1f8770b39d4dab830Gregory P. Smith    }
673f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
674f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    return (PyObject *)new;
675f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
676f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
677f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
678f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* List of functions exported by this module */
679f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
680f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smithstatic struct PyMethodDef SHA_functions[] = {
681f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    {"sha256", (PyCFunction)SHA256_new, METH_VARARGS|METH_KEYWORDS, SHA256_new__doc__},
682f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    {"sha224", (PyCFunction)SHA224_new, METH_VARARGS|METH_KEYWORDS, SHA224_new__doc__},
683f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {NULL,      NULL}            /* Sentinel */
684f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith};
685f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
686f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
687f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith/* Initialize this module. */
688f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
689f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith#define insint(n,v) { PyModule_AddIntConstant(m,n,v); }
690f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
6911a21451b1d73b65af949193208372e86bf308411Martin v. Löwis
6921a21451b1d73b65af949193208372e86bf308411Martin v. Löwisstatic struct PyModuleDef _sha256module = {
693f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyModuleDef_HEAD_INIT,
694f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        "_sha256",
695f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        NULL,
696f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        -1,
697f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        SHA_functions,
698f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        NULL,
699f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        NULL,
700f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        NULL,
701f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        NULL
7021a21451b1d73b65af949193208372e86bf308411Martin v. Löwis};
7031a21451b1d73b65af949193208372e86bf308411Martin v. Löwis
704f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. SmithPyMODINIT_FUNC
7051a21451b1d73b65af949193208372e86bf308411Martin v. LöwisPyInit__sha256(void)
706f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith{
70790aa7646affbaee9628ca6ea6a702aec17b3b550Christian Heimes    Py_TYPE(&SHA224type) = &PyType_Type;
708f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    if (PyType_Ready(&SHA224type) < 0)
7091a21451b1d73b65af949193208372e86bf308411Martin v. Löwis        return NULL;
71090aa7646affbaee9628ca6ea6a702aec17b3b550Christian Heimes    Py_TYPE(&SHA256type) = &PyType_Type;
711f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith    if (PyType_Ready(&SHA256type) < 0)
7121a21451b1d73b65af949193208372e86bf308411Martin v. Löwis        return NULL;
7131a21451b1d73b65af949193208372e86bf308411Martin v. Löwis    return PyModule_Create(&_sha256module);
714f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith}
715