Home | History | Annotate | Download | only in microhttpd
      1 /*
      2  * This code implements the BASE64 algorithm.
      3  * This code is in the public domain; do with it what you wish.
      4  *
      5  * @file base64.c
      6  * @brief This code implements the BASE64 algorithm
      7  * @author Matthieu Speder
      8  */
      9 #include "base64.h"
     10 
     11 static const char base64_chars[] =
     12   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
     13 
     14 static const char base64_digits[] =
     15   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     16     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     17     0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
     18     0, 0, 0, -1, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
     19     14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, 0, 26,
     20     27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
     21     45, 46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     22     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     23     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     24     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     25     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     26     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
     27 
     28 
     29 char *
     30 BASE64Decode(const char* src)
     31 {
     32   size_t in_len = strlen (src);
     33   char* dest;
     34   char* result;
     35 
     36   if (in_len % 4)
     37     {
     38       /* Wrong base64 string length */
     39       return NULL;
     40     }
     41   result = dest = malloc(in_len / 4 * 3 + 1);
     42   if (result == NULL)
     43     return NULL; /* out of memory */
     44   while (*src) {
     45     char a = base64_digits[(unsigned char)*(src++)];
     46     char b = base64_digits[(unsigned char)*(src++)];
     47     char c = base64_digits[(unsigned char)*(src++)];
     48     char d = base64_digits[(unsigned char)*(src++)];
     49     *(dest++) = (a << 2) | ((b & 0x30) >> 4);
     50     if (c == (char)-1)
     51       break;
     52     *(dest++) = ((b & 0x0f) << 4) | ((c & 0x3c) >> 2);
     53     if (d == (char)-1)
     54       break;
     55     *(dest++) = ((c & 0x03) << 6) | d;
     56   }
     57   *dest = 0;
     58   return result;
     59 }
     60 
     61 
     62 /* end of base64.c */
     63