LCOV - code coverage report
Current view: top level - libreoffice/workdir/unxlngi6.pro/UnpackedTarball/python3/Modules - sha512module.c (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 356 0.0 %
Date: 2012-12-17 Functions: 0 19 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* SHA512 module */
       2             : 
       3             : /* This module provides an interface to NIST's SHA-512 and SHA-384 Algorithms */
       4             : 
       5             : /* See below for information about the original code this module was
       6             :    based upon. Additional work performed by:
       7             : 
       8             :    Andrew Kuchling (amk@amk.ca)
       9             :    Greg Stein (gstein@lyra.org)
      10             :    Trevor Perrin (trevp@trevp.net)
      11             : 
      12             :    Copyright (C) 2005-2007   Gregory P. Smith (greg@krypto.org)
      13             :    Licensed to PSF under a Contributor Agreement.
      14             : 
      15             : */
      16             : 
      17             : /* SHA objects */
      18             : 
      19             : #include "Python.h"
      20             : #include "structmember.h"
      21             : #include "hashlib.h"
      22             : 
      23             : #ifdef PY_LONG_LONG /* If no PY_LONG_LONG, don't compile anything! */
      24             : 
      25             : /* Endianness testing and definitions */
      26             : #define TestEndianness(variable) {int i=1; variable=PCT_BIG_ENDIAN;\
      27             :         if (*((char*)&i)==1) variable=PCT_LITTLE_ENDIAN;}
      28             : 
      29             : #define PCT_LITTLE_ENDIAN 1
      30             : #define PCT_BIG_ENDIAN 0
      31             : 
      32             : /* Some useful types */
      33             : 
      34             : typedef unsigned char SHA_BYTE;
      35             : 
      36             : #if SIZEOF_INT == 4
      37             : typedef unsigned int SHA_INT32; /* 32-bit integer */
      38             : typedef unsigned PY_LONG_LONG SHA_INT64;        /* 64-bit integer */
      39             : #else
      40             : /* not defined. compilation will die. */
      41             : #endif
      42             : 
      43             : /* The SHA block size and message digest sizes, in bytes */
      44             : 
      45             : #define SHA_BLOCKSIZE   128
      46             : #define SHA_DIGESTSIZE  64
      47             : 
      48             : /* The structure for storing SHA info */
      49             : 
      50             : typedef struct {
      51             :     PyObject_HEAD
      52             :     SHA_INT64 digest[8];                /* Message digest */
      53             :     SHA_INT32 count_lo, count_hi;       /* 64-bit bit count */
      54             :     SHA_BYTE data[SHA_BLOCKSIZE];       /* SHA data buffer */
      55             :     int Endianness;
      56             :     int local;                          /* unprocessed amount in data */
      57             :     int digestsize;
      58             : } SHAobject;
      59             : 
      60             : /* When run on a little-endian CPU we need to perform byte reversal on an
      61             :    array of longwords. */
      62             : 
      63           0 : static void longReverse(SHA_INT64 *buffer, int byteCount, int Endianness)
      64             : {
      65             :     SHA_INT64 value;
      66             : 
      67           0 :     if ( Endianness == PCT_BIG_ENDIAN )
      68           0 :         return;
      69             : 
      70           0 :     byteCount /= sizeof(*buffer);
      71           0 :     while (byteCount--) {
      72           0 :         value = *buffer;
      73             : 
      74           0 :                 ((unsigned char*)buffer)[0] = (unsigned char)(value >> 56) & 0xff;
      75           0 :                 ((unsigned char*)buffer)[1] = (unsigned char)(value >> 48) & 0xff;
      76           0 :                 ((unsigned char*)buffer)[2] = (unsigned char)(value >> 40) & 0xff;
      77           0 :                 ((unsigned char*)buffer)[3] = (unsigned char)(value >> 32) & 0xff;
      78           0 :                 ((unsigned char*)buffer)[4] = (unsigned char)(value >> 24) & 0xff;
      79           0 :                 ((unsigned char*)buffer)[5] = (unsigned char)(value >> 16) & 0xff;
      80           0 :                 ((unsigned char*)buffer)[6] = (unsigned char)(value >>  8) & 0xff;
      81           0 :                 ((unsigned char*)buffer)[7] = (unsigned char)(value      ) & 0xff;
      82             : 
      83           0 :                 buffer++;
      84             :     }
      85             : }
      86             : 
      87           0 : static void SHAcopy(SHAobject *src, SHAobject *dest)
      88             : {
      89           0 :     dest->Endianness = src->Endianness;
      90           0 :     dest->local = src->local;
      91           0 :     dest->digestsize = src->digestsize;
      92           0 :     dest->count_lo = src->count_lo;
      93           0 :     dest->count_hi = src->count_hi;
      94           0 :     memcpy(dest->digest, src->digest, sizeof(src->digest));
      95           0 :     memcpy(dest->data, src->data, sizeof(src->data));
      96           0 : }
      97             : 
      98             : 
      99             : /* ------------------------------------------------------------------------
     100             :  *
     101             :  * This code for the SHA-512 algorithm was noted as public domain. The
     102             :  * original headers are pasted below.
     103             :  *
     104             :  * Several changes have been made to make it more compatible with the
     105             :  * Python environment and desired interface.
     106             :  *
     107             :  */
     108             : 
     109             : /* LibTomCrypt, modular cryptographic library -- Tom St Denis
     110             :  *
     111             :  * LibTomCrypt is a library that provides various cryptographic
     112             :  * algorithms in a highly modular and flexible manner.
     113             :  *
     114             :  * The library is free for all purposes without any express
     115             :  * gurantee it works.
     116             :  *
     117             :  * Tom St Denis, tomstdenis@iahu.ca, http://libtom.org
     118             :  */
     119             : 
     120             : 
     121             : /* SHA512 by Tom St Denis */
     122             : 
     123             : /* Various logical functions */
     124             : #define ROR64(x, y) \
     125             :     ( ((((x) & Py_ULL(0xFFFFFFFFFFFFFFFF))>>((unsigned PY_LONG_LONG)(y) & 63)) | \
     126             :       ((x)<<((unsigned PY_LONG_LONG)(64-((y) & 63))))) & Py_ULL(0xFFFFFFFFFFFFFFFF))
     127             : #define Ch(x,y,z)       (z ^ (x & (y ^ z)))
     128             : #define Maj(x,y,z)      (((x | y) & z) | (x & y))
     129             : #define S(x, n)         ROR64((x),(n))
     130             : #define R(x, n)         (((x) & Py_ULL(0xFFFFFFFFFFFFFFFF)) >> ((unsigned PY_LONG_LONG)n))
     131             : #define Sigma0(x)       (S(x, 28) ^ S(x, 34) ^ S(x, 39))
     132             : #define Sigma1(x)       (S(x, 14) ^ S(x, 18) ^ S(x, 41))
     133             : #define Gamma0(x)       (S(x, 1) ^ S(x, 8) ^ R(x, 7))
     134             : #define Gamma1(x)       (S(x, 19) ^ S(x, 61) ^ R(x, 6))
     135             : 
     136             : 
     137             : static void
     138           0 : sha512_transform(SHAobject *sha_info)
     139             : {
     140             :     int i;
     141             :     SHA_INT64 S[8], W[80], t0, t1;
     142             : 
     143           0 :     memcpy(W, sha_info->data, sizeof(sha_info->data));
     144           0 :     longReverse(W, (int)sizeof(sha_info->data), sha_info->Endianness);
     145             : 
     146           0 :     for (i = 16; i < 80; ++i) {
     147           0 :                 W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16];
     148             :     }
     149           0 :     for (i = 0; i < 8; ++i) {
     150           0 :         S[i] = sha_info->digest[i];
     151             :     }
     152             : 
     153             :     /* Compress */
     154             : #define RND(a,b,c,d,e,f,g,h,i,ki)                    \
     155             :      t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i];   \
     156             :      t1 = Sigma0(a) + Maj(a, b, c);                  \
     157             :      d += t0;                                        \
     158             :      h  = t0 + t1;
     159             : 
     160           0 :     RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,Py_ULL(0x428a2f98d728ae22));
     161           0 :     RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,Py_ULL(0x7137449123ef65cd));
     162           0 :     RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,Py_ULL(0xb5c0fbcfec4d3b2f));
     163           0 :     RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,Py_ULL(0xe9b5dba58189dbbc));
     164           0 :     RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,Py_ULL(0x3956c25bf348b538));
     165           0 :     RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,Py_ULL(0x59f111f1b605d019));
     166           0 :     RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,Py_ULL(0x923f82a4af194f9b));
     167           0 :     RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,Py_ULL(0xab1c5ed5da6d8118));
     168           0 :     RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,Py_ULL(0xd807aa98a3030242));
     169           0 :     RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,Py_ULL(0x12835b0145706fbe));
     170           0 :     RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,Py_ULL(0x243185be4ee4b28c));
     171           0 :     RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,Py_ULL(0x550c7dc3d5ffb4e2));
     172           0 :     RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,Py_ULL(0x72be5d74f27b896f));
     173           0 :     RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,Py_ULL(0x80deb1fe3b1696b1));
     174           0 :     RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,Py_ULL(0x9bdc06a725c71235));
     175           0 :     RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,Py_ULL(0xc19bf174cf692694));
     176           0 :     RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,Py_ULL(0xe49b69c19ef14ad2));
     177           0 :     RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,Py_ULL(0xefbe4786384f25e3));
     178           0 :     RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,Py_ULL(0x0fc19dc68b8cd5b5));
     179           0 :     RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,Py_ULL(0x240ca1cc77ac9c65));
     180           0 :     RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,Py_ULL(0x2de92c6f592b0275));
     181           0 :     RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,Py_ULL(0x4a7484aa6ea6e483));
     182           0 :     RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,Py_ULL(0x5cb0a9dcbd41fbd4));
     183           0 :     RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,Py_ULL(0x76f988da831153b5));
     184           0 :     RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,Py_ULL(0x983e5152ee66dfab));
     185           0 :     RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,Py_ULL(0xa831c66d2db43210));
     186           0 :     RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,Py_ULL(0xb00327c898fb213f));
     187           0 :     RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,Py_ULL(0xbf597fc7beef0ee4));
     188           0 :     RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,Py_ULL(0xc6e00bf33da88fc2));
     189           0 :     RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,Py_ULL(0xd5a79147930aa725));
     190           0 :     RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,Py_ULL(0x06ca6351e003826f));
     191           0 :     RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,Py_ULL(0x142929670a0e6e70));
     192           0 :     RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,Py_ULL(0x27b70a8546d22ffc));
     193           0 :     RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,Py_ULL(0x2e1b21385c26c926));
     194           0 :     RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,Py_ULL(0x4d2c6dfc5ac42aed));
     195           0 :     RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,Py_ULL(0x53380d139d95b3df));
     196           0 :     RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,Py_ULL(0x650a73548baf63de));
     197           0 :     RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,Py_ULL(0x766a0abb3c77b2a8));
     198           0 :     RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,Py_ULL(0x81c2c92e47edaee6));
     199           0 :     RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,Py_ULL(0x92722c851482353b));
     200           0 :     RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,Py_ULL(0xa2bfe8a14cf10364));
     201           0 :     RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,Py_ULL(0xa81a664bbc423001));
     202           0 :     RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,Py_ULL(0xc24b8b70d0f89791));
     203           0 :     RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,Py_ULL(0xc76c51a30654be30));
     204           0 :     RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,Py_ULL(0xd192e819d6ef5218));
     205           0 :     RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,Py_ULL(0xd69906245565a910));
     206           0 :     RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,Py_ULL(0xf40e35855771202a));
     207           0 :     RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,Py_ULL(0x106aa07032bbd1b8));
     208           0 :     RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,Py_ULL(0x19a4c116b8d2d0c8));
     209           0 :     RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,Py_ULL(0x1e376c085141ab53));
     210           0 :     RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,Py_ULL(0x2748774cdf8eeb99));
     211           0 :     RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,Py_ULL(0x34b0bcb5e19b48a8));
     212           0 :     RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,Py_ULL(0x391c0cb3c5c95a63));
     213           0 :     RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,Py_ULL(0x4ed8aa4ae3418acb));
     214           0 :     RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,Py_ULL(0x5b9cca4f7763e373));
     215           0 :     RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,Py_ULL(0x682e6ff3d6b2b8a3));
     216           0 :     RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,Py_ULL(0x748f82ee5defb2fc));
     217           0 :     RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,Py_ULL(0x78a5636f43172f60));
     218           0 :     RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,Py_ULL(0x84c87814a1f0ab72));
     219           0 :     RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,Py_ULL(0x8cc702081a6439ec));
     220           0 :     RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,Py_ULL(0x90befffa23631e28));
     221           0 :     RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,Py_ULL(0xa4506cebde82bde9));
     222           0 :     RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,Py_ULL(0xbef9a3f7b2c67915));
     223           0 :     RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,Py_ULL(0xc67178f2e372532b));
     224           0 :     RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],64,Py_ULL(0xca273eceea26619c));
     225           0 :     RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],65,Py_ULL(0xd186b8c721c0c207));
     226           0 :     RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],66,Py_ULL(0xeada7dd6cde0eb1e));
     227           0 :     RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],67,Py_ULL(0xf57d4f7fee6ed178));
     228           0 :     RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],68,Py_ULL(0x06f067aa72176fba));
     229           0 :     RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],69,Py_ULL(0x0a637dc5a2c898a6));
     230           0 :     RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],70,Py_ULL(0x113f9804bef90dae));
     231           0 :     RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],71,Py_ULL(0x1b710b35131c471b));
     232           0 :     RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],72,Py_ULL(0x28db77f523047d84));
     233           0 :     RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],73,Py_ULL(0x32caab7b40c72493));
     234           0 :     RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],74,Py_ULL(0x3c9ebe0a15c9bebc));
     235           0 :     RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],75,Py_ULL(0x431d67c49c100d4c));
     236           0 :     RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],76,Py_ULL(0x4cc5d4becb3e42b6));
     237           0 :     RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],77,Py_ULL(0x597f299cfc657e2a));
     238           0 :     RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],78,Py_ULL(0x5fcb6fab3ad6faec));
     239           0 :     RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],79,Py_ULL(0x6c44198c4a475817));
     240             : 
     241             : #undef RND
     242             : 
     243             :     /* feedback */
     244           0 :     for (i = 0; i < 8; i++) {
     245           0 :         sha_info->digest[i] = sha_info->digest[i] + S[i];
     246             :     }
     247             : 
     248           0 : }
     249             : 
     250             : 
     251             : 
     252             : /* initialize the SHA digest */
     253             : 
     254             : static void
     255           0 : sha512_init(SHAobject *sha_info)
     256             : {
     257           0 :     TestEndianness(sha_info->Endianness)
     258           0 :     sha_info->digest[0] = Py_ULL(0x6a09e667f3bcc908);
     259           0 :     sha_info->digest[1] = Py_ULL(0xbb67ae8584caa73b);
     260           0 :     sha_info->digest[2] = Py_ULL(0x3c6ef372fe94f82b);
     261           0 :     sha_info->digest[3] = Py_ULL(0xa54ff53a5f1d36f1);
     262           0 :     sha_info->digest[4] = Py_ULL(0x510e527fade682d1);
     263           0 :     sha_info->digest[5] = Py_ULL(0x9b05688c2b3e6c1f);
     264           0 :     sha_info->digest[6] = Py_ULL(0x1f83d9abfb41bd6b);
     265           0 :     sha_info->digest[7] = Py_ULL(0x5be0cd19137e2179);
     266           0 :     sha_info->count_lo = 0L;
     267           0 :     sha_info->count_hi = 0L;
     268           0 :     sha_info->local = 0;
     269           0 :     sha_info->digestsize = 64;
     270           0 : }
     271             : 
     272             : static void
     273           0 : sha384_init(SHAobject *sha_info)
     274             : {
     275           0 :     TestEndianness(sha_info->Endianness)
     276           0 :     sha_info->digest[0] = Py_ULL(0xcbbb9d5dc1059ed8);
     277           0 :     sha_info->digest[1] = Py_ULL(0x629a292a367cd507);
     278           0 :     sha_info->digest[2] = Py_ULL(0x9159015a3070dd17);
     279           0 :     sha_info->digest[3] = Py_ULL(0x152fecd8f70e5939);
     280           0 :     sha_info->digest[4] = Py_ULL(0x67332667ffc00b31);
     281           0 :     sha_info->digest[5] = Py_ULL(0x8eb44a8768581511);
     282           0 :     sha_info->digest[6] = Py_ULL(0xdb0c2e0d64f98fa7);
     283           0 :     sha_info->digest[7] = Py_ULL(0x47b5481dbefa4fa4);
     284           0 :     sha_info->count_lo = 0L;
     285           0 :     sha_info->count_hi = 0L;
     286           0 :     sha_info->local = 0;
     287           0 :     sha_info->digestsize = 48;
     288           0 : }
     289             : 
     290             : 
     291             : /* update the SHA digest */
     292             : 
     293             : static void
     294           0 : sha512_update(SHAobject *sha_info, SHA_BYTE *buffer, Py_ssize_t count)
     295             : {
     296             :     Py_ssize_t i;
     297             :     SHA_INT32 clo;
     298             : 
     299           0 :     clo = sha_info->count_lo + ((SHA_INT32) count << 3);
     300           0 :     if (clo < sha_info->count_lo) {
     301           0 :         ++sha_info->count_hi;
     302             :     }
     303           0 :     sha_info->count_lo = clo;
     304           0 :     sha_info->count_hi += (SHA_INT32) count >> 29;
     305           0 :     if (sha_info->local) {
     306           0 :         i = SHA_BLOCKSIZE - sha_info->local;
     307           0 :         if (i > count) {
     308           0 :             i = count;
     309             :         }
     310           0 :         memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i);
     311           0 :         count -= i;
     312           0 :         buffer += i;
     313           0 :         sha_info->local += i;
     314           0 :         if (sha_info->local == SHA_BLOCKSIZE) {
     315           0 :             sha512_transform(sha_info);
     316             :         }
     317             :         else {
     318           0 :             return;
     319             :         }
     320             :     }
     321           0 :     while (count >= SHA_BLOCKSIZE) {
     322           0 :         memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);
     323           0 :         buffer += SHA_BLOCKSIZE;
     324           0 :         count -= SHA_BLOCKSIZE;
     325           0 :         sha512_transform(sha_info);
     326             :     }
     327           0 :     memcpy(sha_info->data, buffer, count);
     328           0 :     sha_info->local = count;
     329             : }
     330             : 
     331             : /* finish computing the SHA digest */
     332             : 
     333             : static void
     334           0 : sha512_final(unsigned char digest[SHA_DIGESTSIZE], SHAobject *sha_info)
     335             : {
     336             :     int count;
     337             :     SHA_INT32 lo_bit_count, hi_bit_count;
     338             : 
     339           0 :     lo_bit_count = sha_info->count_lo;
     340           0 :     hi_bit_count = sha_info->count_hi;
     341           0 :     count = (int) ((lo_bit_count >> 3) & 0x7f);
     342           0 :     ((SHA_BYTE *) sha_info->data)[count++] = 0x80;
     343           0 :     if (count > SHA_BLOCKSIZE - 16) {
     344           0 :         memset(((SHA_BYTE *) sha_info->data) + count, 0,
     345           0 :                SHA_BLOCKSIZE - count);
     346           0 :         sha512_transform(sha_info);
     347           0 :         memset((SHA_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 16);
     348             :     }
     349             :     else {
     350           0 :         memset(((SHA_BYTE *) sha_info->data) + count, 0,
     351           0 :                SHA_BLOCKSIZE - 16 - count);
     352             :     }
     353             : 
     354             :     /* GJS: note that we add the hi/lo in big-endian. sha512_transform will
     355             :        swap these values into host-order. */
     356           0 :     sha_info->data[112] = 0;
     357           0 :     sha_info->data[113] = 0;
     358           0 :     sha_info->data[114] = 0;
     359           0 :     sha_info->data[115] = 0;
     360           0 :     sha_info->data[116] = 0;
     361           0 :     sha_info->data[117] = 0;
     362           0 :     sha_info->data[118] = 0;
     363           0 :     sha_info->data[119] = 0;
     364           0 :     sha_info->data[120] = (hi_bit_count >> 24) & 0xff;
     365           0 :     sha_info->data[121] = (hi_bit_count >> 16) & 0xff;
     366           0 :     sha_info->data[122] = (hi_bit_count >>  8) & 0xff;
     367           0 :     sha_info->data[123] = (hi_bit_count >>  0) & 0xff;
     368           0 :     sha_info->data[124] = (lo_bit_count >> 24) & 0xff;
     369           0 :     sha_info->data[125] = (lo_bit_count >> 16) & 0xff;
     370           0 :     sha_info->data[126] = (lo_bit_count >>  8) & 0xff;
     371           0 :     sha_info->data[127] = (lo_bit_count >>  0) & 0xff;
     372           0 :     sha512_transform(sha_info);
     373           0 :     digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 56) & 0xff);
     374           0 :     digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 48) & 0xff);
     375           0 :     digest[ 2] = (unsigned char) ((sha_info->digest[0] >> 40) & 0xff);
     376           0 :     digest[ 3] = (unsigned char) ((sha_info->digest[0] >> 32) & 0xff);
     377           0 :     digest[ 4] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff);
     378           0 :     digest[ 5] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff);
     379           0 :     digest[ 6] = (unsigned char) ((sha_info->digest[0] >>  8) & 0xff);
     380           0 :     digest[ 7] = (unsigned char) ((sha_info->digest[0]      ) & 0xff);
     381           0 :     digest[ 8] = (unsigned char) ((sha_info->digest[1] >> 56) & 0xff);
     382           0 :     digest[ 9] = (unsigned char) ((sha_info->digest[1] >> 48) & 0xff);
     383           0 :     digest[10] = (unsigned char) ((sha_info->digest[1] >> 40) & 0xff);
     384           0 :     digest[11] = (unsigned char) ((sha_info->digest[1] >> 32) & 0xff);
     385           0 :     digest[12] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff);
     386           0 :     digest[13] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff);
     387           0 :     digest[14] = (unsigned char) ((sha_info->digest[1] >>  8) & 0xff);
     388           0 :     digest[15] = (unsigned char) ((sha_info->digest[1]      ) & 0xff);
     389           0 :     digest[16] = (unsigned char) ((sha_info->digest[2] >> 56) & 0xff);
     390           0 :     digest[17] = (unsigned char) ((sha_info->digest[2] >> 48) & 0xff);
     391           0 :     digest[18] = (unsigned char) ((sha_info->digest[2] >> 40) & 0xff);
     392           0 :     digest[19] = (unsigned char) ((sha_info->digest[2] >> 32) & 0xff);
     393           0 :     digest[20] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff);
     394           0 :     digest[21] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff);
     395           0 :     digest[22] = (unsigned char) ((sha_info->digest[2] >>  8) & 0xff);
     396           0 :     digest[23] = (unsigned char) ((sha_info->digest[2]      ) & 0xff);
     397           0 :     digest[24] = (unsigned char) ((sha_info->digest[3] >> 56) & 0xff);
     398           0 :     digest[25] = (unsigned char) ((sha_info->digest[3] >> 48) & 0xff);
     399           0 :     digest[26] = (unsigned char) ((sha_info->digest[3] >> 40) & 0xff);
     400           0 :     digest[27] = (unsigned char) ((sha_info->digest[3] >> 32) & 0xff);
     401           0 :     digest[28] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff);
     402           0 :     digest[29] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff);
     403           0 :     digest[30] = (unsigned char) ((sha_info->digest[3] >>  8) & 0xff);
     404           0 :     digest[31] = (unsigned char) ((sha_info->digest[3]      ) & 0xff);
     405           0 :     digest[32] = (unsigned char) ((sha_info->digest[4] >> 56) & 0xff);
     406           0 :     digest[33] = (unsigned char) ((sha_info->digest[4] >> 48) & 0xff);
     407           0 :     digest[34] = (unsigned char) ((sha_info->digest[4] >> 40) & 0xff);
     408           0 :     digest[35] = (unsigned char) ((sha_info->digest[4] >> 32) & 0xff);
     409           0 :     digest[36] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff);
     410           0 :     digest[37] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff);
     411           0 :     digest[38] = (unsigned char) ((sha_info->digest[4] >>  8) & 0xff);
     412           0 :     digest[39] = (unsigned char) ((sha_info->digest[4]      ) & 0xff);
     413           0 :     digest[40] = (unsigned char) ((sha_info->digest[5] >> 56) & 0xff);
     414           0 :     digest[41] = (unsigned char) ((sha_info->digest[5] >> 48) & 0xff);
     415           0 :     digest[42] = (unsigned char) ((sha_info->digest[5] >> 40) & 0xff);
     416           0 :     digest[43] = (unsigned char) ((sha_info->digest[5] >> 32) & 0xff);
     417           0 :     digest[44] = (unsigned char) ((sha_info->digest[5] >> 24) & 0xff);
     418           0 :     digest[45] = (unsigned char) ((sha_info->digest[5] >> 16) & 0xff);
     419           0 :     digest[46] = (unsigned char) ((sha_info->digest[5] >>  8) & 0xff);
     420           0 :     digest[47] = (unsigned char) ((sha_info->digest[5]      ) & 0xff);
     421           0 :     digest[48] = (unsigned char) ((sha_info->digest[6] >> 56) & 0xff);
     422           0 :     digest[49] = (unsigned char) ((sha_info->digest[6] >> 48) & 0xff);
     423           0 :     digest[50] = (unsigned char) ((sha_info->digest[6] >> 40) & 0xff);
     424           0 :     digest[51] = (unsigned char) ((sha_info->digest[6] >> 32) & 0xff);
     425           0 :     digest[52] = (unsigned char) ((sha_info->digest[6] >> 24) & 0xff);
     426           0 :     digest[53] = (unsigned char) ((sha_info->digest[6] >> 16) & 0xff);
     427           0 :     digest[54] = (unsigned char) ((sha_info->digest[6] >>  8) & 0xff);
     428           0 :     digest[55] = (unsigned char) ((sha_info->digest[6]      ) & 0xff);
     429           0 :     digest[56] = (unsigned char) ((sha_info->digest[7] >> 56) & 0xff);
     430           0 :     digest[57] = (unsigned char) ((sha_info->digest[7] >> 48) & 0xff);
     431           0 :     digest[58] = (unsigned char) ((sha_info->digest[7] >> 40) & 0xff);
     432           0 :     digest[59] = (unsigned char) ((sha_info->digest[7] >> 32) & 0xff);
     433           0 :     digest[60] = (unsigned char) ((sha_info->digest[7] >> 24) & 0xff);
     434           0 :     digest[61] = (unsigned char) ((sha_info->digest[7] >> 16) & 0xff);
     435           0 :     digest[62] = (unsigned char) ((sha_info->digest[7] >>  8) & 0xff);
     436           0 :     digest[63] = (unsigned char) ((sha_info->digest[7]      ) & 0xff);
     437           0 : }
     438             : 
     439             : /*
     440             :  * End of copied SHA code.
     441             :  *
     442             :  * ------------------------------------------------------------------------
     443             :  */
     444             : 
     445             : static PyTypeObject SHA384type;
     446             : static PyTypeObject SHA512type;
     447             : 
     448             : 
     449             : static SHAobject *
     450           0 : newSHA384object(void)
     451             : {
     452           0 :     return (SHAobject *)PyObject_New(SHAobject, &SHA384type);
     453             : }
     454             : 
     455             : static SHAobject *
     456           0 : newSHA512object(void)
     457             : {
     458           0 :     return (SHAobject *)PyObject_New(SHAobject, &SHA512type);
     459             : }
     460             : 
     461             : /* Internal methods for a hash object */
     462             : 
     463             : static void
     464           0 : SHA512_dealloc(PyObject *ptr)
     465             : {
     466           0 :     PyObject_Del(ptr);
     467           0 : }
     468             : 
     469             : 
     470             : /* External methods for a hash object */
     471             : 
     472             : PyDoc_STRVAR(SHA512_copy__doc__, "Return a copy of the hash object.");
     473             : 
     474             : static PyObject *
     475           0 : SHA512_copy(SHAobject *self, PyObject *unused)
     476             : {
     477             :     SHAobject *newobj;
     478             : 
     479           0 :     if (((PyObject*)self)->ob_type == &SHA512type) {
     480           0 :         if ( (newobj = newSHA512object())==NULL)
     481           0 :             return NULL;
     482             :     } else {
     483           0 :         if ( (newobj = newSHA384object())==NULL)
     484           0 :             return NULL;
     485             :     }
     486             : 
     487           0 :     SHAcopy(self, newobj);
     488           0 :     return (PyObject *)newobj;
     489             : }
     490             : 
     491             : PyDoc_STRVAR(SHA512_digest__doc__,
     492             : "Return the digest value as a string of binary data.");
     493             : 
     494             : static PyObject *
     495           0 : SHA512_digest(SHAobject *self, PyObject *unused)
     496             : {
     497             :     unsigned char digest[SHA_DIGESTSIZE];
     498             :     SHAobject temp;
     499             : 
     500           0 :     SHAcopy(self, &temp);
     501           0 :     sha512_final(digest, &temp);
     502           0 :     return PyBytes_FromStringAndSize((const char *)digest, self->digestsize);
     503             : }
     504             : 
     505             : PyDoc_STRVAR(SHA512_hexdigest__doc__,
     506             : "Return the digest value as a string of hexadecimal digits.");
     507             : 
     508             : static PyObject *
     509           0 : SHA512_hexdigest(SHAobject *self, PyObject *unused)
     510             : {
     511             :     unsigned char digest[SHA_DIGESTSIZE];
     512             :     SHAobject temp;
     513             :     PyObject *retval;
     514             :     Py_UCS1 *hex_digest;
     515             :     int i, j;
     516             : 
     517             :     /* Get the raw (binary) digest value */
     518           0 :     SHAcopy(self, &temp);
     519           0 :     sha512_final(digest, &temp);
     520             : 
     521             :     /* Create a new string */
     522           0 :     retval = PyUnicode_New(self->digestsize * 2, 127);
     523           0 :     if (!retval)
     524           0 :             return NULL;
     525           0 :     hex_digest = PyUnicode_1BYTE_DATA(retval);
     526             : 
     527             :     /* Make hex version of the digest */
     528           0 :     for (i=j=0; i<self->digestsize; i++) {
     529             :         unsigned char c;
     530           0 :         c = (digest[i] >> 4) & 0xf;
     531           0 :         hex_digest[j++] = Py_hexdigits[c];
     532           0 :         c = (digest[i] & 0xf);
     533           0 :         hex_digest[j++] = Py_hexdigits[c];
     534             :     }
     535             :     assert(_PyUnicode_CheckConsistency(retval, 1));
     536           0 :     return retval;
     537             : }
     538             : 
     539             : PyDoc_STRVAR(SHA512_update__doc__,
     540             : "Update this hash object's state with the provided string.");
     541             : 
     542             : static PyObject *
     543           0 : SHA512_update(SHAobject *self, PyObject *args)
     544             : {
     545             :     PyObject *obj;
     546             :     Py_buffer buf;
     547             : 
     548           0 :     if (!PyArg_ParseTuple(args, "O:update", &obj))
     549           0 :         return NULL;
     550             : 
     551           0 :     GET_BUFFER_VIEW_OR_ERROUT(obj, &buf);
     552             : 
     553           0 :     sha512_update(self, buf.buf, buf.len);
     554             : 
     555           0 :     PyBuffer_Release(&buf);
     556           0 :     Py_INCREF(Py_None);
     557           0 :     return Py_None;
     558             : }
     559             : 
     560             : static PyMethodDef SHA_methods[] = {
     561             :     {"copy",      (PyCFunction)SHA512_copy,      METH_NOARGS, SHA512_copy__doc__},
     562             :     {"digest",    (PyCFunction)SHA512_digest,    METH_NOARGS, SHA512_digest__doc__},
     563             :     {"hexdigest", (PyCFunction)SHA512_hexdigest, METH_NOARGS, SHA512_hexdigest__doc__},
     564             :     {"update",    (PyCFunction)SHA512_update,    METH_VARARGS, SHA512_update__doc__},
     565             :     {NULL,        NULL}         /* sentinel */
     566             : };
     567             : 
     568             : static PyObject *
     569           0 : SHA512_get_block_size(PyObject *self, void *closure)
     570             : {
     571           0 :     return PyLong_FromLong(SHA_BLOCKSIZE);
     572             : }
     573             : 
     574             : static PyObject *
     575           0 : SHA512_get_name(PyObject *self, void *closure)
     576             : {
     577           0 :     if (((SHAobject *)self)->digestsize == 64)
     578           0 :         return PyUnicode_FromStringAndSize("SHA512", 6);
     579             :     else
     580           0 :         return PyUnicode_FromStringAndSize("SHA384", 6);
     581             : }
     582             : 
     583             : static PyGetSetDef SHA_getseters[] = {
     584             :     {"block_size",
     585             :      (getter)SHA512_get_block_size, NULL,
     586             :      NULL,
     587             :      NULL},
     588             :     {"name",
     589             :      (getter)SHA512_get_name, NULL,
     590             :      NULL,
     591             :      NULL},
     592             :     {NULL}  /* Sentinel */
     593             : };
     594             : 
     595             : static PyMemberDef SHA_members[] = {
     596             :     {"digest_size", T_INT, offsetof(SHAobject, digestsize), READONLY, NULL},
     597             :     {NULL}  /* Sentinel */
     598             : };
     599             : 
     600             : static PyTypeObject SHA384type = {
     601             :     PyVarObject_HEAD_INIT(NULL, 0)
     602             :     "_sha512.sha384",   /*tp_name*/
     603             :     sizeof(SHAobject),  /*tp_size*/
     604             :     0,                  /*tp_itemsize*/
     605             :     /* methods */
     606             :     SHA512_dealloc,     /*tp_dealloc*/
     607             :     0,                  /*tp_print*/
     608             :     0,                  /*tp_getattr*/
     609             :     0,                  /*tp_setattr*/
     610             :     0,                  /*tp_reserved*/
     611             :     0,                  /*tp_repr*/
     612             :     0,                  /*tp_as_number*/
     613             :     0,                  /*tp_as_sequence*/
     614             :     0,                  /*tp_as_mapping*/
     615             :     0,                  /*tp_hash*/
     616             :     0,                  /*tp_call*/
     617             :     0,                  /*tp_str*/
     618             :     0,                  /*tp_getattro*/
     619             :     0,                  /*tp_setattro*/
     620             :     0,                  /*tp_as_buffer*/
     621             :     Py_TPFLAGS_DEFAULT, /*tp_flags*/
     622             :     0,                  /*tp_doc*/
     623             :     0,                  /*tp_traverse*/
     624             :     0,                  /*tp_clear*/
     625             :     0,                  /*tp_richcompare*/
     626             :     0,                  /*tp_weaklistoffset*/
     627             :     0,                  /*tp_iter*/
     628             :     0,                  /*tp_iternext*/
     629             :     SHA_methods,        /* tp_methods */
     630             :     SHA_members,        /* tp_members */
     631             :     SHA_getseters,      /* tp_getset */
     632             : };
     633             : 
     634             : static PyTypeObject SHA512type = {
     635             :     PyVarObject_HEAD_INIT(NULL, 0)
     636             :     "_sha512.sha512",   /*tp_name*/
     637             :     sizeof(SHAobject),  /*tp_size*/
     638             :     0,                  /*tp_itemsize*/
     639             :     /* methods */
     640             :     SHA512_dealloc,     /*tp_dealloc*/
     641             :     0,                  /*tp_print*/
     642             :     0,                  /*tp_getattr*/
     643             :     0,                  /*tp_setattr*/
     644             :     0,                  /*tp_reserved*/
     645             :     0,                  /*tp_repr*/
     646             :     0,                  /*tp_as_number*/
     647             :     0,                  /*tp_as_sequence*/
     648             :     0,                  /*tp_as_mapping*/
     649             :     0,                  /*tp_hash*/
     650             :     0,                  /*tp_call*/
     651             :     0,                  /*tp_str*/
     652             :     0,                  /*tp_getattro*/
     653             :     0,                  /*tp_setattro*/
     654             :     0,                  /*tp_as_buffer*/
     655             :     Py_TPFLAGS_DEFAULT, /*tp_flags*/
     656             :     0,                  /*tp_doc*/
     657             :     0,                  /*tp_traverse*/
     658             :     0,                  /*tp_clear*/
     659             :     0,                  /*tp_richcompare*/
     660             :     0,                  /*tp_weaklistoffset*/
     661             :     0,                  /*tp_iter*/
     662             :     0,                  /*tp_iternext*/
     663             :     SHA_methods,        /* tp_methods */
     664             :     SHA_members,        /* tp_members */
     665             :     SHA_getseters,      /* tp_getset */
     666             : };
     667             : 
     668             : 
     669             : /* The single module-level function: new() */
     670             : 
     671             : PyDoc_STRVAR(SHA512_new__doc__,
     672             : "Return a new SHA-512 hash object; optionally initialized with a string.");
     673             : 
     674             : static PyObject *
     675           0 : SHA512_new(PyObject *self, PyObject *args, PyObject *kwdict)
     676             : {
     677             :     static char *kwlist[] = {"string", NULL};
     678             :     SHAobject *new;
     679           0 :     PyObject *data_obj = NULL;
     680             :     Py_buffer buf;
     681             : 
     682           0 :     if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist,
     683             :                                      &data_obj)) {
     684           0 :         return NULL;
     685             :     }
     686             : 
     687           0 :     if (data_obj)
     688           0 :         GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf);
     689             : 
     690           0 :     if ((new = newSHA512object()) == NULL) {
     691           0 :         if (data_obj)
     692           0 :             PyBuffer_Release(&buf);
     693           0 :         return NULL;
     694             :     }
     695             : 
     696           0 :     sha512_init(new);
     697             : 
     698           0 :     if (PyErr_Occurred()) {
     699           0 :         Py_DECREF(new);
     700           0 :         if (data_obj)
     701           0 :             PyBuffer_Release(&buf);
     702           0 :         return NULL;
     703             :     }
     704           0 :     if (data_obj) {
     705           0 :         sha512_update(new, buf.buf, buf.len);
     706           0 :         PyBuffer_Release(&buf);
     707             :     }
     708             : 
     709           0 :     return (PyObject *)new;
     710             : }
     711             : 
     712             : PyDoc_STRVAR(SHA384_new__doc__,
     713             : "Return a new SHA-384 hash object; optionally initialized with a string.");
     714             : 
     715             : static PyObject *
     716           0 : SHA384_new(PyObject *self, PyObject *args, PyObject *kwdict)
     717             : {
     718             :     static char *kwlist[] = {"string", NULL};
     719             :     SHAobject *new;
     720           0 :     PyObject *data_obj = NULL;
     721             :     Py_buffer buf;
     722             : 
     723           0 :     if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist,
     724             :                                      &data_obj)) {
     725           0 :         return NULL;
     726             :     }
     727             : 
     728           0 :     if (data_obj)
     729           0 :         GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf);
     730             : 
     731           0 :     if ((new = newSHA384object()) == NULL) {
     732           0 :         if (data_obj)
     733           0 :             PyBuffer_Release(&buf);
     734           0 :         return NULL;
     735             :     }
     736             : 
     737           0 :     sha384_init(new);
     738             : 
     739           0 :     if (PyErr_Occurred()) {
     740           0 :         Py_DECREF(new);
     741           0 :         if (data_obj)
     742           0 :             PyBuffer_Release(&buf);
     743           0 :         return NULL;
     744             :     }
     745           0 :     if (data_obj) {
     746           0 :         sha512_update(new, buf.buf, buf.len);
     747           0 :         PyBuffer_Release(&buf);
     748             :     }
     749             : 
     750           0 :     return (PyObject *)new;
     751             : }
     752             : 
     753             : 
     754             : /* List of functions exported by this module */
     755             : 
     756             : static struct PyMethodDef SHA_functions[] = {
     757             :     {"sha512", (PyCFunction)SHA512_new, METH_VARARGS|METH_KEYWORDS, SHA512_new__doc__},
     758             :     {"sha384", (PyCFunction)SHA384_new, METH_VARARGS|METH_KEYWORDS, SHA384_new__doc__},
     759             :     {NULL,      NULL}            /* Sentinel */
     760             : };
     761             : 
     762             : 
     763             : /* Initialize this module. */
     764             : 
     765             : #define insint(n,v) { PyModule_AddIntConstant(m,n,v); }
     766             : 
     767             : 
     768             : static struct PyModuleDef _sha512module = {
     769             :         PyModuleDef_HEAD_INIT,
     770             :         "_sha512",
     771             :         NULL,
     772             :         -1,
     773             :         SHA_functions,
     774             :         NULL,
     775             :         NULL,
     776             :         NULL,
     777             :         NULL
     778             : };
     779             : 
     780             : PyMODINIT_FUNC
     781           0 : PyInit__sha512(void)
     782             : {
     783           0 :     Py_TYPE(&SHA384type) = &PyType_Type;
     784           0 :     if (PyType_Ready(&SHA384type) < 0)
     785           0 :         return NULL;
     786           0 :     Py_TYPE(&SHA512type) = &PyType_Type;
     787           0 :     if (PyType_Ready(&SHA512type) < 0)
     788           0 :         return NULL;
     789           0 :     return PyModule_Create(&_sha512module);
     790             : }
     791             : 
     792             : #endif

Generated by: LCOV version 1.10