~n-muench/ubuntu/oneiric/open-vm-tools/open-vm-tools.fix-836277

« back to all changes in this revision

Viewing changes to lib/misc/base64.c

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Baumann
  • Date: 2008-11-20 21:56:00 UTC
  • mfrom: (1.1.3 upstream) (2.2.1 lenny)
  • Revision ID: james.westby@ubuntu.com-20081120215600-0jujiv17a2ja92xu
Tags: 2008.11.18-130226-1
* Replacing obsolete dh_clean -k with dh_prep.
* Merging upstream version 2008.11.18-130226.
* Updating debian directory for addition of pvscsi and vmxnet3 modules.

Show diffs side-by-side

added added

removed removed

Lines of Context:
54
54
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
55
55
static const char Pad64 = '=';
56
56
 
 
57
// Special markers
 
58
enum {
 
59
   ILLEGAL = -1, EOM = -2, WS = -3
 
60
};
 
61
 
 
62
/*
 
63
 * Reverse byte map used for decoding. Except for specials (negative values), contains the index
 
64
 * into Base64[] where given value is found, ie: base64Reverse[Base64[n]] = n, for 0 <= n < 64
 
65
 *
 
66
 * This static initialization replaces, and should have identical result to, this runtime init:
 
67
 *
 
68
 *  for (i = 0; i < 256; ++i) {
 
69
 *     base64Reverse[i] = isspace(i) ? WS : ILLEGAL;
 
70
 *  }
 
71
 *  base64Reverse['\0']  = EOM;
 
72
 *  base64Reverse['=']   = EOM;
 
73
 *  for (i = 0; Base64[i]; ++i) {
 
74
 *     base64Reverse[(unsigned)Base64[i]] = (char) i;
 
75
 *  }
 
76
 */
 
77
 
 
78
static const char base64Reverse[256] = {
 
79
   EOM,     ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* 00-07 */
 
80
   ILLEGAL, WS,      WS,      WS,      WS,      WS,      ILLEGAL, ILLEGAL,   /* 08-0F */
 
81
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* 10-17 */
 
82
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* 18-1F */
 
83
   WS,      ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* 20-27 */
 
84
   ILLEGAL, ILLEGAL, ILLEGAL, 62,      ILLEGAL, ILLEGAL, ILLEGAL, 63,        /* 28-2F */
 
85
   52,      53,      54,      55,      56,      57,      58,      59,        /* 30-37 */
 
86
   60,      61,      ILLEGAL, ILLEGAL, ILLEGAL, EOM,     ILLEGAL, ILLEGAL,   /* 38-3F */
 
87
   ILLEGAL, 0,       1,       2,       3,       4,       5,       6,         /* 40-47 */
 
88
   7,       8,       9,       10,      11,      12,      13,      14,        /* 48-4F */
 
89
   15,      16,      17,      18,      19,      20,      21,      22,        /* 50-57 */
 
90
   23,      24,      25,      ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* 58-5F */
 
91
   ILLEGAL, 26,      27,      28,      29,      30,      31,      32,        /* 60-67 */
 
92
   33,      34,      35,      36,      37,      38,      39,      40,        /* 68-6F */
 
93
   41,      42,      43,      44,      45,      46,      47,      48,        /* 70-77 */
 
94
   49,      50,      51,      ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* 78-7F */
 
95
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* 80-87 */
 
96
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* 88-8F */
 
97
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* 90-97 */
 
98
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* 98-9F */
 
99
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* A0-A7 */
 
100
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* A8-AF */
 
101
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* B0-B7 */
 
102
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* B8-BF */
 
103
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* C0-C7 */
 
104
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* C8-CF */
 
105
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* D0-D7 */
 
106
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* D8-DF */
 
107
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* E0-E7 */
 
108
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* E8-EF */
 
109
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL,   /* F0-F7 */
 
110
   ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL }; /* F8-FF */
 
111
 
57
112
/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
58
113
   The following encoding technique is taken from RFC 1521 by Borenstein
59
114
   and Freed.  It is reproduced here in a slightly edited form for
278
333
              size_t      outSize,    // IN
279
334
              size_t     *dataLength) // OUT
280
335
{
281
 
   static char base64Reverse[256];
282
 
   static Bool base64ReverseInit = 0;
283
 
 
284
336
   uint32 b = 0;
285
337
   int n = 0;
286
338
   uintptr_t i = 0;
287
339
 
288
 
   // Special markers
289
 
   enum {
290
 
      ILLEGAL = -1, EOM = -2, WS = -3
291
 
   };
292
 
 
293
340
   ASSERT(in);
294
341
   ASSERT(out || outSize == 0);
295
342
   ASSERT(dataLength);
296
343
 
297
344
   *dataLength = 0;
298
345
 
299
 
   if (!base64ReverseInit) {
300
 
      // Default is illegal chars (or whitespace)
301
 
      for (i = 0; i < 256; ++i) {
302
 
         base64Reverse[i] = isspace(i) ? WS : ILLEGAL;
303
 
      }
304
 
      base64Reverse['\0']  = EOM;
305
 
      base64Reverse['=']   = EOM;
306
 
 
307
 
      for (i = 0; Base64[i]; ++i) {
308
 
         base64Reverse[(unsigned)Base64[i]] = (char) i;
309
 
      }
310
 
      base64ReverseInit = 1;
311
 
   }
312
 
 
313
346
   i = 0;
314
347
   for (;;) {
315
348
      int p = base64Reverse[*(unsigned char *)in++];