~darkmuggle-deactivatedaccount/ubuntu/quantal/grub2/fix-872244

« back to all changes in this revision

Viewing changes to grub-core/lib/libgcrypt/cipher/md5.c

  • Committer: Bazaar Package Importer
  • Author(s): Colin Watson, Colin Watson, Evan Broder, Mario Limonciello
  • Date: 2010-11-24 13:59:55 UTC
  • mfrom: (1.17.6 upstream) (17.6.15 experimental)
  • Revision ID: james.westby@ubuntu.com-20101124135955-r6ii5sepayr7jt53
Tags: 1.99~20101124-1ubuntu1
[ Colin Watson ]
* Resynchronise with Debian experimental.  Remaining changes:
  - Adjust for default Ubuntu boot options ("quiet splash").
  - Default to hiding the menu; holding down Shift at boot will show it.
  - Set a monochromatic theme for Ubuntu.
  - Apply Ubuntu GRUB Legacy changes to legacy update-grub script: title,
    recovery mode, quiet option, tweak how memtest86+ is displayed, and
    use UUIDs where appropriate.
  - Fix backslash-escaping in merge_debconf_into_conf.
  - Remove "GNU/Linux" from default distributor string.
  - Add crashkernel= options if kdump and makedumpfile are available.
  - If other operating systems are installed, then automatically unhide
    the menu.  Otherwise, if GRUB_HIDDEN_TIMEOUT is 0, then use keystatus
    if available to check whether Shift is pressed.  If it is, show the
    menu, otherwise boot immediately.  If keystatus is not available, then
    fall back to a short delay interruptible with Escape.
  - Allow Shift to interrupt 'sleep --interruptible'.
  - Don't display introductory message about line editing unless we're
    actually offering a shell prompt.  Don't clear the screen just before
    booting if we never drew the menu in the first place.
  - Remove some verbose messages printed before reading the configuration
    file.
  - Suppress progress messages as the kernel and initrd load for
    non-recovery kernel menu entries.
  - Change prepare_grub_to_access_device to handle filesystems
    loop-mounted on file images.
  - Ignore devices loop-mounted from files in 10_linux.
  - Show the boot menu if the previous boot failed, that is if it failed
    to get to the end of one of the normal runlevels.
  - Don't generate /boot/grub/device.map during grub-install or
    grub-mkconfig by default.
  - Adjust upgrade version checks for Ubuntu.
  - Don't display "GRUB loading" unless Shift is held down.
  - Adjust versions of grub-doc and grub-legacy-doc conflicts to tolerate
    our backport of the grub-doc split.
  - Fix LVM/RAID probing in the absence of /boot/grub/device.map.
  - Look for .mo files in /usr/share/locale-langpack as well, in
    preference.
  - Make sure GRUB_TIMEOUT isn't quoted unnecessarily.
  - Probe all devices in 'grub-probe --target=drive' if
    /boot/grub/device.map is missing.
  - Build-depend on qemu-kvm rather than qemu-system for grub-pc tests.
  - Use qemu rather than qemu-system-i386.
  - Program vesafb on BIOS systems rather than efifb.
  - Add a grub-rescue-efi-amd64 package containing a rescue CD-ROM image
    for EFI-AMD64.
  - On Wubi, don't ask for an install device, but just update wubildr
    using the diverted grub-install.
  - When embedding the core image in a post-MBR gap, check for and avoid
    sectors matching any of a list of known signatures.
  - Disable video_bochs and video_cirrus on PC BIOS systems, as probing
    PCI space seems to break on some systems.
* Downgrade "ACPI shutdown failed" error to a debug message, since it can
  cause spurious test failures.

[ Evan Broder ]
* Enable lua from grub-extras.
* Incorporate the bitop library into lua.
* Add enum_pci function to grub module in lua.
* Switch back to gfxpayload=keep by default, unless the video hardware
  is known to not support it.

[ Mario Limonciello ]
* Built part_msdos and vfat into bootx64.efi (LP: #677758)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* md5.c - MD5 Message-Digest Algorithm
 
2
 * Copyright (C) 1995,1996,1998,1999,2001,2002,
 
3
 *               2003  Free Software Foundation, Inc.
 
4
 *
 
5
 * This file is part of Libgcrypt.
 
6
 *
 
7
 * Libgcrypt is free software; you can redistribute it and/or modify
 
8
 * it under the terms of the GNU Lesser General Public License as
 
9
 * published by the Free Software Foundation; either version 2.1 of
 
10
 * the License, or (at your option) any later version.
 
11
 *
 
12
 * Libgcrypt is distributed in the hope that it will be useful,
 
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
 * GNU Lesser General Public License for more details.
 
16
 *
 
17
 * You should have received a copy of the GNU Lesser General Public
 
18
 * License along with this program; if not, write to the Free Software
 
19
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 
20
 *
 
21
 * According to the definition of MD5 in RFC 1321 from April 1992.
 
22
 * NOTE: This is *not* the same file as the one from glibc.
 
23
 * Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. 
 
24
 * heavily modified for GnuPG by Werner Koch <wk@gnupg.org> 
 
25
 */
 
26
 
 
27
/* Test values:
 
28
 * ""                  D4 1D 8C D9 8F 00 B2 04  E9 80 09 98 EC F8 42 7E
 
29
 * "a"                 0C C1 75 B9 C0 F1 B6 A8  31 C3 99 E2 69 77 26 61
 
30
 * "abc                90 01 50 98 3C D2 4F B0  D6 96 3F 7D 28 E1 7F 72
 
31
 * "message digest"    F9 6B 69 7D 7C B7 93 8D  52 5A 2F 31 AA F1 61 D0
 
32
 */
 
33
 
 
34
#include <config.h>
 
35
#include <stdio.h>
 
36
#include <stdlib.h>
 
37
#include <string.h>
 
38
 
 
39
#include "g10lib.h"
 
40
#include "memory.h"
 
41
#include "cipher.h"
 
42
 
 
43
#include "bithelp.h"
 
44
 
 
45
 
 
46
typedef struct {
 
47
    u32 A,B,C,D;          /* chaining variables */
 
48
    u32  nblocks;
 
49
    byte buf[64];
 
50
    int  count;
 
51
} MD5_CONTEXT;
 
52
 
 
53
 
 
54
static void
 
55
md5_init( void *context )
 
56
{
 
57
  MD5_CONTEXT *ctx = context;
 
58
 
 
59
  ctx->A = 0x67452301;
 
60
  ctx->B = 0xefcdab89;
 
61
  ctx->C = 0x98badcfe;
 
62
  ctx->D = 0x10325476;
 
63
 
 
64
  ctx->nblocks = 0;
 
65
  ctx->count = 0;
 
66
}
 
67
 
 
68
 
 
69
/* These are the four functions used in the four steps of the MD5 algorithm
 
70
   and defined in the RFC 1321.  The first function is a little bit optimized
 
71
   (as found in Colin Plumbs public domain implementation).  */
 
72
/* #define FF(b, c, d) ((b & c) | (~b & d)) */
 
73
#define FF(b, c, d) (d ^ (b & (c ^ d)))
 
74
#define FG(b, c, d) FF (d, b, c)
 
75
#define FH(b, c, d) (b ^ c ^ d)
 
76
#define FI(b, c, d) (c ^ (b | ~d))
 
77
 
 
78
 
 
79
/****************
 
80
 * transform n*64 bytes
 
81
 */
 
82
static void
 
83
transform ( MD5_CONTEXT *ctx, const unsigned char *data )
 
84
{
 
85
  u32 correct_words[16];
 
86
  register u32 A = ctx->A;
 
87
  register u32 B = ctx->B;
 
88
  register u32 C = ctx->C;
 
89
  register u32 D = ctx->D;
 
90
  u32 *cwp = correct_words;
 
91
    
 
92
#ifdef WORDS_BIGENDIAN
 
93
  { 
 
94
    int i;
 
95
    byte *p2, *p1;
 
96
    for(i=0, p1=data, p2=(byte*)correct_words; i < 16; i++, p2 += 4 )
 
97
      {
 
98
        p2[3] = *p1++;
 
99
        p2[2] = *p1++;
 
100
        p2[1] = *p1++;
 
101
        p2[0] = *p1++;
 
102
      }
 
103
  }
 
104
#else
 
105
  memcpy( correct_words, data, 64 );
 
106
#endif
 
107
 
 
108
 
 
109
#define OP(a, b, c, d, s, T) \
 
110
  do                                       \
 
111
    {                                      \
 
112
      a += FF (b, c, d) + (*cwp++) + T;    \
 
113
      a = rol(a, s);                       \
 
114
      a += b;                              \
 
115
    }                                      \
 
116
  while (0)
 
117
 
 
118
  /* Before we start, one word about the strange constants.
 
119
     They are defined in RFC 1321 as
 
120
 
 
121
     T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
 
122
  */
 
123
 
 
124
  /* Round 1.  */
 
125
  OP (A, B, C, D,  7, 0xd76aa478);
 
126
  OP (D, A, B, C, 12, 0xe8c7b756);
 
127
  OP (C, D, A, B, 17, 0x242070db);
 
128
  OP (B, C, D, A, 22, 0xc1bdceee);
 
129
  OP (A, B, C, D,  7, 0xf57c0faf);
 
130
  OP (D, A, B, C, 12, 0x4787c62a);
 
131
  OP (C, D, A, B, 17, 0xa8304613);
 
132
  OP (B, C, D, A, 22, 0xfd469501);
 
133
  OP (A, B, C, D,  7, 0x698098d8);
 
134
  OP (D, A, B, C, 12, 0x8b44f7af);
 
135
  OP (C, D, A, B, 17, 0xffff5bb1);
 
136
  OP (B, C, D, A, 22, 0x895cd7be);
 
137
  OP (A, B, C, D,  7, 0x6b901122);
 
138
  OP (D, A, B, C, 12, 0xfd987193);
 
139
  OP (C, D, A, B, 17, 0xa679438e);
 
140
  OP (B, C, D, A, 22, 0x49b40821);
 
141
 
 
142
#undef OP
 
143
#define OP(f, a, b, c, d, k, s, T)  \
 
144
    do                                                                \
 
145
      {                                                               \
 
146
        a += f (b, c, d) + correct_words[k] + T;                      \
 
147
        a = rol(a, s);                                                \
 
148
        a += b;                                                       \
 
149
      }                                                               \
 
150
    while (0)
 
151
 
 
152
  /* Round 2.  */
 
153
  OP (FG, A, B, C, D,  1,  5, 0xf61e2562);
 
154
  OP (FG, D, A, B, C,  6,  9, 0xc040b340);
 
155
  OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
 
156
  OP (FG, B, C, D, A,  0, 20, 0xe9b6c7aa);
 
157
  OP (FG, A, B, C, D,  5,  5, 0xd62f105d);
 
158
  OP (FG, D, A, B, C, 10,  9, 0x02441453);
 
159
  OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
 
160
  OP (FG, B, C, D, A,  4, 20, 0xe7d3fbc8);
 
161
  OP (FG, A, B, C, D,  9,  5, 0x21e1cde6);
 
162
  OP (FG, D, A, B, C, 14,  9, 0xc33707d6);
 
163
  OP (FG, C, D, A, B,  3, 14, 0xf4d50d87);
 
164
  OP (FG, B, C, D, A,  8, 20, 0x455a14ed);
 
165
  OP (FG, A, B, C, D, 13,  5, 0xa9e3e905);
 
166
  OP (FG, D, A, B, C,  2,  9, 0xfcefa3f8);
 
167
  OP (FG, C, D, A, B,  7, 14, 0x676f02d9);
 
168
  OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
 
169
 
 
170
  /* Round 3.  */
 
171
  OP (FH, A, B, C, D,  5,  4, 0xfffa3942);
 
172
  OP (FH, D, A, B, C,  8, 11, 0x8771f681);
 
173
  OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
 
174
  OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
 
175
  OP (FH, A, B, C, D,  1,  4, 0xa4beea44);
 
176
  OP (FH, D, A, B, C,  4, 11, 0x4bdecfa9);
 
177
  OP (FH, C, D, A, B,  7, 16, 0xf6bb4b60);
 
178
  OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
 
179
  OP (FH, A, B, C, D, 13,  4, 0x289b7ec6);
 
180
  OP (FH, D, A, B, C,  0, 11, 0xeaa127fa);
 
181
  OP (FH, C, D, A, B,  3, 16, 0xd4ef3085);
 
182
  OP (FH, B, C, D, A,  6, 23, 0x04881d05);
 
183
  OP (FH, A, B, C, D,  9,  4, 0xd9d4d039);
 
184
  OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
 
185
  OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
 
186
  OP (FH, B, C, D, A,  2, 23, 0xc4ac5665);
 
187
 
 
188
  /* Round 4.  */
 
189
  OP (FI, A, B, C, D,  0,  6, 0xf4292244);
 
190
  OP (FI, D, A, B, C,  7, 10, 0x432aff97);
 
191
  OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
 
192
  OP (FI, B, C, D, A,  5, 21, 0xfc93a039);
 
193
  OP (FI, A, B, C, D, 12,  6, 0x655b59c3);
 
194
  OP (FI, D, A, B, C,  3, 10, 0x8f0ccc92);
 
195
  OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
 
196
  OP (FI, B, C, D, A,  1, 21, 0x85845dd1);
 
197
  OP (FI, A, B, C, D,  8,  6, 0x6fa87e4f);
 
198
  OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
 
199
  OP (FI, C, D, A, B,  6, 15, 0xa3014314);
 
200
  OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
 
201
  OP (FI, A, B, C, D,  4,  6, 0xf7537e82);
 
202
  OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
 
203
  OP (FI, C, D, A, B,  2, 15, 0x2ad7d2bb);
 
204
  OP (FI, B, C, D, A,  9, 21, 0xeb86d391);
 
205
 
 
206
  /* Put checksum in context given as argument.  */
 
207
  ctx->A += A;
 
208
  ctx->B += B;
 
209
  ctx->C += C;
 
210
  ctx->D += D;
 
211
}
 
212
 
 
213
 
 
214
 
 
215
/* The routine updates the message-digest context to
 
216
 * account for the presence of each of the characters inBuf[0..inLen-1]
 
217
 * in the message whose digest is being computed.
 
218
 */
 
219
static void
 
220
md5_write( void *context, const void *inbuf_arg , size_t inlen)
 
221
{
 
222
  const unsigned char *inbuf = inbuf_arg;
 
223
  MD5_CONTEXT *hd = context;
 
224
  
 
225
  if( hd->count == 64 )  /* flush the buffer */
 
226
    {
 
227
      transform( hd, hd->buf );
 
228
      _gcry_burn_stack (80+6*sizeof(void*));
 
229
      hd->count = 0;
 
230
      hd->nblocks++;
 
231
    }
 
232
  if( !inbuf )
 
233
    return;
 
234
 
 
235
  if( hd->count )
 
236
    {
 
237
      for( ; inlen && hd->count < 64; inlen-- )
 
238
        hd->buf[hd->count++] = *inbuf++;
 
239
      md5_write( hd, NULL, 0 );
 
240
      if( !inlen )
 
241
        return;
 
242
    }
 
243
  _gcry_burn_stack (80+6*sizeof(void*));
 
244
 
 
245
  while( inlen >= 64 ) 
 
246
    {
 
247
      transform( hd, inbuf );
 
248
      hd->count = 0;
 
249
      hd->nblocks++;
 
250
      inlen -= 64;
 
251
      inbuf += 64;
 
252
    }
 
253
  for( ; inlen && hd->count < 64; inlen-- )
 
254
    hd->buf[hd->count++] = *inbuf++;
 
255
 
 
256
}
 
257
 
 
258
 
 
259
 
 
260
/* The routine final terminates the message-digest computation and
 
261
 * ends with the desired message digest in mdContext->digest[0...15].
 
262
 * The handle is prepared for a new MD5 cycle.
 
263
 * Returns 16 bytes representing the digest.
 
264
 */
 
265
 
 
266
static void
 
267
md5_final( void *context)
 
268
{
 
269
  MD5_CONTEXT *hd = context;
 
270
  u32 t, msb, lsb;
 
271
  byte *p;
 
272
  
 
273
  md5_write(hd, NULL, 0); /* flush */;
 
274
 
 
275
  t = hd->nblocks;
 
276
  /* multiply by 64 to make a byte count */
 
277
  lsb = t << 6;
 
278
  msb = t >> 26;
 
279
  /* add the count */
 
280
  t = lsb;
 
281
  if( (lsb += hd->count) < t )
 
282
    msb++;
 
283
  /* multiply by 8 to make a bit count */
 
284
  t = lsb;
 
285
  lsb <<= 3;
 
286
  msb <<= 3;
 
287
  msb |= t >> 29;
 
288
 
 
289
  if( hd->count < 56 )  /* enough room */
 
290
    {
 
291
      hd->buf[hd->count++] = 0x80; /* pad */
 
292
      while( hd->count < 56 )
 
293
        hd->buf[hd->count++] = 0;  /* pad */
 
294
    }
 
295
  else  /* need one extra block */
 
296
    {
 
297
      hd->buf[hd->count++] = 0x80; /* pad character */
 
298
      while( hd->count < 64 )
 
299
        hd->buf[hd->count++] = 0;
 
300
      md5_write(hd, NULL, 0);  /* flush */;
 
301
      memset(hd->buf, 0, 56 ); /* fill next block with zeroes */
 
302
    }
 
303
  /* append the 64 bit count */
 
304
  hd->buf[56] = lsb        ;
 
305
  hd->buf[57] = lsb >>  8;
 
306
  hd->buf[58] = lsb >> 16;
 
307
  hd->buf[59] = lsb >> 24;
 
308
  hd->buf[60] = msb        ;
 
309
  hd->buf[61] = msb >>  8;
 
310
  hd->buf[62] = msb >> 16;
 
311
  hd->buf[63] = msb >> 24;
 
312
  transform( hd, hd->buf );
 
313
  _gcry_burn_stack (80+6*sizeof(void*));
 
314
 
 
315
  p = hd->buf;
 
316
#ifdef WORDS_BIGENDIAN
 
317
#define X(a) do { *p++ = hd->a      ; *p++ = hd->a >> 8;      \
 
318
                  *p++ = hd->a >> 16; *p++ = hd->a >> 24; } while(0)
 
319
#else /* little endian */
 
320
#define X(a) do { *(u32*)p = (*hd).a ; p += 4; } while(0)
 
321
#endif
 
322
  X(A);
 
323
  X(B);
 
324
  X(C);
 
325
  X(D);
 
326
#undef X
 
327
 
 
328
}
 
329
 
 
330
static byte *
 
331
md5_read( void *context )
 
332
{
 
333
  MD5_CONTEXT *hd = (MD5_CONTEXT *) context;
 
334
  return hd->buf;
 
335
}
 
336
 
 
337
static byte asn[18] = /* Object ID is 1.2.840.113549.2.5 */
 
338
  { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86,0x48,
 
339
    0x86, 0xf7, 0x0d, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10 };
 
340
 
 
341
static gcry_md_oid_spec_t oid_spec_md5[] =
 
342
  {
 
343
    /* iso.member-body.us.rsadsi.pkcs.pkcs-1.4 (md5WithRSAEncryption) */
 
344
    { "1.2.840.113549.1.1.4" },
 
345
    /* RSADSI digestAlgorithm MD5 */
 
346
    { "1.2.840.113549.2.5" },
 
347
    { NULL },
 
348
  };
 
349
 
 
350
gcry_md_spec_t _gcry_digest_spec_md5 =
 
351
  {
 
352
    "MD5", asn, DIM (asn), oid_spec_md5, 16,
 
353
    md5_init, md5_write, md5_final, md5_read,
 
354
    sizeof (MD5_CONTEXT)
 
355
  };