1*0957b409SSimon J. Gerraty /* 2*0957b409SSimon J. Gerraty * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org> 3*0957b409SSimon J. Gerraty * 4*0957b409SSimon J. Gerraty * Permission is hereby granted, free of charge, to any person obtaining 5*0957b409SSimon J. Gerraty * a copy of this software and associated documentation files (the 6*0957b409SSimon J. Gerraty * "Software"), to deal in the Software without restriction, including 7*0957b409SSimon J. Gerraty * without limitation the rights to use, copy, modify, merge, publish, 8*0957b409SSimon J. Gerraty * distribute, sublicense, and/or sell copies of the Software, and to 9*0957b409SSimon J. Gerraty * permit persons to whom the Software is furnished to do so, subject to 10*0957b409SSimon J. Gerraty * the following conditions: 11*0957b409SSimon J. Gerraty * 12*0957b409SSimon J. Gerraty * The above copyright notice and this permission notice shall be 13*0957b409SSimon J. Gerraty * included in all copies or substantial portions of the Software. 14*0957b409SSimon J. Gerraty * 15*0957b409SSimon J. Gerraty * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16*0957b409SSimon J. Gerraty * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17*0957b409SSimon J. Gerraty * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18*0957b409SSimon J. Gerraty * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 19*0957b409SSimon J. Gerraty * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 20*0957b409SSimon J. Gerraty * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21*0957b409SSimon J. Gerraty * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22*0957b409SSimon J. Gerraty * SOFTWARE. 23*0957b409SSimon J. Gerraty */ 24*0957b409SSimon J. Gerraty 25*0957b409SSimon J. Gerraty #include "inner.h" 26*0957b409SSimon J. Gerraty 27*0957b409SSimon J. Gerraty #define CH(X, Y, Z) ((((Y) ^ (Z)) & (X)) ^ (Z)) 28*0957b409SSimon J. Gerraty #define MAJ(X, Y, Z) (((Y) & (Z)) | (((Y) | (Z)) & (X))) 29*0957b409SSimon J. Gerraty 30*0957b409SSimon J. Gerraty #define ROTR(x, n) (((uint32_t)(x) << (32 - (n))) | ((uint32_t)(x) >> (n))) 31*0957b409SSimon J. Gerraty 32*0957b409SSimon J. Gerraty #define BSG2_0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) 33*0957b409SSimon J. Gerraty #define BSG2_1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) 34*0957b409SSimon J. Gerraty #define SSG2_0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ (uint32_t)((x) >> 3)) 35*0957b409SSimon J. Gerraty #define SSG2_1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ (uint32_t)((x) >> 10)) 36*0957b409SSimon J. Gerraty 37*0957b409SSimon J. Gerraty /* see inner.h */ 38*0957b409SSimon J. Gerraty const uint32_t br_sha224_IV[8] = { 39*0957b409SSimon J. Gerraty 0xC1059ED8, 0x367CD507, 0x3070DD17, 0xF70E5939, 40*0957b409SSimon J. Gerraty 0xFFC00B31, 0x68581511, 0x64F98FA7, 0xBEFA4FA4 41*0957b409SSimon J. Gerraty }; 42*0957b409SSimon J. Gerraty 43*0957b409SSimon J. Gerraty /* see inner.h */ 44*0957b409SSimon J. Gerraty const uint32_t br_sha256_IV[8] = { 45*0957b409SSimon J. Gerraty 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 46*0957b409SSimon J. Gerraty 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19 47*0957b409SSimon J. Gerraty }; 48*0957b409SSimon J. Gerraty 49*0957b409SSimon J. Gerraty static const uint32_t K[64] = { 50*0957b409SSimon J. Gerraty 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 51*0957b409SSimon J. Gerraty 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 52*0957b409SSimon J. Gerraty 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 53*0957b409SSimon J. Gerraty 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 54*0957b409SSimon J. Gerraty 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 55*0957b409SSimon J. Gerraty 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 56*0957b409SSimon J. Gerraty 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 57*0957b409SSimon J. Gerraty 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, 58*0957b409SSimon J. Gerraty 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 59*0957b409SSimon J. Gerraty 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 60*0957b409SSimon J. Gerraty 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 61*0957b409SSimon J. Gerraty 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 62*0957b409SSimon J. Gerraty 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 63*0957b409SSimon J. Gerraty 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 64*0957b409SSimon J. Gerraty 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 65*0957b409SSimon J. Gerraty 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 66*0957b409SSimon J. Gerraty }; 67*0957b409SSimon J. Gerraty 68*0957b409SSimon J. Gerraty /* see inner.h */ 69*0957b409SSimon J. Gerraty void 70*0957b409SSimon J. Gerraty br_sha2small_round(const unsigned char *buf, uint32_t *val) 71*0957b409SSimon J. Gerraty { 72*0957b409SSimon J. Gerraty 73*0957b409SSimon J. Gerraty #define SHA2_STEP(A, B, C, D, E, F, G, H, j) do { \ 74*0957b409SSimon J. Gerraty uint32_t T1, T2; \ 75*0957b409SSimon J. Gerraty T1 = H + BSG2_1(E) + CH(E, F, G) + K[j] + w[j]; \ 76*0957b409SSimon J. Gerraty T2 = BSG2_0(A) + MAJ(A, B, C); \ 77*0957b409SSimon J. Gerraty D += T1; \ 78*0957b409SSimon J. Gerraty H = T1 + T2; \ 79*0957b409SSimon J. Gerraty } while (0) 80*0957b409SSimon J. Gerraty 81*0957b409SSimon J. Gerraty int i; 82*0957b409SSimon J. Gerraty uint32_t a, b, c, d, e, f, g, h; 83*0957b409SSimon J. Gerraty uint32_t w[64]; 84*0957b409SSimon J. Gerraty 85*0957b409SSimon J. Gerraty br_range_dec32be(w, 16, buf); 86*0957b409SSimon J. Gerraty for (i = 16; i < 64; i ++) { 87*0957b409SSimon J. Gerraty w[i] = SSG2_1(w[i - 2]) + w[i - 7] 88*0957b409SSimon J. Gerraty + SSG2_0(w[i - 15]) + w[i - 16]; 89*0957b409SSimon J. Gerraty } 90*0957b409SSimon J. Gerraty a = val[0]; 91*0957b409SSimon J. Gerraty b = val[1]; 92*0957b409SSimon J. Gerraty c = val[2]; 93*0957b409SSimon J. Gerraty d = val[3]; 94*0957b409SSimon J. Gerraty e = val[4]; 95*0957b409SSimon J. Gerraty f = val[5]; 96*0957b409SSimon J. Gerraty g = val[6]; 97*0957b409SSimon J. Gerraty h = val[7]; 98*0957b409SSimon J. Gerraty for (i = 0; i < 64; i += 8) { 99*0957b409SSimon J. Gerraty SHA2_STEP(a, b, c, d, e, f, g, h, i + 0); 100*0957b409SSimon J. Gerraty SHA2_STEP(h, a, b, c, d, e, f, g, i + 1); 101*0957b409SSimon J. Gerraty SHA2_STEP(g, h, a, b, c, d, e, f, i + 2); 102*0957b409SSimon J. Gerraty SHA2_STEP(f, g, h, a, b, c, d, e, i + 3); 103*0957b409SSimon J. Gerraty SHA2_STEP(e, f, g, h, a, b, c, d, i + 4); 104*0957b409SSimon J. Gerraty SHA2_STEP(d, e, f, g, h, a, b, c, i + 5); 105*0957b409SSimon J. Gerraty SHA2_STEP(c, d, e, f, g, h, a, b, i + 6); 106*0957b409SSimon J. Gerraty SHA2_STEP(b, c, d, e, f, g, h, a, i + 7); 107*0957b409SSimon J. Gerraty } 108*0957b409SSimon J. Gerraty val[0] += a; 109*0957b409SSimon J. Gerraty val[1] += b; 110*0957b409SSimon J. Gerraty val[2] += c; 111*0957b409SSimon J. Gerraty val[3] += d; 112*0957b409SSimon J. Gerraty val[4] += e; 113*0957b409SSimon J. Gerraty val[5] += f; 114*0957b409SSimon J. Gerraty val[6] += g; 115*0957b409SSimon J. Gerraty val[7] += h; 116*0957b409SSimon J. Gerraty 117*0957b409SSimon J. Gerraty #if 0 118*0957b409SSimon J. Gerraty /* obsolete */ 119*0957b409SSimon J. Gerraty #define SHA2_MEXP1(pc) do { \ 120*0957b409SSimon J. Gerraty W[pc] = br_dec32be(buf + ((pc) << 2)); \ 121*0957b409SSimon J. Gerraty } while (0) 122*0957b409SSimon J. Gerraty 123*0957b409SSimon J. Gerraty #define SHA2_MEXP2(pc) do { \ 124*0957b409SSimon J. Gerraty W[(pc) & 0x0F] = SSG2_1(W[((pc) - 2) & 0x0F]) \ 125*0957b409SSimon J. Gerraty + W[((pc) - 7) & 0x0F] \ 126*0957b409SSimon J. Gerraty + SSG2_0(W[((pc) - 15) & 0x0F]) + W[(pc) & 0x0F]; \ 127*0957b409SSimon J. Gerraty } while (0) 128*0957b409SSimon J. Gerraty 129*0957b409SSimon J. Gerraty #define SHA2_STEPn(n, a, b, c, d, e, f, g, h, pc) do { \ 130*0957b409SSimon J. Gerraty uint32_t t1, t2; \ 131*0957b409SSimon J. Gerraty SHA2_MEXP ## n(pc); \ 132*0957b409SSimon J. Gerraty t1 = h + BSG2_1(e) + CH(e, f, g) \ 133*0957b409SSimon J. Gerraty + K[pcount + (pc)] + W[(pc) & 0x0F]; \ 134*0957b409SSimon J. Gerraty t2 = BSG2_0(a) + MAJ(a, b, c); \ 135*0957b409SSimon J. Gerraty d += t1; \ 136*0957b409SSimon J. Gerraty h = t1 + t2; \ 137*0957b409SSimon J. Gerraty } while (0) 138*0957b409SSimon J. Gerraty 139*0957b409SSimon J. Gerraty #define SHA2_STEP1(a, b, c, d, e, f, g, h, pc) \ 140*0957b409SSimon J. Gerraty SHA2_STEPn(1, a, b, c, d, e, f, g, h, pc) 141*0957b409SSimon J. Gerraty #define SHA2_STEP2(a, b, c, d, e, f, g, h, pc) \ 142*0957b409SSimon J. Gerraty SHA2_STEPn(2, a, b, c, d, e, f, g, h, pc) 143*0957b409SSimon J. Gerraty 144*0957b409SSimon J. Gerraty uint32_t A, B, C, D, E, F, G, H; 145*0957b409SSimon J. Gerraty uint32_t W[16]; 146*0957b409SSimon J. Gerraty unsigned pcount; 147*0957b409SSimon J. Gerraty 148*0957b409SSimon J. Gerraty A = val[0]; 149*0957b409SSimon J. Gerraty B = val[1]; 150*0957b409SSimon J. Gerraty C = val[2]; 151*0957b409SSimon J. Gerraty D = val[3]; 152*0957b409SSimon J. Gerraty E = val[4]; 153*0957b409SSimon J. Gerraty F = val[5]; 154*0957b409SSimon J. Gerraty G = val[6]; 155*0957b409SSimon J. Gerraty H = val[7]; 156*0957b409SSimon J. Gerraty pcount = 0; 157*0957b409SSimon J. Gerraty SHA2_STEP1(A, B, C, D, E, F, G, H, 0); 158*0957b409SSimon J. Gerraty SHA2_STEP1(H, A, B, C, D, E, F, G, 1); 159*0957b409SSimon J. Gerraty SHA2_STEP1(G, H, A, B, C, D, E, F, 2); 160*0957b409SSimon J. Gerraty SHA2_STEP1(F, G, H, A, B, C, D, E, 3); 161*0957b409SSimon J. Gerraty SHA2_STEP1(E, F, G, H, A, B, C, D, 4); 162*0957b409SSimon J. Gerraty SHA2_STEP1(D, E, F, G, H, A, B, C, 5); 163*0957b409SSimon J. Gerraty SHA2_STEP1(C, D, E, F, G, H, A, B, 6); 164*0957b409SSimon J. Gerraty SHA2_STEP1(B, C, D, E, F, G, H, A, 7); 165*0957b409SSimon J. Gerraty SHA2_STEP1(A, B, C, D, E, F, G, H, 8); 166*0957b409SSimon J. Gerraty SHA2_STEP1(H, A, B, C, D, E, F, G, 9); 167*0957b409SSimon J. Gerraty SHA2_STEP1(G, H, A, B, C, D, E, F, 10); 168*0957b409SSimon J. Gerraty SHA2_STEP1(F, G, H, A, B, C, D, E, 11); 169*0957b409SSimon J. Gerraty SHA2_STEP1(E, F, G, H, A, B, C, D, 12); 170*0957b409SSimon J. Gerraty SHA2_STEP1(D, E, F, G, H, A, B, C, 13); 171*0957b409SSimon J. Gerraty SHA2_STEP1(C, D, E, F, G, H, A, B, 14); 172*0957b409SSimon J. Gerraty SHA2_STEP1(B, C, D, E, F, G, H, A, 15); 173*0957b409SSimon J. Gerraty for (pcount = 16; pcount < 64; pcount += 16) { 174*0957b409SSimon J. Gerraty SHA2_STEP2(A, B, C, D, E, F, G, H, 0); 175*0957b409SSimon J. Gerraty SHA2_STEP2(H, A, B, C, D, E, F, G, 1); 176*0957b409SSimon J. Gerraty SHA2_STEP2(G, H, A, B, C, D, E, F, 2); 177*0957b409SSimon J. Gerraty SHA2_STEP2(F, G, H, A, B, C, D, E, 3); 178*0957b409SSimon J. Gerraty SHA2_STEP2(E, F, G, H, A, B, C, D, 4); 179*0957b409SSimon J. Gerraty SHA2_STEP2(D, E, F, G, H, A, B, C, 5); 180*0957b409SSimon J. Gerraty SHA2_STEP2(C, D, E, F, G, H, A, B, 6); 181*0957b409SSimon J. Gerraty SHA2_STEP2(B, C, D, E, F, G, H, A, 7); 182*0957b409SSimon J. Gerraty SHA2_STEP2(A, B, C, D, E, F, G, H, 8); 183*0957b409SSimon J. Gerraty SHA2_STEP2(H, A, B, C, D, E, F, G, 9); 184*0957b409SSimon J. Gerraty SHA2_STEP2(G, H, A, B, C, D, E, F, 10); 185*0957b409SSimon J. Gerraty SHA2_STEP2(F, G, H, A, B, C, D, E, 11); 186*0957b409SSimon J. Gerraty SHA2_STEP2(E, F, G, H, A, B, C, D, 12); 187*0957b409SSimon J. Gerraty SHA2_STEP2(D, E, F, G, H, A, B, C, 13); 188*0957b409SSimon J. Gerraty SHA2_STEP2(C, D, E, F, G, H, A, B, 14); 189*0957b409SSimon J. Gerraty SHA2_STEP2(B, C, D, E, F, G, H, A, 15); 190*0957b409SSimon J. Gerraty } 191*0957b409SSimon J. Gerraty val[0] += A; 192*0957b409SSimon J. Gerraty val[1] += B; 193*0957b409SSimon J. Gerraty val[2] += C; 194*0957b409SSimon J. Gerraty val[3] += D; 195*0957b409SSimon J. Gerraty val[4] += E; 196*0957b409SSimon J. Gerraty val[5] += F; 197*0957b409SSimon J. Gerraty val[6] += G; 198*0957b409SSimon J. Gerraty val[7] += H; 199*0957b409SSimon J. Gerraty #endif 200*0957b409SSimon J. Gerraty } 201*0957b409SSimon J. Gerraty 202*0957b409SSimon J. Gerraty static void 203*0957b409SSimon J. Gerraty sha2small_update(br_sha224_context *cc, const void *data, size_t len) 204*0957b409SSimon J. Gerraty { 205*0957b409SSimon J. Gerraty const unsigned char *buf; 206*0957b409SSimon J. Gerraty size_t ptr; 207*0957b409SSimon J. Gerraty 208*0957b409SSimon J. Gerraty buf = data; 209*0957b409SSimon J. Gerraty ptr = (size_t)cc->count & 63; 210*0957b409SSimon J. Gerraty cc->count += (uint64_t)len; 211*0957b409SSimon J. Gerraty while (len > 0) { 212*0957b409SSimon J. Gerraty size_t clen; 213*0957b409SSimon J. Gerraty 214*0957b409SSimon J. Gerraty clen = 64 - ptr; 215*0957b409SSimon J. Gerraty if (clen > len) { 216*0957b409SSimon J. Gerraty clen = len; 217*0957b409SSimon J. Gerraty } 218*0957b409SSimon J. Gerraty memcpy(cc->buf + ptr, buf, clen); 219*0957b409SSimon J. Gerraty ptr += clen; 220*0957b409SSimon J. Gerraty buf += clen; 221*0957b409SSimon J. Gerraty len -= clen; 222*0957b409SSimon J. Gerraty if (ptr == 64) { 223*0957b409SSimon J. Gerraty br_sha2small_round(cc->buf, cc->val); 224*0957b409SSimon J. Gerraty ptr = 0; 225*0957b409SSimon J. Gerraty } 226*0957b409SSimon J. Gerraty } 227*0957b409SSimon J. Gerraty } 228*0957b409SSimon J. Gerraty 229*0957b409SSimon J. Gerraty static void 230*0957b409SSimon J. Gerraty sha2small_out(const br_sha224_context *cc, void *dst, int num) 231*0957b409SSimon J. Gerraty { 232*0957b409SSimon J. Gerraty unsigned char buf[64]; 233*0957b409SSimon J. Gerraty uint32_t val[8]; 234*0957b409SSimon J. Gerraty size_t ptr; 235*0957b409SSimon J. Gerraty 236*0957b409SSimon J. Gerraty ptr = (size_t)cc->count & 63; 237*0957b409SSimon J. Gerraty memcpy(buf, cc->buf, ptr); 238*0957b409SSimon J. Gerraty memcpy(val, cc->val, sizeof val); 239*0957b409SSimon J. Gerraty buf[ptr ++] = 0x80; 240*0957b409SSimon J. Gerraty if (ptr > 56) { 241*0957b409SSimon J. Gerraty memset(buf + ptr, 0, 64 - ptr); 242*0957b409SSimon J. Gerraty br_sha2small_round(buf, val); 243*0957b409SSimon J. Gerraty memset(buf, 0, 56); 244*0957b409SSimon J. Gerraty } else { 245*0957b409SSimon J. Gerraty memset(buf + ptr, 0, 56 - ptr); 246*0957b409SSimon J. Gerraty } 247*0957b409SSimon J. Gerraty br_enc64be(buf + 56, cc->count << 3); 248*0957b409SSimon J. Gerraty br_sha2small_round(buf, val); 249*0957b409SSimon J. Gerraty br_range_enc32be(dst, val, num); 250*0957b409SSimon J. Gerraty } 251*0957b409SSimon J. Gerraty 252*0957b409SSimon J. Gerraty /* see bearssl.h */ 253*0957b409SSimon J. Gerraty void 254*0957b409SSimon J. Gerraty br_sha224_init(br_sha224_context *cc) 255*0957b409SSimon J. Gerraty { 256*0957b409SSimon J. Gerraty cc->vtable = &br_sha224_vtable; 257*0957b409SSimon J. Gerraty memcpy(cc->val, br_sha224_IV, sizeof cc->val); 258*0957b409SSimon J. Gerraty cc->count = 0; 259*0957b409SSimon J. Gerraty } 260*0957b409SSimon J. Gerraty 261*0957b409SSimon J. Gerraty /* see bearssl.h */ 262*0957b409SSimon J. Gerraty void 263*0957b409SSimon J. Gerraty br_sha224_update(br_sha224_context *cc, const void *data, size_t len) 264*0957b409SSimon J. Gerraty { 265*0957b409SSimon J. Gerraty sha2small_update(cc, data, len); 266*0957b409SSimon J. Gerraty } 267*0957b409SSimon J. Gerraty 268*0957b409SSimon J. Gerraty /* see bearssl.h */ 269*0957b409SSimon J. Gerraty void 270*0957b409SSimon J. Gerraty br_sha224_out(const br_sha224_context *cc, void *dst) 271*0957b409SSimon J. Gerraty { 272*0957b409SSimon J. Gerraty sha2small_out(cc, dst, 7); 273*0957b409SSimon J. Gerraty } 274*0957b409SSimon J. Gerraty 275*0957b409SSimon J. Gerraty /* see bearssl.h */ 276*0957b409SSimon J. Gerraty uint64_t 277*0957b409SSimon J. Gerraty br_sha224_state(const br_sha224_context *cc, void *dst) 278*0957b409SSimon J. Gerraty { 279*0957b409SSimon J. Gerraty br_range_enc32be(dst, cc->val, 8); 280*0957b409SSimon J. Gerraty return cc->count; 281*0957b409SSimon J. Gerraty } 282*0957b409SSimon J. Gerraty 283*0957b409SSimon J. Gerraty /* see bearssl.h */ 284*0957b409SSimon J. Gerraty void 285*0957b409SSimon J. Gerraty br_sha224_set_state(br_sha224_context *cc, const void *stb, uint64_t count) 286*0957b409SSimon J. Gerraty { 287*0957b409SSimon J. Gerraty br_range_dec32be(cc->val, 8, stb); 288*0957b409SSimon J. Gerraty cc->count = count; 289*0957b409SSimon J. Gerraty } 290*0957b409SSimon J. Gerraty 291*0957b409SSimon J. Gerraty /* see bearssl.h */ 292*0957b409SSimon J. Gerraty void 293*0957b409SSimon J. Gerraty br_sha256_init(br_sha256_context *cc) 294*0957b409SSimon J. Gerraty { 295*0957b409SSimon J. Gerraty cc->vtable = &br_sha256_vtable; 296*0957b409SSimon J. Gerraty memcpy(cc->val, br_sha256_IV, sizeof cc->val); 297*0957b409SSimon J. Gerraty cc->count = 0; 298*0957b409SSimon J. Gerraty } 299*0957b409SSimon J. Gerraty 300*0957b409SSimon J. Gerraty /* see bearssl.h */ 301*0957b409SSimon J. Gerraty void 302*0957b409SSimon J. Gerraty br_sha256_out(const br_sha256_context *cc, void *dst) 303*0957b409SSimon J. Gerraty { 304*0957b409SSimon J. Gerraty sha2small_out(cc, dst, 8); 305*0957b409SSimon J. Gerraty } 306*0957b409SSimon J. Gerraty 307*0957b409SSimon J. Gerraty /* see bearssl.h */ 308*0957b409SSimon J. Gerraty const br_hash_class br_sha224_vtable = { 309*0957b409SSimon J. Gerraty sizeof(br_sha224_context), 310*0957b409SSimon J. Gerraty BR_HASHDESC_ID(br_sha224_ID) 311*0957b409SSimon J. Gerraty | BR_HASHDESC_OUT(28) 312*0957b409SSimon J. Gerraty | BR_HASHDESC_STATE(32) 313*0957b409SSimon J. Gerraty | BR_HASHDESC_LBLEN(6) 314*0957b409SSimon J. Gerraty | BR_HASHDESC_MD_PADDING 315*0957b409SSimon J. Gerraty | BR_HASHDESC_MD_PADDING_BE, 316*0957b409SSimon J. Gerraty (void (*)(const br_hash_class **))&br_sha224_init, 317*0957b409SSimon J. Gerraty (void (*)(const br_hash_class **, 318*0957b409SSimon J. Gerraty const void *, size_t))&br_sha224_update, 319*0957b409SSimon J. Gerraty (void (*)(const br_hash_class *const *, void *))&br_sha224_out, 320*0957b409SSimon J. Gerraty (uint64_t (*)(const br_hash_class *const *, void *))&br_sha224_state, 321*0957b409SSimon J. Gerraty (void (*)(const br_hash_class **, const void *, uint64_t)) 322*0957b409SSimon J. Gerraty &br_sha224_set_state 323*0957b409SSimon J. Gerraty }; 324*0957b409SSimon J. Gerraty 325*0957b409SSimon J. Gerraty /* see bearssl.h */ 326*0957b409SSimon J. Gerraty const br_hash_class br_sha256_vtable = { 327*0957b409SSimon J. Gerraty sizeof(br_sha256_context), 328*0957b409SSimon J. Gerraty BR_HASHDESC_ID(br_sha256_ID) 329*0957b409SSimon J. Gerraty | BR_HASHDESC_OUT(32) 330*0957b409SSimon J. Gerraty | BR_HASHDESC_STATE(32) 331*0957b409SSimon J. Gerraty | BR_HASHDESC_LBLEN(6) 332*0957b409SSimon J. Gerraty | BR_HASHDESC_MD_PADDING 333*0957b409SSimon J. Gerraty | BR_HASHDESC_MD_PADDING_BE, 334*0957b409SSimon J. Gerraty (void (*)(const br_hash_class **))&br_sha256_init, 335*0957b409SSimon J. Gerraty (void (*)(const br_hash_class **, 336*0957b409SSimon J. Gerraty const void *, size_t))&br_sha256_update, 337*0957b409SSimon J. Gerraty (void (*)(const br_hash_class *const *, void *))&br_sha256_out, 338*0957b409SSimon J. Gerraty (uint64_t (*)(const br_hash_class *const *, void *))&br_sha256_state, 339*0957b409SSimon J. Gerraty (void (*)(const br_hash_class **, const void *, uint64_t)) 340*0957b409SSimon J. Gerraty &br_sha256_set_state 341*0957b409SSimon J. Gerraty }; 342