Subversion Repositories Kolibri OS

Rev

Rev 2331 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. #include "base64.h"
  3.  
  4. ///===============
  5.  
  6. char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  7.  
  8. ///===============
  9.  
  10. char* strchr (const char *s, int c)
  11. {
  12.   do {
  13.     if (*s == c)
  14.       {
  15.         return (char*)s;
  16.       }
  17.   } while (*s++);
  18.   return (0);
  19. }
  20.  
  21. ///===============
  22.  
  23. int base64_encode(char inp[], char outp[], int len)
  24. {
  25. int i, j;
  26. unsigned char chr[3];
  27.  
  28. for (i = 0, j=-1; i < len; i+=3)
  29.         {
  30.         chr[0] = (unsigned char) inp[i];
  31.         if (i < len)
  32.                 {
  33.                 chr[1] = (unsigned char) inp[i+1];
  34.                 chr[2] = (unsigned char) inp[i+2];
  35.                 }
  36.  
  37.         outp[++j] = base64_table[ chr[0]>>2 ];
  38.         outp[++j] = base64_table[ ((chr[0] & 3) << 4) | (chr[1] >> 4) ];
  39.  
  40.         outp[++j] = base64_table[ ((chr[1] & 15) << 2) | (chr[2] >> 6) ];
  41.         outp[++j] = base64_table[ chr[2] & 63 ];
  42.         }
  43.  
  44. switch (len%3)
  45.     {
  46.     case 1:
  47.             outp[j-1] = outp[j] = '=';
  48.             break;
  49.  
  50.     case 2:
  51.             outp[j] = '=';
  52.             break;
  53.  
  54.     default:
  55.         break;
  56.  
  57.     };
  58.  
  59. outp[j+1] = '\0';
  60.  
  61. return j+1;
  62. }
  63.  
  64. ///===============
  65.  
  66. int base64_decode(char inp[], char outp[], int len)
  67. {
  68.         int i, j, k, n;
  69.         char *chr_adr;
  70.         char chr[4];
  71.  
  72.         i = 0;
  73.         j = -1;
  74.         k = 0;
  75.         while (i < len)
  76.         {
  77.                 for (n = 0; n <= 3; n++)
  78.                 {
  79.                         chr[n] = 0;
  80.                         while ((inp[i] <= 0x20) & (i < len))
  81.                                 i++;
  82.                         if (i < len)
  83.                         {
  84.                                 if ((n >= 2) & (inp[i] == '='))
  85.                                         k++;
  86.                                 else
  87.                                 {
  88.                                         chr_adr = strchr(base64_table, inp[i]);
  89.                                         if (chr_adr)
  90.                                                 chr[n] = chr_adr - base64_table;
  91.                                 }                              
  92.                                 i++;
  93.                         }
  94.                 }              
  95.                 outp[++j] = ((chr[0] << 2) | (chr[1] >> 4));
  96.                 outp[++j] = ((chr[1] << 4) | (chr[2] >> 2));
  97.                 outp[++j] = ((chr[2] & 0x03 )<< 6) | (chr[3] & 0x3f);
  98.         }
  99.  
  100.         outp[j+1-k] = '\0';
  101.  
  102.         return j+1-k;
  103. }
  104.  
  105. ///===============
  106.  
  107. #define NULL ((void*)0)
  108.  
  109. typedef struct
  110. {
  111. void    *name;
  112. void    *function;
  113. } export_t;
  114.  
  115. char szbase64_encode[]={"base64_encode"};
  116. char szbase64_decode[]={"base64_decode"};
  117.  
  118. export_t EXPORTS[] =
  119. {
  120. {szbase64_encode, (void*) base64_encode},
  121. {szbase64_decode, (void*) base64_decode},
  122. { NULL, NULL },
  123. };
  124.  
  125. ///===============
  126.