base64.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /* base64.c : base-64 / MIME encode/decode */
  2. /* PUBLIC DOMAIN - Jon Mayo - November 13, 2003 */
  3. #include <esp8266.h>
  4. #include "base64.h"
  5. static const uint8_t base64dec_tab[256]= {
  6. 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  7. 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  8. 255,255,255,255,255,255,255,255,255,255,255, 62,255,255,255, 63,
  9. 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255, 0,255,255,
  10. 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
  11. 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255,
  12. 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
  13. 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,255,255,255,255,255,
  14. 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  15. 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  16. 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  17. 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  18. 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  19. 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  20. 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  21. 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  22. };
  23. #if 0
  24. static int ICACHE_FLASH_ATTR base64decode(const char in[4], char out[3]) {
  25. uint8_t v[4];
  26. v[0]=base64dec_tab[(unsigned)in[0]];
  27. v[1]=base64dec_tab[(unsigned)in[1]];
  28. v[2]=base64dec_tab[(unsigned)in[2]];
  29. v[3]=base64dec_tab[(unsigned)in[3]];
  30. out[0]=(v[0]<<2)|(v[1]>>4);
  31. out[1]=(v[1]<<4)|(v[2]>>2);
  32. out[2]=(v[2]<<6)|(v[3]);
  33. return (v[0]|v[1]|v[2]|v[3])!=255 ? in[3]=='=' ? in[2]=='=' ? 1 : 2 : 3 : 0;
  34. }
  35. #endif
  36. /* decode a base64 string in one shot */
  37. int ICACHE_FLASH_ATTR base64_decode(size_t in_len, const char *in, size_t out_len, unsigned char *out) {
  38. unsigned int ii, io;
  39. uint32_t v;
  40. unsigned int rem;
  41. for(io=0,ii=0,v=0,rem=0;ii<in_len;ii++) {
  42. unsigned char ch;
  43. if(isspace((int)in[ii])) continue;
  44. if(in[ii]=='=') break; /* stop at = */
  45. ch=base64dec_tab[(unsigned int)in[ii]];
  46. if(ch==255) break; /* stop at a parse error */
  47. v=(v<<6)|ch;
  48. rem+=6;
  49. if(rem>=8) {
  50. rem-=8;
  51. if(io>=out_len) return -1; /* truncation is failure */
  52. out[io++]=(v>>rem)&255;
  53. }
  54. }
  55. if(rem>=8) {
  56. rem-=8;
  57. if(io>=out_len) return -1; /* truncation is failure */
  58. out[io++]=(v>>rem)&255;
  59. }
  60. return io;
  61. }
  62. //Only need decode functions for now.
  63. #if 0
  64. static const uint8_t base64enc_tab[64]= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  65. void base64encode(const unsigned char in[3], unsigned char out[4], int count) {
  66. out[0]=base64enc_tab[(in[0]>>2)];
  67. out[1]=base64enc_tab[((in[0]&3)<<4)|(in[1]>>4)];
  68. out[2]=count<2 ? '=' : base64enc_tab[((in[1]&15)<<2)|(in[2]>>6)];
  69. out[3]=count<3 ? '=' : base64enc_tab[(in[2]&63)];
  70. }
  71. int base64_encode(size_t in_len, const unsigned char *in, size_t out_len, char *out) {
  72. unsigned ii, io;
  73. uint_least32_t v;
  74. unsigned rem;
  75. for(io=0,ii=0,v=0,rem=0;ii<in_len;ii++) {
  76. unsigned char ch;
  77. ch=in[ii];
  78. v=(v<<8)|ch;
  79. rem+=8;
  80. while(rem>=6) {
  81. rem-=6;
  82. if(io>=out_len) return -1; /* truncation is failure */
  83. out[io++]=base64enc_tab[(v>>rem)&63];
  84. }
  85. }
  86. if(rem) {
  87. v<<=(6-rem);
  88. if(io>=out_len) return -1; /* truncation is failure */
  89. out[io++]=base64enc_tab[v&63];
  90. }
  91. while(io&3) {
  92. if(io>=out_len) return -1; /* truncation is failure */
  93. out[io++]='=';
  94. }
  95. if(io>=out_len) return -1; /* no room for null terminator */
  96. out[io]=0;
  97. return io;
  98. }
  99. #endif