/simpletypesystem/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/simpletypesystem/trunk
162 by Gustav Hartvigsson
* stuff to do with the unfinished base32 implementation.
1
/* Copyright 2021 Gustav Hatvigsson 
2
 * 
3
 * Based in part on work by Adrien Kunysz (Copyright 2010):
4
 * https://github.com/mjg59/tpmtotp/blob/master/base32.c
5
 *
6
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7
 * of this software and associated documentation files (the "Software"), to deal
8
 * in the Software without restriction, including without limitation the rights
9
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
 * copies of the Software, and to permit persons to whom the Software is
11
 * furnished to do so, subject to the following conditions:
12
 *
13
 * The above copyright notice and this permission notice shall be included in
14
 * all copies or substantial portions of the Software.
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
 * THE SOFTWARE.
23
 **/
24
89 by Gustav Hartvigsson
* Started working on Threads
25
26
#include "BaseN.h"
27
90 by Gustav Hartvigsson
* Macros were wrong.
28
#define S_BASE_16_LAST 15
29
#define S_BASE_32_LAST 31
30
#define S_BASE_64_LAST 63
31
32
#define padding_mark =
33
162 by Gustav Hartvigsson
* stuff to do with the unfinished base32 implementation.
34
35
#define EARLY_EXIT_ON_LEN_ZERO(inlen, outlen) {     \
36
   if (inlen == 0) {                                \
37
    outlen = sizeof ("");                           \
38
    sbyte * ret = s_malloc (outlen);                \
39
    ret[0] = '\0';                                  \
40
    return ret;                                     \
41
  }                                                 \
42
}
43
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
44
#if 0
45
   TEMPLATE FOR THE ASCII TABLE REVERSE
46
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
47
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
48
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
49
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*2*/
50
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*3*/
51
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*4*/
52
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*5*/
53
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*6*/
54
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*7*/
55
56
57
  LEGEND:
58
0..127     VALID NUMBER.
59
60
-1         INVALID
61
62
-2         IGNORE
63
64
-3         PADDING MARK
65
66
67
Padding mark is only not used in Base16, so it will generate an error.
68
69
#endif
70
71
90 by Gustav Hartvigsson
* Macros were wrong.
72
/* ****************************************************************************
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
73
 ********************************* BASE 16 ************************************
90 by Gustav Hartvigsson
* Macros were wrong.
74
 **************************************************************************** */
89 by Gustav Hartvigsson
* Started working on Threads
75
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
76
S_UNUSED
89 by Gustav Hartvigsson
* Started working on Threads
77
static const schar
78
S_BASE_16_ALPHABET[16] = {
79
  '0','1','2','3','4','5','6','7','8','9',
121.1.3 by Gustav Hartvigsson
* Made the GC switchable at rutime (once) when compiled with S_USE_GC set.
80
89 by Gustav Hartvigsson
* Started working on Threads
81
  'A','B','C','D','E','F'
82
};
83
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
84
S_UNUSED
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
85
static const sbyte
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
86
S_BASE_16_REVERSE[128] = {
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
87
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
88
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
89
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
90
  -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*2*/
91
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1, /*3*/
92
  -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*4*/
93
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*5*/
94
  -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*6*/
95
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*7*/
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
96
};
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
97
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
98
#define base_16_concat(first,last)  ((last) | (first << 4))
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
99
#define base_16_mask_shift(byte)    ((byte & 0xf0) >> 4)
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
100
#define base_16_mask(byte)          (byte & 0x0f)
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
101
102
schar *
100 by Gustav Hartvigsson
* Fixed README.
103
s_base_16_enc (const sbyte * input_data,
104
               size_t in_len,
105
               size_t * out_len) {
150 by Gustav Hartvigsson
* Fixed the tests in the CMake file
106
  
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
107
  *out_len = (in_len * 2);
150 by Gustav Hartvigsson
* Fixed the tests in the CMake file
108
  
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
109
  schar * ret_val = s_malloc ((*out_len) + 1);
150 by Gustav Hartvigsson
* Fixed the tests in the CMake file
110
  
111
  s_dbg_print ("in len: %zu out_len: %zu\n", in_len, *out_len);
112
  
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
113
  ret_val[*out_len] = '\0';
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
114
  
115
  size_t pos = 0;
116
  
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
117
  for (sint i = 0; i < in_len; i++) {
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
118
    subyte m_byte = (subyte)input_data[i];
119
    ret_val [pos] = S_BASE_16_ALPHABET[base_16_mask_shift(m_byte)];
120
    ret_val [pos+1] = S_BASE_16_ALPHABET[base_16_mask(m_byte)];
121
    pos += 2;
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
122
  }
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
123
  
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
124
  return ret_val;
125
}
126
127
sbyte *
100 by Gustav Hartvigsson
* Fixed README.
128
s_base_16_dec (const schar * base16_str,
129
               size_t in_len,
130
               size_t * out_len) {
162 by Gustav Hartvigsson
* stuff to do with the unfinished base32 implementation.
131
  EARLY_EXIT_ON_LEN_ZERO (in_len, *out_len);
161 by Gustav Hartvigsson
Base16[enc,dec] - Can now create byte arrays of fixed size.
132
  *out_len = (round_up ((in_len / 2), 2) + 1);
133
  return s_base_16_dec_size (base16_str, in_len, *out_len);
134
}
135
136
sbyte *
137
s_base_16_dec_size (const schar * base16_str,
138
                   size_t in_len,
139
                   size_t out_len) {
162 by Gustav Hartvigsson
* stuff to do with the unfinished base32 implementation.
140
  EARLY_EXIT_ON_LEN_ZERO (in_len, out_len);
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
141
  sbyte * ptr = (sbyte *) base16_str;
161 by Gustav Hartvigsson
Base16[enc,dec] - Can now create byte arrays of fixed size.
142
  sbyte * endptr = ptr + in_len;
143
  sbyte * ret_val = s_malloc (sizeof(sbyte) * (out_len));
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
144
  
145
  subyte first;
146
  subyte second;
147
  subyte concat;
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
148
  
149
  size_t pos = 0;
150
  
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
151
  
152
  //s_dbg_print ("first,\t second,\t concat\n");
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
153
  while (ptr != endptr) {
150 by Gustav Hartvigsson
* Fixed the tests in the CMake file
154
    if (S_BASE_16_REVERSE[(size_t)*ptr] < 0) {
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
155
      s_err_print ("Unclean Base16 data.\n");
156
    }
157
    
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
158
    first = *ptr++;
159
    second = *ptr++;
160
    concat = base_16_concat(S_BASE_16_REVERSE[first],
162 by Gustav Hartvigsson
* stuff to do with the unfinished base32 implementation.
161
                            S_BASE_16_REVERSE[second]);
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
162
    
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
163
    //s_dbg_print ("%02x (%d),\t %02x (%d),\t %02x (%d)\n",first ,first, second, second, concat, concat);
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
164
    
165
    
166
    ret_val[pos] = concat;
160 by Gustav Hartvigsson
Fixed Base16 encoding and decoding
167
    pos++;
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
168
  }
169
  
170
  return ret_val;
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
171
}
172
173
/* ****************************************************************************
174
 ********************************* BASE 32 ************************************
175
 **************************************************************************** */
176
89 by Gustav Hartvigsson
* Started working on Threads
177
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
178
S_UNUSED
89 by Gustav Hartvigsson
* Started working on Threads
179
static const schar
180
S_BASE_32_ALPHABET[32] = {
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
181
/* 0   1   2   3   4   5   6   7   8   9 */
182
  'A','B','C','D','E','F','G','H','I','J',
183
  'K','L','M','N','O','P','Q','R','S','T',
184
  'U','V','W','X','Y','Z',
185
                          '2','3','4','5',
186
  '6','7'
187
};
188
189
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
190
S_UNUSED
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
191
static const sbyte
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
192
S_BASE_32_REVERSE[128] = {
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
193
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
194
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
195
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
196
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*2*/
197
  -1, -1, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, -3, -1, -1, /*3*/
198
  -1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /*4*/
199
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -1, -1, -1, -1, -1, /*5*/
200
  -1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /*6*/
201
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -1, -1, -1, -1, -1, /*7*/
202
};
203
162 by Gustav Hartvigsson
* stuff to do with the unfinished base32 implementation.
204
#define base_32_mask(byte) (byte & 0x1F)
205
206
#define base_32_get_offset(block) (8 - 5 - (5 * block) % 8)
207
208
#define base_32_shift_right(byte, offset)\
209
  ((offset) > 0) ? (byte >> (offset)) :\
210
  (byte << (-(offset)))
211
212
#define base_32_shift_left(byte, offset)\
213
  ((offset) > 0) ? (byte << (offset)) :\
214
  (byte >> (-(offset)))
215
216
#define base_32_get_octet(block) ((block*5) / 8)
217
218
sint
219
_base_32_decode_sequence (const schar * sequence, 
220
                          sbyte * out,
221
                          const sbyte reverse_table[]) {
222
  sint offset,
223
       octet;
224
  sbyte c,
225
        r;
226
  out[0] = 0;
227
  for (sint b = 0; b < 8; b++) {
228
    offset = base_32_get_offset (b);
229
    octet = base_32_get_octet (b);
230
    r = sequence[b];
231
    c = reverse_table[r];
232
    if (c < 0) { // invalid char.
233
     return octet;
234
    }
235
    out[octet] |= base_32_shift_left (c, offset);
236
    if (offset < 0) {
237
      out[octet + 1] = base_32_shift_left (c, offset + 8);
238
    }
239
  }
240
  return 5;
241
}
242
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
243
/* TODO */
90 by Gustav Hartvigsson
* Macros were wrong.
244
schar *
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
245
s_base_32_enc (const sbyte * input_data,
100 by Gustav Hartvigsson
* Fixed README.
246
               size_t in_len,
247
               size_t * out_len);
90 by Gustav Hartvigsson
* Macros were wrong.
248
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
249
/* TODO */
90 by Gustav Hartvigsson
* Macros were wrong.
250
sbyte *
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
251
s_base_32_dec (const schar * base32_str,
100 by Gustav Hartvigsson
* Fixed README.
252
               size_t in_len,
162 by Gustav Hartvigsson
* stuff to do with the unfinished base32 implementation.
253
               size_t * out_len) {
254
  EARLY_EXIT_ON_LEN_ZERO (in_len, *out_len);
255
  *out_len = in_len;
256
  return s_base_32_dec_size (base32_str,
257
                             in_len,
258
                             *out_len);
259
}
260
261
/* TODO */
262
sbyte *
263
s_base_32_dec_size (const schar * base32_str,
264
                   size_t in_len,
265
                   size_t out_len) {
266
  EARLY_EXIT_ON_LEN_ZERO (in_len, out_len);
267
  sbyte * ret_val = s_malloc (out_len);
268
  
269
  
270
  
271
  return ret_val;
272
}
273
90 by Gustav Hartvigsson
* Macros were wrong.
274
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
275
/* * BASE 32 HEX * */
276
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
277
S_UNUSED
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
278
static const schar
279
S_BASE_32_HEX_ALPHABET[32] = {
280
/* 0   1   2   3   4   5   6   7   8   9 */
281
  '0','1','2','3','4','5','6','7','8','9',
121.1.3 by Gustav Hartvigsson
* Made the GC switchable at rutime (once) when compiled with S_USE_GC set.
282
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
283
  'A','B','C','D','E','F','G','H','I','J',
284
  'K','L','M','N','O','P','Q','R','S','T',
285
  'U','V'
286
};
287
288
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
289
S_UNUSED
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
290
static const sbyte
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
291
S_BASE_32_HEX_REVERSE[128] = {
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
292
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
293
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
294
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
295
  -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*2*/
296
   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1, /*3*/
297
  -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /*4*/
298
  25, 26, 27, 28, 29, 30, 31, 31, -1, -1, -1, -1, -1, -1, -1, -1, /*5*/
299
  -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /*7*/
300
  25, 26, 27, 28, 29, 30, 31, 31, -1, -1, -1, -1, -1, -1, -1, -1, /*8*/
301
};
302
303
/* TODO */
90 by Gustav Hartvigsson
* Macros were wrong.
304
schar *
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
305
s_base_32_hex_enc (const sbyte * input_data,
100 by Gustav Hartvigsson
* Fixed README.
306
                   size_t in_len,
307
                   size_t * out_len);
90 by Gustav Hartvigsson
* Macros were wrong.
308
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
309
/* TODO */
90 by Gustav Hartvigsson
* Macros were wrong.
310
sbyte *
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
311
s_base_32_hex_dec (const schar * base32_str,
100 by Gustav Hartvigsson
* Fixed README.
312
                   size_t in_len,
313
                   size_t * out_len);
90 by Gustav Hartvigsson
* Macros were wrong.
314
162 by Gustav Hartvigsson
* stuff to do with the unfinished base32 implementation.
315
/* TODO */
316
sbyte *
317
s_base_32_hex_dec_size (const schar * base32_str,
318
                   size_t in_len,
319
                   size_t * out_len);
320
90 by Gustav Hartvigsson
* Macros were wrong.
321
322
/* ****************************************************************************
323
 ********************************* BASE 64 ************************************
324
 **************************************************************************** */
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
325
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
326
S_UNUSED
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
327
static const schar
328
S_BASE_64_ALPHABET[64] = {
329
/* 0   1   2   3   4   5   6   7   8   9 */
330
  'A','B','C','D','E','F','G','H','I','J',
331
  'K','L','M','N','O','P','Q','R','S','T',
332
  'U','V','W','X','Y','Z',
333
                          'a','b','c','d',
334
  'e','f','g','h','i','j','k','l','m','n',
335
  'o','p','q','r','s','t','u','v','w','x',
336
  'y','z',
337
          '0','1','2','3','4','5','6','7',
338
  '8','9',
339
          '+','/'
340
};
341
342
/* TODO */
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
343
S_UNUSED
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
344
static const sbyte
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
345
S_BASE_64_REVERSE[128] = {
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
346
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
347
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
348
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
349
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, -1, 64, /*2*/
350
  53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, -1, -1, -3, -1, -1, /*3*/
351
  -1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /*4*/
352
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -1, -1, -1, -1, -1, /*5*/
353
  -1, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, /*6*/
354
  42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, -1, -1, -1, -1, -1, /*7*/
355
};
356
90 by Gustav Hartvigsson
* Macros were wrong.
357
schar *
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
358
s_base_64_enc (const sbyte * input_data,
100 by Gustav Hartvigsson
* Fixed README.
359
               size_t in_len,
360
               size_t * out_len);
90 by Gustav Hartvigsson
* Macros were wrong.
361
362
sbyte *
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
363
s_base_64_dec (const schar * base64_str,
100 by Gustav Hartvigsson
* Fixed README.
364
               size_t in_len,
365
               size_t * out_len);
90 by Gustav Hartvigsson
* Macros were wrong.
366
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
367
/* * BASE 64 SAFE * */
368
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
369
S_UNUSED
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
370
static const schar
371
S_BASE_64_SAFE_ALPHABET[64] = {
372
/* 0   1   2   3   4   5   6   7   8   9 */
373
  'A','B','C','D','E','F','G','H','I','J',
374
  'K','L','M','N','O','P','Q','R','S','T',
375
  'U','V','W','X','Y','Z',
376
                          'a','b','c','d',
377
  'e','f','g','h','i','j','k','l','m','n',
378
  'o','p','q','r','s','t','u','v','w','x',
379
  'y','z',
380
          '0','1','2','3','4','5','6','7',
381
  '8','9',
382
          '-','_'
383
};
384
385
/* TODO */
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
386
S_UNUSED
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
387
static const sbyte
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
388
S_BASE_64_SAFE_REVERSE[128] = {
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
389
/* 0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F     */
390
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*0*/
391
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*1*/
392
  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, /*2*/
393
  53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, -1, -1, -3, -1, -1, /*3*/
394
  -1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /*4*/
395
  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, -1, -1, -1, -1, 64, /*5*/
396
  -1, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, /*6*/
397
  42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, -1, -1, -1, -1, -1, /*7*/
398
};
399
400
/* TODO */
90 by Gustav Hartvigsson
* Macros were wrong.
401
schar *
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
402
s_base_64_safe_enc (const sbyte * input_data,
100 by Gustav Hartvigsson
* Fixed README.
403
                    size_t in_len,
404
                    size_t * out_len);
90 by Gustav Hartvigsson
* Macros were wrong.
405
95 by Gustav Hartvigsson
* Added S_BASE_*_REVERSE
406
/* TODO */
90 by Gustav Hartvigsson
* Macros were wrong.
407
sbyte *
138 by Gustav Hartvigsson
* Fixed s_base_16_enc
408
s_base_64_safe_dec (const schar * base64_str,
100 by Gustav Hartvigsson
* Fixed README.
409
                    size_t in_len,
410
                    size_t * out_len);
90 by Gustav Hartvigsson
* Macros were wrong.
411