49 #define UCHAR_MAX 0xff
61 static unsigned char to_b32[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
63 #define UNSIG_CHAR_PTR(x) ((unsigned char *)(x))
69 const unsigned char *cp;
71 static int pad_count[] = {0, 6, 4, 3, 1};
77 for (cp =
UNSIG_CHAR_PTR(in), count = len; count > 0; count -= 5, cp += 5) {
83 VSTRING_ADDCH(result, to_b32[(cp[0] & 0x7) << 2 | cp[1] >> 6]);
89 VSTRING_ADDCH(result, to_b32[(cp[1] & 0x1) << 4 | cp[2] >> 4]);
94 VSTRING_ADDCH(result, to_b32[(cp[2] & 0xf) << 1 | cp[3] >> 7]);
100 VSTRING_ADDCH(result, to_b32[(cp[3] & 0x3) << 3 | cp[4] >> 5]);
113 static unsigned char *un_b32 = 0;
114 const unsigned char *cp;
125 #define CHARS_PER_BYTE (UCHAR_MAX + 1)
128 #define ENFORCE_LENGTH(x) (x)
129 #define ENFORCE_PADDING(x) (x)
130 #define ENFORCE_NULL_BITS(x) (x)
132 #define ENFORCE_LENGTH(x) (1)
133 #define ENFORCE_PADDING(x) (1)
134 #define ENFORCE_NULL_BITS(x) (1)
149 for (cp = to_b32; cp < to_b32 +
sizeof(to_b32) - 1; cp++)
150 un_b32[*cp] = cp - to_b32;
157 for (cp =
UNSIG_CHAR_PTR(in), count = 0; count < len; count += 8) {
158 if ((ch0 = un_b32[*cp++]) ==
INVALID
159 || (ch1 = un_b32[*cp++]) ==
INVALID)
162 if ((ch2 = *cp++) ==
'='
166 if ((ch2 = un_b32[ch2]) ==
INVALID)
168 if ((ch3 = un_b32[*cp++]) ==
INVALID)
171 if ((ch4 = *cp++) ==
'='
175 if ((ch4 = un_b32[ch4]) ==
INVALID)
178 if ((ch5 = *cp++) ==
'='
182 if ((ch5 = un_b32[ch5]) ==
INVALID)
184 if ((ch6 = un_b32[*cp++]) ==
INVALID)
187 if ((ch7 = *cp++) ==
'='
190 if ((ch7 = un_b32[ch7]) ==
INVALID)
204 #define STR(x) vstring_str(x)
205 #define LEN(x) VSTRING_LEN(x)
207 int main(
int unused_argc,
char **unused_argv)
217 for (j = 0; j < 256; j++)
218 for (i = 1; i < 256; i++)
222 #define DECODE(b,x,l) { \
223 if (base32_decode((b),(x),(l)) == 0) \
224 msg_panic("bad base32: %s", (x)); \
226 #define VERIFY(b,t,l) { \
227 if (memcmp((b), (t), (l)) != 0) \
228 msg_panic("bad test: %s", (b)); \
234 for (i = 1; i <= 8; i++) {
236 DECODE(b2,
STR(b1),
LEN(b1));
242 DECODE(b2,
STR(b1),
LEN(b1));
243 DECODE(b1,
STR(b2),
LEN(b2));
244 DECODE(b2,
STR(b1),
LEN(b1));
252 DECODE(b2,
STR(b1),
LEN(b1));
253 DECODE(b1,
STR(b2),
LEN(b2));
254 DECODE(b2,
STR(b1),
LEN(b1));
255 DECODE(b1,
STR(b2),
LEN(b2));
256 DECODE(b2,
STR(b1),
LEN(b1));
int main(int argc, char **argv)
VSTRING * vstring_strncat(VSTRING *vp, const char *src, ssize_t len)
VSTRING * vstring_truncate(VSTRING *vp, ssize_t len)
VSTRING * base32_decode(VSTRING *result, const char *in, ssize_t len)
#define VSTRING_TERMINATE(vp)
#define VSTRING_ADDCH(vp, ch)
#define VSTRING_RESET(vp)
VSTRING * vstring_alloc(ssize_t len)
#define UNSIG_CHAR_PTR(x)
#define ENFORCE_NULL_BITS(x)
#define ENFORCE_LENGTH(x)
VSTRING * vstring_free(VSTRING *vp)
VSTRING * base32_encode(VSTRING *result, const char *in, ssize_t len)
#define ENFORCE_PADDING(x)
void * mymalloc(ssize_t len)