1
/* This file was automatically imported with
2
import_gcry.py. Please don't modify it */
3
/* sha256.c - SHA256 hash function
4
* Copyright (C) 2003, 2006, 2008 Free Software Foundation, Inc.
6
* This file is part of Libgcrypt.
8
* Libgcrypt is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU Lesser General Public License as
10
* published by the Free Software Foundation; either version 2.1 of
11
* the License, or (at your option) any later version.
13
* Libgcrypt is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU Lesser General Public License for more details.
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
26
SHA224: 23097d22 3405d822 8642a477 bda255b3 2aadbce4 bda0b3f7 e36c9da7
27
SHA256: ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad
29
"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
30
SHA224: 75388b16 512776cc 5dba5da1 fd890150 b0c6455c b4f58b19 52522525
31
SHA256: 248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1
34
SHA224: 20794655 980c91d8 bbb4c1ea 97618a4b f03f4258 1948b2ee 4ee7ad67
35
SHA256: cdc76e5c 9914fb92 81a1c7e2 84d73e67 f1809a48 a497200e 046d39cc c7112cd0
45
#include "hash-common.h"
48
u32 h0,h1,h2,h3,h4,h5,h6,h7;
56
sha256_init (void *context)
58
SHA256_CONTEXT *hd = context;
75
sha224_init (void *context)
77
SHA256_CONTEXT *hd = context;
94
Transform the message X which consists of 16 32-bit-words. See FIPS
96
#define Cho(x,y,z) (z ^ (x & (y ^ z))) /* (4.2) same as SHA-1's F1 */
97
#define Maj(x,y,z) ((x & y) | (z & (x|y))) /* (4.3) same as SHA-1's F3 */
98
#define Sum0(x) (ror ((x), 2) ^ ror ((x), 13) ^ ror ((x), 22)) /* (4.4) */
99
#define Sum1(x) (ror ((x), 6) ^ ror ((x), 11) ^ ror ((x), 25)) /* (4.5) */
100
#define S0(x) (ror ((x), 7) ^ ror ((x), 18) ^ ((x) >> 3)) /* (4.6) */
101
#define S1(x) (ror ((x), 17) ^ ror ((x), 19) ^ ((x) >> 10)) /* (4.7) */
102
#define R(a,b,c,d,e,f,g,h,k,w) do \
104
t1 = (h) + Sum1((e)) + Cho((e),(f),(g)) + (k) + (w); \
105
t2 = Sum0((a)) + Maj((a),(b),(c)); \
117
transform (SHA256_CONTEXT *hd, const unsigned char *data)
119
static const u32 K[64] = {
120
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
121
0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
122
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
123
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
124
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
125
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
126
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
127
0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
128
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
129
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
130
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
131
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
132
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
133
0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
134
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
135
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
138
u32 a,b,c,d,e,f,g,h,t1,t2;
152
#ifdef WORDS_BIGENDIAN
153
memcpy (x, data, 64);
158
for (i=0, p2=(byte*)x; i < 16; i++, p2 += 4 )
168
for (i=0; i < 16; i++)
171
w[i] = S1(w[i-2]) + w[i-7] + S0(w[i-15]) + w[i-16];
173
for (i=0; i < 64; i++)
174
R(a,b,c,d,e,f,g,h,K[i],w[i]);
194
/* Update the message digest with the contents of INBUF with length
197
sha256_write (void *context, const void *inbuf_arg, size_t inlen)
199
const unsigned char *inbuf = inbuf_arg;
200
SHA256_CONTEXT *hd = context;
203
{ /* flush the buffer */
204
transform (hd, hd->buf);
205
_gcry_burn_stack (74*4+32);
213
for (; inlen && hd->count < 64; inlen--)
214
hd->buf[hd->count++] = *inbuf++;
215
sha256_write (hd, NULL, 0);
222
transform (hd, inbuf);
228
_gcry_burn_stack (74*4+32);
229
for (; inlen && hd->count < 64; inlen--)
230
hd->buf[hd->count++] = *inbuf++;
235
The routine finally terminates the computation and returns the
236
digest. The handle is prepared for a new cycle, but adding bytes
237
to the handle will the destroy the returned buffer. Returns: 32
238
bytes with the message the digest. */
240
sha256_final(void *context)
242
SHA256_CONTEXT *hd = context;
246
sha256_write (hd, NULL, 0); /* flush */;
249
/* multiply by 64 to make a byte count */
254
if ((lsb += hd->count) < t)
256
/* multiply by 8 to make a bit count */
264
hd->buf[hd->count++] = 0x80; /* pad */
265
while (hd->count < 56)
266
hd->buf[hd->count++] = 0; /* pad */
269
{ /* need one extra block */
270
hd->buf[hd->count++] = 0x80; /* pad character */
271
while (hd->count < 64)
272
hd->buf[hd->count++] = 0;
273
sha256_write (hd, NULL, 0); /* flush */;
274
memset (hd->buf, 0, 56 ); /* fill next block with zeroes */
276
/* append the 64 bit count */
277
hd->buf[56] = msb >> 24;
278
hd->buf[57] = msb >> 16;
279
hd->buf[58] = msb >> 8;
281
hd->buf[60] = lsb >> 24;
282
hd->buf[61] = lsb >> 16;
283
hd->buf[62] = lsb >> 8;
285
transform (hd, hd->buf);
286
_gcry_burn_stack (74*4+32);
289
#ifdef WORDS_BIGENDIAN
290
#define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0)
291
#else /* little endian */
292
#define X(a) do { *p++ = hd->h##a >> 24; *p++ = hd->h##a >> 16; \
293
*p++ = hd->h##a >> 8; *p++ = hd->h##a; } while(0)
307
sha256_read (void *context)
309
SHA256_CONTEXT *hd = context;
324
/* Run a full self-test for ALGO and return 0 on success. */
329
static byte asn224[19] = /* Object ID is 2.16.840.1.101.3.4.2.4 */
330
{ 0x30, 0x2D, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48,
331
0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05, 0x00, 0x04,
335
static gcry_md_oid_spec_t oid_spec_sha224[] =
337
/* From RFC3874, Section 4 */
338
{ "2.16.840.1.101.3.4.2.4" },
342
static byte asn256[19] = /* Object ID is 2.16.840.1.101.3.4.2.1 */
343
{ 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
344
0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
347
static gcry_md_oid_spec_t oid_spec_sha256[] =
349
/* According to the OpenPGP draft rfc2440-bis06 */
350
{ "2.16.840.1.101.3.4.2.1" },
351
/* PKCS#1 sha256WithRSAEncryption */
352
{ "1.2.840.113549.1.1.11" },
357
gcry_md_spec_t _gcry_digest_spec_sha224 =
359
"SHA224", asn224, DIM (asn224), oid_spec_sha224, 28,
360
sha224_init, sha256_write, sha256_final, sha256_read,
361
sizeof (SHA256_CONTEXT)
366
gcry_md_spec_t _gcry_digest_spec_sha256 =
368
"SHA256", asn256, DIM (asn256), oid_spec_sha256, 32,
369
sha256_init, sha256_write, sha256_final, sha256_read,
370
sizeof (SHA256_CONTEXT)
376
GRUB_MOD_INIT(gcry_sha256)
378
grub_md_register (&_gcry_digest_spec_sha224);
379
grub_md_register (&_gcry_digest_spec_sha256);
382
GRUB_MOD_FINI(gcry_sha256)
384
grub_md_unregister (&_gcry_digest_spec_sha224);
385
grub_md_unregister (&_gcry_digest_spec_sha256);