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