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