Showing
16 changed files
with
1353 additions
and
0 deletions
.gitignore
0 → 100644
1 | +.*.swp |
base64.c
0 → 100644
1 | +/* -*- buffer-read-only: t -*- vi: set ro: */ | ||
2 | +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ | ||
3 | +/* base64.c -- Encode binary data using printable characters. | ||
4 | + Copyright (C) 1999, 2000, 2001, 2004, 2005, 2006, 2009, 2010 Free Software | ||
5 | + Foundation, Inc. | ||
6 | + | ||
7 | + This program is free software; you can redistribute it and/or modify | ||
8 | + it under the terms of the GNU General Public License as published by | ||
9 | + the Free Software Foundation; either version 3, or (at your option) | ||
10 | + any later version. | ||
11 | + | ||
12 | + This program is distributed in the hope that it will be useful, | ||
13 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | + GNU General Public License for more details. | ||
16 | + | ||
17 | + You should have received a copy of the GNU General Public License | ||
18 | + along with this program; if not, write to the Free Software Foundation, | ||
19 | + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ | ||
20 | + | ||
21 | +/* Written by Simon Josefsson. Partially adapted from GNU MailUtils | ||
22 | + * (mailbox/filter_trans.c, as of 2004-11-28). Improved by review | ||
23 | + * from Paul Eggert, Bruno Haible, and Stepan Kasal. | ||
24 | + * | ||
25 | + * See also RFC 3548 <http://www.ietf.org/rfc/rfc3548.txt>. | ||
26 | + * | ||
27 | + * Be careful with error checking. Here is how you would typically | ||
28 | + * use these functions: | ||
29 | + * | ||
30 | + * bool ok = base64_decode_alloc (in, inlen, &out, &outlen); | ||
31 | + * if (!ok) | ||
32 | + * FAIL: input was not valid base64 | ||
33 | + * if (out == NULL) | ||
34 | + * FAIL: memory allocation error | ||
35 | + * OK: data in OUT/OUTLEN | ||
36 | + * | ||
37 | + * size_t outlen = base64_encode_alloc (in, inlen, &out); | ||
38 | + * if (out == NULL && outlen == 0 && inlen != 0) | ||
39 | + * FAIL: input too long | ||
40 | + * if (out == NULL) | ||
41 | + * FAIL: memory allocation error | ||
42 | + * OK: data in OUT/OUTLEN. | ||
43 | + * | ||
44 | + */ | ||
45 | + | ||
46 | +/* Get prototype. */ | ||
47 | +#include "base64.h" | ||
48 | + | ||
49 | +/* Get malloc. */ | ||
50 | +#include <stdlib.h> | ||
51 | + | ||
52 | +/* Get UCHAR_MAX. */ | ||
53 | +#include <limits.h> | ||
54 | + | ||
55 | +#include <string.h> | ||
56 | + | ||
57 | +/* C89 compliant way to cast 'char' to 'unsigned char'. */ | ||
58 | +static inline unsigned char | ||
59 | +to_uchar (char ch) | ||
60 | +{ | ||
61 | + return ch; | ||
62 | +} | ||
63 | + | ||
64 | +/* Base64 encode IN array of size INLEN into OUT array of size OUTLEN. | ||
65 | + If OUTLEN is less than BASE64_LENGTH(INLEN), write as many bytes as | ||
66 | + possible. If OUTLEN is larger than BASE64_LENGTH(INLEN), also zero | ||
67 | + terminate the output buffer. */ | ||
68 | +void | ||
69 | +base64_encode (const char *restrict in, size_t inlen, | ||
70 | + char *restrict out, size_t outlen) | ||
71 | +{ | ||
72 | + static const char b64str[64] = | ||
73 | + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | ||
74 | + | ||
75 | + while (inlen && outlen) | ||
76 | + { | ||
77 | + *out++ = b64str[(to_uchar (in[0]) >> 2) & 0x3f]; | ||
78 | + if (!--outlen) | ||
79 | + break; | ||
80 | + *out++ = b64str[((to_uchar (in[0]) << 4) | ||
81 | + + (--inlen ? to_uchar (in[1]) >> 4 : 0)) | ||
82 | + & 0x3f]; | ||
83 | + if (!--outlen) | ||
84 | + break; | ||
85 | + *out++ = | ||
86 | + (inlen | ||
87 | + ? b64str[((to_uchar (in[1]) << 2) | ||
88 | + + (--inlen ? to_uchar (in[2]) >> 6 : 0)) | ||
89 | + & 0x3f] | ||
90 | + : '='); | ||
91 | + if (!--outlen) | ||
92 | + break; | ||
93 | + *out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '='; | ||
94 | + if (!--outlen) | ||
95 | + break; | ||
96 | + if (inlen) | ||
97 | + inlen--; | ||
98 | + if (inlen) | ||
99 | + in += 3; | ||
100 | + } | ||
101 | + | ||
102 | + if (outlen) | ||
103 | + *out = '\0'; | ||
104 | +} | ||
105 | + | ||
106 | +/* Allocate a buffer and store zero terminated base64 encoded data | ||
107 | + from array IN of size INLEN, returning BASE64_LENGTH(INLEN), i.e., | ||
108 | + the length of the encoded data, excluding the terminating zero. On | ||
109 | + return, the OUT variable will hold a pointer to newly allocated | ||
110 | + memory that must be deallocated by the caller. If output string | ||
111 | + length would overflow, 0 is returned and OUT is set to NULL. If | ||
112 | + memory allocation failed, OUT is set to NULL, and the return value | ||
113 | + indicates length of the requested memory block, i.e., | ||
114 | + BASE64_LENGTH(inlen) + 1. */ | ||
115 | +size_t | ||
116 | +base64_encode_alloc (const char *in, size_t inlen, char **out) | ||
117 | +{ | ||
118 | + size_t outlen = 1 + BASE64_LENGTH (inlen); | ||
119 | + | ||
120 | + /* Check for overflow in outlen computation. | ||
121 | + * | ||
122 | + * If there is no overflow, outlen >= inlen. | ||
123 | + * | ||
124 | + * If the operation (inlen + 2) overflows then it yields at most +1, so | ||
125 | + * outlen is 0. | ||
126 | + * | ||
127 | + * If the multiplication overflows, we lose at least half of the | ||
128 | + * correct value, so the result is < ((inlen + 2) / 3) * 2, which is | ||
129 | + * less than (inlen + 2) * 0.66667, which is less than inlen as soon as | ||
130 | + * (inlen > 4). | ||
131 | + */ | ||
132 | + if (inlen > outlen) | ||
133 | + { | ||
134 | + *out = NULL; | ||
135 | + return 0; | ||
136 | + } | ||
137 | + | ||
138 | + *out = malloc (outlen); | ||
139 | + if (!*out) | ||
140 | + return outlen; | ||
141 | + | ||
142 | + base64_encode (in, inlen, *out, outlen); | ||
143 | + | ||
144 | + return outlen - 1; | ||
145 | +} | ||
146 | + | ||
147 | +/* With this approach this file works independent of the charset used | ||
148 | + (think EBCDIC). However, it does assume that the characters in the | ||
149 | + Base64 alphabet (A-Za-z0-9+/) are encoded in 0..255. POSIX | ||
150 | + 1003.1-2001 require that char and unsigned char are 8-bit | ||
151 | + quantities, though, taking care of that problem. But this may be a | ||
152 | + potential problem on non-POSIX C99 platforms. | ||
153 | + | ||
154 | + IBM C V6 for AIX mishandles "#define B64(x) ...'x'...", so use "_" | ||
155 | + as the formal parameter rather than "x". */ | ||
156 | +#define B64(_) \ | ||
157 | + ((_) == 'A' ? 0 \ | ||
158 | + : (_) == 'B' ? 1 \ | ||
159 | + : (_) == 'C' ? 2 \ | ||
160 | + : (_) == 'D' ? 3 \ | ||
161 | + : (_) == 'E' ? 4 \ | ||
162 | + : (_) == 'F' ? 5 \ | ||
163 | + : (_) == 'G' ? 6 \ | ||
164 | + : (_) == 'H' ? 7 \ | ||
165 | + : (_) == 'I' ? 8 \ | ||
166 | + : (_) == 'J' ? 9 \ | ||
167 | + : (_) == 'K' ? 10 \ | ||
168 | + : (_) == 'L' ? 11 \ | ||
169 | + : (_) == 'M' ? 12 \ | ||
170 | + : (_) == 'N' ? 13 \ | ||
171 | + : (_) == 'O' ? 14 \ | ||
172 | + : (_) == 'P' ? 15 \ | ||
173 | + : (_) == 'Q' ? 16 \ | ||
174 | + : (_) == 'R' ? 17 \ | ||
175 | + : (_) == 'S' ? 18 \ | ||
176 | + : (_) == 'T' ? 19 \ | ||
177 | + : (_) == 'U' ? 20 \ | ||
178 | + : (_) == 'V' ? 21 \ | ||
179 | + : (_) == 'W' ? 22 \ | ||
180 | + : (_) == 'X' ? 23 \ | ||
181 | + : (_) == 'Y' ? 24 \ | ||
182 | + : (_) == 'Z' ? 25 \ | ||
183 | + : (_) == 'a' ? 26 \ | ||
184 | + : (_) == 'b' ? 27 \ | ||
185 | + : (_) == 'c' ? 28 \ | ||
186 | + : (_) == 'd' ? 29 \ | ||
187 | + : (_) == 'e' ? 30 \ | ||
188 | + : (_) == 'f' ? 31 \ | ||
189 | + : (_) == 'g' ? 32 \ | ||
190 | + : (_) == 'h' ? 33 \ | ||
191 | + : (_) == 'i' ? 34 \ | ||
192 | + : (_) == 'j' ? 35 \ | ||
193 | + : (_) == 'k' ? 36 \ | ||
194 | + : (_) == 'l' ? 37 \ | ||
195 | + : (_) == 'm' ? 38 \ | ||
196 | + : (_) == 'n' ? 39 \ | ||
197 | + : (_) == 'o' ? 40 \ | ||
198 | + : (_) == 'p' ? 41 \ | ||
199 | + : (_) == 'q' ? 42 \ | ||
200 | + : (_) == 'r' ? 43 \ | ||
201 | + : (_) == 's' ? 44 \ | ||
202 | + : (_) == 't' ? 45 \ | ||
203 | + : (_) == 'u' ? 46 \ | ||
204 | + : (_) == 'v' ? 47 \ | ||
205 | + : (_) == 'w' ? 48 \ | ||
206 | + : (_) == 'x' ? 49 \ | ||
207 | + : (_) == 'y' ? 50 \ | ||
208 | + : (_) == 'z' ? 51 \ | ||
209 | + : (_) == '0' ? 52 \ | ||
210 | + : (_) == '1' ? 53 \ | ||
211 | + : (_) == '2' ? 54 \ | ||
212 | + : (_) == '3' ? 55 \ | ||
213 | + : (_) == '4' ? 56 \ | ||
214 | + : (_) == '5' ? 57 \ | ||
215 | + : (_) == '6' ? 58 \ | ||
216 | + : (_) == '7' ? 59 \ | ||
217 | + : (_) == '8' ? 60 \ | ||
218 | + : (_) == '9' ? 61 \ | ||
219 | + : (_) == '+' ? 62 \ | ||
220 | + : (_) == '/' ? 63 \ | ||
221 | + : -1) | ||
222 | + | ||
223 | +static const signed char b64[0x100] = { | ||
224 | + B64 (0), B64 (1), B64 (2), B64 (3), | ||
225 | + B64 (4), B64 (5), B64 (6), B64 (7), | ||
226 | + B64 (8), B64 (9), B64 (10), B64 (11), | ||
227 | + B64 (12), B64 (13), B64 (14), B64 (15), | ||
228 | + B64 (16), B64 (17), B64 (18), B64 (19), | ||
229 | + B64 (20), B64 (21), B64 (22), B64 (23), | ||
230 | + B64 (24), B64 (25), B64 (26), B64 (27), | ||
231 | + B64 (28), B64 (29), B64 (30), B64 (31), | ||
232 | + B64 (32), B64 (33), B64 (34), B64 (35), | ||
233 | + B64 (36), B64 (37), B64 (38), B64 (39), | ||
234 | + B64 (40), B64 (41), B64 (42), B64 (43), | ||
235 | + B64 (44), B64 (45), B64 (46), B64 (47), | ||
236 | + B64 (48), B64 (49), B64 (50), B64 (51), | ||
237 | + B64 (52), B64 (53), B64 (54), B64 (55), | ||
238 | + B64 (56), B64 (57), B64 (58), B64 (59), | ||
239 | + B64 (60), B64 (61), B64 (62), B64 (63), | ||
240 | + B64 (64), B64 (65), B64 (66), B64 (67), | ||
241 | + B64 (68), B64 (69), B64 (70), B64 (71), | ||
242 | + B64 (72), B64 (73), B64 (74), B64 (75), | ||
243 | + B64 (76), B64 (77), B64 (78), B64 (79), | ||
244 | + B64 (80), B64 (81), B64 (82), B64 (83), | ||
245 | + B64 (84), B64 (85), B64 (86), B64 (87), | ||
246 | + B64 (88), B64 (89), B64 (90), B64 (91), | ||
247 | + B64 (92), B64 (93), B64 (94), B64 (95), | ||
248 | + B64 (96), B64 (97), B64 (98), B64 (99), | ||
249 | + B64 (100), B64 (101), B64 (102), B64 (103), | ||
250 | + B64 (104), B64 (105), B64 (106), B64 (107), | ||
251 | + B64 (108), B64 (109), B64 (110), B64 (111), | ||
252 | + B64 (112), B64 (113), B64 (114), B64 (115), | ||
253 | + B64 (116), B64 (117), B64 (118), B64 (119), | ||
254 | + B64 (120), B64 (121), B64 (122), B64 (123), | ||
255 | + B64 (124), B64 (125), B64 (126), B64 (127), | ||
256 | + B64 (128), B64 (129), B64 (130), B64 (131), | ||
257 | + B64 (132), B64 (133), B64 (134), B64 (135), | ||
258 | + B64 (136), B64 (137), B64 (138), B64 (139), | ||
259 | + B64 (140), B64 (141), B64 (142), B64 (143), | ||
260 | + B64 (144), B64 (145), B64 (146), B64 (147), | ||
261 | + B64 (148), B64 (149), B64 (150), B64 (151), | ||
262 | + B64 (152), B64 (153), B64 (154), B64 (155), | ||
263 | + B64 (156), B64 (157), B64 (158), B64 (159), | ||
264 | + B64 (160), B64 (161), B64 (162), B64 (163), | ||
265 | + B64 (164), B64 (165), B64 (166), B64 (167), | ||
266 | + B64 (168), B64 (169), B64 (170), B64 (171), | ||
267 | + B64 (172), B64 (173), B64 (174), B64 (175), | ||
268 | + B64 (176), B64 (177), B64 (178), B64 (179), | ||
269 | + B64 (180), B64 (181), B64 (182), B64 (183), | ||
270 | + B64 (184), B64 (185), B64 (186), B64 (187), | ||
271 | + B64 (188), B64 (189), B64 (190), B64 (191), | ||
272 | + B64 (192), B64 (193), B64 (194), B64 (195), | ||
273 | + B64 (196), B64 (197), B64 (198), B64 (199), | ||
274 | + B64 (200), B64 (201), B64 (202), B64 (203), | ||
275 | + B64 (204), B64 (205), B64 (206), B64 (207), | ||
276 | + B64 (208), B64 (209), B64 (210), B64 (211), | ||
277 | + B64 (212), B64 (213), B64 (214), B64 (215), | ||
278 | + B64 (216), B64 (217), B64 (218), B64 (219), | ||
279 | + B64 (220), B64 (221), B64 (222), B64 (223), | ||
280 | + B64 (224), B64 (225), B64 (226), B64 (227), | ||
281 | + B64 (228), B64 (229), B64 (230), B64 (231), | ||
282 | + B64 (232), B64 (233), B64 (234), B64 (235), | ||
283 | + B64 (236), B64 (237), B64 (238), B64 (239), | ||
284 | + B64 (240), B64 (241), B64 (242), B64 (243), | ||
285 | + B64 (244), B64 (245), B64 (246), B64 (247), | ||
286 | + B64 (248), B64 (249), B64 (250), B64 (251), | ||
287 | + B64 (252), B64 (253), B64 (254), B64 (255) | ||
288 | +}; | ||
289 | + | ||
290 | +#if UCHAR_MAX == 255 | ||
291 | +# define uchar_in_range(c) true | ||
292 | +#else | ||
293 | +# define uchar_in_range(c) ((c) <= 255) | ||
294 | +#endif | ||
295 | + | ||
296 | +/* Return true if CH is a character from the Base64 alphabet, and | ||
297 | + false otherwise. Note that '=' is padding and not considered to be | ||
298 | + part of the alphabet. */ | ||
299 | +bool | ||
300 | +isbase64 (char ch) | ||
301 | +{ | ||
302 | + return uchar_in_range (to_uchar (ch)) && 0 <= b64[to_uchar (ch)]; | ||
303 | +} | ||
304 | + | ||
305 | +/* Initialize decode-context buffer, CTX. */ | ||
306 | +void | ||
307 | +base64_decode_ctx_init (struct base64_decode_context *ctx) | ||
308 | +{ | ||
309 | + ctx->i = 0; | ||
310 | +} | ||
311 | + | ||
312 | +/* If CTX->i is 0 or 4, there are four or more bytes in [*IN..IN_END), and | ||
313 | + none of those four is a newline, then return *IN. Otherwise, copy up to | ||
314 | + 4 - CTX->i non-newline bytes from that range into CTX->buf, starting at | ||
315 | + index CTX->i and setting CTX->i to reflect the number of bytes copied, | ||
316 | + and return CTX->buf. In either case, advance *IN to point to the byte | ||
317 | + after the last one processed, and set *N_NON_NEWLINE to the number of | ||
318 | + verified non-newline bytes accessible through the returned pointer. */ | ||
319 | +static inline char * | ||
320 | +get_4 (struct base64_decode_context *ctx, | ||
321 | + char const *restrict *in, char const *restrict in_end, | ||
322 | + size_t *n_non_newline) | ||
323 | +{ | ||
324 | + if (ctx->i == 4) | ||
325 | + ctx->i = 0; | ||
326 | + | ||
327 | + if (ctx->i == 0) | ||
328 | + { | ||
329 | + char const *t = *in; | ||
330 | + if (4 <= in_end - *in && memchr (t, '\n', 4) == NULL) | ||
331 | + { | ||
332 | + /* This is the common case: no newline. */ | ||
333 | + *in += 4; | ||
334 | + *n_non_newline = 4; | ||
335 | + return (char *) t; | ||
336 | + } | ||
337 | + } | ||
338 | + | ||
339 | + { | ||
340 | + /* Copy non-newline bytes into BUF. */ | ||
341 | + char const *p = *in; | ||
342 | + while (p < in_end) | ||
343 | + { | ||
344 | + char c = *p++; | ||
345 | + if (c != '\n') | ||
346 | + { | ||
347 | + ctx->buf[ctx->i++] = c; | ||
348 | + if (ctx->i == 4) | ||
349 | + break; | ||
350 | + } | ||
351 | + } | ||
352 | + | ||
353 | + *in = p; | ||
354 | + *n_non_newline = ctx->i; | ||
355 | + return ctx->buf; | ||
356 | + } | ||
357 | +} | ||
358 | + | ||
359 | +#define return_false \ | ||
360 | + do \ | ||
361 | + { \ | ||
362 | + *outp = out; \ | ||
363 | + return false; \ | ||
364 | + } \ | ||
365 | + while (false) | ||
366 | + | ||
367 | +/* Decode up to four bytes of base64-encoded data, IN, of length INLEN | ||
368 | + into the output buffer, *OUT, of size *OUTLEN bytes. Return true if | ||
369 | + decoding is successful, false otherwise. If *OUTLEN is too small, | ||
370 | + as many bytes as possible are written to *OUT. On return, advance | ||
371 | + *OUT to point to the byte after the last one written, and decrement | ||
372 | + *OUTLEN to reflect the number of bytes remaining in *OUT. */ | ||
373 | +static inline bool | ||
374 | +decode_4 (char const *restrict in, size_t inlen, | ||
375 | + char *restrict *outp, size_t *outleft) | ||
376 | +{ | ||
377 | + char *out = *outp; | ||
378 | + if (inlen < 2) | ||
379 | + return false; | ||
380 | + | ||
381 | + if (!isbase64 (in[0]) || !isbase64 (in[1])) | ||
382 | + return false; | ||
383 | + | ||
384 | + if (*outleft) | ||
385 | + { | ||
386 | + *out++ = ((b64[to_uchar (in[0])] << 2) | ||
387 | + | (b64[to_uchar (in[1])] >> 4)); | ||
388 | + --*outleft; | ||
389 | + } | ||
390 | + | ||
391 | + if (inlen == 2) | ||
392 | + return_false; | ||
393 | + | ||
394 | + if (in[2] == '=') | ||
395 | + { | ||
396 | + if (inlen != 4) | ||
397 | + return_false; | ||
398 | + | ||
399 | + if (in[3] != '=') | ||
400 | + return_false; | ||
401 | + } | ||
402 | + else | ||
403 | + { | ||
404 | + if (!isbase64 (in[2])) | ||
405 | + return_false; | ||
406 | + | ||
407 | + if (*outleft) | ||
408 | + { | ||
409 | + *out++ = (((b64[to_uchar (in[1])] << 4) & 0xf0) | ||
410 | + | (b64[to_uchar (in[2])] >> 2)); | ||
411 | + --*outleft; | ||
412 | + } | ||
413 | + | ||
414 | + if (inlen == 3) | ||
415 | + return_false; | ||
416 | + | ||
417 | + if (in[3] == '=') | ||
418 | + { | ||
419 | + if (inlen != 4) | ||
420 | + return_false; | ||
421 | + } | ||
422 | + else | ||
423 | + { | ||
424 | + if (!isbase64 (in[3])) | ||
425 | + return_false; | ||
426 | + | ||
427 | + if (*outleft) | ||
428 | + { | ||
429 | + *out++ = (((b64[to_uchar (in[2])] << 6) & 0xc0) | ||
430 | + | b64[to_uchar (in[3])]); | ||
431 | + --*outleft; | ||
432 | + } | ||
433 | + } | ||
434 | + } | ||
435 | + | ||
436 | + *outp = out; | ||
437 | + return true; | ||
438 | +} | ||
439 | + | ||
440 | +/* Decode base64-encoded input array IN of length INLEN to output array | ||
441 | + OUT that can hold *OUTLEN bytes. The input data may be interspersed | ||
442 | + with newlines. Return true if decoding was successful, i.e. if the | ||
443 | + input was valid base64 data, false otherwise. If *OUTLEN is too | ||
444 | + small, as many bytes as possible will be written to OUT. On return, | ||
445 | + *OUTLEN holds the length of decoded bytes in OUT. Note that as soon | ||
446 | + as any non-alphabet, non-newline character is encountered, decoding | ||
447 | + is stopped and false is returned. If INLEN is zero, then process | ||
448 | + only whatever data is stored in CTX. | ||
449 | + | ||
450 | + Initially, CTX must have been initialized via base64_decode_ctx_init. | ||
451 | + Subsequent calls to this function must reuse whatever state is recorded | ||
452 | + in that buffer. It is necessary for when a quadruple of base64 input | ||
453 | + bytes spans two input buffers. | ||
454 | + | ||
455 | + If CTX is NULL then newlines are treated as garbage and the input | ||
456 | + buffer is processed as a unit. */ | ||
457 | + | ||
458 | +bool | ||
459 | +base64_decode_ctx (struct base64_decode_context *ctx, | ||
460 | + const char *restrict in, size_t inlen, | ||
461 | + char *restrict out, size_t *outlen) | ||
462 | +{ | ||
463 | + size_t outleft = *outlen; | ||
464 | + bool ignore_newlines = ctx != NULL; | ||
465 | + bool flush_ctx = false; | ||
466 | + unsigned int ctx_i = 0; | ||
467 | + | ||
468 | + if (ignore_newlines) | ||
469 | + { | ||
470 | + ctx_i = ctx->i; | ||
471 | + flush_ctx = inlen == 0; | ||
472 | + } | ||
473 | + | ||
474 | + | ||
475 | + while (true) | ||
476 | + { | ||
477 | + size_t outleft_save = outleft; | ||
478 | + if (ctx_i == 0 && !flush_ctx) | ||
479 | + { | ||
480 | + while (true) | ||
481 | + { | ||
482 | + /* Save a copy of outleft, in case we need to re-parse this | ||
483 | + block of four bytes. */ | ||
484 | + outleft_save = outleft; | ||
485 | + if (!decode_4 (in, inlen, &out, &outleft)) | ||
486 | + break; | ||
487 | + | ||
488 | + in += 4; | ||
489 | + inlen -= 4; | ||
490 | + } | ||
491 | + } | ||
492 | + | ||
493 | + if (inlen == 0 && !flush_ctx) | ||
494 | + break; | ||
495 | + | ||
496 | + /* Handle the common case of 72-byte wrapped lines. | ||
497 | + This also handles any other multiple-of-4-byte wrapping. */ | ||
498 | + if (inlen && *in == '\n' && ignore_newlines) | ||
499 | + { | ||
500 | + ++in; | ||
501 | + --inlen; | ||
502 | + continue; | ||
503 | + } | ||
504 | + | ||
505 | + /* Restore OUT and OUTLEFT. */ | ||
506 | + out -= outleft_save - outleft; | ||
507 | + outleft = outleft_save; | ||
508 | + | ||
509 | + { | ||
510 | + char const *in_end = in + inlen; | ||
511 | + char const *non_nl; | ||
512 | + | ||
513 | + if (ignore_newlines) | ||
514 | + non_nl = get_4 (ctx, &in, in_end, &inlen); | ||
515 | + else | ||
516 | + non_nl = in; /* Might have nl in this case. */ | ||
517 | + | ||
518 | + /* If the input is empty or consists solely of newlines (0 non-newlines), | ||
519 | + then we're done. Likewise if there are fewer than 4 bytes when not | ||
520 | + flushing context and not treating newlines as garbage. */ | ||
521 | + if (inlen == 0 || (inlen < 4 && !flush_ctx && ignore_newlines)) | ||
522 | + { | ||
523 | + inlen = 0; | ||
524 | + break; | ||
525 | + } | ||
526 | + if (!decode_4 (non_nl, inlen, &out, &outleft)) | ||
527 | + break; | ||
528 | + | ||
529 | + inlen = in_end - in; | ||
530 | + } | ||
531 | + } | ||
532 | + | ||
533 | + *outlen -= outleft; | ||
534 | + | ||
535 | + return inlen == 0; | ||
536 | +} | ||
537 | + | ||
538 | +/* Allocate an output buffer in *OUT, and decode the base64 encoded | ||
539 | + data stored in IN of size INLEN to the *OUT buffer. On return, the | ||
540 | + size of the decoded data is stored in *OUTLEN. OUTLEN may be NULL, | ||
541 | + if the caller is not interested in the decoded length. *OUT may be | ||
542 | + NULL to indicate an out of memory error, in which case *OUTLEN | ||
543 | + contains the size of the memory block needed. The function returns | ||
544 | + true on successful decoding and memory allocation errors. (Use the | ||
545 | + *OUT and *OUTLEN parameters to differentiate between successful | ||
546 | + decoding and memory error.) The function returns false if the | ||
547 | + input was invalid, in which case *OUT is NULL and *OUTLEN is | ||
548 | + undefined. */ | ||
549 | +bool | ||
550 | +base64_decode_alloc_ctx (struct base64_decode_context *ctx, | ||
551 | + const char *in, size_t inlen, char **out, | ||
552 | + size_t *outlen) | ||
553 | +{ | ||
554 | + /* This may allocate a few bytes too many, depending on input, | ||
555 | + but it's not worth the extra CPU time to compute the exact size. | ||
556 | + The exact size is 3 * inlen / 4, minus 1 if the input ends | ||
557 | + with "=" and minus another 1 if the input ends with "==". | ||
558 | + Dividing before multiplying avoids the possibility of overflow. */ | ||
559 | + size_t needlen = 3 * (inlen / 4) + 2; | ||
560 | + | ||
561 | + *out = malloc (needlen); | ||
562 | + if (!*out) | ||
563 | + return true; | ||
564 | + | ||
565 | + if (!base64_decode_ctx (ctx, in, inlen, *out, &needlen)) | ||
566 | + { | ||
567 | + free (*out); | ||
568 | + *out = NULL; | ||
569 | + return false; | ||
570 | + } | ||
571 | + | ||
572 | + if (outlen) | ||
573 | + *outlen = needlen; | ||
574 | + | ||
575 | + return true; | ||
576 | +} |
base64.h
0 → 100644
1 | +/* -*- buffer-read-only: t -*- vi: set ro: */ | ||
2 | +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ | ||
3 | +/* base64.h -- Encode binary data using printable characters. | ||
4 | + Copyright (C) 2004, 2005, 2006, 2009, 2010 Free Software Foundation, Inc. | ||
5 | + Written by Simon Josefsson. | ||
6 | + | ||
7 | + This program is free software; you can redistribute it and/or modify | ||
8 | + it under the terms of the GNU General Public License as published by | ||
9 | + the Free Software Foundation; either version 3, or (at your option) | ||
10 | + any later version. | ||
11 | + | ||
12 | + This program is distributed in the hope that it will be useful, | ||
13 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | + GNU General Public License for more details. | ||
16 | + | ||
17 | + You should have received a copy of the GNU General Public License | ||
18 | + along with this program; if not, write to the Free Software Foundation, | ||
19 | + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ | ||
20 | + | ||
21 | +/* Define to the equivalent of the C99 'restrict' keyword, or to | ||
22 | + * nothing if this is not supported. Do not define if restrict is | ||
23 | + * supported directly. */ | ||
24 | +#define restrict __restrict | ||
25 | +/* Work around a bug in Sun C++: it does not support _Restrict or | ||
26 | + * __restrict__, even though the corresponding Sun C compiler ends up with | ||
27 | + * "#define restrict _Restrict" or "#define restrict __restrict__" in the | ||
28 | + * previous line. Perhaps some future version of Sun C++ will work with | ||
29 | + * restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ | ||
30 | +#if defined __SUNPRO_CC && !defined __RESTRICT | ||
31 | +# define _Restrict | ||
32 | +# define __restrict__ | ||
33 | +#endif | ||
34 | + | ||
35 | +#ifndef BASE64_H | ||
36 | +# define BASE64_H | ||
37 | + | ||
38 | +/* Get size_t. */ | ||
39 | +# include <stddef.h> | ||
40 | + | ||
41 | +/* Get bool. */ | ||
42 | +# include <stdbool.h> | ||
43 | + | ||
44 | +/* This uses that the expression (n+(k-1))/k means the smallest | ||
45 | + integer >= n/k, i.e., the ceiling of n/k. */ | ||
46 | +# define BASE64_LENGTH(inlen) ((((inlen) + 2) / 3) * 4) | ||
47 | + | ||
48 | +struct base64_decode_context | ||
49 | +{ | ||
50 | + unsigned int i; | ||
51 | + char buf[4]; | ||
52 | +}; | ||
53 | + | ||
54 | +extern bool isbase64 (char ch); | ||
55 | + | ||
56 | +extern void base64_encode (const char *restrict in, size_t inlen, | ||
57 | + char *restrict out, size_t outlen); | ||
58 | + | ||
59 | +extern size_t base64_encode_alloc (const char *in, size_t inlen, char **out); | ||
60 | + | ||
61 | +extern void base64_decode_ctx_init (struct base64_decode_context *ctx); | ||
62 | + | ||
63 | +extern bool base64_decode_ctx (struct base64_decode_context *ctx, | ||
64 | + const char *restrict in, size_t inlen, | ||
65 | + char *restrict out, size_t *outlen); | ||
66 | + | ||
67 | +extern bool base64_decode_alloc_ctx (struct base64_decode_context *ctx, | ||
68 | + const char *in, size_t inlen, | ||
69 | + char **out, size_t *outlen); | ||
70 | + | ||
71 | +#define base64_decode(in, inlen, out, outlen) \ | ||
72 | + base64_decode_ctx (NULL, in, inlen, out, outlen) | ||
73 | + | ||
74 | +#define base64_decode_alloc(in, inlen, out, outlen) \ | ||
75 | + base64_decode_alloc_ctx (NULL, in, inlen, out, outlen) | ||
76 | + | ||
77 | +#endif /* BASE64_H */ |
bigpoint_cclass.c
0 → 100644
1 | +#include "bigpoint_cclass.h" | ||
2 | + | ||
3 | +#include <stdarg.h> | ||
4 | +#include <string.h> | ||
5 | +#include <stdlib.h> | ||
6 | +#include <json/json.h> | ||
7 | + | ||
8 | + | ||
9 | +void * | ||
10 | +new(const void * _class, ...) | ||
11 | +{ | ||
12 | + const struct BIGPOINT_CCLASS * class = _class; | ||
13 | + void * object = calloc(1, class->size); | ||
14 | + | ||
15 | + * (const struct BIGPOINT_CCLASS **) object = class; | ||
16 | + | ||
17 | + if (class->__construct) { | ||
18 | + va_list params; | ||
19 | + | ||
20 | + va_start(params, _class); | ||
21 | + class->__construct(object, ¶ms); | ||
22 | + va_end(params); | ||
23 | + } | ||
24 | + | ||
25 | + return object; | ||
26 | +} | ||
27 | + | ||
28 | +void * | ||
29 | +newFromJson(const void * _class, struct json_object * json) | ||
30 | +{ | ||
31 | + const struct BIGPOINT_CCLASS * class = _class; | ||
32 | + void * object = calloc(1, class->size); | ||
33 | + | ||
34 | + * (const struct BIGPOINT_CCLASS **) object = class; | ||
35 | + | ||
36 | + if (class->__jsonConst && json) { | ||
37 | + class->__jsonConst(object, json); | ||
38 | + } | ||
39 | + | ||
40 | + return object; | ||
41 | +} | ||
42 | + | ||
43 | +void | ||
44 | +delete(void * _object) | ||
45 | +{ | ||
46 | + const struct BIGPOINT_CCLASS ** class = _object; | ||
47 | + | ||
48 | + if (_object && *class && (*class)->__destruct) { | ||
49 | + (*class)->__destruct(_object); | ||
50 | + } | ||
51 | + | ||
52 | + free(_object); | ||
53 | +} | ||
54 | + | ||
55 | +struct json_object * | ||
56 | +toJson(void * _object) | ||
57 | +{ | ||
58 | + const struct BIGPOINT_CCLASS ** class = _object; | ||
59 | + | ||
60 | + if (_object && *class && (*class)->__toJson) { | ||
61 | + return (*class)->__toJson(_object); | ||
62 | + } | ||
63 | + | ||
64 | + return NULL; | ||
65 | +} | ||
66 | + | ||
67 | +// vim: set et ts=4 sw=4: |
bigpoint_cclass.h
0 → 100644
1 | +#ifndef __BIGPOINT_CCLASS_H__ | ||
2 | +#define __BIGPOINT_CCLASS_H__ | ||
3 | + | ||
4 | +#include <stdarg.h> | ||
5 | +#include <sys/types.h> | ||
6 | +#include <json/json.h> | ||
7 | + | ||
8 | +typedef void (* ctor)(void*, va_list*); | ||
9 | +typedef void (* dtor)(void*); | ||
10 | + | ||
11 | +struct BIGPOINT_CCLASS { | ||
12 | + size_t size; | ||
13 | + void (* __construct)(void * _this, va_list * params); | ||
14 | + void (* __jsonConst)(void * _this, struct json_object * json); | ||
15 | + void (* __destruct)(void * _this); | ||
16 | + struct json_object * (* __toJson)(void * _this); | ||
17 | +}; | ||
18 | + | ||
19 | +void * | ||
20 | +new(const void * _class, ...); | ||
21 | + | ||
22 | +void * | ||
23 | +newFromJson(const void * _class, struct json_object * json); | ||
24 | + | ||
25 | +void | ||
26 | +delete(void * _object); | ||
27 | + | ||
28 | +struct json_object * | ||
29 | +toJson(void * _object); | ||
30 | + | ||
31 | +#endif//__BIGPOINT_CCLASS_H__ | ||
32 | + | ||
33 | +// vim: set et ts=4 sw=4: |
bigpoint_crypt.c
0 → 100644
1 | +#include <stdarg.h> | ||
2 | +#include <stdlib.h> | ||
3 | +#include <fcntl.h> | ||
4 | +#include <string.h> | ||
5 | +#include <sys/types.h> | ||
6 | +#include <sys/stat.h> | ||
7 | +#include <mcrypt.h> | ||
8 | +#include <mhash.h> | ||
9 | + | ||
10 | +#include "bigpoint_crypt.h" | ||
11 | + | ||
12 | + | ||
13 | +static | ||
14 | +void | ||
15 | +__construct(struct BIGPOINT_CRYPT * _this, va_list * params) | ||
16 | +{ | ||
17 | + _this->algorithm = va_arg(* params, const char * const); | ||
18 | + _this->mode = va_arg(* params, const char * const); | ||
19 | + | ||
20 | + _this->mcrypt = mcrypt_module_open( | ||
21 | + (char *)_this->algorithm, | ||
22 | + NULL, | ||
23 | + (char *)_this->mode, | ||
24 | + NULL); | ||
25 | + | ||
26 | + _this->ivsize = mcrypt_enc_get_iv_size(_this->mcrypt); | ||
27 | + _this->keysize = mcrypt_enc_get_key_size(_this->mcrypt); | ||
28 | +} | ||
29 | + | ||
30 | +static | ||
31 | +void | ||
32 | +__destruct(struct BIGPOINT_CRYPT * _this) | ||
33 | +{ | ||
34 | + if (_this->iv) { | ||
35 | + free(_this->iv); | ||
36 | + } | ||
37 | + | ||
38 | + mcrypt_module_close(_this->mcrypt); | ||
39 | +} | ||
40 | + | ||
41 | +static const | ||
42 | +struct BIGPOINT_CCLASS _bigpoint_crypt = { | ||
43 | + sizeof(struct BIGPOINT_CRYPT), | ||
44 | + (ctor)__construct, | ||
45 | + NULL, | ||
46 | + (dtor)__destruct, | ||
47 | + NULL | ||
48 | +}; | ||
49 | + | ||
50 | +const struct BIGPOINT_CCLASS * const BIGPOINT_CRYPT = &_bigpoint_crypt; | ||
51 | + | ||
52 | +static | ||
53 | +void | ||
54 | +mcrypt_close(MCRYPT * mcrypt) | ||
55 | +{ | ||
56 | + mcrypt_free(*mcrypt); | ||
57 | + *mcrypt = NULL; | ||
58 | +} | ||
59 | + | ||
60 | +void * | ||
61 | +bigpoint_crypt_createIv(struct BIGPOINT_CRYPT * _this) | ||
62 | +{ | ||
63 | + int urandom; | ||
64 | + size_t rsize = 0; | ||
65 | + void * iv = NULL; | ||
66 | + | ||
67 | + iv = calloc(_this->ivsize, sizeof(char)); | ||
68 | + | ||
69 | + urandom = open("/dev/urandom", O_RDONLY); | ||
70 | + rsize = read(urandom, iv, _this->ivsize); | ||
71 | + | ||
72 | + if (_this->ivsize != rsize) { | ||
73 | + free(iv); | ||
74 | + iv = NULL; | ||
75 | + } | ||
76 | + | ||
77 | + return iv; | ||
78 | +} | ||
79 | + | ||
80 | +static | ||
81 | +void * | ||
82 | +createKey(struct BIGPOINT_CRYPT * _this, const char * const password) | ||
83 | +{ | ||
84 | + void * key = NULL; | ||
85 | + | ||
86 | + key = calloc(_this->keysize, sizeof(char)); | ||
87 | + | ||
88 | + mhash_keygen( | ||
89 | + KEYGEN_MCRYPT, | ||
90 | + MHASH_SHA256, | ||
91 | + mhash_keygen_count(), | ||
92 | + key, | ||
93 | + _this->keysize, | ||
94 | + NULL, | ||
95 | + 0, | ||
96 | + (char *)password, // @TODO: bad karma...now this might change password. | ||
97 | + strlen(password)); | ||
98 | + | ||
99 | + return key; | ||
100 | +} | ||
101 | + | ||
102 | +void * | ||
103 | +bigpoint_crypt_encrypt( | ||
104 | + struct BIGPOINT_CRYPT * _this, | ||
105 | + const void * const data, | ||
106 | + const char * const password, | ||
107 | + size_t * length) | ||
108 | +{ | ||
109 | + char * encrypted; | ||
110 | + void * iv; | ||
111 | + void * key; | ||
112 | + | ||
113 | + key = createKey(_this, password); | ||
114 | + if(_this->iv) { | ||
115 | + iv = _this->iv; | ||
116 | + } else { | ||
117 | + iv = bigpoint_crypt_createIv(_this); | ||
118 | + } | ||
119 | + | ||
120 | + mcrypt_generic_init(_this->mcrypt, key, _this->keysize, iv); | ||
121 | + | ||
122 | + encrypted = calloc(_this->ivsize + *length, sizeof(char)); | ||
123 | + memcpy(encrypted, iv, _this->ivsize); | ||
124 | + memcpy(encrypted + _this->ivsize, data, *length); | ||
125 | + | ||
126 | + mcrypt_generic(_this->mcrypt, encrypted + _this->ivsize, *length); | ||
127 | + mcrypt_generic_deinit(_this->mcrypt); | ||
128 | + *length += _this->ivsize; | ||
129 | + | ||
130 | + free(key); | ||
131 | + if (_this->iv != iv) { | ||
132 | + free(iv); | ||
133 | + } | ||
134 | + | ||
135 | + return encrypted; | ||
136 | +} | ||
137 | + | ||
138 | +void * | ||
139 | +bigpoint_crypt_decrypt( | ||
140 | + struct BIGPOINT_CRYPT * _this, | ||
141 | + const void * const data, | ||
142 | + const char * const password, | ||
143 | + size_t * length) | ||
144 | +{ | ||
145 | + char * decrypted; | ||
146 | + void * iv; | ||
147 | + void * key; | ||
148 | + | ||
149 | + key = createKey(_this, password); | ||
150 | + iv = calloc(_this->ivsize, sizeof(char)); | ||
151 | + memcpy(iv, data, _this->ivsize); | ||
152 | + | ||
153 | + mcrypt_generic_init(_this->mcrypt, key, _this->keysize, iv); | ||
154 | + | ||
155 | + *length -= _this->ivsize; | ||
156 | + decrypted = calloc(*length, sizeof(char)); | ||
157 | + memcpy(decrypted, data + _this->ivsize, *length); | ||
158 | + | ||
159 | + mdecrypt_generic(_this->mcrypt, decrypted, *length); | ||
160 | + mcrypt_generic_deinit(_this->mcrypt); | ||
161 | + | ||
162 | + free(key); | ||
163 | + free(iv); | ||
164 | + | ||
165 | + return decrypted; | ||
166 | +} | ||
167 | + | ||
168 | +// vim: set et ts=4 sw=4: |
bigpoint_crypt.h
0 → 100644
1 | +#ifndef __BIGPOINT_CRYPT_H__ | ||
2 | +#define __BIGPOINT_CRYPT_H__ | ||
3 | + | ||
4 | +#include <sys/types.h> | ||
5 | + | ||
6 | +#include "bigpoint_cclass.h" | ||
7 | + | ||
8 | + | ||
9 | +struct BIGPOINT_CRYPT { | ||
10 | + const struct BIGPOINT_CCLASS * const class; | ||
11 | + const char * algorithm; | ||
12 | + const char * mode; | ||
13 | + MCRYPT mcrypt; | ||
14 | + size_t ivsize; | ||
15 | + size_t keysize; | ||
16 | + void * iv; | ||
17 | +}; | ||
18 | + | ||
19 | +extern const struct BIGPOINT_CCLASS * const BIGPOINT_CRYPT; | ||
20 | + | ||
21 | +void * bigpoint_crypt_encrypt( | ||
22 | + struct BIGPOINT_CRYPT * _this, | ||
23 | + const void * const data, | ||
24 | + const char * const password, | ||
25 | + size_t * length); | ||
26 | + | ||
27 | +void * bigpoint_crypt_decrypt( | ||
28 | + struct BIGPOINT_CRYPT * _this, | ||
29 | + const void * const data, | ||
30 | + const char * const password, | ||
31 | + size_t * length); | ||
32 | + | ||
33 | +void * bigpoint_crypt_createIv( | ||
34 | + struct BIGPOINT_CRYPT * _this); | ||
35 | + | ||
36 | +void bigpoint_crypt_setIv( | ||
37 | + struct BIGPOINT_CRYPT * _this, | ||
38 | + const void * const iv); | ||
39 | + | ||
40 | +void bigpoint_crypt_setIvsize( | ||
41 | + struct BIGPOINT_CRYPT * _this, | ||
42 | + const size_t size); | ||
43 | + | ||
44 | +void bigpoint_crypt_setKeysize( | ||
45 | + struct BIGPOINT_CRYPT * _this, | ||
46 | + const size_t size); | ||
47 | + | ||
48 | +#endif//__BIGPOINT_CRYPT_H__ | ||
49 | +// vim: set et ts=4 sw=4: |
bigpoint_dyntype.c
0 → 100644
1 | +#include <stdlib.h> | ||
2 | +#include <string.h> | ||
3 | +#include <sys/types.h> | ||
4 | +#include <json/json.h> | ||
5 | + | ||
6 | +#include "bigpoint_dyntype.h" | ||
7 | + | ||
8 | + | ||
9 | +static | ||
10 | +void | ||
11 | +__construct(struct BIGPOINT_DYNTYPE * _this, va_list * params) | ||
12 | +{ | ||
13 | + _this->type = va_arg(* params, enum BIGPOINT_DYNTYPE_TYPES); | ||
14 | + _this->size = va_arg(* params, size_t); | ||
15 | + | ||
16 | + _this->data = calloc(_this->size, sizeof(char)); | ||
17 | + memcpy(_this->data, va_arg(* params, void *), _this->size); | ||
18 | +} | ||
19 | + | ||
20 | +static | ||
21 | +void | ||
22 | +__destruct(struct BIGPOINT_DYNTYPE * _this) | ||
23 | +{ | ||
24 | + if (_this && _this->data) { | ||
25 | + free(_this->data); | ||
26 | + } | ||
27 | +} | ||
28 | + | ||
29 | +static | ||
30 | +struct json_object * | ||
31 | +__toJson(struct BIGPOINT_DYNTYPE * _this) | ||
32 | +{ | ||
33 | + struct json_object * json = NULL; | ||
34 | + | ||
35 | + /** | ||
36 | + * @TODO: make a smart implementation here base on the type of the | ||
37 | + * actual object. | ||
38 | + */ | ||
39 | + return json; | ||
40 | +} | ||
41 | + | ||
42 | +static | ||
43 | +void | ||
44 | +__jsonConst(struct BIGPOINT_DYNTYPE * _this, struct json_object * json) | ||
45 | +{ | ||
46 | + /** | ||
47 | + * @TODO: initialize by json.... | ||
48 | + */ | ||
49 | +} | ||
50 | + | ||
51 | +static const | ||
52 | +struct BIGPOINT_CCLASS _bigpoint_dyntype = { | ||
53 | + sizeof(struct BIGPOINT_DYNTYPE), | ||
54 | + (ctor)__construct, | ||
55 | + __jsonConst, | ||
56 | + (dtor)__destruct, | ||
57 | + __toJson | ||
58 | +}; | ||
59 | + | ||
60 | +const struct BIGPOINT_CCLASS * const BIGPOINT_DYNTYPE = &_bigpoint_dyntype; | ||
61 | + | ||
62 | +// vim: set et ts=4 sw=4: |
bigpoint_dyntype.h
0 → 100644
1 | +#ifndef __BIGPOINT_DYNTYPE_H__ | ||
2 | +#define __BIGPOINT_DYNTYPE_H__ | ||
3 | + | ||
4 | +#include <sys/types.h> | ||
5 | + | ||
6 | +#include "bigpoint_cclass.h" | ||
7 | + | ||
8 | + | ||
9 | +enum BIGPOINT_DYNTYPE_TYPES { | ||
10 | + BIGPOINT_DYNTYPE_BOOLEAN = 0, | ||
11 | + BIGPOINT_DYNTYPE_INT, | ||
12 | + BIGPOINT_DYNTYPE_FLOAT, | ||
13 | + BIGPOINT_DYNTYPE_STRING, | ||
14 | + BIGPOINT_DYNTYPE_ARRAY, | ||
15 | + BIGPOINT_DYNTYPE_OBJECT | ||
16 | +}; | ||
17 | + | ||
18 | + | ||
19 | +struct BIGPOINT_DYNTYPE { | ||
20 | + const struct BIGPOINT_CCLASS * const class; | ||
21 | + enum BIGPOINT_DYNTYPE_TYPES type; | ||
22 | + size_t size; | ||
23 | + void * data; | ||
24 | +}; | ||
25 | + | ||
26 | +extern const struct BIGPOINT_CCLASS * const BIGPOINT_DYNTYPE; | ||
27 | + | ||
28 | +#endif//__BIGPOINT_DYNTYPE_H__ | ||
29 | + | ||
30 | +// vim: set et ts=4 sw=4: |
bigpoint_packet.c
0 → 100644
1 | +#include <json/json.h> | ||
2 | + | ||
3 | +#include "bigpoint_container_packet.h" | ||
4 | + | ||
5 | + | ||
6 | +static | ||
7 | +void | ||
8 | +__construct(struct BIGPOINT_PACKET * _this, va_list * params) | ||
9 | +{ | ||
10 | + bigpoint_container_packet_set_default_content(_this); | ||
11 | +} | ||
12 | + | ||
13 | +static | ||
14 | +void | ||
15 | +__jsonConst(struct BIGPOINT_PACKET * _this, struct json_object * json) | ||
16 | +{ | ||
17 | + struct json_object * header = NULL; | ||
18 | + struct json_object * data = NULL; | ||
19 | + | ||
20 | + if (! json_type_array == json_object_get_type(json)) { | ||
21 | + bigpoint_packet_set_default_content(_this); | ||
22 | + return; | ||
23 | + } | ||
24 | + | ||
25 | + header = json_object_array_get_idx(json, 0); | ||
26 | + data = json_object_array_get_idx(json, 1); | ||
27 | + | ||
28 | + if (! (header && data)) { | ||
29 | + bigpoint_packet_set_default_content(_this); | ||
30 | + return; | ||
31 | + } | ||
32 | + | ||
33 | + bigpoint_packet_setHeader(_this, newFromJson(BIGPOINT_DYNTYPE, header)); | ||
34 | + bigpoint_packet_setData(_this, newFromJson(BIGPOINT_DYNTYPE, data)); | ||
35 | +} | ||
36 | + | ||
37 | +static | ||
38 | +void | ||
39 | +__destruct(struct BIGPOINT_PACKET * _this) | ||
40 | +{ | ||
41 | +} | ||
42 | + | ||
43 | +static | ||
44 | +struct json_object * | ||
45 | +__toJson(struct BIGPOINT_PACKET * _this) | ||
46 | +{ | ||
47 | + struct json_object * json = json_object_new_array(); | ||
48 | + | ||
49 | + json_object_array_add(json, toJson(bigpoint_packet_getHeader(_this))); | ||
50 | + json_object_array_add(json, toJson(bigpoint_packet_getData(_this))); | ||
51 | + | ||
52 | + return json; | ||
53 | +} | ||
54 | + | ||
55 | +static const | ||
56 | +struct BIGPOINT_CLASS _bigpoint_packet = { | ||
57 | + sizeof(struct BIGPOINT_PACKET), | ||
58 | + (ctor)__construct, | ||
59 | + __jsonConst, | ||
60 | + (dtor)__destruct, | ||
61 | + __toJson | ||
62 | +}; | ||
63 | + | ||
64 | +const struct BIGPOINT_CCLASS * const BIGPOINT_PACKET = &_bigpoint_packet; | ||
65 | + | ||
66 | +void * | ||
67 | +bigpoint_packet_getHeader( | ||
68 | + struct BIGPOINT_PACKET * _this) | ||
69 | +{ | ||
70 | + return _this->content[BIGPOINT_PACKET_HEADER]; | ||
71 | +} | ||
72 | + | ||
73 | +void * | ||
74 | +bigpoint_packet_getData( | ||
75 | + struct BIGPOINT_PACKET * _this) | ||
76 | +{ | ||
77 | + return _this->content[BIGPOINT_PACKET_DATA]; | ||
78 | +} | ||
79 | + | ||
80 | +void bigpoint_packet_setHeader( | ||
81 | + struct BIGPOINT_PACKET * _this, | ||
82 | + struct BIGPOINT_DYNTYPE * header) | ||
83 | +{ | ||
84 | + _this->content[BIGPOINT_PACKET_HEADER] = header; | ||
85 | +} | ||
86 | + | ||
87 | +void bigpoint_packet_setData( | ||
88 | + struct BIGPOINT_PACKET * _this, | ||
89 | + struct BIGPOINT_DYNTYPE * data) | ||
90 | +{ | ||
91 | + _this->content[BIGPOINT_PACKET_DATA] = data; | ||
92 | +} | ||
93 | + | ||
94 | +void | ||
95 | +bigpoint_container_packet_set_default_content( | ||
96 | + struct BIGPOINT_PACKET * _this) | ||
97 | +{ | ||
98 | + _this->content[BIGPOINT_PACKET_HEADER] = NULL; | ||
99 | + _this->content[BIGPOINT_PACKET_DATA] = NULL; | ||
100 | +} | ||
101 | + | ||
102 | +// vim: set et ts=4 sw=4: |
bigpoint_packet.h
0 → 100644
1 | +#ifndef __BIGPOINT_PACKET_H__ | ||
2 | +#define __BIGPOINT_PACKET_H__ | ||
3 | + | ||
4 | +#include "bigpoint_cclass.h" | ||
5 | +#include "bigpoint_dyntype.h" | ||
6 | + | ||
7 | + | ||
8 | +enum BIGPOINT_PACKET_CONTENT_KEYS { | ||
9 | + BIGPOINT_PACKET_HEADER = 0, | ||
10 | + BIGPOINT_PACKET_DATA | ||
11 | +}; | ||
12 | + | ||
13 | +struct BIGPOINT_PACKET { | ||
14 | + const struct BIGPOINT_CCLASS * const class; | ||
15 | + struct BIGPOINT_DYNTYPE * content[2]; | ||
16 | +}; | ||
17 | + | ||
18 | +extern const struct BIGPOINT_CCLASS * const BIGPOINT_PACKET; | ||
19 | + | ||
20 | +void * bigpoint_packet_getHeader( | ||
21 | + struct BIGPOINT_PACKET * _this); | ||
22 | + | ||
23 | +void * bigpoint_packet_getData( | ||
24 | + struct BIGPOINT_PACKET * _this); | ||
25 | + | ||
26 | +void bigpoint_packet_setHeader( | ||
27 | + struct BIGPOINT_PACKET * _this, | ||
28 | + struct BIGPOINT_DYNTYPE * header); | ||
29 | + | ||
30 | +void bigpoint_packet_setData( | ||
31 | + struct BIGPOINT_PACKET * _this, | ||
32 | + struct BIGPOINT_DYNTYPE * data); | ||
33 | + | ||
34 | +void bigpoint_packet_set_default_content( | ||
35 | + struct BIGPOINT_PACKET * _this); | ||
36 | + | ||
37 | +#endif//__BIGPOINT_PACKET_H__ | ||
38 | + | ||
39 | +// vim: set et ts=4 sw=4: |
bigpoint_token_cryptdec.c
0 → 100644
1 | +#include "bigpoint_token_cryptdec" | ||
2 | + | ||
3 | +static | ||
4 | +void | ||
5 | +__construct(struct BIGPOINT_TOKEN_CRYPTDEC * _this, va_list * params) | ||
6 | +{ | ||
7 | + _this->containerFactory = va_arg(* params, struct BIGPOINT_CONTANER_FACTORY *); | ||
8 | + _this->crypt = va_arg(* params, struct BIGPOINT_CRYPT *); | ||
9 | +} | ||
10 | + | ||
11 | +// vim: set et ts=4 sw=4: |
bigpoint_token_cryptdec.h
0 → 100644
1 | +#ifndef __BIGPOINT_TOKEN_CRPYTDEC_H__ | ||
2 | +#define __BIGPOINT_TOKEN_CRPYTDEC_H__ | ||
3 | + | ||
4 | +#include "bigpoint_cclass.h" | ||
5 | + | ||
6 | + | ||
7 | +struct BIGPOINT_TOKEN_CRYPTDEC { | ||
8 | + const struct BIGPOINT_CCLASS * const class; | ||
9 | + struct BIGPOINT_CONTAINTER_FACTORY * containerFactory; | ||
10 | + struct BIGPOINT_CRYPT * crypt; | ||
11 | +} | ||
12 | + | ||
13 | +extern const struct BIGPOINT_CCLASS * const BIGPOINT_TOKEN_CRYPTDEC; | ||
14 | + | ||
15 | +#endif//__BIGPOINT_TOKEN_CRPYTDEC_H__ | ||
16 | + | ||
17 | +// vim: set et ts=4 sw=4: |
test.c
0 → 100644
1 | +#include <mcrypt.h> | ||
2 | +#include <string.h> | ||
3 | +#include <stdlib.h> | ||
4 | +#include <stdio.h> | ||
5 | +#include <sys/types.h> | ||
6 | + | ||
7 | +#include "bigpoint_cclass.h" | ||
8 | +#include "bigpoint_crypt.h" | ||
9 | +#include "base64.h" | ||
10 | + | ||
11 | + | ||
12 | +int | ||
13 | +main(int argc, char * argv[]) | ||
14 | +{ | ||
15 | + char b64d[] = "J4rYV+oJ9+EzoyLy/o8aolRSw51DzDhTyeht/tcdUA6hNNxaVFrW/FXVTfWXzkZgW1oc1D2vwkfQ80PD+iWzcw"; | ||
16 | + char pass[] = "1234"; | ||
17 | + char * data = NULL; | ||
18 | + char * decrypted = NULL; | ||
19 | + size_t length = strlen(b64d); | ||
20 | + | ||
21 | + struct BIGPOINT_CRYPT * crypt = NULL; | ||
22 | + | ||
23 | + data = calloc(length, sizeof(char)); | ||
24 | + base64_decode(b64d, length, data, &length); | ||
25 | + | ||
26 | + data = realloc(data, length + 1); | ||
27 | + data[length] = '\0'; | ||
28 | + | ||
29 | + crypt = new(BIGPOINT_CRYPT, MCRYPT_RIJNDAEL_256, MCRYPT_CFB); | ||
30 | + decrypted = bigpoint_crypt_decrypt(crypt, data, pass, &length); | ||
31 | + delete(crypt); | ||
32 | + free(data); | ||
33 | + | ||
34 | + printf("%s\n", decrypted); | ||
35 | + free(decrypted); | ||
36 | + | ||
37 | + return 0; | ||
38 | +} | ||
39 | + | ||
40 | +// vim: set et ts=4 sw=4: |
test2.c
0 → 100644
1 | +#include <mcrypt.h> | ||
2 | +#include <string.h> | ||
3 | +#include <stdlib.h> | ||
4 | +#include <stdio.h> | ||
5 | +#include <sys/types.h> | ||
6 | + | ||
7 | +#include "bigpoint_cclass.h" | ||
8 | +#include "bigpoint_crypt.h" | ||
9 | +#include "base64.h" | ||
10 | + | ||
11 | + | ||
12 | +int | ||
13 | +main(int argc, char * argv[]) | ||
14 | +{ | ||
15 | + char data[] = "ein weiterer test"; | ||
16 | + char pass[] = "1234"; | ||
17 | + char * b64d = NULL; | ||
18 | + char * encrypted = NULL; | ||
19 | + size_t length = strlen(data); | ||
20 | + | ||
21 | + struct BIGPOINT_CRYPT * crypt = NULL; | ||
22 | + | ||
23 | + crypt = new(BIGPOINT_CRYPT, MCRYPT_RIJNDAEL_256, MCRYPT_CFB); | ||
24 | + encrypted = bigpoint_crypt_encrypt(crypt, data, pass, &length); | ||
25 | + delete(crypt); | ||
26 | + | ||
27 | + b64d = calloc(BASE64_LENGTH(length), sizeof(char)); | ||
28 | + base64_encode(encrypted, length, b64d, BASE64_LENGTH(length)); | ||
29 | + free(encrypted); | ||
30 | + | ||
31 | + b64d = realloc(b64d, BASE64_LENGTH(length) + 1); | ||
32 | + b64d[BASE64_LENGTH(length)] = '\0'; | ||
33 | + | ||
34 | + printf("%s\n", b64d); | ||
35 | + free(b64d); | ||
36 | + | ||
37 | + return 0; | ||
38 | +} | ||
39 | + | ||
40 | +// vim: set et ts=4 sw=4: |
test3.c
0 → 100644
1 | +#include <stdio.h> | ||
2 | +#include <string.h> | ||
3 | + | ||
4 | +#include "bigpoint_cclass.h" | ||
5 | +#include "bigpoint_dyntype.h" | ||
6 | + | ||
7 | + | ||
8 | +int | ||
9 | +main(int argc, char * argv[]) | ||
10 | +{ | ||
11 | + char string[] = "ein weiterer test"; | ||
12 | + int integer = 42; | ||
13 | + float floating = 4.3; | ||
14 | + | ||
15 | + char * rstring = NULL; | ||
16 | + long rint = 0; | ||
17 | + double rfloat = 0.0; | ||
18 | + | ||
19 | + struct BIGPOINT_DYNTYPE * dynstring = | ||
20 | + new(BIGPOINT_DYNTYPE, BIGPOINT_DYNTYPE_STRING, strlen(string) + 1, string); | ||
21 | + struct BIGPOINT_DYNTYPE * dynint = | ||
22 | + new(BIGPOINT_DYNTYPE, BIGPOINT_DYNTYPE_INT, sizeof(long), (long)integer); | ||
23 | + struct BIGPOINT_DYNTYPE * dynfloat = | ||
24 | + new(BIGPOINT_DYNTYPE, BIGPOINT_DYNTYPE_FLOAT, sizeof(double), (double)floating); | ||
25 | + | ||
26 | + bigpoint_dyntype_get(dynstring, rstring); | ||
27 | + bigpoint_dyntype_get(dynint, rint); | ||
28 | + bigpoint_dyntype_get(dynfloat, rfloat); | ||
29 | + | ||
30 | + printf("%s\n", rstring); | ||
31 | + printf("%ld\n", rint); | ||
32 | + printf("%lf\n", rfloat); | ||
33 | + | ||
34 | + delete(dynstring); | ||
35 | + delete(dynint); | ||
36 | + delete(dynfloat); | ||
37 | + | ||
38 | + return 0; | ||
39 | +} | ||
40 | + | ||
41 | +// vim: set et ts=4 sw=4: |
Please
register
or
login
to post a comment