Branch data Line data Source code
1 : : /*
2 : : *****************************************************************************
3 : : *
4 : : * File: base64.c
5 : : *
6 : : * Purpose: Implementation of the Base64 encode/decode algorithim.
7 : : *
8 : : * This code was derived from the base64.c part of FFmpeg written
9 : : * by Ryan Martell. (rdm4@martellventures.com).
10 : : *
11 : : * Copyright (C) Ryan Martell. (rdm4@martellventures.com)
12 : : *
13 : : * Fwknop is developed primarily by the people listed in the file 'AUTHORS'.
14 : : * Copyright (C) 2009-2014 fwknop developers and contributors. For a full
15 : : * list of contributors, see the file 'CREDITS'.
16 : : *
17 : : * License (GNU General Public License):
18 : : *
19 : : * This library is free software; you can redistribute it and/or
20 : : * modify it under the terms of the GNU General Public License
21 : : * as published by the Free Software Foundation; either version 2
22 : : * of the License, or (at your option) any later version.
23 : : *
24 : : * This program is distributed in the hope that it will be useful,
25 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 : : * GNU General Public License for more details.
28 : : *
29 : : * You should have received a copy of the GNU General Public License
30 : : * along with this program; if not, write to the Free Software
31 : : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
32 : : * USA
33 : : *
34 : : *****************************************************************************
35 : : */
36 : : #include "base64.h"
37 : : #include "fko_common.h"
38 : :
39 : : #if !AFL_FUZZING
40 : : static unsigned char map2[] =
41 : : {
42 : : 0x3e, 0xff, 0xff, 0xff, 0x3f, 0x34, 0x35, 0x36,
43 : : 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xff,
44 : : 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01,
45 : : 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
46 : : 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
47 : : 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
48 : : 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x1b,
49 : : 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
50 : : 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
51 : : 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33
52 : : };
53 : : #endif
54 : :
55 : : int
56 : 8677775 : b64_decode(const char *in, unsigned char *out)
57 : : {
58 : : int i;
59 : 8677775 : unsigned char *dst = out;
60 : : #if ! AFL_FUZZING
61 : : int v;
62 : : #endif
63 : :
64 : : #if AFL_FUZZING
65 : : /* short circuit base64 decoding in AFL fuzzing mode - just copy
66 : : * data as-is.
67 : : */
68 : : for (i = 0; in[i]; i++)
69 : : *dst++ = in[i];
70 : : #else
71 : 8677775 : v = 0;
72 [ + + ]: 1176497432 : for (i = 0; in[i] && in[i] != '='; i++) {
73 : 1167833209 : unsigned int index= in[i]-43;
74 : :
75 [ + + ][ + + ]: 1167833209 : if (index>=(sizeof(map2)/sizeof(map2[0])) || map2[index] == 0xff)
76 : : return(-1);
77 : :
78 : 1167819657 : v = (v << 6) + map2[index];
79 : :
80 [ + + ]: 1167819657 : if (i & 3)
81 : 873292798 : *dst++ = v >> (6 - 2 * (i & 3));
82 : : }
83 : : #endif
84 : :
85 : 8664223 : *dst = '\0';
86 : :
87 : 8664223 : return(dst - out);
88 : : }
89 : :
90 : : /*****************************************************************************
91 : : * b64_encode: Stolen from VLC's http.c
92 : : * Simplified by michael
93 : : * fixed edge cases and made it work from data (vs. strings) by ryan.
94 : : *****************************************************************************
95 : : */
96 : : int
97 : 13057593 : b64_encode(unsigned char *in, char *out, int in_len)
98 : : {
99 : : static const char b64[] =
100 : : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
101 : 13057593 : unsigned i_bits = 0;
102 : 13057593 : int i_shift = 0;
103 : 13057593 : int bytes_remaining = in_len;
104 : :
105 : 13057593 : char *dst = out;
106 : :
107 [ + - ]: 13057593 : if (in_len > 0) { /* Special edge case, what should we really do here? */
108 [ + + ]: 829215928 : while (bytes_remaining) {
109 : 816158335 : i_bits = (i_bits << 8) + *in++;
110 : 816158335 : bytes_remaining--;
111 : 1093099855 : i_shift += 8;
112 : :
113 : : do {
114 : 1093099855 : *dst++ = b64[(i_bits << 6 >> i_shift) & 0x3f];
115 : 1093099855 : i_shift -= 6;
116 [ + + ][ + + ]: 1106157448 : } while (i_shift > 6 || (bytes_remaining == 0 && i_shift > 0));
117 : : }
118 [ + + ]: 27723818 : while ((dst - out) & 3)
119 : 14666225 : *dst++ = '=';
120 : : }
121 : :
122 : 13057593 : *dst = '\0';
123 : :
124 : 13057593 : return(dst - out);
125 : : }
126 : :
127 : : /* Strip trailing equals ("=") charcters from a base64-encoded
128 : : * message digest.
129 : : */
130 : : void
131 : 13057357 : strip_b64_eq(char *data)
132 : : {
133 : : char *ndx;
134 : :
135 [ + + ]: 13057357 : if((ndx = strchr(data, '=')) != NULL)
136 : 11140508 : *ndx = '\0';
137 : 13057357 : }
138 : :
139 : : /***EOF***/
|