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