b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame^] | 1 | |
| 2 | #include <ctype.h> |
| 3 | |
| 4 | int 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 | } |