5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 2007 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
22 static unsigned char pem_enc[64] =
23 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
25 /* Encodes data into Base 64 encoding. Returns NULL terminated base 64 encoded
28 char *silc_base64_encode(SilcStack stack, unsigned char *data, SilcUInt32 len)
31 SilcUInt32 bits, c, char_count;
38 pem = silc_scalloc(stack, ((len * 8 + 5) / 6) + 5, sizeof(*pem));
40 for (i = 0; i < len; i++) {
45 if (char_count == 3) {
46 pem[j++] = pem_enc[bits >> 18];
47 pem[j++] = pem_enc[(bits >> 12) & 0x3f];
48 pem[j++] = pem_enc[(bits >> 6) & 0x3f];
49 pem[j++] = pem_enc[bits & 0x3f];
57 if (char_count != 0) {
58 bits <<= 16 - (8 * char_count);
59 pem[j++] = pem_enc[bits >> 18];
60 pem[j++] = pem_enc[(bits >> 12) & 0x3f];
62 if (char_count == 1) {
66 pem[j++] = pem_enc[(bits >> 6) & 0x3f];
74 /* Same as above but puts newline ('\n') every 72 characters. */
76 char *silc_base64_encode_file(SilcStack stack,
77 unsigned char *data, SilcUInt32 data_len)
83 pem = silc_base64_encode(stack, data, data_len);
86 pem2 = silc_scalloc(stack, len + (len / 72) + 1, sizeof(*pem2));
88 for (i = 0, j = 0, cols = 1; i < len; i++, cols++) {
99 silc_sfree(stack, pem);
103 /* Decodes Base 64 into data. Returns the decoded data. */
105 unsigned char *silc_base64_decode(SilcStack stack,
106 unsigned char *base64,
107 SilcUInt32 base64_len,
111 SilcUInt32 len, c, char_count, bits;
113 static char ialpha[256], decoder[256];
115 for (i = 64 - 1; i >= 0; i--) {
116 ialpha[pem_enc[i]] = 1;
117 decoder[pem_enc[i]] = i;
125 len = strlen(base64);
129 data = silc_scalloc(stack, ((len * 6) / 8), sizeof(*data));
131 for (i = 0; i < len; i++) {
137 if (c > 127 || !ialpha[c])
143 if (char_count == 4) {
144 data[j++] = bits >> 16;
145 data[j++] = (bits >> 8) & 0xff;
146 data[j++] = bits & 0xff;
156 silc_sfree(stack, data);
160 data[j++] = bits >> 10;
163 data[j++] = bits >> 16;
164 data[j++] = (bits >> 8) & 0xff;