SayoriOS  0.3.3
base64.c
См. документацию.
1 
9 #include <kernel.h>
10 
11 static const char encoding_table[] = {
12  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
13  'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
14  'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
15  'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
16  'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
17  'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
18  'w', 'x', 'y', 'z', '0', '1', '2', '3',
19  '4', '5', '6', '7', '8', '9', '+', '/' };
20 
21 static const unsigned char decoding_table[256] = {
22  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
23  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
24  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
25  0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
26  0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
27  0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
28  0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
29  0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
30  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
31  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
32  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
33  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
34  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
35  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
36  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
37  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
38 };
39 
47 uint8_t* b64e(const char *string){
48  uint32_t len = ((strlen(string)));
49  int i;
50  uint8_t *p = nullptr;
51  uint8_t *encoded = nullptr;
52  p = encoded;
53  for (i = 0; i < len - 2; i += 3) {
54  *p++ = encoding_table[(string[i] >> 2) & 0x3F];
55  *p++ = encoding_table[((string[i] & 0x3) << 4) | ((int) (string[i + 1] & 0xF0) >> 4)];
56  *p++ = encoding_table[((string[i + 1] & 0xF) << 2) | ((int) (string[i + 2] & 0xC0) >> 6)];
57  *p++ = encoding_table[string[i + 2] & 0x3F];
58  }
59  if (i < len) {
60  *p++ = encoding_table[(string[i] >> 2) & 0x3F];
61  if (i == (len - 1)) {
62  *p++ = encoding_table[((string[i] & 0x3) << 4)];
63  *p++ = '=';
64  } else {
65  *p++ = encoding_table[((string[i] & 0x3) << 4) |
66  ((int) (string[i + 1] & 0xF0) >> 4)];
67  *p++ = encoding_table[((string[i + 1] & 0xF) << 2)];
68  }
69  *p++ = '=';
70  }
71  *p++ = '\0';
72  return encoded;
73 }
74 
82 uint8_t* b64d(const char *data) {
83  size_t decode_size = strlen(data);
84 
85  if (decode_size % 4 != 0){
86  return 0;
87  }
88 
89  size_t output_length = decode_size / 4 * 3;
90 
91  if (data[decode_size - 1] == '=') (output_length)--;
92  if (data[decode_size - 2] == '=') (output_length)--;
93 
94  uint8_t* decoded_data = (uint8_t*)kmalloc(output_length*3);
95 
96  if (decoded_data == 0){
97  return 0;
98  }
99 
100  for (size_t i = 0, j = 0; i < decode_size;) {
101  uint32_t sextet_a = data[i] == '=' ? 0 & i++ : decoding_table[(uint8_t)data[i++]];
102  uint32_t sextet_b = data[i] == '=' ? 0 & i++ : decoding_table[(uint8_t)data[i++]];
103  uint32_t sextet_c = data[i] == '=' ? 0 & i++ : decoding_table[(uint8_t)data[i++]];
104  uint32_t sextet_d = data[i] == '=' ? 0 & i++ : decoding_table[(uint8_t)data[i++]];
105  uint32_t triple = (sextet_a << 3 * 6)
106  + (sextet_b << 2 * 6)
107  + (sextet_c << 1 * 6)
108  + (sextet_d << 0 * 6);
109 
110  if (j < output_length) decoded_data[j++] = (triple >> 2 * 8) & 0xFF;
111  if (j < output_length) decoded_data[j++] = (triple >> 1 * 8) & 0xFF;
112  if (j < output_length) decoded_data[j++] = (triple >> 0 * 8) & 0xFF;
113  }
114  decoded_data[output_length] = '\0';
115  return decoded_data;
116 }
uint8_t * b64e(const char *string)
Кодирует строку в Base64.
Definition: base64.c:47
uint8_t * b64d(const char *data)
Декодирует строку Base64.
Definition: base64.c:82
size_t strlen(const char *str)
Возращает длину строки
Definition: string.c:88