base64.c 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include "base64.h"
  2. #include <math.h>
  3. const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  4. char * base64_encode( unsigned char * bindata, char * base64, int binlength )
  5. {
  6. int i, j;
  7. unsigned char current;
  8. for ( i = 0, j = 0 ; i < binlength ; i += 3 )
  9. {
  10. current = (bindata[i] >> 2) ;
  11. current &= (unsigned char)0x3F;
  12. base64[j++] = base64char[(int)current];
  13. current = ( (unsigned char)(bindata[i] << 4 ) ) & ( (unsigned char)0x30 ) ;
  14. if ( i + 1 >= binlength )
  15. {
  16. base64[j++] = base64char[(int)current];
  17. base64[j++] = '=';
  18. base64[j++] = '=';
  19. break;
  20. }
  21. current |= ( (unsigned char)(bindata[i+1] >> 4) ) & ( (unsigned char) 0x0F );
  22. base64[j++] = base64char[(int)current];
  23. current = ( (unsigned char)(bindata[i+1] << 2) ) & ( (unsigned char)0x3C ) ;
  24. if ( i + 2 >= binlength )
  25. {
  26. base64[j++] = base64char[(int)current];
  27. base64[j++] = '=';
  28. break;
  29. }
  30. current |= ( (unsigned char)(bindata[i+2] >> 6) ) & ( (unsigned char) 0x03 );
  31. base64[j++] = base64char[(int)current];
  32. current = ( (unsigned char)bindata[i+2] ) & ( (unsigned char)0x3F ) ;
  33. base64[j++] = base64char[(int)current];
  34. }
  35. base64[j] = '\0';
  36. return base64;
  37. }
  38. int base64_decode( char * base64, unsigned char * boutdata )
  39. {
  40. int i, j;
  41. unsigned char k;
  42. unsigned char temp[4];
  43. for ( i = 0, j = 0; base64[i] != '\0' ; i += 4 )
  44. {
  45. temp[0]=0xFF;
  46. temp[1]=0xFF;
  47. temp[2]=0xFF;
  48. temp[3]=0xFF;
  49. for ( k = 0 ; k < 64 ; k ++ )
  50. {
  51. if ( base64char[k] == base64[i] )
  52. temp[0]= k;
  53. }
  54. for ( k = 0 ; k < 64 ; k ++ )
  55. {
  56. if ( base64char[k] == base64[i+1] )
  57. temp[1]= k;
  58. }
  59. for ( k = 0 ; k < 64 ; k ++ )
  60. {
  61. if ( base64char[k] == base64[i+2] )
  62. temp[2]= k;
  63. }
  64. for ( k = 0 ; k < 64 ; k ++ )
  65. {
  66. if ( base64char[k] == base64[i+3] )
  67. temp[3]= k;
  68. }
  69. boutdata[j++] = ((unsigned char)(((unsigned char)(temp[0] << 2))&0xFC)) |
  70. ((unsigned char)((unsigned char)(temp[1]>>4)&0x03));
  71. if ( base64[i+2] == '=' )
  72. break;
  73. boutdata[j++] = ((unsigned char)(((unsigned char)(temp[1] << 4))&0xF0)) |
  74. ((unsigned char)((unsigned char)(temp[2]>>2)&0x0F));
  75. if ( base64[i+3] == '=' )
  76. break;
  77. boutdata[j++] = ((unsigned char)(((unsigned char)(temp[2] << 6))&0xF0)) |
  78. ((unsigned char)(temp[3]&0x3F));
  79. }
  80. return j;
  81. }
  82. int get_base64_size(int size)
  83. {
  84. return ceil((size + 2.0) / 3.0) * 4;
  85. }