blob: 4ce2f4d3d26c96e6e736d93f9968c6f172a25326 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001
2#include <ctype.h>
3
4int b64_pton(const char *src, unsigned char *dst, int dstsiz)
5{
6 int i, j, k;
7 unsigned int val3 = 0;
8 const char b64_tbl[] =
9 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
10 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
11 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3e\xff\xff\xff\x3f"
12 "\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\xff\xff\xff\x00\xff\xff"
13 "\xff\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e"
14 "\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\xff\xff\xff\xff\xff"
15 "\xff\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28"
16 "\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\xff\xff\xff\xff\xff"
17 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
18 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
19 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
20 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
21 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
22 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
23 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
24 "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff";
25
26 for (i = j = k = 0; src[i] != '\0'; i++) {
27 if (isspace(src[i]))
28 continue;
29 if (b64_tbl[(unsigned char)src[i]] == (char)0xff)
30 return(-1);
31 val3 |= b64_tbl[(unsigned char)src[i]];
32 if (src[i] != '=') {
33 if (dst != 0 && k >= dstsiz)
34 return (-1);
35 if (j % 4 == 1) {
36 if (dst != 0)
37 dst[k] = val3 >> 4;
38 k++;
39 } else if (j % 4 == 2) {
40 if (dst != 0)
41 dst[k] = val3 >> 2;
42 k++;
43 } else if (j % 4 == 3) {
44 if (dst != 0)
45 dst[k] = val3;
46 k++;
47 }
48 }
49 val3 <<= 6;
50 j++;
51 }
52 if (j % 4 != 0)
53 return (-1);
54
55 return (k);
56}