1*fe6060f1SDimitry Andric //====- SHA256.cpp - SHA256 implementation ---*- C++ -* ======// 2*fe6060f1SDimitry Andric // 3*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*fe6060f1SDimitry Andric // 7*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 8*fe6060f1SDimitry Andric /* 9*fe6060f1SDimitry Andric * The SHA-256 Secure Hash Standard was published by NIST in 2002. 10*fe6060f1SDimitry Andric * 11*fe6060f1SDimitry Andric * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf 12*fe6060f1SDimitry Andric * 13*fe6060f1SDimitry Andric * The implementation is based on nacl's sha256 implementation [0] and LLVM's 14*fe6060f1SDimitry Andric * pre-exsiting SHA1 code [1]. 15*fe6060f1SDimitry Andric * 16*fe6060f1SDimitry Andric * [0] https://hyperelliptic.org/nacl/nacl-20110221.tar.bz2 (public domain 17*fe6060f1SDimitry Andric * code) 18*fe6060f1SDimitry Andric * [1] llvm/lib/Support/SHA1.{h,cpp} 19*fe6060f1SDimitry Andric */ 20*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 21*fe6060f1SDimitry Andric 22*fe6060f1SDimitry Andric #include "llvm/Support/SHA256.h" 23*fe6060f1SDimitry Andric #include "llvm/ADT/ArrayRef.h" 24*fe6060f1SDimitry Andric #include "llvm/ADT/StringRef.h" 25*fe6060f1SDimitry Andric #include "llvm/Support/Endian.h" 26*fe6060f1SDimitry Andric #include "llvm/Support/Host.h" 27*fe6060f1SDimitry Andric #include <string.h> 28*fe6060f1SDimitry Andric 29*fe6060f1SDimitry Andric namespace llvm { 30*fe6060f1SDimitry Andric 31*fe6060f1SDimitry Andric #if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN 32*fe6060f1SDimitry Andric #define SHA_BIG_ENDIAN 33*fe6060f1SDimitry Andric #endif 34*fe6060f1SDimitry Andric 35*fe6060f1SDimitry Andric #define SHR(x, c) ((x) >> (c)) 36*fe6060f1SDimitry Andric #define ROTR(x, n) (((x) >> n) | ((x) << (32 - (n)))) 37*fe6060f1SDimitry Andric 38*fe6060f1SDimitry Andric #define CH(x, y, z) (((x) & (y)) ^ (~(x) & (z))) 39*fe6060f1SDimitry Andric #define MAJ(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) 40*fe6060f1SDimitry Andric 41*fe6060f1SDimitry Andric #define SIGMA_0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) 42*fe6060f1SDimitry Andric #define SIGMA_1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) 43*fe6060f1SDimitry Andric 44*fe6060f1SDimitry Andric #define SIGMA_2(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)) 45*fe6060f1SDimitry Andric #define SIGMA_3(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) 46*fe6060f1SDimitry Andric 47*fe6060f1SDimitry Andric #define F_EXPAND(A, B, C, D, E, F, G, H, M1, M2, M3, M4, k) \ 48*fe6060f1SDimitry Andric do { \ 49*fe6060f1SDimitry Andric H += SIGMA_1(E) + CH(E, F, G) + M1 + k; \ 50*fe6060f1SDimitry Andric D += H; \ 51*fe6060f1SDimitry Andric H += SIGMA_0(A) + MAJ(A, B, C); \ 52*fe6060f1SDimitry Andric M1 += SIGMA_2(M2) + M3 + SIGMA_3(M4); \ 53*fe6060f1SDimitry Andric } while (0); 54*fe6060f1SDimitry Andric 55*fe6060f1SDimitry Andric void SHA256::init() { 56*fe6060f1SDimitry Andric InternalState.State[0] = 0x6A09E667; 57*fe6060f1SDimitry Andric InternalState.State[1] = 0xBB67AE85; 58*fe6060f1SDimitry Andric InternalState.State[2] = 0x3C6EF372; 59*fe6060f1SDimitry Andric InternalState.State[3] = 0xA54FF53A; 60*fe6060f1SDimitry Andric InternalState.State[4] = 0x510E527F; 61*fe6060f1SDimitry Andric InternalState.State[5] = 0x9B05688C; 62*fe6060f1SDimitry Andric InternalState.State[6] = 0x1F83D9AB; 63*fe6060f1SDimitry Andric InternalState.State[7] = 0x5BE0CD19; 64*fe6060f1SDimitry Andric InternalState.ByteCount = 0; 65*fe6060f1SDimitry Andric InternalState.BufferOffset = 0; 66*fe6060f1SDimitry Andric } 67*fe6060f1SDimitry Andric 68*fe6060f1SDimitry Andric void SHA256::hashBlock() { 69*fe6060f1SDimitry Andric uint32_t A = InternalState.State[0]; 70*fe6060f1SDimitry Andric uint32_t B = InternalState.State[1]; 71*fe6060f1SDimitry Andric uint32_t C = InternalState.State[2]; 72*fe6060f1SDimitry Andric uint32_t D = InternalState.State[3]; 73*fe6060f1SDimitry Andric uint32_t E = InternalState.State[4]; 74*fe6060f1SDimitry Andric uint32_t F = InternalState.State[5]; 75*fe6060f1SDimitry Andric uint32_t G = InternalState.State[6]; 76*fe6060f1SDimitry Andric uint32_t H = InternalState.State[7]; 77*fe6060f1SDimitry Andric 78*fe6060f1SDimitry Andric uint32_t W00 = InternalState.Buffer.L[0]; 79*fe6060f1SDimitry Andric uint32_t W01 = InternalState.Buffer.L[1]; 80*fe6060f1SDimitry Andric uint32_t W02 = InternalState.Buffer.L[2]; 81*fe6060f1SDimitry Andric uint32_t W03 = InternalState.Buffer.L[3]; 82*fe6060f1SDimitry Andric uint32_t W04 = InternalState.Buffer.L[4]; 83*fe6060f1SDimitry Andric uint32_t W05 = InternalState.Buffer.L[5]; 84*fe6060f1SDimitry Andric uint32_t W06 = InternalState.Buffer.L[6]; 85*fe6060f1SDimitry Andric uint32_t W07 = InternalState.Buffer.L[7]; 86*fe6060f1SDimitry Andric uint32_t W08 = InternalState.Buffer.L[8]; 87*fe6060f1SDimitry Andric uint32_t W09 = InternalState.Buffer.L[9]; 88*fe6060f1SDimitry Andric uint32_t W10 = InternalState.Buffer.L[10]; 89*fe6060f1SDimitry Andric uint32_t W11 = InternalState.Buffer.L[11]; 90*fe6060f1SDimitry Andric uint32_t W12 = InternalState.Buffer.L[12]; 91*fe6060f1SDimitry Andric uint32_t W13 = InternalState.Buffer.L[13]; 92*fe6060f1SDimitry Andric uint32_t W14 = InternalState.Buffer.L[14]; 93*fe6060f1SDimitry Andric uint32_t W15 = InternalState.Buffer.L[15]; 94*fe6060f1SDimitry Andric 95*fe6060f1SDimitry Andric F_EXPAND(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x428A2F98); 96*fe6060f1SDimitry Andric F_EXPAND(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x71374491); 97*fe6060f1SDimitry Andric F_EXPAND(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0xB5C0FBCF); 98*fe6060f1SDimitry Andric F_EXPAND(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0xE9B5DBA5); 99*fe6060f1SDimitry Andric F_EXPAND(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x3956C25B); 100*fe6060f1SDimitry Andric F_EXPAND(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x59F111F1); 101*fe6060f1SDimitry Andric F_EXPAND(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x923F82A4); 102*fe6060f1SDimitry Andric F_EXPAND(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0xAB1C5ED5); 103*fe6060f1SDimitry Andric F_EXPAND(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0xD807AA98); 104*fe6060f1SDimitry Andric F_EXPAND(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x12835B01); 105*fe6060f1SDimitry Andric F_EXPAND(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x243185BE); 106*fe6060f1SDimitry Andric F_EXPAND(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x550C7DC3); 107*fe6060f1SDimitry Andric F_EXPAND(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x72BE5D74); 108*fe6060f1SDimitry Andric F_EXPAND(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0x80DEB1FE); 109*fe6060f1SDimitry Andric F_EXPAND(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x9BDC06A7); 110*fe6060f1SDimitry Andric F_EXPAND(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0xC19BF174); 111*fe6060f1SDimitry Andric 112*fe6060f1SDimitry Andric F_EXPAND(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0xE49B69C1); 113*fe6060f1SDimitry Andric F_EXPAND(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0xEFBE4786); 114*fe6060f1SDimitry Andric F_EXPAND(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x0FC19DC6); 115*fe6060f1SDimitry Andric F_EXPAND(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x240CA1CC); 116*fe6060f1SDimitry Andric F_EXPAND(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x2DE92C6F); 117*fe6060f1SDimitry Andric F_EXPAND(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x4A7484AA); 118*fe6060f1SDimitry Andric F_EXPAND(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x5CB0A9DC); 119*fe6060f1SDimitry Andric F_EXPAND(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x76F988DA); 120*fe6060f1SDimitry Andric F_EXPAND(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x983E5152); 121*fe6060f1SDimitry Andric F_EXPAND(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0xA831C66D); 122*fe6060f1SDimitry Andric F_EXPAND(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0xB00327C8); 123*fe6060f1SDimitry Andric F_EXPAND(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0xBF597FC7); 124*fe6060f1SDimitry Andric F_EXPAND(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0xC6E00BF3); 125*fe6060f1SDimitry Andric F_EXPAND(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD5A79147); 126*fe6060f1SDimitry Andric F_EXPAND(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0x06CA6351); 127*fe6060f1SDimitry Andric F_EXPAND(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x14292967); 128*fe6060f1SDimitry Andric 129*fe6060f1SDimitry Andric F_EXPAND(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x27B70A85); 130*fe6060f1SDimitry Andric F_EXPAND(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x2E1B2138); 131*fe6060f1SDimitry Andric F_EXPAND(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x4D2C6DFC); 132*fe6060f1SDimitry Andric F_EXPAND(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x53380D13); 133*fe6060f1SDimitry Andric F_EXPAND(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x650A7354); 134*fe6060f1SDimitry Andric F_EXPAND(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x766A0ABB); 135*fe6060f1SDimitry Andric F_EXPAND(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x81C2C92E); 136*fe6060f1SDimitry Andric F_EXPAND(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x92722C85); 137*fe6060f1SDimitry Andric F_EXPAND(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0xA2BFE8A1); 138*fe6060f1SDimitry Andric F_EXPAND(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0xA81A664B); 139*fe6060f1SDimitry Andric F_EXPAND(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0xC24B8B70); 140*fe6060f1SDimitry Andric F_EXPAND(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0xC76C51A3); 141*fe6060f1SDimitry Andric F_EXPAND(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0xD192E819); 142*fe6060f1SDimitry Andric F_EXPAND(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xD6990624); 143*fe6060f1SDimitry Andric F_EXPAND(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0xF40E3585); 144*fe6060f1SDimitry Andric F_EXPAND(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0x106AA070); 145*fe6060f1SDimitry Andric 146*fe6060f1SDimitry Andric F_EXPAND(A, B, C, D, E, F, G, H, W00, W14, W09, W01, 0x19A4C116); 147*fe6060f1SDimitry Andric F_EXPAND(H, A, B, C, D, E, F, G, W01, W15, W10, W02, 0x1E376C08); 148*fe6060f1SDimitry Andric F_EXPAND(G, H, A, B, C, D, E, F, W02, W00, W11, W03, 0x2748774C); 149*fe6060f1SDimitry Andric F_EXPAND(F, G, H, A, B, C, D, E, W03, W01, W12, W04, 0x34B0BCB5); 150*fe6060f1SDimitry Andric F_EXPAND(E, F, G, H, A, B, C, D, W04, W02, W13, W05, 0x391C0CB3); 151*fe6060f1SDimitry Andric F_EXPAND(D, E, F, G, H, A, B, C, W05, W03, W14, W06, 0x4ED8AA4A); 152*fe6060f1SDimitry Andric F_EXPAND(C, D, E, F, G, H, A, B, W06, W04, W15, W07, 0x5B9CCA4F); 153*fe6060f1SDimitry Andric F_EXPAND(B, C, D, E, F, G, H, A, W07, W05, W00, W08, 0x682E6FF3); 154*fe6060f1SDimitry Andric F_EXPAND(A, B, C, D, E, F, G, H, W08, W06, W01, W09, 0x748F82EE); 155*fe6060f1SDimitry Andric F_EXPAND(H, A, B, C, D, E, F, G, W09, W07, W02, W10, 0x78A5636F); 156*fe6060f1SDimitry Andric F_EXPAND(G, H, A, B, C, D, E, F, W10, W08, W03, W11, 0x84C87814); 157*fe6060f1SDimitry Andric F_EXPAND(F, G, H, A, B, C, D, E, W11, W09, W04, W12, 0x8CC70208); 158*fe6060f1SDimitry Andric F_EXPAND(E, F, G, H, A, B, C, D, W12, W10, W05, W13, 0x90BEFFFA); 159*fe6060f1SDimitry Andric F_EXPAND(D, E, F, G, H, A, B, C, W13, W11, W06, W14, 0xA4506CEB); 160*fe6060f1SDimitry Andric F_EXPAND(C, D, E, F, G, H, A, B, W14, W12, W07, W15, 0xBEF9A3F7); 161*fe6060f1SDimitry Andric F_EXPAND(B, C, D, E, F, G, H, A, W15, W13, W08, W00, 0xC67178F2); 162*fe6060f1SDimitry Andric 163*fe6060f1SDimitry Andric InternalState.State[0] += A; 164*fe6060f1SDimitry Andric InternalState.State[1] += B; 165*fe6060f1SDimitry Andric InternalState.State[2] += C; 166*fe6060f1SDimitry Andric InternalState.State[3] += D; 167*fe6060f1SDimitry Andric InternalState.State[4] += E; 168*fe6060f1SDimitry Andric InternalState.State[5] += F; 169*fe6060f1SDimitry Andric InternalState.State[6] += G; 170*fe6060f1SDimitry Andric InternalState.State[7] += H; 171*fe6060f1SDimitry Andric } 172*fe6060f1SDimitry Andric 173*fe6060f1SDimitry Andric void SHA256::addUncounted(uint8_t Data) { 174*fe6060f1SDimitry Andric #ifdef SHA_BIG_ENDIAN 175*fe6060f1SDimitry Andric InternalState.Buffer.C[InternalState.BufferOffset] = Data; 176*fe6060f1SDimitry Andric #else 177*fe6060f1SDimitry Andric InternalState.Buffer.C[InternalState.BufferOffset ^ 3] = Data; 178*fe6060f1SDimitry Andric #endif 179*fe6060f1SDimitry Andric 180*fe6060f1SDimitry Andric InternalState.BufferOffset++; 181*fe6060f1SDimitry Andric if (InternalState.BufferOffset == BLOCK_LENGTH) { 182*fe6060f1SDimitry Andric hashBlock(); 183*fe6060f1SDimitry Andric InternalState.BufferOffset = 0; 184*fe6060f1SDimitry Andric } 185*fe6060f1SDimitry Andric } 186*fe6060f1SDimitry Andric 187*fe6060f1SDimitry Andric void SHA256::writebyte(uint8_t Data) { 188*fe6060f1SDimitry Andric ++InternalState.ByteCount; 189*fe6060f1SDimitry Andric addUncounted(Data); 190*fe6060f1SDimitry Andric } 191*fe6060f1SDimitry Andric 192*fe6060f1SDimitry Andric void SHA256::update(ArrayRef<uint8_t> Data) { 193*fe6060f1SDimitry Andric InternalState.ByteCount += Data.size(); 194*fe6060f1SDimitry Andric 195*fe6060f1SDimitry Andric // Finish the current block. 196*fe6060f1SDimitry Andric if (InternalState.BufferOffset > 0) { 197*fe6060f1SDimitry Andric const size_t Remainder = std::min<size_t>( 198*fe6060f1SDimitry Andric Data.size(), BLOCK_LENGTH - InternalState.BufferOffset); 199*fe6060f1SDimitry Andric for (size_t I = 0; I < Remainder; ++I) 200*fe6060f1SDimitry Andric addUncounted(Data[I]); 201*fe6060f1SDimitry Andric Data = Data.drop_front(Remainder); 202*fe6060f1SDimitry Andric } 203*fe6060f1SDimitry Andric 204*fe6060f1SDimitry Andric // Fast buffer filling for large inputs. 205*fe6060f1SDimitry Andric while (Data.size() >= BLOCK_LENGTH) { 206*fe6060f1SDimitry Andric assert(InternalState.BufferOffset == 0); 207*fe6060f1SDimitry Andric static_assert(BLOCK_LENGTH % 4 == 0, ""); 208*fe6060f1SDimitry Andric constexpr size_t BLOCK_LENGTH_32 = BLOCK_LENGTH / 4; 209*fe6060f1SDimitry Andric for (size_t I = 0; I < BLOCK_LENGTH_32; ++I) 210*fe6060f1SDimitry Andric InternalState.Buffer.L[I] = support::endian::read32be(&Data[I * 4]); 211*fe6060f1SDimitry Andric hashBlock(); 212*fe6060f1SDimitry Andric Data = Data.drop_front(BLOCK_LENGTH); 213*fe6060f1SDimitry Andric } 214*fe6060f1SDimitry Andric 215*fe6060f1SDimitry Andric // Finish the remainder. 216*fe6060f1SDimitry Andric for (uint8_t C : Data) 217*fe6060f1SDimitry Andric addUncounted(C); 218*fe6060f1SDimitry Andric } 219*fe6060f1SDimitry Andric 220*fe6060f1SDimitry Andric void SHA256::update(StringRef Str) { 221*fe6060f1SDimitry Andric update( 222*fe6060f1SDimitry Andric ArrayRef<uint8_t>((uint8_t *)const_cast<char *>(Str.data()), Str.size())); 223*fe6060f1SDimitry Andric } 224*fe6060f1SDimitry Andric 225*fe6060f1SDimitry Andric void SHA256::pad() { 226*fe6060f1SDimitry Andric // Implement SHA-2 padding (fips180-2 5.1.1) 227*fe6060f1SDimitry Andric 228*fe6060f1SDimitry Andric // Pad with 0x80 followed by 0x00 until the end of the block 229*fe6060f1SDimitry Andric addUncounted(0x80); 230*fe6060f1SDimitry Andric while (InternalState.BufferOffset != 56) 231*fe6060f1SDimitry Andric addUncounted(0x00); 232*fe6060f1SDimitry Andric 233*fe6060f1SDimitry Andric uint64_t len = InternalState.ByteCount << 3; // bit size 234*fe6060f1SDimitry Andric 235*fe6060f1SDimitry Andric // Append length in the last 8 bytes big edian encoded 236*fe6060f1SDimitry Andric addUncounted(len >> 56); 237*fe6060f1SDimitry Andric addUncounted(len >> 48); 238*fe6060f1SDimitry Andric addUncounted(len >> 40); 239*fe6060f1SDimitry Andric addUncounted(len >> 32); 240*fe6060f1SDimitry Andric addUncounted(len >> 24); 241*fe6060f1SDimitry Andric addUncounted(len >> 16); 242*fe6060f1SDimitry Andric addUncounted(len >> 8); 243*fe6060f1SDimitry Andric addUncounted(len); 244*fe6060f1SDimitry Andric } 245*fe6060f1SDimitry Andric 246*fe6060f1SDimitry Andric StringRef SHA256::final() { 247*fe6060f1SDimitry Andric // Pad to complete the last block 248*fe6060f1SDimitry Andric pad(); 249*fe6060f1SDimitry Andric 250*fe6060f1SDimitry Andric #ifdef SHA_BIG_ENDIAN 251*fe6060f1SDimitry Andric // Just copy the current state 252*fe6060f1SDimitry Andric for (int i = 0; i < 8; i++) { 253*fe6060f1SDimitry Andric HashResult[i] = InternalState.State[i]; 254*fe6060f1SDimitry Andric } 255*fe6060f1SDimitry Andric #else 256*fe6060f1SDimitry Andric // Swap byte order back 257*fe6060f1SDimitry Andric for (int i = 0; i < 8; i++) { 258*fe6060f1SDimitry Andric HashResult[i] = (((InternalState.State[i]) << 24) & 0xff000000) | 259*fe6060f1SDimitry Andric (((InternalState.State[i]) << 8) & 0x00ff0000) | 260*fe6060f1SDimitry Andric (((InternalState.State[i]) >> 8) & 0x0000ff00) | 261*fe6060f1SDimitry Andric (((InternalState.State[i]) >> 24) & 0x000000ff); 262*fe6060f1SDimitry Andric } 263*fe6060f1SDimitry Andric #endif 264*fe6060f1SDimitry Andric 265*fe6060f1SDimitry Andric // Return pointer to hash (32 characters) 266*fe6060f1SDimitry Andric return StringRef((char *)HashResult, HASH_LENGTH); 267*fe6060f1SDimitry Andric } 268*fe6060f1SDimitry Andric 269*fe6060f1SDimitry Andric StringRef SHA256::result() { 270*fe6060f1SDimitry Andric auto StateToRestore = InternalState; 271*fe6060f1SDimitry Andric 272*fe6060f1SDimitry Andric auto Hash = final(); 273*fe6060f1SDimitry Andric 274*fe6060f1SDimitry Andric // Restore the state 275*fe6060f1SDimitry Andric InternalState = StateToRestore; 276*fe6060f1SDimitry Andric 277*fe6060f1SDimitry Andric // Return pointer to hash (32 characters) 278*fe6060f1SDimitry Andric return Hash; 279*fe6060f1SDimitry Andric } 280*fe6060f1SDimitry Andric 281*fe6060f1SDimitry Andric std::array<uint8_t, 32> SHA256::hash(ArrayRef<uint8_t> Data) { 282*fe6060f1SDimitry Andric SHA256 Hash; 283*fe6060f1SDimitry Andric Hash.update(Data); 284*fe6060f1SDimitry Andric StringRef S = Hash.final(); 285*fe6060f1SDimitry Andric 286*fe6060f1SDimitry Andric std::array<uint8_t, 32> Arr; 287*fe6060f1SDimitry Andric memcpy(Arr.data(), S.data(), S.size()); 288*fe6060f1SDimitry Andric return Arr; 289*fe6060f1SDimitry Andric } 290*fe6060f1SDimitry Andric 291*fe6060f1SDimitry Andric } // namespace llvm 292