~hamo/ubuntu/precise/grub2/grub2.hi_res

« back to all changes in this revision

Viewing changes to lib/libgcrypt/cipher/sha256.c

  • Committer: Bazaar Package Importer
  • Author(s): Colin Watson, Colin Watson, Robert Millan, Updated translations
  • Date: 2010-11-22 12:24:56 UTC
  • mfrom: (1.26.4 upstream) (17.3.36 sid)
  • mto: (17.3.43 sid)
  • mto: This revision was merged to the branch mainline in revision 89.
  • Revision ID: james.westby@ubuntu.com-20101122122456-y82z3sfb7k4zfdcc
Tags: 1.99~20101122-1
[ Colin Watson ]
* New Bazaar snapshot.  Too many changes to list in full, but some of the
  more user-visible ones are as follows:
  - GRUB script:
    + Function parameters, "break", "continue", "shift", "setparams",
      "return", and "!".
    + "export" command supports multiple variable names.
    + Multi-line quoted strings support.
    + Wildcard expansion.
  - sendkey support.
  - USB hotunplugging and USB serial support.
  - Rename CD-ROM to cd on BIOS.
  - Add new --boot-directory option to grub-install, grub-reboot, and
    grub-set-default; the old --root-directory option is still accepted
    but was often confusing.
  - Basic btrfs detection/UUID support (but no file reading yet).
  - bash-completion for utilities.
  - If a device is listed in device.map, always assume that it is
    BIOS-visible rather than using extra layers such as LVM or RAID.
  - Add grub-mknetdir script (closes: #550658).
  - Remove deprecated "root" command.
  - Handle RAID devices containing virtio components.
  - GRUB Legacy configuration file support (via grub-menulst2cfg).
  - Keyboard layout support (via grub-mklayout and grub-kbdcomp).
  - Check generated grub.cfg for syntax errors before saving.
  - Pause execution for at most ten seconds if any errors are displayed,
    so that the user has a chance to see them.
  - Support submenus.
  - Write embedding zone using Reed-Solomon, so that it's robust against
    being partially overwritten (closes: #550702, #591416, #593347).
  - GRUB_DISABLE_LINUX_RECOVERY and GRUB_DISABLE_NETBSD_RECOVERY merged
    into a single GRUB_DISABLE_RECOVERY variable.
  - Fix loader memory allocation failure (closes: #551627).
  - Don't call savedefault on recovery entries (closes: #589325).
  - Support triple-indirect blocks on ext2 (closes: #543924).
  - Recognise DDF1 fake RAID (closes: #603354).

[ Robert Millan ]
* Use dpkg architecture wildcards.

[ Updated translations ]
* Slovenian (Vanja Cvelbar).  Closes: #604003
* Dzongkha (dawa pemo via Tenzin Dendup).  Closes: #604102

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* sha256.c - SHA256 hash function
2
 
 *      Copyright (C) 2003, 2006, 2008 Free Software Foundation, Inc.
3
 
 *
4
 
 * This file is part of Libgcrypt.
5
 
 *
6
 
 * Libgcrypt is free software; you can redistribute it and/or modify
7
 
 * it under the terms of the GNU Lesser General Public License as
8
 
 * published by the Free Software Foundation; either version 2.1 of
9
 
 * the License, or (at your option) any later version.
10
 
 *
11
 
 * Libgcrypt is distributed in the hope that it will be useful,
12
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 
 * GNU Lesser General Public License for more details.
15
 
 *
16
 
 * You should have received a copy of the GNU Lesser General Public
17
 
 * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18
 
 */
19
 
 
20
 
 
21
 
/*  Test vectors:
22
 
    
23
 
    "abc"
24
 
    SHA224: 23097d22 3405d822 8642a477 bda255b3 2aadbce4 bda0b3f7 e36c9da7
25
 
    SHA256: ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad
26
 
 
27
 
    "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
28
 
    SHA224: 75388b16 512776cc 5dba5da1 fd890150 b0c6455c b4f58b19 52522525
29
 
    SHA256: 248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1
30
 
 
31
 
    "a" one million times
32
 
    SHA224: 20794655 980c91d8 bbb4c1ea 97618a4b f03f4258 1948b2ee 4ee7ad67
33
 
    SHA256: cdc76e5c 9914fb92 81a1c7e2 84d73e67 f1809a48 a497200e 046d39cc c7112cd0
34
 
 
35
 
 */
36
 
 
37
 
 
38
 
#include <config.h>
39
 
#include <stdio.h>
40
 
#include <stdlib.h>
41
 
#include <string.h>
42
 
 
43
 
#include "g10lib.h"
44
 
#include "memory.h"
45
 
#include "bithelp.h"
46
 
#include "cipher.h"
47
 
#include "hash-common.h"
48
 
 
49
 
typedef struct {
50
 
  u32  h0,h1,h2,h3,h4,h5,h6,h7;
51
 
  u32  nblocks;
52
 
  byte buf[64];
53
 
  int  count;
54
 
} SHA256_CONTEXT;
55
 
 
56
 
 
57
 
static void
58
 
sha256_init (void *context)
59
 
{
60
 
  SHA256_CONTEXT *hd = context;
61
 
 
62
 
  hd->h0 = 0x6a09e667;
63
 
  hd->h1 = 0xbb67ae85;
64
 
  hd->h2 = 0x3c6ef372;
65
 
  hd->h3 = 0xa54ff53a;
66
 
  hd->h4 = 0x510e527f;
67
 
  hd->h5 = 0x9b05688c;
68
 
  hd->h6 = 0x1f83d9ab;
69
 
  hd->h7 = 0x5be0cd19;
70
 
 
71
 
  hd->nblocks = 0;
72
 
  hd->count = 0;
73
 
}
74
 
 
75
 
 
76
 
static void
77
 
sha224_init (void *context)
78
 
{
79
 
  SHA256_CONTEXT *hd = context;
80
 
 
81
 
  hd->h0 = 0xc1059ed8;
82
 
  hd->h1 = 0x367cd507;
83
 
  hd->h2 = 0x3070dd17;
84
 
  hd->h3 = 0xf70e5939;
85
 
  hd->h4 = 0xffc00b31;
86
 
  hd->h5 = 0x68581511;
87
 
  hd->h6 = 0x64f98fa7;
88
 
  hd->h7 = 0xbefa4fa4;
89
 
 
90
 
  hd->nblocks = 0;
91
 
  hd->count = 0;
92
 
}
93
 
 
94
 
 
95
 
/*
96
 
  Transform the message X which consists of 16 32-bit-words. See FIPS
97
 
  180-2 for details.  */
98
 
#define Cho(x,y,z) (z ^ (x & (y ^ z)))      /* (4.2) same as SHA-1's F1 */
99
 
#define Maj(x,y,z) ((x & y) | (z & (x|y)))  /* (4.3) same as SHA-1's F3 */
100
 
#define Sum0(x) (ror ((x), 2) ^ ror ((x), 13) ^ ror ((x), 22))  /* (4.4) */
101
 
#define Sum1(x) (ror ((x), 6) ^ ror ((x), 11) ^ ror ((x), 25))  /* (4.5) */
102
 
#define S0(x) (ror ((x), 7) ^ ror ((x), 18) ^ ((x) >> 3))       /* (4.6) */
103
 
#define S1(x) (ror ((x), 17) ^ ror ((x), 19) ^ ((x) >> 10))     /* (4.7) */
104
 
#define R(a,b,c,d,e,f,g,h,k,w) do                                 \
105
 
          {                                                       \
106
 
            t1 = (h) + Sum1((e)) + Cho((e),(f),(g)) + (k) + (w);  \
107
 
            t2 = Sum0((a)) + Maj((a),(b),(c));                    \
108
 
            h = g;                                                \
109
 
            g = f;                                                \
110
 
            f = e;                                                \
111
 
            e = d + t1;                                           \
112
 
            d = c;                                                \
113
 
            c = b;                                                \
114
 
            b = a;                                                \
115
 
            a = t1 + t2;                                          \
116
 
          } while (0)
117
 
 
118
 
static void
119
 
transform (SHA256_CONTEXT *hd, const unsigned char *data)
120
 
{
121
 
  static const u32 K[64] = {
122
 
    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
123
 
    0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
124
 
    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
125
 
    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 
126
 
    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
127
 
    0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
128
 
    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
129
 
    0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
130
 
    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
131
 
    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
132
 
    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
133
 
    0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
134
 
    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
135
 
    0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
136
 
    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
137
 
    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
138
 
  };
139
 
 
140
 
  u32 a,b,c,d,e,f,g,h,t1,t2;
141
 
  u32 x[16];
142
 
  u32 w[64];
143
 
  int i;
144
 
  
145
 
  a = hd->h0;
146
 
  b = hd->h1;
147
 
  c = hd->h2;
148
 
  d = hd->h3;
149
 
  e = hd->h4;
150
 
  f = hd->h5;
151
 
  g = hd->h6;
152
 
  h = hd->h7;
153
 
  
154
 
#ifdef WORDS_BIGENDIAN
155
 
  memcpy (x, data, 64);
156
 
#else
157
 
  { 
158
 
    byte *p2;
159
 
  
160
 
    for (i=0, p2=(byte*)x; i < 16; i++, p2 += 4 ) 
161
 
      {
162
 
        p2[3] = *data++;
163
 
        p2[2] = *data++;
164
 
        p2[1] = *data++;
165
 
        p2[0] = *data++;
166
 
      }
167
 
  }
168
 
#endif
169
 
 
170
 
  for (i=0; i < 16; i++)
171
 
    w[i] = x[i];
172
 
  for (; i < 64; i++)
173
 
    w[i] = S1(w[i-2]) + w[i-7] + S0(w[i-15]) + w[i-16];
174
 
 
175
 
  for (i=0; i < 64; i++)
176
 
    R(a,b,c,d,e,f,g,h,K[i],w[i]);
177
 
 
178
 
  hd->h0 += a;
179
 
  hd->h1 += b;
180
 
  hd->h2 += c;
181
 
  hd->h3 += d;
182
 
  hd->h4 += e;
183
 
  hd->h5 += f;
184
 
  hd->h6 += g;
185
 
  hd->h7 += h;
186
 
}
187
 
#undef Cho
188
 
#undef Maj
189
 
#undef Sum0
190
 
#undef Sum1
191
 
#undef S0
192
 
#undef S1
193
 
#undef R
194
 
 
195
 
 
196
 
/* Update the message digest with the contents of INBUF with length
197
 
  INLEN.  */
198
 
static void
199
 
sha256_write (void *context, const void *inbuf_arg, size_t inlen)
200
 
{
201
 
  const unsigned char *inbuf = inbuf_arg;
202
 
  SHA256_CONTEXT *hd = context;
203
 
 
204
 
  if (hd->count == 64)
205
 
    { /* flush the buffer */
206
 
      transform (hd, hd->buf);
207
 
      _gcry_burn_stack (74*4+32);
208
 
      hd->count = 0;
209
 
      hd->nblocks++;
210
 
    }
211
 
  if (!inbuf)
212
 
    return;
213
 
  if (hd->count)
214
 
    {
215
 
      for (; inlen && hd->count < 64; inlen--)
216
 
        hd->buf[hd->count++] = *inbuf++;
217
 
      sha256_write (hd, NULL, 0);
218
 
      if (!inlen)
219
 
        return;
220
 
    }
221
 
 
222
 
  while (inlen >= 64)
223
 
    {
224
 
      transform (hd, inbuf);
225
 
      hd->count = 0;
226
 
      hd->nblocks++;
227
 
      inlen -= 64;
228
 
      inbuf += 64;
229
 
    }
230
 
  _gcry_burn_stack (74*4+32);
231
 
  for (; inlen && hd->count < 64; inlen--)
232
 
    hd->buf[hd->count++] = *inbuf++;
233
 
}
234
 
 
235
 
 
236
 
/*
237
 
   The routine finally terminates the computation and returns the
238
 
   digest.  The handle is prepared for a new cycle, but adding bytes
239
 
   to the handle will the destroy the returned buffer.  Returns: 32
240
 
   bytes with the message the digest.  */
241
 
static void
242
 
sha256_final(void *context)
243
 
{
244
 
  SHA256_CONTEXT *hd = context;
245
 
  u32 t, msb, lsb;
246
 
  byte *p;
247
 
  
248
 
  sha256_write (hd, NULL, 0); /* flush */;
249
 
 
250
 
  t = hd->nblocks;
251
 
  /* multiply by 64 to make a byte count */
252
 
  lsb = t << 6;
253
 
  msb = t >> 26;
254
 
  /* add the count */
255
 
  t = lsb;
256
 
  if ((lsb += hd->count) < t)
257
 
    msb++;
258
 
  /* multiply by 8 to make a bit count */
259
 
  t = lsb;
260
 
  lsb <<= 3;
261
 
  msb <<= 3;
262
 
  msb |= t >> 29;
263
 
 
264
 
  if (hd->count < 56)
265
 
    { /* enough room */
266
 
      hd->buf[hd->count++] = 0x80; /* pad */
267
 
      while (hd->count < 56)
268
 
        hd->buf[hd->count++] = 0;  /* pad */
269
 
    }
270
 
  else
271
 
    { /* need one extra block */
272
 
      hd->buf[hd->count++] = 0x80; /* pad character */
273
 
      while (hd->count < 64)
274
 
        hd->buf[hd->count++] = 0;
275
 
      sha256_write (hd, NULL, 0);  /* flush */;
276
 
      memset (hd->buf, 0, 56 ); /* fill next block with zeroes */
277
 
    }
278
 
  /* append the 64 bit count */
279
 
  hd->buf[56] = msb >> 24;
280
 
  hd->buf[57] = msb >> 16;
281
 
  hd->buf[58] = msb >>  8;
282
 
  hd->buf[59] = msb;
283
 
  hd->buf[60] = lsb >> 24;
284
 
  hd->buf[61] = lsb >> 16;
285
 
  hd->buf[62] = lsb >>  8;
286
 
  hd->buf[63] = lsb;
287
 
  transform (hd, hd->buf);
288
 
  _gcry_burn_stack (74*4+32);
289
 
 
290
 
  p = hd->buf;
291
 
#ifdef WORDS_BIGENDIAN
292
 
#define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0)
293
 
#else /* little endian */
294
 
#define X(a) do { *p++ = hd->h##a >> 24; *p++ = hd->h##a >> 16;  \
295
 
                  *p++ = hd->h##a >> 8; *p++ = hd->h##a; } while(0)
296
 
#endif
297
 
  X(0);
298
 
  X(1);
299
 
  X(2);
300
 
  X(3);
301
 
  X(4);
302
 
  X(5);
303
 
  X(6);
304
 
  X(7);
305
 
#undef X
306
 
}
307
 
 
308
 
static byte *
309
 
sha256_read (void *context)
310
 
{
311
 
  SHA256_CONTEXT *hd = context;
312
 
 
313
 
  return hd->buf;
314
 
}
315
 
 
316
 
 
317
 
 
318
 
/* 
319
 
     Self-test section.
320
 
 */
321
 
 
322
 
 
323
 
static gpg_err_code_t
324
 
selftests_sha224 (int extended, selftest_report_func_t report)
325
 
{
326
 
  const char *what;
327
 
  const char *errtxt;
328
 
  
329
 
  what = "short string";
330
 
  errtxt = _gcry_hash_selftest_check_one
331
 
    (GCRY_MD_SHA224, 0, 
332
 
     "abc", 3,
333
 
     "\x23\x09\x7d\x22\x34\x05\xd8\x22\x86\x42\xa4\x77\xbd\xa2\x55\xb3"
334
 
     "\x2a\xad\xbc\xe4\xbd\xa0\xb3\xf7\xe3\x6c\x9d\xa7", 28);
335
 
  if (errtxt)
336
 
    goto failed;
337
 
 
338
 
  if (extended)
339
 
    {
340
 
      what = "long string";
341
 
      errtxt = _gcry_hash_selftest_check_one
342
 
        (GCRY_MD_SHA224, 0, 
343
 
         "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56,
344
 
         "\x75\x38\x8b\x16\x51\x27\x76\xcc\x5d\xba\x5d\xa1\xfd\x89\x01\x50"
345
 
         "\xb0\xc6\x45\x5c\xb4\xf5\x8b\x19\x52\x52\x25\x25", 28);
346
 
      if (errtxt)
347
 
        goto failed;
348
 
      
349
 
      what = "one million \"a\"";
350
 
      errtxt = _gcry_hash_selftest_check_one
351
 
        (GCRY_MD_SHA224, 1,
352
 
         NULL, 0,
353
 
         "\x20\x79\x46\x55\x98\x0c\x91\xd8\xbb\xb4\xc1\xea\x97\x61\x8a\x4b"
354
 
         "\xf0\x3f\x42\x58\x19\x48\xb2\xee\x4e\xe7\xad\x67", 28);
355
 
      if (errtxt)
356
 
        goto failed;
357
 
    }
358
 
 
359
 
  return 0; /* Succeeded. */
360
 
 
361
 
 failed:
362
 
  if (report)
363
 
    report ("digest", GCRY_MD_SHA224, what, errtxt);
364
 
  return GPG_ERR_SELFTEST_FAILED;
365
 
}
366
 
 
367
 
static gpg_err_code_t
368
 
selftests_sha256 (int extended, selftest_report_func_t report)
369
 
{
370
 
  const char *what;
371
 
  const char *errtxt;
372
 
  
373
 
  what = "short string";
374
 
  errtxt = _gcry_hash_selftest_check_one
375
 
    (GCRY_MD_SHA256, 0, 
376
 
     "abc", 3,
377
 
     "\xba\x78\x16\xbf\x8f\x01\xcf\xea\x41\x41\x40\xde\x5d\xae\x22\x23"
378
 
     "\xb0\x03\x61\xa3\x96\x17\x7a\x9c\xb4\x10\xff\x61\xf2\x00\x15\xad", 32);
379
 
  if (errtxt)
380
 
    goto failed;
381
 
 
382
 
  if (extended)
383
 
    {
384
 
      what = "long string";
385
 
      errtxt = _gcry_hash_selftest_check_one
386
 
        (GCRY_MD_SHA256, 0, 
387
 
         "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56,
388
 
         "\x24\x8d\x6a\x61\xd2\x06\x38\xb8\xe5\xc0\x26\x93\x0c\x3e\x60\x39"
389
 
         "\xa3\x3c\xe4\x59\x64\xff\x21\x67\xf6\xec\xed\xd4\x19\xdb\x06\xc1",
390
 
         32);
391
 
      if (errtxt)
392
 
        goto failed;
393
 
      
394
 
      what = "one million \"a\"";
395
 
      errtxt = _gcry_hash_selftest_check_one
396
 
        (GCRY_MD_SHA256, 1,
397
 
         NULL, 0,
398
 
         "\xcd\xc7\x6e\x5c\x99\x14\xfb\x92\x81\xa1\xc7\xe2\x84\xd7\x3e\x67"
399
 
         "\xf1\x80\x9a\x48\xa4\x97\x20\x0e\x04\x6d\x39\xcc\xc7\x11\x2c\xd0",
400
 
         32);
401
 
      if (errtxt)
402
 
        goto failed;
403
 
    }
404
 
 
405
 
  return 0; /* Succeeded. */
406
 
 
407
 
 failed:
408
 
  if (report)
409
 
    report ("digest", GCRY_MD_SHA256, what, errtxt);
410
 
  return GPG_ERR_SELFTEST_FAILED;
411
 
}
412
 
 
413
 
 
414
 
/* Run a full self-test for ALGO and return 0 on success.  */
415
 
static gpg_err_code_t
416
 
run_selftests (int algo, int extended, selftest_report_func_t report)
417
 
{
418
 
  gpg_err_code_t ec;
419
 
 
420
 
  switch (algo)
421
 
    {
422
 
    case GCRY_MD_SHA224:
423
 
      ec = selftests_sha224 (extended, report);
424
 
      break;
425
 
    case GCRY_MD_SHA256:
426
 
      ec = selftests_sha256 (extended, report);
427
 
      break;
428
 
    default:
429
 
      ec = GPG_ERR_DIGEST_ALGO;
430
 
      break;
431
 
        
432
 
    }
433
 
  return ec;
434
 
}
435
 
 
436
 
 
437
 
 
438
 
 
439
 
static byte asn224[19] = /* Object ID is 2.16.840.1.101.3.4.2.4 */
440
 
  { 0x30, 0x2D, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48,
441
 
    0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05, 0x00, 0x04,
442
 
    0x1C
443
 
  };
444
 
 
445
 
static gcry_md_oid_spec_t oid_spec_sha224[] =
446
 
  {
447
 
    /* From RFC3874, Section 4 */
448
 
    { "2.16.840.1.101.3.4.2.4" }, 
449
 
    { NULL },
450
 
  };
451
 
 
452
 
static byte asn256[19] = /* Object ID is  2.16.840.1.101.3.4.2.1 */
453
 
  { 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
454
 
    0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
455
 
    0x00, 0x04, 0x20 };
456
 
 
457
 
static gcry_md_oid_spec_t oid_spec_sha256[] =
458
 
  {
459
 
    /* According to the OpenPGP draft rfc2440-bis06 */
460
 
    { "2.16.840.1.101.3.4.2.1" }, 
461
 
    /* PKCS#1 sha256WithRSAEncryption */
462
 
    { "1.2.840.113549.1.1.11" },
463
 
 
464
 
    { NULL },
465
 
  };
466
 
 
467
 
gcry_md_spec_t _gcry_digest_spec_sha224 =
468
 
  {
469
 
    "SHA224", asn224, DIM (asn224), oid_spec_sha224, 28,
470
 
    sha224_init, sha256_write, sha256_final, sha256_read,
471
 
    sizeof (SHA256_CONTEXT)
472
 
  };
473
 
md_extra_spec_t _gcry_digest_extraspec_sha224 = 
474
 
  {
475
 
    run_selftests
476
 
  };
477
 
 
478
 
gcry_md_spec_t _gcry_digest_spec_sha256 =
479
 
  {
480
 
    "SHA256", asn256, DIM (asn256), oid_spec_sha256, 32,
481
 
    sha256_init, sha256_write, sha256_final, sha256_read,
482
 
    sizeof (SHA256_CONTEXT)
483
 
  };
484
 
md_extra_spec_t _gcry_digest_extraspec_sha256 = 
485
 
  {
486
 
    run_selftests
487
 
  };