commit
05da18964b
16 changed files with 1353 additions and 0 deletions
-
1.gitignore
-
576base64.c
-
77base64.h
-
67bigpoint_cclass.c
-
33bigpoint_cclass.h
-
168bigpoint_crypt.c
-
49bigpoint_crypt.h
-
62bigpoint_dyntype.c
-
30bigpoint_dyntype.h
-
102bigpoint_packet.c
-
39bigpoint_packet.h
-
11bigpoint_token_cryptdec.c
-
17bigpoint_token_cryptdec.h
-
40test.c
-
40test2.c
-
41test3.c
@ -0,0 +1 @@ |
|||||
|
.*.swp |
||||
@ -0,0 +1,576 @@ |
|||||
|
/* -*- buffer-read-only: t -*- vi: set ro: */ |
||||
|
/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ |
||||
|
/* base64.c -- Encode binary data using printable characters. |
||||
|
Copyright (C) 1999, 2000, 2001, 2004, 2005, 2006, 2009, 2010 Free Software |
||||
|
Foundation, Inc. |
||||
|
|
||||
|
This program is free software; you can redistribute it and/or modify |
||||
|
it under the terms of the GNU General Public License as published by |
||||
|
the Free Software Foundation; either version 3, or (at your option) |
||||
|
any later version. |
||||
|
|
||||
|
This program is distributed in the hope that it will be useful, |
||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
GNU General Public License for more details. |
||||
|
|
||||
|
You should have received a copy of the GNU General Public License |
||||
|
along with this program; if not, write to the Free Software Foundation, |
||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ |
||||
|
|
||||
|
/* Written by Simon Josefsson. Partially adapted from GNU MailUtils |
||||
|
* (mailbox/filter_trans.c, as of 2004-11-28). Improved by review |
||||
|
* from Paul Eggert, Bruno Haible, and Stepan Kasal. |
||||
|
* |
||||
|
* See also RFC 3548 <http://www.ietf.org/rfc/rfc3548.txt>. |
||||
|
* |
||||
|
* Be careful with error checking. Here is how you would typically |
||||
|
* use these functions: |
||||
|
* |
||||
|
* bool ok = base64_decode_alloc (in, inlen, &out, &outlen); |
||||
|
* if (!ok) |
||||
|
* FAIL: input was not valid base64 |
||||
|
* if (out == NULL) |
||||
|
* FAIL: memory allocation error |
||||
|
* OK: data in OUT/OUTLEN |
||||
|
* |
||||
|
* size_t outlen = base64_encode_alloc (in, inlen, &out); |
||||
|
* if (out == NULL && outlen == 0 && inlen != 0) |
||||
|
* FAIL: input too long |
||||
|
* if (out == NULL) |
||||
|
* FAIL: memory allocation error |
||||
|
* OK: data in OUT/OUTLEN. |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
/* Get prototype. */ |
||||
|
#include "base64.h" |
||||
|
|
||||
|
/* Get malloc. */ |
||||
|
#include <stdlib.h> |
||||
|
|
||||
|
/* Get UCHAR_MAX. */ |
||||
|
#include <limits.h> |
||||
|
|
||||
|
#include <string.h> |
||||
|
|
||||
|
/* C89 compliant way to cast 'char' to 'unsigned char'. */ |
||||
|
static inline unsigned char |
||||
|
to_uchar (char ch) |
||||
|
{ |
||||
|
return ch; |
||||
|
} |
||||
|
|
||||
|
/* Base64 encode IN array of size INLEN into OUT array of size OUTLEN. |
||||
|
If OUTLEN is less than BASE64_LENGTH(INLEN), write as many bytes as |
||||
|
possible. If OUTLEN is larger than BASE64_LENGTH(INLEN), also zero |
||||
|
terminate the output buffer. */ |
||||
|
void |
||||
|
base64_encode (const char *restrict in, size_t inlen, |
||||
|
char *restrict out, size_t outlen) |
||||
|
{ |
||||
|
static const char b64str[64] = |
||||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
||||
|
|
||||
|
while (inlen && outlen) |
||||
|
{ |
||||
|
*out++ = b64str[(to_uchar (in[0]) >> 2) & 0x3f]; |
||||
|
if (!--outlen) |
||||
|
break; |
||||
|
*out++ = b64str[((to_uchar (in[0]) << 4) |
||||
|
+ (--inlen ? to_uchar (in[1]) >> 4 : 0)) |
||||
|
& 0x3f]; |
||||
|
if (!--outlen) |
||||
|
break; |
||||
|
*out++ = |
||||
|
(inlen |
||||
|
? b64str[((to_uchar (in[1]) << 2) |
||||
|
+ (--inlen ? to_uchar (in[2]) >> 6 : 0)) |
||||
|
& 0x3f] |
||||
|
: '='); |
||||
|
if (!--outlen) |
||||
|
break; |
||||
|
*out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '='; |
||||
|
if (!--outlen) |
||||
|
break; |
||||
|
if (inlen) |
||||
|
inlen--; |
||||
|
if (inlen) |
||||
|
in += 3; |
||||
|
} |
||||
|
|
||||
|
if (outlen) |
||||
|
*out = '\0'; |
||||
|
} |
||||
|
|
||||
|
/* Allocate a buffer and store zero terminated base64 encoded data |
||||
|
from array IN of size INLEN, returning BASE64_LENGTH(INLEN), i.e., |
||||
|
the length of the encoded data, excluding the terminating zero. On |
||||
|
return, the OUT variable will hold a pointer to newly allocated |
||||
|
memory that must be deallocated by the caller. If output string |
||||
|
length would overflow, 0 is returned and OUT is set to NULL. If |
||||
|
memory allocation failed, OUT is set to NULL, and the return value |
||||
|
indicates length of the requested memory block, i.e., |
||||
|
BASE64_LENGTH(inlen) + 1. */ |
||||
|
size_t |
||||
|
base64_encode_alloc (const char *in, size_t inlen, char **out) |
||||
|
{ |
||||
|
size_t outlen = 1 + BASE64_LENGTH (inlen); |
||||
|
|
||||
|
/* Check for overflow in outlen computation. |
||||
|
* |
||||
|
* If there is no overflow, outlen >= inlen. |
||||
|
* |
||||
|
* If the operation (inlen + 2) overflows then it yields at most +1, so |
||||
|
* outlen is 0. |
||||
|
* |
||||
|
* If the multiplication overflows, we lose at least half of the |
||||
|
* correct value, so the result is < ((inlen + 2) / 3) * 2, which is |
||||
|
* less than (inlen + 2) * 0.66667, which is less than inlen as soon as |
||||
|
* (inlen > 4). |
||||
|
*/ |
||||
|
if (inlen > outlen) |
||||
|
{ |
||||
|
*out = NULL; |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
*out = malloc (outlen); |
||||
|
if (!*out) |
||||
|
return outlen; |
||||
|
|
||||
|
base64_encode (in, inlen, *out, outlen); |
||||
|
|
||||
|
return outlen - 1; |
||||
|
} |
||||
|
|
||||
|
/* With this approach this file works independent of the charset used |
||||
|
(think EBCDIC). However, it does assume that the characters in the |
||||
|
Base64 alphabet (A-Za-z0-9+/) are encoded in 0..255. POSIX |
||||
|
1003.1-2001 require that char and unsigned char are 8-bit |
||||
|
quantities, though, taking care of that problem. But this may be a |
||||
|
potential problem on non-POSIX C99 platforms. |
||||
|
|
||||
|
IBM C V6 for AIX mishandles "#define B64(x) ...'x'...", so use "_" |
||||
|
as the formal parameter rather than "x". */ |
||||
|
#define B64(_) \ |
||||
|
((_) == 'A' ? 0 \ |
||||
|
: (_) == 'B' ? 1 \ |
||||
|
: (_) == 'C' ? 2 \ |
||||
|
: (_) == 'D' ? 3 \ |
||||
|
: (_) == 'E' ? 4 \ |
||||
|
: (_) == 'F' ? 5 \ |
||||
|
: (_) == 'G' ? 6 \ |
||||
|
: (_) == 'H' ? 7 \ |
||||
|
: (_) == 'I' ? 8 \ |
||||
|
: (_) == 'J' ? 9 \ |
||||
|
: (_) == 'K' ? 10 \ |
||||
|
: (_) == 'L' ? 11 \ |
||||
|
: (_) == 'M' ? 12 \ |
||||
|
: (_) == 'N' ? 13 \ |
||||
|
: (_) == 'O' ? 14 \ |
||||
|
: (_) == 'P' ? 15 \ |
||||
|
: (_) == 'Q' ? 16 \ |
||||
|
: (_) == 'R' ? 17 \ |
||||
|
: (_) == 'S' ? 18 \ |
||||
|
: (_) == 'T' ? 19 \ |
||||
|
: (_) == 'U' ? 20 \ |
||||
|
: (_) == 'V' ? 21 \ |
||||
|
: (_) == 'W' ? 22 \ |
||||
|
: (_) == 'X' ? 23 \ |
||||
|
: (_) == 'Y' ? 24 \ |
||||
|
: (_) == 'Z' ? 25 \ |
||||
|
: (_) == 'a' ? 26 \ |
||||
|
: (_) == 'b' ? 27 \ |
||||
|
: (_) == 'c' ? 28 \ |
||||
|
: (_) == 'd' ? 29 \ |
||||
|
: (_) == 'e' ? 30 \ |
||||
|
: (_) == 'f' ? 31 \ |
||||
|
: (_) == 'g' ? 32 \ |
||||
|
: (_) == 'h' ? 33 \ |
||||
|
: (_) == 'i' ? 34 \ |
||||
|
: (_) == 'j' ? 35 \ |
||||
|
: (_) == 'k' ? 36 \ |
||||
|
: (_) == 'l' ? 37 \ |
||||
|
: (_) == 'm' ? 38 \ |
||||
|
: (_) == 'n' ? 39 \ |
||||
|
: (_) == 'o' ? 40 \ |
||||
|
: (_) == 'p' ? 41 \ |
||||
|
: (_) == 'q' ? 42 \ |
||||
|
: (_) == 'r' ? 43 \ |
||||
|
: (_) == 's' ? 44 \ |
||||
|
: (_) == 't' ? 45 \ |
||||
|
: (_) == 'u' ? 46 \ |
||||
|
: (_) == 'v' ? 47 \ |
||||
|
: (_) == 'w' ? 48 \ |
||||
|
: (_) == 'x' ? 49 \ |
||||
|
: (_) == 'y' ? 50 \ |
||||
|
: (_) == 'z' ? 51 \ |
||||
|
: (_) == '0' ? 52 \ |
||||
|
: (_) == '1' ? 53 \ |
||||
|
: (_) == '2' ? 54 \ |
||||
|
: (_) == '3' ? 55 \ |
||||
|
: (_) == '4' ? 56 \ |
||||
|
: (_) == '5' ? 57 \ |
||||
|
: (_) == '6' ? 58 \ |
||||
|
: (_) == '7' ? 59 \ |
||||
|
: (_) == '8' ? 60 \ |
||||
|
: (_) == '9' ? 61 \ |
||||
|
: (_) == '+' ? 62 \ |
||||
|
: (_) == '/' ? 63 \ |
||||
|
: -1) |
||||
|
|
||||
|
static const signed char b64[0x100] = { |
||||
|
B64 (0), B64 (1), B64 (2), B64 (3), |
||||
|
B64 (4), B64 (5), B64 (6), B64 (7), |
||||
|
B64 (8), B64 (9), B64 (10), B64 (11), |
||||
|
B64 (12), B64 (13), B64 (14), B64 (15), |
||||
|
B64 (16), B64 (17), B64 (18), B64 (19), |
||||
|
B64 (20), B64 (21), B64 (22), B64 (23), |
||||
|
B64 (24), B64 (25), B64 (26), B64 (27), |
||||
|
B64 (28), B64 (29), B64 (30), B64 (31), |
||||
|
B64 (32), B64 (33), B64 (34), B64 (35), |
||||
|
B64 (36), B64 (37), B64 (38), B64 (39), |
||||
|
B64 (40), B64 (41), B64 (42), B64 (43), |
||||
|
B64 (44), B64 (45), B64 (46), B64 (47), |
||||
|
B64 (48), B64 (49), B64 (50), B64 (51), |
||||
|
B64 (52), B64 (53), B64 (54), B64 (55), |
||||
|
B64 (56), B64 (57), B64 (58), B64 (59), |
||||
|
B64 (60), B64 (61), B64 (62), B64 (63), |
||||
|
B64 (64), B64 (65), B64 (66), B64 (67), |
||||
|
B64 (68), B64 (69), B64 (70), B64 (71), |
||||
|
B64 (72), B64 (73), B64 (74), B64 (75), |
||||
|
B64 (76), B64 (77), B64 (78), B64 (79), |
||||
|
B64 (80), B64 (81), B64 (82), B64 (83), |
||||
|
B64 (84), B64 (85), B64 (86), B64 (87), |
||||
|
B64 (88), B64 (89), B64 (90), B64 (91), |
||||
|
B64 (92), B64 (93), B64 (94), B64 (95), |
||||
|
B64 (96), B64 (97), B64 (98), B64 (99), |
||||
|
B64 (100), B64 (101), B64 (102), B64 (103), |
||||
|
B64 (104), B64 (105), B64 (106), B64 (107), |
||||
|
B64 (108), B64 (109), B64 (110), B64 (111), |
||||
|
B64 (112), B64 (113), B64 (114), B64 (115), |
||||
|
B64 (116), B64 (117), B64 (118), B64 (119), |
||||
|
B64 (120), B64 (121), B64 (122), B64 (123), |
||||
|
B64 (124), B64 (125), B64 (126), B64 (127), |
||||
|
B64 (128), B64 (129), B64 (130), B64 (131), |
||||
|
B64 (132), B64 (133), B64 (134), B64 (135), |
||||
|
B64 (136), B64 (137), B64 (138), B64 (139), |
||||
|
B64 (140), B64 (141), B64 (142), B64 (143), |
||||
|
B64 (144), B64 (145), B64 (146), B64 (147), |
||||
|
B64 (148), B64 (149), B64 (150), B64 (151), |
||||
|
B64 (152), B64 (153), B64 (154), B64 (155), |
||||
|
B64 (156), B64 (157), B64 (158), B64 (159), |
||||
|
B64 (160), B64 (161), B64 (162), B64 (163), |
||||
|
B64 (164), B64 (165), B64 (166), B64 (167), |
||||
|
B64 (168), B64 (169), B64 (170), B64 (171), |
||||
|
B64 (172), B64 (173), B64 (174), B64 (175), |
||||
|
B64 (176), B64 (177), B64 (178), B64 (179), |
||||
|
B64 (180), B64 (181), B64 (182), B64 (183), |
||||
|
B64 (184), B64 (185), B64 (186), B64 (187), |
||||
|
B64 (188), B64 (189), B64 (190), B64 (191), |
||||
|
B64 (192), B64 (193), B64 (194), B64 (195), |
||||
|
B64 (196), B64 (197), B64 (198), B64 (199), |
||||
|
B64 (200), B64 (201), B64 (202), B64 (203), |
||||
|
B64 (204), B64 (205), B64 (206), B64 (207), |
||||
|
B64 (208), B64 (209), B64 (210), B64 (211), |
||||
|
B64 (212), B64 (213), B64 (214), B64 (215), |
||||
|
B64 (216), B64 (217), B64 (218), B64 (219), |
||||
|
B64 (220), B64 (221), B64 (222), B64 (223), |
||||
|
B64 (224), B64 (225), B64 (226), B64 (227), |
||||
|
B64 (228), B64 (229), B64 (230), B64 (231), |
||||
|
B64 (232), B64 (233), B64 (234), B64 (235), |
||||
|
B64 (236), B64 (237), B64 (238), B64 (239), |
||||
|
B64 (240), B64 (241), B64 (242), B64 (243), |
||||
|
B64 (244), B64 (245), B64 (246), B64 (247), |
||||
|
B64 (248), B64 (249), B64 (250), B64 (251), |
||||
|
B64 (252), B64 (253), B64 (254), B64 (255) |
||||
|
}; |
||||
|
|
||||
|
#if UCHAR_MAX == 255 |
||||
|
# define uchar_in_range(c) true |
||||
|
#else |
||||
|
# define uchar_in_range(c) ((c) <= 255) |
||||
|
#endif |
||||
|
|
||||
|
/* Return true if CH is a character from the Base64 alphabet, and |
||||
|
false otherwise. Note that '=' is padding and not considered to be |
||||
|
part of the alphabet. */ |
||||
|
bool |
||||
|
isbase64 (char ch) |
||||
|
{ |
||||
|
return uchar_in_range (to_uchar (ch)) && 0 <= b64[to_uchar (ch)]; |
||||
|
} |
||||
|
|
||||
|
/* Initialize decode-context buffer, CTX. */ |
||||
|
void |
||||
|
base64_decode_ctx_init (struct base64_decode_context *ctx) |
||||
|
{ |
||||
|
ctx->i = 0; |
||||
|
} |
||||
|
|
||||
|
/* If CTX->i is 0 or 4, there are four or more bytes in [*IN..IN_END), and |
||||
|
none of those four is a newline, then return *IN. Otherwise, copy up to |
||||
|
4 - CTX->i non-newline bytes from that range into CTX->buf, starting at |
||||
|
index CTX->i and setting CTX->i to reflect the number of bytes copied, |
||||
|
and return CTX->buf. In either case, advance *IN to point to the byte |
||||
|
after the last one processed, and set *N_NON_NEWLINE to the number of |
||||
|
verified non-newline bytes accessible through the returned pointer. */ |
||||
|
static inline char * |
||||
|
get_4 (struct base64_decode_context *ctx, |
||||
|
char const *restrict *in, char const *restrict in_end, |
||||
|
size_t *n_non_newline) |
||||
|
{ |
||||
|
if (ctx->i == 4) |
||||
|
ctx->i = 0; |
||||
|
|
||||
|
if (ctx->i == 0) |
||||
|
{ |
||||
|
char const *t = *in; |
||||
|
if (4 <= in_end - *in && memchr (t, '\n', 4) == NULL) |
||||
|
{ |
||||
|
/* This is the common case: no newline. */ |
||||
|
*in += 4; |
||||
|
*n_non_newline = 4; |
||||
|
return (char *) t; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
{ |
||||
|
/* Copy non-newline bytes into BUF. */ |
||||
|
char const *p = *in; |
||||
|
while (p < in_end) |
||||
|
{ |
||||
|
char c = *p++; |
||||
|
if (c != '\n') |
||||
|
{ |
||||
|
ctx->buf[ctx->i++] = c; |
||||
|
if (ctx->i == 4) |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
*in = p; |
||||
|
*n_non_newline = ctx->i; |
||||
|
return ctx->buf; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
#define return_false \ |
||||
|
do \ |
||||
|
{ \ |
||||
|
*outp = out; \ |
||||
|
return false; \ |
||||
|
} \ |
||||
|
while (false) |
||||
|
|
||||
|
/* Decode up to four bytes of base64-encoded data, IN, of length INLEN |
||||
|
into the output buffer, *OUT, of size *OUTLEN bytes. Return true if |
||||
|
decoding is successful, false otherwise. If *OUTLEN is too small, |
||||
|
as many bytes as possible are written to *OUT. On return, advance |
||||
|
*OUT to point to the byte after the last one written, and decrement |
||||
|
*OUTLEN to reflect the number of bytes remaining in *OUT. */ |
||||
|
static inline bool |
||||
|
decode_4 (char const *restrict in, size_t inlen, |
||||
|
char *restrict *outp, size_t *outleft) |
||||
|
{ |
||||
|
char *out = *outp; |
||||
|
if (inlen < 2) |
||||
|
return false; |
||||
|
|
||||
|
if (!isbase64 (in[0]) || !isbase64 (in[1])) |
||||
|
return false; |
||||
|
|
||||
|
if (*outleft) |
||||
|
{ |
||||
|
*out++ = ((b64[to_uchar (in[0])] << 2) |
||||
|
| (b64[to_uchar (in[1])] >> 4)); |
||||
|
--*outleft; |
||||
|
} |
||||
|
|
||||
|
if (inlen == 2) |
||||
|
return_false; |
||||
|
|
||||
|
if (in[2] == '=') |
||||
|
{ |
||||
|
if (inlen != 4) |
||||
|
return_false; |
||||
|
|
||||
|
if (in[3] != '=') |
||||
|
return_false; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
if (!isbase64 (in[2])) |
||||
|
return_false; |
||||
|
|
||||
|
if (*outleft) |
||||
|
{ |
||||
|
*out++ = (((b64[to_uchar (in[1])] << 4) & 0xf0) |
||||
|
| (b64[to_uchar (in[2])] >> 2)); |
||||
|
--*outleft; |
||||
|
} |
||||
|
|
||||
|
if (inlen == 3) |
||||
|
return_false; |
||||
|
|
||||
|
if (in[3] == '=') |
||||
|
{ |
||||
|
if (inlen != 4) |
||||
|
return_false; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
if (!isbase64 (in[3])) |
||||
|
return_false; |
||||
|
|
||||
|
if (*outleft) |
||||
|
{ |
||||
|
*out++ = (((b64[to_uchar (in[2])] << 6) & 0xc0) |
||||
|
| b64[to_uchar (in[3])]); |
||||
|
--*outleft; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
*outp = out; |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
/* Decode base64-encoded input array IN of length INLEN to output array |
||||
|
OUT that can hold *OUTLEN bytes. The input data may be interspersed |
||||
|
with newlines. Return true if decoding was successful, i.e. if the |
||||
|
input was valid base64 data, false otherwise. If *OUTLEN is too |
||||
|
small, as many bytes as possible will be written to OUT. On return, |
||||
|
*OUTLEN holds the length of decoded bytes in OUT. Note that as soon |
||||
|
as any non-alphabet, non-newline character is encountered, decoding |
||||
|
is stopped and false is returned. If INLEN is zero, then process |
||||
|
only whatever data is stored in CTX. |
||||
|
|
||||
|
Initially, CTX must have been initialized via base64_decode_ctx_init. |
||||
|
Subsequent calls to this function must reuse whatever state is recorded |
||||
|
in that buffer. It is necessary for when a quadruple of base64 input |
||||
|
bytes spans two input buffers. |
||||
|
|
||||
|
If CTX is NULL then newlines are treated as garbage and the input |
||||
|
buffer is processed as a unit. */ |
||||
|
|
||||
|
bool |
||||
|
base64_decode_ctx (struct base64_decode_context *ctx, |
||||
|
const char *restrict in, size_t inlen, |
||||
|
char *restrict out, size_t *outlen) |
||||
|
{ |
||||
|
size_t outleft = *outlen; |
||||
|
bool ignore_newlines = ctx != NULL; |
||||
|
bool flush_ctx = false; |
||||
|
unsigned int ctx_i = 0; |
||||
|
|
||||
|
if (ignore_newlines) |
||||
|
{ |
||||
|
ctx_i = ctx->i; |
||||
|
flush_ctx = inlen == 0; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
while (true) |
||||
|
{ |
||||
|
size_t outleft_save = outleft; |
||||
|
if (ctx_i == 0 && !flush_ctx) |
||||
|
{ |
||||
|
while (true) |
||||
|
{ |
||||
|
/* Save a copy of outleft, in case we need to re-parse this |
||||
|
block of four bytes. */ |
||||
|
outleft_save = outleft; |
||||
|
if (!decode_4 (in, inlen, &out, &outleft)) |
||||
|
break; |
||||
|
|
||||
|
in += 4; |
||||
|
inlen -= 4; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (inlen == 0 && !flush_ctx) |
||||
|
break; |
||||
|
|
||||
|
/* Handle the common case of 72-byte wrapped lines. |
||||
|
This also handles any other multiple-of-4-byte wrapping. */ |
||||
|
if (inlen && *in == '\n' && ignore_newlines) |
||||
|
{ |
||||
|
++in; |
||||
|
--inlen; |
||||
|
continue; |
||||
|
} |
||||
|
|
||||
|
/* Restore OUT and OUTLEFT. */ |
||||
|
out -= outleft_save - outleft; |
||||
|
outleft = outleft_save; |
||||
|
|
||||
|
{ |
||||
|
char const *in_end = in + inlen; |
||||
|
char const *non_nl; |
||||
|
|
||||
|
if (ignore_newlines) |
||||
|
non_nl = get_4 (ctx, &in, in_end, &inlen); |
||||
|
else |
||||
|
non_nl = in; /* Might have nl in this case. */ |
||||
|
|
||||
|
/* If the input is empty or consists solely of newlines (0 non-newlines), |
||||
|
then we're done. Likewise if there are fewer than 4 bytes when not |
||||
|
flushing context and not treating newlines as garbage. */ |
||||
|
if (inlen == 0 || (inlen < 4 && !flush_ctx && ignore_newlines)) |
||||
|
{ |
||||
|
inlen = 0; |
||||
|
break; |
||||
|
} |
||||
|
if (!decode_4 (non_nl, inlen, &out, &outleft)) |
||||
|
break; |
||||
|
|
||||
|
inlen = in_end - in; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
*outlen -= outleft; |
||||
|
|
||||
|
return inlen == 0; |
||||
|
} |
||||
|
|
||||
|
/* Allocate an output buffer in *OUT, and decode the base64 encoded |
||||
|
data stored in IN of size INLEN to the *OUT buffer. On return, the |
||||
|
size of the decoded data is stored in *OUTLEN. OUTLEN may be NULL, |
||||
|
if the caller is not interested in the decoded length. *OUT may be |
||||
|
NULL to indicate an out of memory error, in which case *OUTLEN |
||||
|
contains the size of the memory block needed. The function returns |
||||
|
true on successful decoding and memory allocation errors. (Use the |
||||
|
*OUT and *OUTLEN parameters to differentiate between successful |
||||
|
decoding and memory error.) The function returns false if the |
||||
|
input was invalid, in which case *OUT is NULL and *OUTLEN is |
||||
|
undefined. */ |
||||
|
bool |
||||
|
base64_decode_alloc_ctx (struct base64_decode_context *ctx, |
||||
|
const char *in, size_t inlen, char **out, |
||||
|
size_t *outlen) |
||||
|
{ |
||||
|
/* This may allocate a few bytes too many, depending on input, |
||||
|
but it's not worth the extra CPU time to compute the exact size. |
||||
|
The exact size is 3 * inlen / 4, minus 1 if the input ends |
||||
|
with "=" and minus another 1 if the input ends with "==". |
||||
|
Dividing before multiplying avoids the possibility of overflow. */ |
||||
|
size_t needlen = 3 * (inlen / 4) + 2; |
||||
|
|
||||
|
*out = malloc (needlen); |
||||
|
if (!*out) |
||||
|
return true; |
||||
|
|
||||
|
if (!base64_decode_ctx (ctx, in, inlen, *out, &needlen)) |
||||
|
{ |
||||
|
free (*out); |
||||
|
*out = NULL; |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
if (outlen) |
||||
|
*outlen = needlen; |
||||
|
|
||||
|
return true; |
||||
|
} |
||||
@ -0,0 +1,77 @@ |
|||||
|
/* -*- buffer-read-only: t -*- vi: set ro: */ |
||||
|
/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ |
||||
|
/* base64.h -- Encode binary data using printable characters. |
||||
|
Copyright (C) 2004, 2005, 2006, 2009, 2010 Free Software Foundation, Inc. |
||||
|
Written by Simon Josefsson. |
||||
|
|
||||
|
This program is free software; you can redistribute it and/or modify |
||||
|
it under the terms of the GNU General Public License as published by |
||||
|
the Free Software Foundation; either version 3, or (at your option) |
||||
|
any later version. |
||||
|
|
||||
|
This program is distributed in the hope that it will be useful, |
||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
GNU General Public License for more details. |
||||
|
|
||||
|
You should have received a copy of the GNU General Public License |
||||
|
along with this program; if not, write to the Free Software Foundation, |
||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ |
||||
|
|
||||
|
/* Define to the equivalent of the C99 'restrict' keyword, or to |
||||
|
* nothing if this is not supported. Do not define if restrict is |
||||
|
* supported directly. */ |
||||
|
#define restrict __restrict |
||||
|
/* Work around a bug in Sun C++: it does not support _Restrict or |
||||
|
* __restrict__, even though the corresponding Sun C compiler ends up with |
||||
|
* "#define restrict _Restrict" or "#define restrict __restrict__" in the |
||||
|
* previous line. Perhaps some future version of Sun C++ will work with |
||||
|
* restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ |
||||
|
#if defined __SUNPRO_CC && !defined __RESTRICT |
||||
|
# define _Restrict |
||||
|
# define __restrict__ |
||||
|
#endif |
||||
|
|
||||
|
#ifndef BASE64_H |
||||
|
# define BASE64_H |
||||
|
|
||||
|
/* Get size_t. */ |
||||
|
# include <stddef.h> |
||||
|
|
||||
|
/* Get bool. */ |
||||
|
# include <stdbool.h> |
||||
|
|
||||
|
/* This uses that the expression (n+(k-1))/k means the smallest |
||||
|
integer >= n/k, i.e., the ceiling of n/k. */ |
||||
|
# define BASE64_LENGTH(inlen) ((((inlen) + 2) / 3) * 4) |
||||
|
|
||||
|
struct base64_decode_context |
||||
|
{ |
||||
|
unsigned int i; |
||||
|
char buf[4]; |
||||
|
}; |
||||
|
|
||||
|
extern bool isbase64 (char ch); |
||||
|
|
||||
|
extern void base64_encode (const char *restrict in, size_t inlen, |
||||
|
char *restrict out, size_t outlen); |
||||
|
|
||||
|
extern size_t base64_encode_alloc (const char *in, size_t inlen, char **out); |
||||
|
|
||||
|
extern void base64_decode_ctx_init (struct base64_decode_context *ctx); |
||||
|
|
||||
|
extern bool base64_decode_ctx (struct base64_decode_context *ctx, |
||||
|
const char *restrict in, size_t inlen, |
||||
|
char *restrict out, size_t *outlen); |
||||
|
|
||||
|
extern bool base64_decode_alloc_ctx (struct base64_decode_context *ctx, |
||||
|
const char *in, size_t inlen, |
||||
|
char **out, size_t *outlen); |
||||
|
|
||||
|
#define base64_decode(in, inlen, out, outlen) \ |
||||
|
base64_decode_ctx (NULL, in, inlen, out, outlen) |
||||
|
|
||||
|
#define base64_decode_alloc(in, inlen, out, outlen) \ |
||||
|
base64_decode_alloc_ctx (NULL, in, inlen, out, outlen) |
||||
|
|
||||
|
#endif /* BASE64_H */ |
||||
@ -0,0 +1,67 @@ |
|||||
|
#include "bigpoint_cclass.h" |
||||
|
|
||||
|
#include <stdarg.h> |
||||
|
#include <string.h> |
||||
|
#include <stdlib.h> |
||||
|
#include <json/json.h> |
||||
|
|
||||
|
|
||||
|
void * |
||||
|
new(const void * _class, ...) |
||||
|
{ |
||||
|
const struct BIGPOINT_CCLASS * class = _class; |
||||
|
void * object = calloc(1, class->size); |
||||
|
|
||||
|
* (const struct BIGPOINT_CCLASS **) object = class; |
||||
|
|
||||
|
if (class->__construct) { |
||||
|
va_list params; |
||||
|
|
||||
|
va_start(params, _class); |
||||
|
class->__construct(object, ¶ms); |
||||
|
va_end(params); |
||||
|
} |
||||
|
|
||||
|
return object; |
||||
|
} |
||||
|
|
||||
|
void * |
||||
|
newFromJson(const void * _class, struct json_object * json) |
||||
|
{ |
||||
|
const struct BIGPOINT_CCLASS * class = _class; |
||||
|
void * object = calloc(1, class->size); |
||||
|
|
||||
|
* (const struct BIGPOINT_CCLASS **) object = class; |
||||
|
|
||||
|
if (class->__jsonConst && json) { |
||||
|
class->__jsonConst(object, json); |
||||
|
} |
||||
|
|
||||
|
return object; |
||||
|
} |
||||
|
|
||||
|
void |
||||
|
delete(void * _object) |
||||
|
{ |
||||
|
const struct BIGPOINT_CCLASS ** class = _object; |
||||
|
|
||||
|
if (_object && *class && (*class)->__destruct) { |
||||
|
(*class)->__destruct(_object); |
||||
|
} |
||||
|
|
||||
|
free(_object); |
||||
|
} |
||||
|
|
||||
|
struct json_object * |
||||
|
toJson(void * _object) |
||||
|
{ |
||||
|
const struct BIGPOINT_CCLASS ** class = _object; |
||||
|
|
||||
|
if (_object && *class && (*class)->__toJson) { |
||||
|
return (*class)->__toJson(_object); |
||||
|
} |
||||
|
|
||||
|
return NULL; |
||||
|
} |
||||
|
|
||||
|
// vim: set et ts=4 sw=4: |
||||
@ -0,0 +1,33 @@ |
|||||
|
#ifndef __BIGPOINT_CCLASS_H__ |
||||
|
#define __BIGPOINT_CCLASS_H__ |
||||
|
|
||||
|
#include <stdarg.h> |
||||
|
#include <sys/types.h> |
||||
|
#include <json/json.h> |
||||
|
|
||||
|
typedef void (* ctor)(void*, va_list*); |
||||
|
typedef void (* dtor)(void*); |
||||
|
|
||||
|
struct BIGPOINT_CCLASS { |
||||
|
size_t size; |
||||
|
void (* __construct)(void * _this, va_list * params); |
||||
|
void (* __jsonConst)(void * _this, struct json_object * json); |
||||
|
void (* __destruct)(void * _this); |
||||
|
struct json_object * (* __toJson)(void * _this); |
||||
|
}; |
||||
|
|
||||
|
void * |
||||
|
new(const void * _class, ...); |
||||
|
|
||||
|
void * |
||||
|
newFromJson(const void * _class, struct json_object * json); |
||||
|
|
||||
|
void |
||||
|
delete(void * _object); |
||||
|
|
||||
|
struct json_object * |
||||
|
toJson(void * _object); |
||||
|
|
||||
|
#endif//__BIGPOINT_CCLASS_H__ |
||||
|
|
||||
|
// vim: set et ts=4 sw=4: |
||||
@ -0,0 +1,168 @@ |
|||||
|
#include <stdarg.h> |
||||
|
#include <stdlib.h> |
||||
|
#include <fcntl.h> |
||||
|
#include <string.h> |
||||
|
#include <sys/types.h> |
||||
|
#include <sys/stat.h> |
||||
|
#include <mcrypt.h> |
||||
|
#include <mhash.h> |
||||
|
|
||||
|
#include "bigpoint_crypt.h" |
||||
|
|
||||
|
|
||||
|
static |
||||
|
void |
||||
|
__construct(struct BIGPOINT_CRYPT * _this, va_list * params) |
||||
|
{ |
||||
|
_this->algorithm = va_arg(* params, const char * const); |
||||
|
_this->mode = va_arg(* params, const char * const); |
||||
|
|
||||
|
_this->mcrypt = mcrypt_module_open( |
||||
|
(char *)_this->algorithm, |
||||
|
NULL, |
||||
|
(char *)_this->mode, |
||||
|
NULL); |
||||
|
|
||||
|
_this->ivsize = mcrypt_enc_get_iv_size(_this->mcrypt); |
||||
|
_this->keysize = mcrypt_enc_get_key_size(_this->mcrypt); |
||||
|
} |
||||
|
|
||||
|
static |
||||
|
void |
||||
|
__destruct(struct BIGPOINT_CRYPT * _this) |
||||
|
{ |
||||
|
if (_this->iv) { |
||||
|
free(_this->iv); |
||||
|
} |
||||
|
|
||||
|
mcrypt_module_close(_this->mcrypt); |
||||
|
} |
||||
|
|
||||
|
static const |
||||
|
struct BIGPOINT_CCLASS _bigpoint_crypt = { |
||||
|
sizeof(struct BIGPOINT_CRYPT), |
||||
|
(ctor)__construct, |
||||
|
NULL, |
||||
|
(dtor)__destruct, |
||||
|
NULL |
||||
|
}; |
||||
|
|
||||
|
const struct BIGPOINT_CCLASS * const BIGPOINT_CRYPT = &_bigpoint_crypt; |
||||
|
|
||||
|
static |
||||
|
void |
||||
|
mcrypt_close(MCRYPT * mcrypt) |
||||
|
{ |
||||
|
mcrypt_free(*mcrypt); |
||||
|
*mcrypt = NULL; |
||||
|
} |
||||
|
|
||||
|
void * |
||||
|
bigpoint_crypt_createIv(struct BIGPOINT_CRYPT * _this) |
||||
|
{ |
||||
|
int urandom; |
||||
|
size_t rsize = 0; |
||||
|
void * iv = NULL; |
||||
|
|
||||
|
iv = calloc(_this->ivsize, sizeof(char)); |
||||
|
|
||||
|
urandom = open("/dev/urandom", O_RDONLY); |
||||
|
rsize = read(urandom, iv, _this->ivsize); |
||||
|
|
||||
|
if (_this->ivsize != rsize) { |
||||
|
free(iv); |
||||
|
iv = NULL; |
||||
|
} |
||||
|
|
||||
|
return iv; |
||||
|
} |
||||
|
|
||||
|
static |
||||
|
void * |
||||
|
createKey(struct BIGPOINT_CRYPT * _this, const char * const password) |
||||
|
{ |
||||
|
void * key = NULL; |
||||
|
|
||||
|
key = calloc(_this->keysize, sizeof(char)); |
||||
|
|
||||
|
mhash_keygen( |
||||
|
KEYGEN_MCRYPT, |
||||
|
MHASH_SHA256, |
||||
|
mhash_keygen_count(), |
||||
|
key, |
||||
|
_this->keysize, |
||||
|
NULL, |
||||
|
0, |
||||
|
(char *)password, // @TODO: bad karma...now this might change password. |
||||
|
strlen(password)); |
||||
|
|
||||
|
return key; |
||||
|
} |
||||
|
|
||||
|
void * |
||||
|
bigpoint_crypt_encrypt( |
||||
|
struct BIGPOINT_CRYPT * _this, |
||||
|
const void * const data, |
||||
|
const char * const password, |
||||
|
size_t * length) |
||||
|
{ |
||||
|
char * encrypted; |
||||
|
void * iv; |
||||
|
void * key; |
||||
|
|
||||
|
key = createKey(_this, password); |
||||
|
if(_this->iv) { |
||||
|
iv = _this->iv; |
||||
|
} else { |
||||
|
iv = bigpoint_crypt_createIv(_this); |
||||
|
} |
||||
|
|
||||
|
mcrypt_generic_init(_this->mcrypt, key, _this->keysize, iv); |
||||
|
|
||||
|
encrypted = calloc(_this->ivsize + *length, sizeof(char)); |
||||
|
memcpy(encrypted, iv, _this->ivsize); |
||||
|
memcpy(encrypted + _this->ivsize, data, *length); |
||||
|
|
||||
|
mcrypt_generic(_this->mcrypt, encrypted + _this->ivsize, *length); |
||||
|
mcrypt_generic_deinit(_this->mcrypt); |
||||
|
*length += _this->ivsize; |
||||
|
|
||||
|
free(key); |
||||
|
if (_this->iv != iv) { |
||||
|
free(iv); |
||||
|
} |
||||
|
|
||||
|
return encrypted; |
||||
|
} |
||||
|
|
||||
|
void * |
||||
|
bigpoint_crypt_decrypt( |
||||
|
struct BIGPOINT_CRYPT * _this, |
||||
|
const void * const data, |
||||
|
const char * const password, |
||||
|
size_t * length) |
||||
|
{ |
||||
|
char * decrypted; |
||||
|
void * iv; |
||||
|
void * key; |
||||
|
|
||||
|
key = createKey(_this, password); |
||||
|
iv = calloc(_this->ivsize, sizeof(char)); |
||||
|
memcpy(iv, data, _this->ivsize); |
||||
|
|
||||
|
mcrypt_generic_init(_this->mcrypt, key, _this->keysize, iv); |
||||
|
|
||||
|
*length -= _this->ivsize; |
||||
|
decrypted = calloc(*length, sizeof(char)); |
||||
|
memcpy(decrypted, data + _this->ivsize, *length); |
||||
|
|
||||
|
mdecrypt_generic(_this->mcrypt, decrypted, *length); |
||||
|
mcrypt_generic_deinit(_this->mcrypt); |
||||
|
|
||||
|
free(key); |
||||
|
free(iv); |
||||
|
|
||||
|
return decrypted; |
||||
|
} |
||||
|
|
||||
|
// vim: set et ts=4 sw=4: |
||||
@ -0,0 +1,49 @@ |
|||||
|
#ifndef __BIGPOINT_CRYPT_H__ |
||||
|
#define __BIGPOINT_CRYPT_H__ |
||||
|
|
||||
|
#include <sys/types.h> |
||||
|
|
||||
|
#include "bigpoint_cclass.h" |
||||
|
|
||||
|
|
||||
|
struct BIGPOINT_CRYPT { |
||||
|
const struct BIGPOINT_CCLASS * const class; |
||||
|
const char * algorithm; |
||||
|
const char * mode; |
||||
|
MCRYPT mcrypt; |
||||
|
size_t ivsize; |
||||
|
size_t keysize; |
||||
|
void * iv; |
||||
|
}; |
||||
|
|
||||
|
extern const struct BIGPOINT_CCLASS * const BIGPOINT_CRYPT; |
||||
|
|
||||
|
void * bigpoint_crypt_encrypt( |
||||
|
struct BIGPOINT_CRYPT * _this, |
||||
|
const void * const data, |
||||
|
const char * const password, |
||||
|
size_t * length); |
||||
|
|
||||
|
void * bigpoint_crypt_decrypt( |
||||
|
struct BIGPOINT_CRYPT * _this, |
||||
|
const void * const data, |
||||
|
const char * const password, |
||||
|
size_t * length); |
||||
|
|
||||
|
void * bigpoint_crypt_createIv( |
||||
|
struct BIGPOINT_CRYPT * _this); |
||||
|
|
||||
|
void bigpoint_crypt_setIv( |
||||
|
struct BIGPOINT_CRYPT * _this, |
||||
|
const void * const iv); |
||||
|
|
||||
|
void bigpoint_crypt_setIvsize( |
||||
|
struct BIGPOINT_CRYPT * _this, |
||||
|
const size_t size); |
||||
|
|
||||
|
void bigpoint_crypt_setKeysize( |
||||
|
struct BIGPOINT_CRYPT * _this, |
||||
|
const size_t size); |
||||
|
|
||||
|
#endif//__BIGPOINT_CRYPT_H__ |
||||
|
// vim: set et ts=4 sw=4: |
||||
@ -0,0 +1,62 @@ |
|||||
|
#include <stdlib.h> |
||||
|
#include <string.h> |
||||
|
#include <sys/types.h> |
||||
|
#include <json/json.h> |
||||
|
|
||||
|
#include "bigpoint_dyntype.h" |
||||
|
|
||||
|
|
||||
|
static |
||||
|
void |
||||
|
__construct(struct BIGPOINT_DYNTYPE * _this, va_list * params) |
||||
|
{ |
||||
|
_this->type = va_arg(* params, enum BIGPOINT_DYNTYPE_TYPES); |
||||
|
_this->size = va_arg(* params, size_t); |
||||
|
|
||||
|
_this->data = calloc(_this->size, sizeof(char)); |
||||
|
memcpy(_this->data, va_arg(* params, void *), _this->size); |
||||
|
} |
||||
|
|
||||
|
static |
||||
|
void |
||||
|
__destruct(struct BIGPOINT_DYNTYPE * _this) |
||||
|
{ |
||||
|
if (_this && _this->data) { |
||||
|
free(_this->data); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
static |
||||
|
struct json_object * |
||||
|
__toJson(struct BIGPOINT_DYNTYPE * _this) |
||||
|
{ |
||||
|
struct json_object * json = NULL; |
||||
|
|
||||
|
/** |
||||
|
* @TODO: make a smart implementation here base on the type of the |
||||
|
* actual object. |
||||
|
*/ |
||||
|
return json; |
||||
|
} |
||||
|
|
||||
|
static |
||||
|
void |
||||
|
__jsonConst(struct BIGPOINT_DYNTYPE * _this, struct json_object * json) |
||||
|
{ |
||||
|
/** |
||||
|
* @TODO: initialize by json.... |
||||
|
*/ |
||||
|
} |
||||
|
|
||||
|
static const |
||||
|
struct BIGPOINT_CCLASS _bigpoint_dyntype = { |
||||
|
sizeof(struct BIGPOINT_DYNTYPE), |
||||
|
(ctor)__construct, |
||||
|
__jsonConst, |
||||
|
(dtor)__destruct, |
||||
|
__toJson |
||||
|
}; |
||||
|
|
||||
|
const struct BIGPOINT_CCLASS * const BIGPOINT_DYNTYPE = &_bigpoint_dyntype; |
||||
|
|
||||
|
// vim: set et ts=4 sw=4: |
||||
@ -0,0 +1,30 @@ |
|||||
|
#ifndef __BIGPOINT_DYNTYPE_H__ |
||||
|
#define __BIGPOINT_DYNTYPE_H__ |
||||
|
|
||||
|
#include <sys/types.h> |
||||
|
|
||||
|
#include "bigpoint_cclass.h" |
||||
|
|
||||
|
|
||||
|
enum BIGPOINT_DYNTYPE_TYPES { |
||||
|
BIGPOINT_DYNTYPE_BOOLEAN = 0, |
||||
|
BIGPOINT_DYNTYPE_INT, |
||||
|
BIGPOINT_DYNTYPE_FLOAT, |
||||
|
BIGPOINT_DYNTYPE_STRING, |
||||
|
BIGPOINT_DYNTYPE_ARRAY, |
||||
|
BIGPOINT_DYNTYPE_OBJECT |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
struct BIGPOINT_DYNTYPE { |
||||
|
const struct BIGPOINT_CCLASS * const class; |
||||
|
enum BIGPOINT_DYNTYPE_TYPES type; |
||||
|
size_t size; |
||||
|
void * data; |
||||
|
}; |
||||
|
|
||||
|
extern const struct BIGPOINT_CCLASS * const BIGPOINT_DYNTYPE; |
||||
|
|
||||
|
#endif//__BIGPOINT_DYNTYPE_H__ |
||||
|
|
||||
|
// vim: set et ts=4 sw=4: |
||||
@ -0,0 +1,102 @@ |
|||||
|
#include <json/json.h> |
||||
|
|
||||
|
#include "bigpoint_container_packet.h" |
||||
|
|
||||
|
|
||||
|
static |
||||
|
void |
||||
|
__construct(struct BIGPOINT_PACKET * _this, va_list * params) |
||||
|
{ |
||||
|
bigpoint_container_packet_set_default_content(_this); |
||||
|
} |
||||
|
|
||||
|
static |
||||
|
void |
||||
|
__jsonConst(struct BIGPOINT_PACKET * _this, struct json_object * json) |
||||
|
{ |
||||
|
struct json_object * header = NULL; |
||||
|
struct json_object * data = NULL; |
||||
|
|
||||
|
if (! json_type_array == json_object_get_type(json)) { |
||||
|
bigpoint_packet_set_default_content(_this); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
header = json_object_array_get_idx(json, 0); |
||||
|
data = json_object_array_get_idx(json, 1); |
||||
|
|
||||
|
if (! (header && data)) { |
||||
|
bigpoint_packet_set_default_content(_this); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
bigpoint_packet_setHeader(_this, newFromJson(BIGPOINT_DYNTYPE, header)); |
||||
|
bigpoint_packet_setData(_this, newFromJson(BIGPOINT_DYNTYPE, data)); |
||||
|
} |
||||
|
|
||||
|
static |
||||
|
void |
||||
|
__destruct(struct BIGPOINT_PACKET * _this) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
static |
||||
|
struct json_object * |
||||
|
__toJson(struct BIGPOINT_PACKET * _this) |
||||
|
{ |
||||
|
struct json_object * json = json_object_new_array(); |
||||
|
|
||||
|
json_object_array_add(json, toJson(bigpoint_packet_getHeader(_this))); |
||||
|
json_object_array_add(json, toJson(bigpoint_packet_getData(_this))); |
||||
|
|
||||
|
return json; |
||||
|
} |
||||
|
|
||||
|
static const |
||||
|
struct BIGPOINT_CLASS _bigpoint_packet = { |
||||
|
sizeof(struct BIGPOINT_PACKET), |
||||
|
(ctor)__construct, |
||||
|
__jsonConst, |
||||
|
(dtor)__destruct, |
||||
|
__toJson |
||||
|
}; |
||||
|
|
||||
|
const struct BIGPOINT_CCLASS * const BIGPOINT_PACKET = &_bigpoint_packet; |
||||
|
|
||||
|
void * |
||||
|
bigpoint_packet_getHeader( |
||||
|
struct BIGPOINT_PACKET * _this) |
||||
|
{ |
||||
|
return _this->content[BIGPOINT_PACKET_HEADER]; |
||||
|
} |
||||
|
|
||||
|
void * |
||||
|
bigpoint_packet_getData( |
||||
|
struct BIGPOINT_PACKET * _this) |
||||
|
{ |
||||
|
return _this->content[BIGPOINT_PACKET_DATA]; |
||||
|
} |
||||
|
|
||||
|
void bigpoint_packet_setHeader( |
||||
|
struct BIGPOINT_PACKET * _this, |
||||
|
struct BIGPOINT_DYNTYPE * header) |
||||
|
{ |
||||
|
_this->content[BIGPOINT_PACKET_HEADER] = header; |
||||
|
} |
||||
|
|
||||
|
void bigpoint_packet_setData( |
||||
|
struct BIGPOINT_PACKET * _this, |
||||
|
struct BIGPOINT_DYNTYPE * data) |
||||
|
{ |
||||
|
_this->content[BIGPOINT_PACKET_DATA] = data; |
||||
|
} |
||||
|
|
||||
|
void |
||||
|
bigpoint_container_packet_set_default_content( |
||||
|
struct BIGPOINT_PACKET * _this) |
||||
|
{ |
||||
|
_this->content[BIGPOINT_PACKET_HEADER] = NULL; |
||||
|
_this->content[BIGPOINT_PACKET_DATA] = NULL; |
||||
|
} |
||||
|
|
||||
|
// vim: set et ts=4 sw=4: |
||||
@ -0,0 +1,39 @@ |
|||||
|
#ifndef __BIGPOINT_PACKET_H__ |
||||
|
#define __BIGPOINT_PACKET_H__ |
||||
|
|
||||
|
#include "bigpoint_cclass.h" |
||||
|
#include "bigpoint_dyntype.h" |
||||
|
|
||||
|
|
||||
|
enum BIGPOINT_PACKET_CONTENT_KEYS { |
||||
|
BIGPOINT_PACKET_HEADER = 0, |
||||
|
BIGPOINT_PACKET_DATA |
||||
|
}; |
||||
|
|
||||
|
struct BIGPOINT_PACKET { |
||||
|
const struct BIGPOINT_CCLASS * const class; |
||||
|
struct BIGPOINT_DYNTYPE * content[2]; |
||||
|
}; |
||||
|
|
||||
|
extern const struct BIGPOINT_CCLASS * const BIGPOINT_PACKET; |
||||
|
|
||||
|
void * bigpoint_packet_getHeader( |
||||
|
struct BIGPOINT_PACKET * _this); |
||||
|
|
||||
|
void * bigpoint_packet_getData( |
||||
|
struct BIGPOINT_PACKET * _this); |
||||
|
|
||||
|
void bigpoint_packet_setHeader( |
||||
|
struct BIGPOINT_PACKET * _this, |
||||
|
struct BIGPOINT_DYNTYPE * header); |
||||
|
|
||||
|
void bigpoint_packet_setData( |
||||
|
struct BIGPOINT_PACKET * _this, |
||||
|
struct BIGPOINT_DYNTYPE * data); |
||||
|
|
||||
|
void bigpoint_packet_set_default_content( |
||||
|
struct BIGPOINT_PACKET * _this); |
||||
|
|
||||
|
#endif//__BIGPOINT_PACKET_H__ |
||||
|
|
||||
|
// vim: set et ts=4 sw=4: |
||||
@ -0,0 +1,11 @@ |
|||||
|
#include "bigpoint_token_cryptdec" |
||||
|
|
||||
|
static |
||||
|
void |
||||
|
__construct(struct BIGPOINT_TOKEN_CRYPTDEC * _this, va_list * params) |
||||
|
{ |
||||
|
_this->containerFactory = va_arg(* params, struct BIGPOINT_CONTANER_FACTORY *); |
||||
|
_this->crypt = va_arg(* params, struct BIGPOINT_CRYPT *); |
||||
|
} |
||||
|
|
||||
|
// vim: set et ts=4 sw=4: |
||||
@ -0,0 +1,17 @@ |
|||||
|
#ifndef __BIGPOINT_TOKEN_CRPYTDEC_H__ |
||||
|
#define __BIGPOINT_TOKEN_CRPYTDEC_H__ |
||||
|
|
||||
|
#include "bigpoint_cclass.h" |
||||
|
|
||||
|
|
||||
|
struct BIGPOINT_TOKEN_CRYPTDEC { |
||||
|
const struct BIGPOINT_CCLASS * const class; |
||||
|
struct BIGPOINT_CONTAINTER_FACTORY * containerFactory; |
||||
|
struct BIGPOINT_CRYPT * crypt; |
||||
|
} |
||||
|
|
||||
|
extern const struct BIGPOINT_CCLASS * const BIGPOINT_TOKEN_CRYPTDEC; |
||||
|
|
||||
|
#endif//__BIGPOINT_TOKEN_CRPYTDEC_H__ |
||||
|
|
||||
|
// vim: set et ts=4 sw=4: |
||||
@ -0,0 +1,40 @@ |
|||||
|
#include <mcrypt.h> |
||||
|
#include <string.h> |
||||
|
#include <stdlib.h> |
||||
|
#include <stdio.h> |
||||
|
#include <sys/types.h> |
||||
|
|
||||
|
#include "bigpoint_cclass.h" |
||||
|
#include "bigpoint_crypt.h" |
||||
|
#include "base64.h" |
||||
|
|
||||
|
|
||||
|
int |
||||
|
main(int argc, char * argv[]) |
||||
|
{ |
||||
|
char b64d[] = "J4rYV+oJ9+EzoyLy/o8aolRSw51DzDhTyeht/tcdUA6hNNxaVFrW/FXVTfWXzkZgW1oc1D2vwkfQ80PD+iWzcw"; |
||||
|
char pass[] = "1234"; |
||||
|
char * data = NULL; |
||||
|
char * decrypted = NULL; |
||||
|
size_t length = strlen(b64d); |
||||
|
|
||||
|
struct BIGPOINT_CRYPT * crypt = NULL; |
||||
|
|
||||
|
data = calloc(length, sizeof(char)); |
||||
|
base64_decode(b64d, length, data, &length); |
||||
|
|
||||
|
data = realloc(data, length + 1); |
||||
|
data[length] = '\0'; |
||||
|
|
||||
|
crypt = new(BIGPOINT_CRYPT, MCRYPT_RIJNDAEL_256, MCRYPT_CFB); |
||||
|
decrypted = bigpoint_crypt_decrypt(crypt, data, pass, &length); |
||||
|
delete(crypt); |
||||
|
free(data); |
||||
|
|
||||
|
printf("%s\n", decrypted); |
||||
|
free(decrypted); |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
// vim: set et ts=4 sw=4: |
||||
@ -0,0 +1,40 @@ |
|||||
|
#include <mcrypt.h> |
||||
|
#include <string.h> |
||||
|
#include <stdlib.h> |
||||
|
#include <stdio.h> |
||||
|
#include <sys/types.h> |
||||
|
|
||||
|
#include "bigpoint_cclass.h" |
||||
|
#include "bigpoint_crypt.h" |
||||
|
#include "base64.h" |
||||
|
|
||||
|
|
||||
|
int |
||||
|
main(int argc, char * argv[]) |
||||
|
{ |
||||
|
char data[] = "ein weiterer test"; |
||||
|
char pass[] = "1234"; |
||||
|
char * b64d = NULL; |
||||
|
char * encrypted = NULL; |
||||
|
size_t length = strlen(data); |
||||
|
|
||||
|
struct BIGPOINT_CRYPT * crypt = NULL; |
||||
|
|
||||
|
crypt = new(BIGPOINT_CRYPT, MCRYPT_RIJNDAEL_256, MCRYPT_CFB); |
||||
|
encrypted = bigpoint_crypt_encrypt(crypt, data, pass, &length); |
||||
|
delete(crypt); |
||||
|
|
||||
|
b64d = calloc(BASE64_LENGTH(length), sizeof(char)); |
||||
|
base64_encode(encrypted, length, b64d, BASE64_LENGTH(length)); |
||||
|
free(encrypted); |
||||
|
|
||||
|
b64d = realloc(b64d, BASE64_LENGTH(length) + 1); |
||||
|
b64d[BASE64_LENGTH(length)] = '\0'; |
||||
|
|
||||
|
printf("%s\n", b64d); |
||||
|
free(b64d); |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
// vim: set et ts=4 sw=4: |
||||
@ -0,0 +1,41 @@ |
|||||
|
#include <stdio.h> |
||||
|
#include <string.h> |
||||
|
|
||||
|
#include "bigpoint_cclass.h" |
||||
|
#include "bigpoint_dyntype.h" |
||||
|
|
||||
|
|
||||
|
int |
||||
|
main(int argc, char * argv[]) |
||||
|
{ |
||||
|
char string[] = "ein weiterer test"; |
||||
|
int integer = 42; |
||||
|
float floating = 4.3; |
||||
|
|
||||
|
char * rstring = NULL; |
||||
|
long rint = 0; |
||||
|
double rfloat = 0.0; |
||||
|
|
||||
|
struct BIGPOINT_DYNTYPE * dynstring = |
||||
|
new(BIGPOINT_DYNTYPE, BIGPOINT_DYNTYPE_STRING, strlen(string) + 1, string); |
||||
|
struct BIGPOINT_DYNTYPE * dynint = |
||||
|
new(BIGPOINT_DYNTYPE, BIGPOINT_DYNTYPE_INT, sizeof(long), (long)integer); |
||||
|
struct BIGPOINT_DYNTYPE * dynfloat = |
||||
|
new(BIGPOINT_DYNTYPE, BIGPOINT_DYNTYPE_FLOAT, sizeof(double), (double)floating); |
||||
|
|
||||
|
bigpoint_dyntype_get(dynstring, rstring); |
||||
|
bigpoint_dyntype_get(dynint, rint); |
||||
|
bigpoint_dyntype_get(dynfloat, rfloat); |
||||
|
|
||||
|
printf("%s\n", rstring); |
||||
|
printf("%ld\n", rint); |
||||
|
printf("%lf\n", rfloat); |
||||
|
|
||||
|
delete(dynstring); |
||||
|
delete(dynint); |
||||
|
delete(dynfloat); |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
// vim: set et ts=4 sw=4: |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue