17db96d56Sopenharmony_ci/* SHA512 module */ 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ci/* This module provides an interface to NIST's SHA-512 and SHA-384 Algorithms */ 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ci/* See below for information about the original code this module was 67db96d56Sopenharmony_ci based upon. Additional work performed by: 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_ci Andrew Kuchling (amk@amk.ca) 97db96d56Sopenharmony_ci Greg Stein (gstein@lyra.org) 107db96d56Sopenharmony_ci Trevor Perrin (trevp@trevp.net) 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ci Copyright (C) 2005-2007 Gregory P. Smith (greg@krypto.org) 137db96d56Sopenharmony_ci Licensed to PSF under a Contributor Agreement. 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ci*/ 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_ci/* SHA objects */ 187db96d56Sopenharmony_ci#ifndef Py_BUILD_CORE_BUILTIN 197db96d56Sopenharmony_ci# define Py_BUILD_CORE_MODULE 1 207db96d56Sopenharmony_ci#endif 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci#include "Python.h" 237db96d56Sopenharmony_ci#include "pycore_bitutils.h" // _Py_bswap64() 247db96d56Sopenharmony_ci#include "pycore_strhex.h" // _Py_strhex() 257db96d56Sopenharmony_ci#include "structmember.h" // PyMemberDef 267db96d56Sopenharmony_ci#include "hashlib.h" 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ci/*[clinic input] 297db96d56Sopenharmony_cimodule _sha512 307db96d56Sopenharmony_ciclass SHA512Type "SHAobject *" "&PyType_Type" 317db96d56Sopenharmony_ci[clinic start generated code]*/ 327db96d56Sopenharmony_ci/*[clinic end generated code: output=da39a3ee5e6b4b0d input=81a3ccde92bcfe8d]*/ 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci/* Some useful types */ 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_citypedef unsigned char SHA_BYTE; 377db96d56Sopenharmony_citypedef uint32_t SHA_INT32; /* 32-bit integer */ 387db96d56Sopenharmony_citypedef uint64_t SHA_INT64; /* 64-bit integer */ 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci/* The SHA block size and message digest sizes, in bytes */ 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ci#define SHA_BLOCKSIZE 128 437db96d56Sopenharmony_ci#define SHA_DIGESTSIZE 64 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_ci/* The structure for storing SHA info */ 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_citypedef struct { 487db96d56Sopenharmony_ci PyObject_HEAD 497db96d56Sopenharmony_ci SHA_INT64 digest[8]; /* Message digest */ 507db96d56Sopenharmony_ci SHA_INT32 count_lo, count_hi; /* 64-bit bit count */ 517db96d56Sopenharmony_ci SHA_BYTE data[SHA_BLOCKSIZE]; /* SHA data buffer */ 527db96d56Sopenharmony_ci int local; /* unprocessed amount in data */ 537db96d56Sopenharmony_ci int digestsize; 547db96d56Sopenharmony_ci} SHAobject; 557db96d56Sopenharmony_ci 567db96d56Sopenharmony_ci#include "clinic/sha512module.c.h" 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci/* When run on a little-endian CPU we need to perform byte reversal on an 597db96d56Sopenharmony_ci array of longwords. */ 607db96d56Sopenharmony_ci 617db96d56Sopenharmony_ci#if PY_LITTLE_ENDIAN 627db96d56Sopenharmony_cistatic void longReverse(SHA_INT64 *buffer, int byteCount) 637db96d56Sopenharmony_ci{ 647db96d56Sopenharmony_ci byteCount /= sizeof(*buffer); 657db96d56Sopenharmony_ci for (; byteCount--; buffer++) { 667db96d56Sopenharmony_ci *buffer = _Py_bswap64(*buffer); 677db96d56Sopenharmony_ci } 687db96d56Sopenharmony_ci} 697db96d56Sopenharmony_ci#endif 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_cistatic void SHAcopy(SHAobject *src, SHAobject *dest) 727db96d56Sopenharmony_ci{ 737db96d56Sopenharmony_ci dest->local = src->local; 747db96d56Sopenharmony_ci dest->digestsize = src->digestsize; 757db96d56Sopenharmony_ci dest->count_lo = src->count_lo; 767db96d56Sopenharmony_ci dest->count_hi = src->count_hi; 777db96d56Sopenharmony_ci memcpy(dest->digest, src->digest, sizeof(src->digest)); 787db96d56Sopenharmony_ci memcpy(dest->data, src->data, sizeof(src->data)); 797db96d56Sopenharmony_ci} 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_ci/* ------------------------------------------------------------------------ 837db96d56Sopenharmony_ci * 847db96d56Sopenharmony_ci * This code for the SHA-512 algorithm was noted as public domain. The 857db96d56Sopenharmony_ci * original headers are pasted below. 867db96d56Sopenharmony_ci * 877db96d56Sopenharmony_ci * Several changes have been made to make it more compatible with the 887db96d56Sopenharmony_ci * Python environment and desired interface. 897db96d56Sopenharmony_ci * 907db96d56Sopenharmony_ci */ 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_ci/* LibTomCrypt, modular cryptographic library -- Tom St Denis 937db96d56Sopenharmony_ci * 947db96d56Sopenharmony_ci * LibTomCrypt is a library that provides various cryptographic 957db96d56Sopenharmony_ci * algorithms in a highly modular and flexible manner. 967db96d56Sopenharmony_ci * 977db96d56Sopenharmony_ci * The library is free for all purposes without any express 987db96d56Sopenharmony_ci * guarantee it works. 997db96d56Sopenharmony_ci * 1007db96d56Sopenharmony_ci * Tom St Denis, tomstdenis@iahu.ca, https://www.libtom.net 1017db96d56Sopenharmony_ci */ 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_ci/* SHA512 by Tom St Denis */ 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_ci/* Various logical functions */ 1077db96d56Sopenharmony_ci#define ROR64(x, y) \ 1087db96d56Sopenharmony_ci ( ((((x) & 0xFFFFFFFFFFFFFFFFULL)>>((unsigned long long)(y) & 63)) | \ 1097db96d56Sopenharmony_ci ((x)<<((unsigned long long)(64-((y) & 63))))) & 0xFFFFFFFFFFFFFFFFULL) 1107db96d56Sopenharmony_ci#define Ch(x,y,z) (z ^ (x & (y ^ z))) 1117db96d56Sopenharmony_ci#define Maj(x,y,z) (((x | y) & z) | (x & y)) 1127db96d56Sopenharmony_ci#define S(x, n) ROR64((x),(n)) 1137db96d56Sopenharmony_ci#define R(x, n) (((x) & 0xFFFFFFFFFFFFFFFFULL) >> ((unsigned long long)n)) 1147db96d56Sopenharmony_ci#define Sigma0(x) (S(x, 28) ^ S(x, 34) ^ S(x, 39)) 1157db96d56Sopenharmony_ci#define Sigma1(x) (S(x, 14) ^ S(x, 18) ^ S(x, 41)) 1167db96d56Sopenharmony_ci#define Gamma0(x) (S(x, 1) ^ S(x, 8) ^ R(x, 7)) 1177db96d56Sopenharmony_ci#define Gamma1(x) (S(x, 19) ^ S(x, 61) ^ R(x, 6)) 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci 1207db96d56Sopenharmony_cistatic void 1217db96d56Sopenharmony_cisha512_transform(SHAobject *sha_info) 1227db96d56Sopenharmony_ci{ 1237db96d56Sopenharmony_ci int i; 1247db96d56Sopenharmony_ci SHA_INT64 S[8], W[80], t0, t1; 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci memcpy(W, sha_info->data, sizeof(sha_info->data)); 1277db96d56Sopenharmony_ci#if PY_LITTLE_ENDIAN 1287db96d56Sopenharmony_ci longReverse(W, (int)sizeof(sha_info->data)); 1297db96d56Sopenharmony_ci#endif 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci for (i = 16; i < 80; ++i) { 1327db96d56Sopenharmony_ci W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]; 1337db96d56Sopenharmony_ci } 1347db96d56Sopenharmony_ci for (i = 0; i < 8; ++i) { 1357db96d56Sopenharmony_ci S[i] = sha_info->digest[i]; 1367db96d56Sopenharmony_ci } 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci /* Compress */ 1397db96d56Sopenharmony_ci#define RND(a,b,c,d,e,f,g,h,i,ki) \ 1407db96d56Sopenharmony_ci t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i]; \ 1417db96d56Sopenharmony_ci t1 = Sigma0(a) + Maj(a, b, c); \ 1427db96d56Sopenharmony_ci d += t0; \ 1437db96d56Sopenharmony_ci h = t0 + t1; 1447db96d56Sopenharmony_ci 1457db96d56Sopenharmony_ci RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98d728ae22ULL); 1467db96d56Sopenharmony_ci RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x7137449123ef65cdULL); 1477db96d56Sopenharmony_ci RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,0xb5c0fbcfec4d3b2fULL); 1487db96d56Sopenharmony_ci RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,0xe9b5dba58189dbbcULL); 1497db96d56Sopenharmony_ci RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,0x3956c25bf348b538ULL); 1507db96d56Sopenharmony_ci RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,0x59f111f1b605d019ULL); 1517db96d56Sopenharmony_ci RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,0x923f82a4af194f9bULL); 1527db96d56Sopenharmony_ci RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,0xab1c5ed5da6d8118ULL); 1537db96d56Sopenharmony_ci RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,0xd807aa98a3030242ULL); 1547db96d56Sopenharmony_ci RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,0x12835b0145706fbeULL); 1557db96d56Sopenharmony_ci RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,0x243185be4ee4b28cULL); 1567db96d56Sopenharmony_ci RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,0x550c7dc3d5ffb4e2ULL); 1577db96d56Sopenharmony_ci RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,0x72be5d74f27b896fULL); 1587db96d56Sopenharmony_ci RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,0x80deb1fe3b1696b1ULL); 1597db96d56Sopenharmony_ci RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,0x9bdc06a725c71235ULL); 1607db96d56Sopenharmony_ci RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,0xc19bf174cf692694ULL); 1617db96d56Sopenharmony_ci RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,0xe49b69c19ef14ad2ULL); 1627db96d56Sopenharmony_ci RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,0xefbe4786384f25e3ULL); 1637db96d56Sopenharmony_ci RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,0x0fc19dc68b8cd5b5ULL); 1647db96d56Sopenharmony_ci RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,0x240ca1cc77ac9c65ULL); 1657db96d56Sopenharmony_ci RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,0x2de92c6f592b0275ULL); 1667db96d56Sopenharmony_ci RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,0x4a7484aa6ea6e483ULL); 1677db96d56Sopenharmony_ci RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,0x5cb0a9dcbd41fbd4ULL); 1687db96d56Sopenharmony_ci RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,0x76f988da831153b5ULL); 1697db96d56Sopenharmony_ci RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,0x983e5152ee66dfabULL); 1707db96d56Sopenharmony_ci RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,0xa831c66d2db43210ULL); 1717db96d56Sopenharmony_ci RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,0xb00327c898fb213fULL); 1727db96d56Sopenharmony_ci RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,0xbf597fc7beef0ee4ULL); 1737db96d56Sopenharmony_ci RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,0xc6e00bf33da88fc2ULL); 1747db96d56Sopenharmony_ci RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,0xd5a79147930aa725ULL); 1757db96d56Sopenharmony_ci RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,0x06ca6351e003826fULL); 1767db96d56Sopenharmony_ci RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,0x142929670a0e6e70ULL); 1777db96d56Sopenharmony_ci RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,0x27b70a8546d22ffcULL); 1787db96d56Sopenharmony_ci RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,0x2e1b21385c26c926ULL); 1797db96d56Sopenharmony_ci RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,0x4d2c6dfc5ac42aedULL); 1807db96d56Sopenharmony_ci RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,0x53380d139d95b3dfULL); 1817db96d56Sopenharmony_ci RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,0x650a73548baf63deULL); 1827db96d56Sopenharmony_ci RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,0x766a0abb3c77b2a8ULL); 1837db96d56Sopenharmony_ci RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,0x81c2c92e47edaee6ULL); 1847db96d56Sopenharmony_ci RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,0x92722c851482353bULL); 1857db96d56Sopenharmony_ci RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,0xa2bfe8a14cf10364ULL); 1867db96d56Sopenharmony_ci RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,0xa81a664bbc423001ULL); 1877db96d56Sopenharmony_ci RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,0xc24b8b70d0f89791ULL); 1887db96d56Sopenharmony_ci RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,0xc76c51a30654be30ULL); 1897db96d56Sopenharmony_ci RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,0xd192e819d6ef5218ULL); 1907db96d56Sopenharmony_ci RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,0xd69906245565a910ULL); 1917db96d56Sopenharmony_ci RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,0xf40e35855771202aULL); 1927db96d56Sopenharmony_ci RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,0x106aa07032bbd1b8ULL); 1937db96d56Sopenharmony_ci RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,0x19a4c116b8d2d0c8ULL); 1947db96d56Sopenharmony_ci RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,0x1e376c085141ab53ULL); 1957db96d56Sopenharmony_ci RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,0x2748774cdf8eeb99ULL); 1967db96d56Sopenharmony_ci RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,0x34b0bcb5e19b48a8ULL); 1977db96d56Sopenharmony_ci RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,0x391c0cb3c5c95a63ULL); 1987db96d56Sopenharmony_ci RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,0x4ed8aa4ae3418acbULL); 1997db96d56Sopenharmony_ci RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,0x5b9cca4f7763e373ULL); 2007db96d56Sopenharmony_ci RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,0x682e6ff3d6b2b8a3ULL); 2017db96d56Sopenharmony_ci RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,0x748f82ee5defb2fcULL); 2027db96d56Sopenharmony_ci RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,0x78a5636f43172f60ULL); 2037db96d56Sopenharmony_ci RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,0x84c87814a1f0ab72ULL); 2047db96d56Sopenharmony_ci RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,0x8cc702081a6439ecULL); 2057db96d56Sopenharmony_ci RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,0x90befffa23631e28ULL); 2067db96d56Sopenharmony_ci RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,0xa4506cebde82bde9ULL); 2077db96d56Sopenharmony_ci RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,0xbef9a3f7b2c67915ULL); 2087db96d56Sopenharmony_ci RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,0xc67178f2e372532bULL); 2097db96d56Sopenharmony_ci RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],64,0xca273eceea26619cULL); 2107db96d56Sopenharmony_ci RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],65,0xd186b8c721c0c207ULL); 2117db96d56Sopenharmony_ci RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],66,0xeada7dd6cde0eb1eULL); 2127db96d56Sopenharmony_ci RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],67,0xf57d4f7fee6ed178ULL); 2137db96d56Sopenharmony_ci RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],68,0x06f067aa72176fbaULL); 2147db96d56Sopenharmony_ci RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],69,0x0a637dc5a2c898a6ULL); 2157db96d56Sopenharmony_ci RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],70,0x113f9804bef90daeULL); 2167db96d56Sopenharmony_ci RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],71,0x1b710b35131c471bULL); 2177db96d56Sopenharmony_ci RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],72,0x28db77f523047d84ULL); 2187db96d56Sopenharmony_ci RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],73,0x32caab7b40c72493ULL); 2197db96d56Sopenharmony_ci RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],74,0x3c9ebe0a15c9bebcULL); 2207db96d56Sopenharmony_ci RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],75,0x431d67c49c100d4cULL); 2217db96d56Sopenharmony_ci RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],76,0x4cc5d4becb3e42b6ULL); 2227db96d56Sopenharmony_ci RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],77,0x597f299cfc657e2aULL); 2237db96d56Sopenharmony_ci RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],78,0x5fcb6fab3ad6faecULL); 2247db96d56Sopenharmony_ci RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],79,0x6c44198c4a475817ULL); 2257db96d56Sopenharmony_ci 2267db96d56Sopenharmony_ci#undef RND 2277db96d56Sopenharmony_ci 2287db96d56Sopenharmony_ci /* feedback */ 2297db96d56Sopenharmony_ci for (i = 0; i < 8; i++) { 2307db96d56Sopenharmony_ci sha_info->digest[i] = sha_info->digest[i] + S[i]; 2317db96d56Sopenharmony_ci } 2327db96d56Sopenharmony_ci 2337db96d56Sopenharmony_ci} 2347db96d56Sopenharmony_ci 2357db96d56Sopenharmony_ci 2367db96d56Sopenharmony_ci 2377db96d56Sopenharmony_ci/* initialize the SHA digest */ 2387db96d56Sopenharmony_ci 2397db96d56Sopenharmony_cistatic void 2407db96d56Sopenharmony_cisha512_init(SHAobject *sha_info) 2417db96d56Sopenharmony_ci{ 2427db96d56Sopenharmony_ci sha_info->digest[0] = Py_ULL(0x6a09e667f3bcc908); 2437db96d56Sopenharmony_ci sha_info->digest[1] = Py_ULL(0xbb67ae8584caa73b); 2447db96d56Sopenharmony_ci sha_info->digest[2] = Py_ULL(0x3c6ef372fe94f82b); 2457db96d56Sopenharmony_ci sha_info->digest[3] = Py_ULL(0xa54ff53a5f1d36f1); 2467db96d56Sopenharmony_ci sha_info->digest[4] = Py_ULL(0x510e527fade682d1); 2477db96d56Sopenharmony_ci sha_info->digest[5] = Py_ULL(0x9b05688c2b3e6c1f); 2487db96d56Sopenharmony_ci sha_info->digest[6] = Py_ULL(0x1f83d9abfb41bd6b); 2497db96d56Sopenharmony_ci sha_info->digest[7] = Py_ULL(0x5be0cd19137e2179); 2507db96d56Sopenharmony_ci sha_info->count_lo = 0L; 2517db96d56Sopenharmony_ci sha_info->count_hi = 0L; 2527db96d56Sopenharmony_ci sha_info->local = 0; 2537db96d56Sopenharmony_ci sha_info->digestsize = 64; 2547db96d56Sopenharmony_ci} 2557db96d56Sopenharmony_ci 2567db96d56Sopenharmony_cistatic void 2577db96d56Sopenharmony_cisha384_init(SHAobject *sha_info) 2587db96d56Sopenharmony_ci{ 2597db96d56Sopenharmony_ci sha_info->digest[0] = Py_ULL(0xcbbb9d5dc1059ed8); 2607db96d56Sopenharmony_ci sha_info->digest[1] = Py_ULL(0x629a292a367cd507); 2617db96d56Sopenharmony_ci sha_info->digest[2] = Py_ULL(0x9159015a3070dd17); 2627db96d56Sopenharmony_ci sha_info->digest[3] = Py_ULL(0x152fecd8f70e5939); 2637db96d56Sopenharmony_ci sha_info->digest[4] = Py_ULL(0x67332667ffc00b31); 2647db96d56Sopenharmony_ci sha_info->digest[5] = Py_ULL(0x8eb44a8768581511); 2657db96d56Sopenharmony_ci sha_info->digest[6] = Py_ULL(0xdb0c2e0d64f98fa7); 2667db96d56Sopenharmony_ci sha_info->digest[7] = Py_ULL(0x47b5481dbefa4fa4); 2677db96d56Sopenharmony_ci sha_info->count_lo = 0L; 2687db96d56Sopenharmony_ci sha_info->count_hi = 0L; 2697db96d56Sopenharmony_ci sha_info->local = 0; 2707db96d56Sopenharmony_ci sha_info->digestsize = 48; 2717db96d56Sopenharmony_ci} 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci 2747db96d56Sopenharmony_ci/* update the SHA digest */ 2757db96d56Sopenharmony_ci 2767db96d56Sopenharmony_cistatic void 2777db96d56Sopenharmony_cisha512_update(SHAobject *sha_info, SHA_BYTE *buffer, Py_ssize_t count) 2787db96d56Sopenharmony_ci{ 2797db96d56Sopenharmony_ci Py_ssize_t i; 2807db96d56Sopenharmony_ci SHA_INT32 clo; 2817db96d56Sopenharmony_ci 2827db96d56Sopenharmony_ci clo = sha_info->count_lo + ((SHA_INT32) count << 3); 2837db96d56Sopenharmony_ci if (clo < sha_info->count_lo) { 2847db96d56Sopenharmony_ci ++sha_info->count_hi; 2857db96d56Sopenharmony_ci } 2867db96d56Sopenharmony_ci sha_info->count_lo = clo; 2877db96d56Sopenharmony_ci sha_info->count_hi += (SHA_INT32) count >> 29; 2887db96d56Sopenharmony_ci if (sha_info->local) { 2897db96d56Sopenharmony_ci i = SHA_BLOCKSIZE - sha_info->local; 2907db96d56Sopenharmony_ci if (i > count) { 2917db96d56Sopenharmony_ci i = count; 2927db96d56Sopenharmony_ci } 2937db96d56Sopenharmony_ci memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i); 2947db96d56Sopenharmony_ci count -= i; 2957db96d56Sopenharmony_ci buffer += i; 2967db96d56Sopenharmony_ci sha_info->local += (int)i; 2977db96d56Sopenharmony_ci if (sha_info->local == SHA_BLOCKSIZE) { 2987db96d56Sopenharmony_ci sha512_transform(sha_info); 2997db96d56Sopenharmony_ci } 3007db96d56Sopenharmony_ci else { 3017db96d56Sopenharmony_ci return; 3027db96d56Sopenharmony_ci } 3037db96d56Sopenharmony_ci } 3047db96d56Sopenharmony_ci while (count >= SHA_BLOCKSIZE) { 3057db96d56Sopenharmony_ci memcpy(sha_info->data, buffer, SHA_BLOCKSIZE); 3067db96d56Sopenharmony_ci buffer += SHA_BLOCKSIZE; 3077db96d56Sopenharmony_ci count -= SHA_BLOCKSIZE; 3087db96d56Sopenharmony_ci sha512_transform(sha_info); 3097db96d56Sopenharmony_ci } 3107db96d56Sopenharmony_ci memcpy(sha_info->data, buffer, count); 3117db96d56Sopenharmony_ci sha_info->local = (int)count; 3127db96d56Sopenharmony_ci} 3137db96d56Sopenharmony_ci 3147db96d56Sopenharmony_ci/* finish computing the SHA digest */ 3157db96d56Sopenharmony_ci 3167db96d56Sopenharmony_cistatic void 3177db96d56Sopenharmony_cisha512_final(unsigned char digest[SHA_DIGESTSIZE], SHAobject *sha_info) 3187db96d56Sopenharmony_ci{ 3197db96d56Sopenharmony_ci int count; 3207db96d56Sopenharmony_ci SHA_INT32 lo_bit_count, hi_bit_count; 3217db96d56Sopenharmony_ci 3227db96d56Sopenharmony_ci lo_bit_count = sha_info->count_lo; 3237db96d56Sopenharmony_ci hi_bit_count = sha_info->count_hi; 3247db96d56Sopenharmony_ci count = (int) ((lo_bit_count >> 3) & 0x7f); 3257db96d56Sopenharmony_ci ((SHA_BYTE *) sha_info->data)[count++] = 0x80; 3267db96d56Sopenharmony_ci if (count > SHA_BLOCKSIZE - 16) { 3277db96d56Sopenharmony_ci memset(((SHA_BYTE *) sha_info->data) + count, 0, 3287db96d56Sopenharmony_ci SHA_BLOCKSIZE - count); 3297db96d56Sopenharmony_ci sha512_transform(sha_info); 3307db96d56Sopenharmony_ci memset((SHA_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 16); 3317db96d56Sopenharmony_ci } 3327db96d56Sopenharmony_ci else { 3337db96d56Sopenharmony_ci memset(((SHA_BYTE *) sha_info->data) + count, 0, 3347db96d56Sopenharmony_ci SHA_BLOCKSIZE - 16 - count); 3357db96d56Sopenharmony_ci } 3367db96d56Sopenharmony_ci 3377db96d56Sopenharmony_ci /* GJS: note that we add the hi/lo in big-endian. sha512_transform will 3387db96d56Sopenharmony_ci swap these values into host-order. */ 3397db96d56Sopenharmony_ci sha_info->data[112] = 0; 3407db96d56Sopenharmony_ci sha_info->data[113] = 0; 3417db96d56Sopenharmony_ci sha_info->data[114] = 0; 3427db96d56Sopenharmony_ci sha_info->data[115] = 0; 3437db96d56Sopenharmony_ci sha_info->data[116] = 0; 3447db96d56Sopenharmony_ci sha_info->data[117] = 0; 3457db96d56Sopenharmony_ci sha_info->data[118] = 0; 3467db96d56Sopenharmony_ci sha_info->data[119] = 0; 3477db96d56Sopenharmony_ci sha_info->data[120] = (hi_bit_count >> 24) & 0xff; 3487db96d56Sopenharmony_ci sha_info->data[121] = (hi_bit_count >> 16) & 0xff; 3497db96d56Sopenharmony_ci sha_info->data[122] = (hi_bit_count >> 8) & 0xff; 3507db96d56Sopenharmony_ci sha_info->data[123] = (hi_bit_count >> 0) & 0xff; 3517db96d56Sopenharmony_ci sha_info->data[124] = (lo_bit_count >> 24) & 0xff; 3527db96d56Sopenharmony_ci sha_info->data[125] = (lo_bit_count >> 16) & 0xff; 3537db96d56Sopenharmony_ci sha_info->data[126] = (lo_bit_count >> 8) & 0xff; 3547db96d56Sopenharmony_ci sha_info->data[127] = (lo_bit_count >> 0) & 0xff; 3557db96d56Sopenharmony_ci sha512_transform(sha_info); 3567db96d56Sopenharmony_ci digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 56) & 0xff); 3577db96d56Sopenharmony_ci digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 48) & 0xff); 3587db96d56Sopenharmony_ci digest[ 2] = (unsigned char) ((sha_info->digest[0] >> 40) & 0xff); 3597db96d56Sopenharmony_ci digest[ 3] = (unsigned char) ((sha_info->digest[0] >> 32) & 0xff); 3607db96d56Sopenharmony_ci digest[ 4] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff); 3617db96d56Sopenharmony_ci digest[ 5] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff); 3627db96d56Sopenharmony_ci digest[ 6] = (unsigned char) ((sha_info->digest[0] >> 8) & 0xff); 3637db96d56Sopenharmony_ci digest[ 7] = (unsigned char) ((sha_info->digest[0] ) & 0xff); 3647db96d56Sopenharmony_ci digest[ 8] = (unsigned char) ((sha_info->digest[1] >> 56) & 0xff); 3657db96d56Sopenharmony_ci digest[ 9] = (unsigned char) ((sha_info->digest[1] >> 48) & 0xff); 3667db96d56Sopenharmony_ci digest[10] = (unsigned char) ((sha_info->digest[1] >> 40) & 0xff); 3677db96d56Sopenharmony_ci digest[11] = (unsigned char) ((sha_info->digest[1] >> 32) & 0xff); 3687db96d56Sopenharmony_ci digest[12] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff); 3697db96d56Sopenharmony_ci digest[13] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff); 3707db96d56Sopenharmony_ci digest[14] = (unsigned char) ((sha_info->digest[1] >> 8) & 0xff); 3717db96d56Sopenharmony_ci digest[15] = (unsigned char) ((sha_info->digest[1] ) & 0xff); 3727db96d56Sopenharmony_ci digest[16] = (unsigned char) ((sha_info->digest[2] >> 56) & 0xff); 3737db96d56Sopenharmony_ci digest[17] = (unsigned char) ((sha_info->digest[2] >> 48) & 0xff); 3747db96d56Sopenharmony_ci digest[18] = (unsigned char) ((sha_info->digest[2] >> 40) & 0xff); 3757db96d56Sopenharmony_ci digest[19] = (unsigned char) ((sha_info->digest[2] >> 32) & 0xff); 3767db96d56Sopenharmony_ci digest[20] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff); 3777db96d56Sopenharmony_ci digest[21] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff); 3787db96d56Sopenharmony_ci digest[22] = (unsigned char) ((sha_info->digest[2] >> 8) & 0xff); 3797db96d56Sopenharmony_ci digest[23] = (unsigned char) ((sha_info->digest[2] ) & 0xff); 3807db96d56Sopenharmony_ci digest[24] = (unsigned char) ((sha_info->digest[3] >> 56) & 0xff); 3817db96d56Sopenharmony_ci digest[25] = (unsigned char) ((sha_info->digest[3] >> 48) & 0xff); 3827db96d56Sopenharmony_ci digest[26] = (unsigned char) ((sha_info->digest[3] >> 40) & 0xff); 3837db96d56Sopenharmony_ci digest[27] = (unsigned char) ((sha_info->digest[3] >> 32) & 0xff); 3847db96d56Sopenharmony_ci digest[28] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff); 3857db96d56Sopenharmony_ci digest[29] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff); 3867db96d56Sopenharmony_ci digest[30] = (unsigned char) ((sha_info->digest[3] >> 8) & 0xff); 3877db96d56Sopenharmony_ci digest[31] = (unsigned char) ((sha_info->digest[3] ) & 0xff); 3887db96d56Sopenharmony_ci digest[32] = (unsigned char) ((sha_info->digest[4] >> 56) & 0xff); 3897db96d56Sopenharmony_ci digest[33] = (unsigned char) ((sha_info->digest[4] >> 48) & 0xff); 3907db96d56Sopenharmony_ci digest[34] = (unsigned char) ((sha_info->digest[4] >> 40) & 0xff); 3917db96d56Sopenharmony_ci digest[35] = (unsigned char) ((sha_info->digest[4] >> 32) & 0xff); 3927db96d56Sopenharmony_ci digest[36] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff); 3937db96d56Sopenharmony_ci digest[37] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff); 3947db96d56Sopenharmony_ci digest[38] = (unsigned char) ((sha_info->digest[4] >> 8) & 0xff); 3957db96d56Sopenharmony_ci digest[39] = (unsigned char) ((sha_info->digest[4] ) & 0xff); 3967db96d56Sopenharmony_ci digest[40] = (unsigned char) ((sha_info->digest[5] >> 56) & 0xff); 3977db96d56Sopenharmony_ci digest[41] = (unsigned char) ((sha_info->digest[5] >> 48) & 0xff); 3987db96d56Sopenharmony_ci digest[42] = (unsigned char) ((sha_info->digest[5] >> 40) & 0xff); 3997db96d56Sopenharmony_ci digest[43] = (unsigned char) ((sha_info->digest[5] >> 32) & 0xff); 4007db96d56Sopenharmony_ci digest[44] = (unsigned char) ((sha_info->digest[5] >> 24) & 0xff); 4017db96d56Sopenharmony_ci digest[45] = (unsigned char) ((sha_info->digest[5] >> 16) & 0xff); 4027db96d56Sopenharmony_ci digest[46] = (unsigned char) ((sha_info->digest[5] >> 8) & 0xff); 4037db96d56Sopenharmony_ci digest[47] = (unsigned char) ((sha_info->digest[5] ) & 0xff); 4047db96d56Sopenharmony_ci digest[48] = (unsigned char) ((sha_info->digest[6] >> 56) & 0xff); 4057db96d56Sopenharmony_ci digest[49] = (unsigned char) ((sha_info->digest[6] >> 48) & 0xff); 4067db96d56Sopenharmony_ci digest[50] = (unsigned char) ((sha_info->digest[6] >> 40) & 0xff); 4077db96d56Sopenharmony_ci digest[51] = (unsigned char) ((sha_info->digest[6] >> 32) & 0xff); 4087db96d56Sopenharmony_ci digest[52] = (unsigned char) ((sha_info->digest[6] >> 24) & 0xff); 4097db96d56Sopenharmony_ci digest[53] = (unsigned char) ((sha_info->digest[6] >> 16) & 0xff); 4107db96d56Sopenharmony_ci digest[54] = (unsigned char) ((sha_info->digest[6] >> 8) & 0xff); 4117db96d56Sopenharmony_ci digest[55] = (unsigned char) ((sha_info->digest[6] ) & 0xff); 4127db96d56Sopenharmony_ci digest[56] = (unsigned char) ((sha_info->digest[7] >> 56) & 0xff); 4137db96d56Sopenharmony_ci digest[57] = (unsigned char) ((sha_info->digest[7] >> 48) & 0xff); 4147db96d56Sopenharmony_ci digest[58] = (unsigned char) ((sha_info->digest[7] >> 40) & 0xff); 4157db96d56Sopenharmony_ci digest[59] = (unsigned char) ((sha_info->digest[7] >> 32) & 0xff); 4167db96d56Sopenharmony_ci digest[60] = (unsigned char) ((sha_info->digest[7] >> 24) & 0xff); 4177db96d56Sopenharmony_ci digest[61] = (unsigned char) ((sha_info->digest[7] >> 16) & 0xff); 4187db96d56Sopenharmony_ci digest[62] = (unsigned char) ((sha_info->digest[7] >> 8) & 0xff); 4197db96d56Sopenharmony_ci digest[63] = (unsigned char) ((sha_info->digest[7] ) & 0xff); 4207db96d56Sopenharmony_ci} 4217db96d56Sopenharmony_ci 4227db96d56Sopenharmony_ci/* 4237db96d56Sopenharmony_ci * End of copied SHA code. 4247db96d56Sopenharmony_ci * 4257db96d56Sopenharmony_ci * ------------------------------------------------------------------------ 4267db96d56Sopenharmony_ci */ 4277db96d56Sopenharmony_ci 4287db96d56Sopenharmony_citypedef struct { 4297db96d56Sopenharmony_ci PyTypeObject* sha384_type; 4307db96d56Sopenharmony_ci PyTypeObject* sha512_type; 4317db96d56Sopenharmony_ci} SHA512State; 4327db96d56Sopenharmony_ci 4337db96d56Sopenharmony_cistatic inline SHA512State* 4347db96d56Sopenharmony_cisha512_get_state(PyObject *module) 4357db96d56Sopenharmony_ci{ 4367db96d56Sopenharmony_ci void *state = PyModule_GetState(module); 4377db96d56Sopenharmony_ci assert(state != NULL); 4387db96d56Sopenharmony_ci return (SHA512State *)state; 4397db96d56Sopenharmony_ci} 4407db96d56Sopenharmony_ci 4417db96d56Sopenharmony_cistatic SHAobject * 4427db96d56Sopenharmony_cinewSHA384object(SHA512State *st) 4437db96d56Sopenharmony_ci{ 4447db96d56Sopenharmony_ci SHAobject *sha = (SHAobject *)PyObject_GC_New(SHAobject, st->sha384_type); 4457db96d56Sopenharmony_ci PyObject_GC_Track(sha); 4467db96d56Sopenharmony_ci return sha; 4477db96d56Sopenharmony_ci} 4487db96d56Sopenharmony_ci 4497db96d56Sopenharmony_cistatic SHAobject * 4507db96d56Sopenharmony_cinewSHA512object(SHA512State *st) 4517db96d56Sopenharmony_ci{ 4527db96d56Sopenharmony_ci SHAobject *sha = (SHAobject *)PyObject_GC_New(SHAobject, st->sha512_type); 4537db96d56Sopenharmony_ci PyObject_GC_Track(sha); 4547db96d56Sopenharmony_ci return sha; 4557db96d56Sopenharmony_ci} 4567db96d56Sopenharmony_ci 4577db96d56Sopenharmony_ci/* Internal methods for a hash object */ 4587db96d56Sopenharmony_cistatic int 4597db96d56Sopenharmony_ciSHA_traverse(PyObject *ptr, visitproc visit, void *arg) 4607db96d56Sopenharmony_ci{ 4617db96d56Sopenharmony_ci Py_VISIT(Py_TYPE(ptr)); 4627db96d56Sopenharmony_ci return 0; 4637db96d56Sopenharmony_ci} 4647db96d56Sopenharmony_ci 4657db96d56Sopenharmony_cistatic void 4667db96d56Sopenharmony_ciSHA512_dealloc(PyObject *ptr) 4677db96d56Sopenharmony_ci{ 4687db96d56Sopenharmony_ci PyTypeObject *tp = Py_TYPE(ptr); 4697db96d56Sopenharmony_ci PyObject_GC_UnTrack(ptr); 4707db96d56Sopenharmony_ci PyObject_GC_Del(ptr); 4717db96d56Sopenharmony_ci Py_DECREF(tp); 4727db96d56Sopenharmony_ci} 4737db96d56Sopenharmony_ci 4747db96d56Sopenharmony_ci 4757db96d56Sopenharmony_ci/* External methods for a hash object */ 4767db96d56Sopenharmony_ci 4777db96d56Sopenharmony_ci/*[clinic input] 4787db96d56Sopenharmony_ciSHA512Type.copy 4797db96d56Sopenharmony_ci 4807db96d56Sopenharmony_ci cls: defining_class 4817db96d56Sopenharmony_ci 4827db96d56Sopenharmony_ciReturn a copy of the hash object. 4837db96d56Sopenharmony_ci[clinic start generated code]*/ 4847db96d56Sopenharmony_ci 4857db96d56Sopenharmony_cistatic PyObject * 4867db96d56Sopenharmony_ciSHA512Type_copy_impl(SHAobject *self, PyTypeObject *cls) 4877db96d56Sopenharmony_ci/*[clinic end generated code: output=85ea5b47837a08e6 input=f673a18f66527c90]*/ 4887db96d56Sopenharmony_ci{ 4897db96d56Sopenharmony_ci SHAobject *newobj; 4907db96d56Sopenharmony_ci SHA512State *st = PyType_GetModuleState(cls); 4917db96d56Sopenharmony_ci 4927db96d56Sopenharmony_ci if (Py_IS_TYPE((PyObject*)self, st->sha512_type)) { 4937db96d56Sopenharmony_ci if ( (newobj = newSHA512object(st))==NULL) { 4947db96d56Sopenharmony_ci return NULL; 4957db96d56Sopenharmony_ci } 4967db96d56Sopenharmony_ci } 4977db96d56Sopenharmony_ci else { 4987db96d56Sopenharmony_ci if ( (newobj = newSHA384object(st))==NULL) { 4997db96d56Sopenharmony_ci return NULL; 5007db96d56Sopenharmony_ci } 5017db96d56Sopenharmony_ci } 5027db96d56Sopenharmony_ci 5037db96d56Sopenharmony_ci SHAcopy(self, newobj); 5047db96d56Sopenharmony_ci return (PyObject *)newobj; 5057db96d56Sopenharmony_ci} 5067db96d56Sopenharmony_ci 5077db96d56Sopenharmony_ci/*[clinic input] 5087db96d56Sopenharmony_ciSHA512Type.digest 5097db96d56Sopenharmony_ci 5107db96d56Sopenharmony_ciReturn the digest value as a bytes object. 5117db96d56Sopenharmony_ci[clinic start generated code]*/ 5127db96d56Sopenharmony_ci 5137db96d56Sopenharmony_cistatic PyObject * 5147db96d56Sopenharmony_ciSHA512Type_digest_impl(SHAobject *self) 5157db96d56Sopenharmony_ci/*[clinic end generated code: output=1080bbeeef7dde1b input=f6470dd359071f4b]*/ 5167db96d56Sopenharmony_ci{ 5177db96d56Sopenharmony_ci unsigned char digest[SHA_DIGESTSIZE]; 5187db96d56Sopenharmony_ci SHAobject temp; 5197db96d56Sopenharmony_ci 5207db96d56Sopenharmony_ci SHAcopy(self, &temp); 5217db96d56Sopenharmony_ci sha512_final(digest, &temp); 5227db96d56Sopenharmony_ci return PyBytes_FromStringAndSize((const char *)digest, self->digestsize); 5237db96d56Sopenharmony_ci} 5247db96d56Sopenharmony_ci 5257db96d56Sopenharmony_ci/*[clinic input] 5267db96d56Sopenharmony_ciSHA512Type.hexdigest 5277db96d56Sopenharmony_ci 5287db96d56Sopenharmony_ciReturn the digest value as a string of hexadecimal digits. 5297db96d56Sopenharmony_ci[clinic start generated code]*/ 5307db96d56Sopenharmony_ci 5317db96d56Sopenharmony_cistatic PyObject * 5327db96d56Sopenharmony_ciSHA512Type_hexdigest_impl(SHAobject *self) 5337db96d56Sopenharmony_ci/*[clinic end generated code: output=7373305b8601e18b input=498b877b25cbe0a2]*/ 5347db96d56Sopenharmony_ci{ 5357db96d56Sopenharmony_ci unsigned char digest[SHA_DIGESTSIZE]; 5367db96d56Sopenharmony_ci SHAobject temp; 5377db96d56Sopenharmony_ci 5387db96d56Sopenharmony_ci /* Get the raw (binary) digest value */ 5397db96d56Sopenharmony_ci SHAcopy(self, &temp); 5407db96d56Sopenharmony_ci sha512_final(digest, &temp); 5417db96d56Sopenharmony_ci 5427db96d56Sopenharmony_ci return _Py_strhex((const char *)digest, self->digestsize); 5437db96d56Sopenharmony_ci} 5447db96d56Sopenharmony_ci 5457db96d56Sopenharmony_ci/*[clinic input] 5467db96d56Sopenharmony_ciSHA512Type.update 5477db96d56Sopenharmony_ci 5487db96d56Sopenharmony_ci obj: object 5497db96d56Sopenharmony_ci / 5507db96d56Sopenharmony_ci 5517db96d56Sopenharmony_ciUpdate this hash object's state with the provided string. 5527db96d56Sopenharmony_ci[clinic start generated code]*/ 5537db96d56Sopenharmony_ci 5547db96d56Sopenharmony_cistatic PyObject * 5557db96d56Sopenharmony_ciSHA512Type_update(SHAobject *self, PyObject *obj) 5567db96d56Sopenharmony_ci/*[clinic end generated code: output=1cf333e73995a79e input=ded2b46656566283]*/ 5577db96d56Sopenharmony_ci{ 5587db96d56Sopenharmony_ci Py_buffer buf; 5597db96d56Sopenharmony_ci 5607db96d56Sopenharmony_ci GET_BUFFER_VIEW_OR_ERROUT(obj, &buf); 5617db96d56Sopenharmony_ci 5627db96d56Sopenharmony_ci sha512_update(self, buf.buf, buf.len); 5637db96d56Sopenharmony_ci 5647db96d56Sopenharmony_ci PyBuffer_Release(&buf); 5657db96d56Sopenharmony_ci Py_RETURN_NONE; 5667db96d56Sopenharmony_ci} 5677db96d56Sopenharmony_ci 5687db96d56Sopenharmony_cistatic PyMethodDef SHA_methods[] = { 5697db96d56Sopenharmony_ci SHA512TYPE_COPY_METHODDEF 5707db96d56Sopenharmony_ci SHA512TYPE_DIGEST_METHODDEF 5717db96d56Sopenharmony_ci SHA512TYPE_HEXDIGEST_METHODDEF 5727db96d56Sopenharmony_ci SHA512TYPE_UPDATE_METHODDEF 5737db96d56Sopenharmony_ci {NULL, NULL} /* sentinel */ 5747db96d56Sopenharmony_ci}; 5757db96d56Sopenharmony_ci 5767db96d56Sopenharmony_cistatic PyObject * 5777db96d56Sopenharmony_ciSHA512_get_block_size(PyObject *self, void *closure) 5787db96d56Sopenharmony_ci{ 5797db96d56Sopenharmony_ci return PyLong_FromLong(SHA_BLOCKSIZE); 5807db96d56Sopenharmony_ci} 5817db96d56Sopenharmony_ci 5827db96d56Sopenharmony_cistatic PyObject * 5837db96d56Sopenharmony_ciSHA512_get_name(PyObject *self, void *closure) 5847db96d56Sopenharmony_ci{ 5857db96d56Sopenharmony_ci if (((SHAobject *)self)->digestsize == 64) 5867db96d56Sopenharmony_ci return PyUnicode_FromStringAndSize("sha512", 6); 5877db96d56Sopenharmony_ci else 5887db96d56Sopenharmony_ci return PyUnicode_FromStringAndSize("sha384", 6); 5897db96d56Sopenharmony_ci} 5907db96d56Sopenharmony_ci 5917db96d56Sopenharmony_cistatic PyGetSetDef SHA_getseters[] = { 5927db96d56Sopenharmony_ci {"block_size", 5937db96d56Sopenharmony_ci (getter)SHA512_get_block_size, NULL, 5947db96d56Sopenharmony_ci NULL, 5957db96d56Sopenharmony_ci NULL}, 5967db96d56Sopenharmony_ci {"name", 5977db96d56Sopenharmony_ci (getter)SHA512_get_name, NULL, 5987db96d56Sopenharmony_ci NULL, 5997db96d56Sopenharmony_ci NULL}, 6007db96d56Sopenharmony_ci {NULL} /* Sentinel */ 6017db96d56Sopenharmony_ci}; 6027db96d56Sopenharmony_ci 6037db96d56Sopenharmony_cistatic PyMemberDef SHA_members[] = { 6047db96d56Sopenharmony_ci {"digest_size", T_INT, offsetof(SHAobject, digestsize), READONLY, NULL}, 6057db96d56Sopenharmony_ci {NULL} /* Sentinel */ 6067db96d56Sopenharmony_ci}; 6077db96d56Sopenharmony_ci 6087db96d56Sopenharmony_cistatic PyType_Slot sha512_sha384_type_slots[] = { 6097db96d56Sopenharmony_ci {Py_tp_dealloc, SHA512_dealloc}, 6107db96d56Sopenharmony_ci {Py_tp_methods, SHA_methods}, 6117db96d56Sopenharmony_ci {Py_tp_members, SHA_members}, 6127db96d56Sopenharmony_ci {Py_tp_getset, SHA_getseters}, 6137db96d56Sopenharmony_ci {Py_tp_traverse, SHA_traverse}, 6147db96d56Sopenharmony_ci {0,0} 6157db96d56Sopenharmony_ci}; 6167db96d56Sopenharmony_ci 6177db96d56Sopenharmony_cistatic PyType_Spec sha512_sha384_type_spec = { 6187db96d56Sopenharmony_ci .name = "_sha512.sha384", 6197db96d56Sopenharmony_ci .basicsize = sizeof(SHAobject), 6207db96d56Sopenharmony_ci .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | 6217db96d56Sopenharmony_ci Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC), 6227db96d56Sopenharmony_ci .slots = sha512_sha384_type_slots 6237db96d56Sopenharmony_ci}; 6247db96d56Sopenharmony_ci 6257db96d56Sopenharmony_cistatic PyType_Slot sha512_sha512_type_slots[] = { 6267db96d56Sopenharmony_ci {Py_tp_dealloc, SHA512_dealloc}, 6277db96d56Sopenharmony_ci {Py_tp_methods, SHA_methods}, 6287db96d56Sopenharmony_ci {Py_tp_members, SHA_members}, 6297db96d56Sopenharmony_ci {Py_tp_getset, SHA_getseters}, 6307db96d56Sopenharmony_ci {Py_tp_traverse, SHA_traverse}, 6317db96d56Sopenharmony_ci {0,0} 6327db96d56Sopenharmony_ci}; 6337db96d56Sopenharmony_ci 6347db96d56Sopenharmony_ci// Using PyType_GetModuleState() on this type is safe since 6357db96d56Sopenharmony_ci// it cannot be subclassed: it does not have the Py_TPFLAGS_BASETYPE flag. 6367db96d56Sopenharmony_cistatic PyType_Spec sha512_sha512_type_spec = { 6377db96d56Sopenharmony_ci .name = "_sha512.sha512", 6387db96d56Sopenharmony_ci .basicsize = sizeof(SHAobject), 6397db96d56Sopenharmony_ci .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION | 6407db96d56Sopenharmony_ci Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC), 6417db96d56Sopenharmony_ci .slots = sha512_sha512_type_slots 6427db96d56Sopenharmony_ci}; 6437db96d56Sopenharmony_ci 6447db96d56Sopenharmony_ci/* The single module-level function: new() */ 6457db96d56Sopenharmony_ci 6467db96d56Sopenharmony_ci/*[clinic input] 6477db96d56Sopenharmony_ci_sha512.sha512 6487db96d56Sopenharmony_ci 6497db96d56Sopenharmony_ci string: object(c_default="NULL") = b'' 6507db96d56Sopenharmony_ci * 6517db96d56Sopenharmony_ci usedforsecurity: bool = True 6527db96d56Sopenharmony_ci 6537db96d56Sopenharmony_ciReturn a new SHA-512 hash object; optionally initialized with a string. 6547db96d56Sopenharmony_ci[clinic start generated code]*/ 6557db96d56Sopenharmony_ci 6567db96d56Sopenharmony_cistatic PyObject * 6577db96d56Sopenharmony_ci_sha512_sha512_impl(PyObject *module, PyObject *string, int usedforsecurity) 6587db96d56Sopenharmony_ci/*[clinic end generated code: output=a8d9e5f9e6a0831c input=23b4daebc2ebb9c9]*/ 6597db96d56Sopenharmony_ci{ 6607db96d56Sopenharmony_ci SHAobject *new; 6617db96d56Sopenharmony_ci Py_buffer buf; 6627db96d56Sopenharmony_ci 6637db96d56Sopenharmony_ci SHA512State *st = sha512_get_state(module); 6647db96d56Sopenharmony_ci 6657db96d56Sopenharmony_ci if (string) 6667db96d56Sopenharmony_ci GET_BUFFER_VIEW_OR_ERROUT(string, &buf); 6677db96d56Sopenharmony_ci 6687db96d56Sopenharmony_ci if ((new = newSHA512object(st)) == NULL) { 6697db96d56Sopenharmony_ci if (string) 6707db96d56Sopenharmony_ci PyBuffer_Release(&buf); 6717db96d56Sopenharmony_ci return NULL; 6727db96d56Sopenharmony_ci } 6737db96d56Sopenharmony_ci 6747db96d56Sopenharmony_ci sha512_init(new); 6757db96d56Sopenharmony_ci 6767db96d56Sopenharmony_ci if (PyErr_Occurred()) { 6777db96d56Sopenharmony_ci Py_DECREF(new); 6787db96d56Sopenharmony_ci if (string) 6797db96d56Sopenharmony_ci PyBuffer_Release(&buf); 6807db96d56Sopenharmony_ci return NULL; 6817db96d56Sopenharmony_ci } 6827db96d56Sopenharmony_ci if (string) { 6837db96d56Sopenharmony_ci sha512_update(new, buf.buf, buf.len); 6847db96d56Sopenharmony_ci PyBuffer_Release(&buf); 6857db96d56Sopenharmony_ci } 6867db96d56Sopenharmony_ci 6877db96d56Sopenharmony_ci return (PyObject *)new; 6887db96d56Sopenharmony_ci} 6897db96d56Sopenharmony_ci 6907db96d56Sopenharmony_ci/*[clinic input] 6917db96d56Sopenharmony_ci_sha512.sha384 6927db96d56Sopenharmony_ci 6937db96d56Sopenharmony_ci string: object(c_default="NULL") = b'' 6947db96d56Sopenharmony_ci * 6957db96d56Sopenharmony_ci usedforsecurity: bool = True 6967db96d56Sopenharmony_ci 6977db96d56Sopenharmony_ciReturn a new SHA-384 hash object; optionally initialized with a string. 6987db96d56Sopenharmony_ci[clinic start generated code]*/ 6997db96d56Sopenharmony_ci 7007db96d56Sopenharmony_cistatic PyObject * 7017db96d56Sopenharmony_ci_sha512_sha384_impl(PyObject *module, PyObject *string, int usedforsecurity) 7027db96d56Sopenharmony_ci/*[clinic end generated code: output=da7d594a08027ac3 input=59ef72f039a6b431]*/ 7037db96d56Sopenharmony_ci{ 7047db96d56Sopenharmony_ci SHAobject *new; 7057db96d56Sopenharmony_ci Py_buffer buf; 7067db96d56Sopenharmony_ci 7077db96d56Sopenharmony_ci SHA512State *st = sha512_get_state(module); 7087db96d56Sopenharmony_ci 7097db96d56Sopenharmony_ci if (string) 7107db96d56Sopenharmony_ci GET_BUFFER_VIEW_OR_ERROUT(string, &buf); 7117db96d56Sopenharmony_ci 7127db96d56Sopenharmony_ci if ((new = newSHA384object(st)) == NULL) { 7137db96d56Sopenharmony_ci if (string) 7147db96d56Sopenharmony_ci PyBuffer_Release(&buf); 7157db96d56Sopenharmony_ci return NULL; 7167db96d56Sopenharmony_ci } 7177db96d56Sopenharmony_ci 7187db96d56Sopenharmony_ci sha384_init(new); 7197db96d56Sopenharmony_ci 7207db96d56Sopenharmony_ci if (PyErr_Occurred()) { 7217db96d56Sopenharmony_ci Py_DECREF(new); 7227db96d56Sopenharmony_ci if (string) 7237db96d56Sopenharmony_ci PyBuffer_Release(&buf); 7247db96d56Sopenharmony_ci return NULL; 7257db96d56Sopenharmony_ci } 7267db96d56Sopenharmony_ci if (string) { 7277db96d56Sopenharmony_ci sha512_update(new, buf.buf, buf.len); 7287db96d56Sopenharmony_ci PyBuffer_Release(&buf); 7297db96d56Sopenharmony_ci } 7307db96d56Sopenharmony_ci 7317db96d56Sopenharmony_ci return (PyObject *)new; 7327db96d56Sopenharmony_ci} 7337db96d56Sopenharmony_ci 7347db96d56Sopenharmony_ci 7357db96d56Sopenharmony_ci/* List of functions exported by this module */ 7367db96d56Sopenharmony_ci 7377db96d56Sopenharmony_cistatic struct PyMethodDef SHA_functions[] = { 7387db96d56Sopenharmony_ci _SHA512_SHA512_METHODDEF 7397db96d56Sopenharmony_ci _SHA512_SHA384_METHODDEF 7407db96d56Sopenharmony_ci {NULL, NULL} /* Sentinel */ 7417db96d56Sopenharmony_ci}; 7427db96d56Sopenharmony_ci 7437db96d56Sopenharmony_cistatic int 7447db96d56Sopenharmony_ci_sha512_traverse(PyObject *module, visitproc visit, void *arg) 7457db96d56Sopenharmony_ci{ 7467db96d56Sopenharmony_ci SHA512State *state = sha512_get_state(module); 7477db96d56Sopenharmony_ci Py_VISIT(state->sha384_type); 7487db96d56Sopenharmony_ci Py_VISIT(state->sha512_type); 7497db96d56Sopenharmony_ci return 0; 7507db96d56Sopenharmony_ci} 7517db96d56Sopenharmony_ci 7527db96d56Sopenharmony_cistatic int 7537db96d56Sopenharmony_ci_sha512_clear(PyObject *module) 7547db96d56Sopenharmony_ci{ 7557db96d56Sopenharmony_ci SHA512State *state = sha512_get_state(module); 7567db96d56Sopenharmony_ci Py_CLEAR(state->sha384_type); 7577db96d56Sopenharmony_ci Py_CLEAR(state->sha512_type); 7587db96d56Sopenharmony_ci return 0; 7597db96d56Sopenharmony_ci} 7607db96d56Sopenharmony_ci 7617db96d56Sopenharmony_cistatic void 7627db96d56Sopenharmony_ci_sha512_free(void *module) 7637db96d56Sopenharmony_ci{ 7647db96d56Sopenharmony_ci _sha512_clear((PyObject *)module); 7657db96d56Sopenharmony_ci} 7667db96d56Sopenharmony_ci 7677db96d56Sopenharmony_ci 7687db96d56Sopenharmony_ci/* Initialize this module. */ 7697db96d56Sopenharmony_cistatic int 7707db96d56Sopenharmony_ci_sha512_exec(PyObject *m) 7717db96d56Sopenharmony_ci{ 7727db96d56Sopenharmony_ci SHA512State* st = sha512_get_state(m); 7737db96d56Sopenharmony_ci 7747db96d56Sopenharmony_ci st->sha384_type = (PyTypeObject *)PyType_FromModuleAndSpec( 7757db96d56Sopenharmony_ci m, &sha512_sha384_type_spec, NULL); 7767db96d56Sopenharmony_ci 7777db96d56Sopenharmony_ci st->sha512_type = (PyTypeObject *)PyType_FromModuleAndSpec( 7787db96d56Sopenharmony_ci m, &sha512_sha512_type_spec, NULL); 7797db96d56Sopenharmony_ci 7807db96d56Sopenharmony_ci if (st->sha384_type == NULL || st->sha512_type == NULL) { 7817db96d56Sopenharmony_ci return -1; 7827db96d56Sopenharmony_ci } 7837db96d56Sopenharmony_ci 7847db96d56Sopenharmony_ci Py_INCREF(st->sha384_type); 7857db96d56Sopenharmony_ci if (PyModule_AddObject(m, "SHA384Type", (PyObject *)st->sha384_type) < 0) { 7867db96d56Sopenharmony_ci Py_DECREF(st->sha384_type); 7877db96d56Sopenharmony_ci return -1; 7887db96d56Sopenharmony_ci } 7897db96d56Sopenharmony_ci 7907db96d56Sopenharmony_ci Py_INCREF(st->sha512_type); 7917db96d56Sopenharmony_ci if (PyModule_AddObject(m, "SHA384Type", (PyObject *)st->sha512_type) < 0) { 7927db96d56Sopenharmony_ci Py_DECREF(st->sha512_type); 7937db96d56Sopenharmony_ci return -1; 7947db96d56Sopenharmony_ci } 7957db96d56Sopenharmony_ci 7967db96d56Sopenharmony_ci return 0; 7977db96d56Sopenharmony_ci} 7987db96d56Sopenharmony_ci 7997db96d56Sopenharmony_cistatic PyModuleDef_Slot _sha512_slots[] = { 8007db96d56Sopenharmony_ci {Py_mod_exec, _sha512_exec}, 8017db96d56Sopenharmony_ci {0, NULL} 8027db96d56Sopenharmony_ci}; 8037db96d56Sopenharmony_ci 8047db96d56Sopenharmony_cistatic struct PyModuleDef _sha512module = { 8057db96d56Sopenharmony_ci PyModuleDef_HEAD_INIT, 8067db96d56Sopenharmony_ci .m_name = "_sha512", 8077db96d56Sopenharmony_ci .m_size = sizeof(SHA512State), 8087db96d56Sopenharmony_ci .m_methods = SHA_functions, 8097db96d56Sopenharmony_ci .m_slots = _sha512_slots, 8107db96d56Sopenharmony_ci .m_traverse = _sha512_traverse, 8117db96d56Sopenharmony_ci .m_clear = _sha512_clear, 8127db96d56Sopenharmony_ci .m_free = _sha512_free 8137db96d56Sopenharmony_ci}; 8147db96d56Sopenharmony_ci 8157db96d56Sopenharmony_ciPyMODINIT_FUNC 8167db96d56Sopenharmony_ciPyInit__sha512(void) 8177db96d56Sopenharmony_ci{ 8187db96d56Sopenharmony_ci return PyModuleDef_Init(&_sha512module); 8197db96d56Sopenharmony_ci} 820