A library for setting up Secure Socket Layer (SSL) connections and verifying remote hosts using certificates. Contains only the source files for mbed platform implementation of the library.

Dependents:   HTTPClient-SSL HTTPClient-SSL HTTPClient-SSL HTTPClient-SSL

Committer:
Mike Fiore
Date:
Mon Mar 23 16:51:07 2015 -0500
Revision:
6:cf58d49e1a86
Parent:
0:b86d15c6ba29
fix whitespace in sha512.c

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Vanger 0:b86d15c6ba29 1 /* coding.c
Vanger 0:b86d15c6ba29 2 *
Vanger 0:b86d15c6ba29 3 * Copyright (C) 2006-2014 wolfSSL Inc.
Vanger 0:b86d15c6ba29 4 *
Vanger 0:b86d15c6ba29 5 * This file is part of CyaSSL.
Vanger 0:b86d15c6ba29 6 *
Vanger 0:b86d15c6ba29 7 * CyaSSL is free software; you can redistribute it and/or modify
Vanger 0:b86d15c6ba29 8 * it under the terms of the GNU General Public License as published by
Vanger 0:b86d15c6ba29 9 * the Free Software Foundation; either version 2 of the License, or
Vanger 0:b86d15c6ba29 10 * (at your option) any later version.
Vanger 0:b86d15c6ba29 11 *
Vanger 0:b86d15c6ba29 12 * CyaSSL is distributed in the hope that it will be useful,
Vanger 0:b86d15c6ba29 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Vanger 0:b86d15c6ba29 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Vanger 0:b86d15c6ba29 15 * GNU General Public License for more details.
Vanger 0:b86d15c6ba29 16 *
Vanger 0:b86d15c6ba29 17 * You should have received a copy of the GNU General Public License
Vanger 0:b86d15c6ba29 18 * along with this program; if not, write to the Free Software
Vanger 0:b86d15c6ba29 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Vanger 0:b86d15c6ba29 20 */
Vanger 0:b86d15c6ba29 21
Vanger 0:b86d15c6ba29 22 #ifdef HAVE_CONFIG_H
Vanger 0:b86d15c6ba29 23 #include <config.h>
Vanger 0:b86d15c6ba29 24 #endif
Vanger 0:b86d15c6ba29 25
Vanger 0:b86d15c6ba29 26 #include <cyassl/ctaocrypt/settings.h>
Vanger 0:b86d15c6ba29 27
Vanger 0:b86d15c6ba29 28 #ifndef NO_CODING
Vanger 0:b86d15c6ba29 29
Vanger 0:b86d15c6ba29 30 #include <cyassl/ctaocrypt/coding.h>
Vanger 0:b86d15c6ba29 31 #include <cyassl/ctaocrypt/error-crypt.h>
Vanger 0:b86d15c6ba29 32 #include <cyassl/ctaocrypt/logging.h>
Vanger 0:b86d15c6ba29 33
Vanger 0:b86d15c6ba29 34
Vanger 0:b86d15c6ba29 35 enum {
Vanger 0:b86d15c6ba29 36 BAD = 0xFF, /* invalid encoding */
Vanger 0:b86d15c6ba29 37 PAD = '=',
Vanger 0:b86d15c6ba29 38 PEM_LINE_SZ = 64
Vanger 0:b86d15c6ba29 39 };
Vanger 0:b86d15c6ba29 40
Vanger 0:b86d15c6ba29 41
Vanger 0:b86d15c6ba29 42 static
Vanger 0:b86d15c6ba29 43 const byte base64Decode[] = { 62, BAD, BAD, BAD, 63, /* + starts at 0x2B */
Vanger 0:b86d15c6ba29 44 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
Vanger 0:b86d15c6ba29 45 BAD, BAD, BAD, BAD, BAD, BAD, BAD,
Vanger 0:b86d15c6ba29 46 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
Vanger 0:b86d15c6ba29 47 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
Vanger 0:b86d15c6ba29 48 20, 21, 22, 23, 24, 25,
Vanger 0:b86d15c6ba29 49 BAD, BAD, BAD, BAD, BAD, BAD,
Vanger 0:b86d15c6ba29 50 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
Vanger 0:b86d15c6ba29 51 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
Vanger 0:b86d15c6ba29 52 46, 47, 48, 49, 50, 51
Vanger 0:b86d15c6ba29 53 };
Vanger 0:b86d15c6ba29 54
Vanger 0:b86d15c6ba29 55
Vanger 0:b86d15c6ba29 56 int Base64_Decode(const byte* in, word32 inLen, byte* out, word32* outLen)
Vanger 0:b86d15c6ba29 57 {
Vanger 0:b86d15c6ba29 58 word32 i = 0;
Vanger 0:b86d15c6ba29 59 word32 j = 0;
Vanger 0:b86d15c6ba29 60 word32 plainSz = inLen - ((inLen + (PEM_LINE_SZ - 1)) / PEM_LINE_SZ );
Vanger 0:b86d15c6ba29 61 const byte maxIdx = (byte)sizeof(base64Decode) + 0x2B - 1;
Vanger 0:b86d15c6ba29 62
Vanger 0:b86d15c6ba29 63 plainSz = (plainSz * 3 + 3) / 4;
Vanger 0:b86d15c6ba29 64 if (plainSz > *outLen) return BAD_FUNC_ARG;
Vanger 0:b86d15c6ba29 65
Vanger 0:b86d15c6ba29 66 while (inLen > 3) {
Vanger 0:b86d15c6ba29 67 byte b1, b2, b3;
Vanger 0:b86d15c6ba29 68 byte e1 = in[j++];
Vanger 0:b86d15c6ba29 69 byte e2 = in[j++];
Vanger 0:b86d15c6ba29 70 byte e3 = in[j++];
Vanger 0:b86d15c6ba29 71 byte e4 = in[j++];
Vanger 0:b86d15c6ba29 72
Vanger 0:b86d15c6ba29 73 int pad3 = 0;
Vanger 0:b86d15c6ba29 74 int pad4 = 0;
Vanger 0:b86d15c6ba29 75
Vanger 0:b86d15c6ba29 76 if (e1 == 0) /* end file 0's */
Vanger 0:b86d15c6ba29 77 break;
Vanger 0:b86d15c6ba29 78 if (e3 == PAD)
Vanger 0:b86d15c6ba29 79 pad3 = 1;
Vanger 0:b86d15c6ba29 80 if (e4 == PAD)
Vanger 0:b86d15c6ba29 81 pad4 = 1;
Vanger 0:b86d15c6ba29 82
Vanger 0:b86d15c6ba29 83 if (e1 < 0x2B || e2 < 0x2B || e3 < 0x2B || e4 < 0x2B) {
Vanger 0:b86d15c6ba29 84 CYASSL_MSG("Bad Base64 Decode data, too small");
Vanger 0:b86d15c6ba29 85 return ASN_INPUT_E;
Vanger 0:b86d15c6ba29 86 }
Vanger 0:b86d15c6ba29 87
Vanger 0:b86d15c6ba29 88 if (e1 > maxIdx || e2 > maxIdx || e3 > maxIdx || e4 > maxIdx) {
Vanger 0:b86d15c6ba29 89 CYASSL_MSG("Bad Base64 Decode data, too big");
Vanger 0:b86d15c6ba29 90 return ASN_INPUT_E;
Vanger 0:b86d15c6ba29 91 }
Vanger 0:b86d15c6ba29 92
Vanger 0:b86d15c6ba29 93 e1 = base64Decode[e1 - 0x2B];
Vanger 0:b86d15c6ba29 94 e2 = base64Decode[e2 - 0x2B];
Vanger 0:b86d15c6ba29 95 e3 = (e3 == PAD) ? 0 : base64Decode[e3 - 0x2B];
Vanger 0:b86d15c6ba29 96 e4 = (e4 == PAD) ? 0 : base64Decode[e4 - 0x2B];
Vanger 0:b86d15c6ba29 97
Vanger 0:b86d15c6ba29 98 b1 = (byte)((e1 << 2) | (e2 >> 4));
Vanger 0:b86d15c6ba29 99 b2 = (byte)(((e2 & 0xF) << 4) | (e3 >> 2));
Vanger 0:b86d15c6ba29 100 b3 = (byte)(((e3 & 0x3) << 6) | e4);
Vanger 0:b86d15c6ba29 101
Vanger 0:b86d15c6ba29 102 out[i++] = b1;
Vanger 0:b86d15c6ba29 103 if (!pad3)
Vanger 0:b86d15c6ba29 104 out[i++] = b2;
Vanger 0:b86d15c6ba29 105 if (!pad4)
Vanger 0:b86d15c6ba29 106 out[i++] = b3;
Vanger 0:b86d15c6ba29 107 else
Vanger 0:b86d15c6ba29 108 break;
Vanger 0:b86d15c6ba29 109
Vanger 0:b86d15c6ba29 110 inLen -= 4;
Vanger 0:b86d15c6ba29 111 if (inLen && (in[j] == ' ' || in[j] == '\r' || in[j] == '\n')) {
Vanger 0:b86d15c6ba29 112 byte endLine = in[j++];
Vanger 0:b86d15c6ba29 113 inLen--;
Vanger 0:b86d15c6ba29 114 while (inLen && endLine == ' ') { /* allow trailing whitespace */
Vanger 0:b86d15c6ba29 115 endLine = in[j++];
Vanger 0:b86d15c6ba29 116 inLen--;
Vanger 0:b86d15c6ba29 117 }
Vanger 0:b86d15c6ba29 118 if (endLine == '\r') {
Vanger 0:b86d15c6ba29 119 if (inLen) {
Vanger 0:b86d15c6ba29 120 endLine = in[j++];
Vanger 0:b86d15c6ba29 121 inLen--;
Vanger 0:b86d15c6ba29 122 }
Vanger 0:b86d15c6ba29 123 }
Vanger 0:b86d15c6ba29 124 if (endLine != '\n') {
Vanger 0:b86d15c6ba29 125 CYASSL_MSG("Bad end of line in Base64 Decode");
Vanger 0:b86d15c6ba29 126 return ASN_INPUT_E;
Vanger 0:b86d15c6ba29 127 }
Vanger 0:b86d15c6ba29 128 }
Vanger 0:b86d15c6ba29 129 }
Vanger 0:b86d15c6ba29 130 *outLen = i;
Vanger 0:b86d15c6ba29 131
Vanger 0:b86d15c6ba29 132 return 0;
Vanger 0:b86d15c6ba29 133 }
Vanger 0:b86d15c6ba29 134
Vanger 0:b86d15c6ba29 135
Vanger 0:b86d15c6ba29 136 #if defined(OPENSSL_EXTRA) || defined (SESSION_CERTS) || defined(CYASSL_KEY_GEN) || defined(CYASSL_CERT_GEN) || defined(HAVE_WEBSERVER)
Vanger 0:b86d15c6ba29 137
Vanger 0:b86d15c6ba29 138 static
Vanger 0:b86d15c6ba29 139 const byte base64Encode[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
Vanger 0:b86d15c6ba29 140 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
Vanger 0:b86d15c6ba29 141 'U', 'V', 'W', 'X', 'Y', 'Z',
Vanger 0:b86d15c6ba29 142 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
Vanger 0:b86d15c6ba29 143 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
Vanger 0:b86d15c6ba29 144 'u', 'v', 'w', 'x', 'y', 'z',
Vanger 0:b86d15c6ba29 145 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
Vanger 0:b86d15c6ba29 146 '+', '/'
Vanger 0:b86d15c6ba29 147 };
Vanger 0:b86d15c6ba29 148
Vanger 0:b86d15c6ba29 149
Vanger 0:b86d15c6ba29 150 /* make sure *i (idx) won't exceed max, store and possibly escape to out,
Vanger 0:b86d15c6ba29 151 * raw means use e w/o decode, 0 on success */
Vanger 0:b86d15c6ba29 152 static int CEscape(int escaped, byte e, byte* out, word32* i, word32 max,
Vanger 0:b86d15c6ba29 153 int raw)
Vanger 0:b86d15c6ba29 154 {
Vanger 0:b86d15c6ba29 155 int doEscape = 0;
Vanger 0:b86d15c6ba29 156 word32 needed = 1;
Vanger 0:b86d15c6ba29 157 word32 idx = *i;
Vanger 0:b86d15c6ba29 158
Vanger 0:b86d15c6ba29 159 byte basic;
Vanger 0:b86d15c6ba29 160 byte plus = 0;
Vanger 0:b86d15c6ba29 161 byte equals = 0;
Vanger 0:b86d15c6ba29 162 byte newline = 0;
Vanger 0:b86d15c6ba29 163
Vanger 0:b86d15c6ba29 164 if (raw)
Vanger 0:b86d15c6ba29 165 basic = e;
Vanger 0:b86d15c6ba29 166 else
Vanger 0:b86d15c6ba29 167 basic = base64Encode[e];
Vanger 0:b86d15c6ba29 168
Vanger 0:b86d15c6ba29 169 /* check whether to escape */
Vanger 0:b86d15c6ba29 170 if (escaped) {
Vanger 0:b86d15c6ba29 171 switch ((char)basic) {
Vanger 0:b86d15c6ba29 172 case '+' :
Vanger 0:b86d15c6ba29 173 plus = 1;
Vanger 0:b86d15c6ba29 174 doEscape = 1;
Vanger 0:b86d15c6ba29 175 needed += 2;
Vanger 0:b86d15c6ba29 176 break;
Vanger 0:b86d15c6ba29 177 case '=' :
Vanger 0:b86d15c6ba29 178 equals = 1;
Vanger 0:b86d15c6ba29 179 doEscape = 1;
Vanger 0:b86d15c6ba29 180 needed += 2;
Vanger 0:b86d15c6ba29 181 break;
Vanger 0:b86d15c6ba29 182 case '\n' :
Vanger 0:b86d15c6ba29 183 newline = 1;
Vanger 0:b86d15c6ba29 184 doEscape = 1;
Vanger 0:b86d15c6ba29 185 needed += 2;
Vanger 0:b86d15c6ba29 186 break;
Vanger 0:b86d15c6ba29 187 default:
Vanger 0:b86d15c6ba29 188 /* do nothing */
Vanger 0:b86d15c6ba29 189 break;
Vanger 0:b86d15c6ba29 190 }
Vanger 0:b86d15c6ba29 191 }
Vanger 0:b86d15c6ba29 192
Vanger 0:b86d15c6ba29 193 /* check size */
Vanger 0:b86d15c6ba29 194 if ( (idx+needed) > max) {
Vanger 0:b86d15c6ba29 195 CYASSL_MSG("Escape buffer max too small");
Vanger 0:b86d15c6ba29 196 return BUFFER_E;
Vanger 0:b86d15c6ba29 197 }
Vanger 0:b86d15c6ba29 198
Vanger 0:b86d15c6ba29 199 /* store it */
Vanger 0:b86d15c6ba29 200 if (doEscape == 0) {
Vanger 0:b86d15c6ba29 201 out[idx++] = basic;
Vanger 0:b86d15c6ba29 202 }
Vanger 0:b86d15c6ba29 203 else {
Vanger 0:b86d15c6ba29 204 out[idx++] = '%'; /* start escape */
Vanger 0:b86d15c6ba29 205
Vanger 0:b86d15c6ba29 206 if (plus) {
Vanger 0:b86d15c6ba29 207 out[idx++] = '2';
Vanger 0:b86d15c6ba29 208 out[idx++] = 'B';
Vanger 0:b86d15c6ba29 209 }
Vanger 0:b86d15c6ba29 210 else if (equals) {
Vanger 0:b86d15c6ba29 211 out[idx++] = '3';
Vanger 0:b86d15c6ba29 212 out[idx++] = 'D';
Vanger 0:b86d15c6ba29 213 }
Vanger 0:b86d15c6ba29 214 else if (newline) {
Vanger 0:b86d15c6ba29 215 out[idx++] = '0';
Vanger 0:b86d15c6ba29 216 out[idx++] = 'A';
Vanger 0:b86d15c6ba29 217 }
Vanger 0:b86d15c6ba29 218
Vanger 0:b86d15c6ba29 219 }
Vanger 0:b86d15c6ba29 220 *i = idx;
Vanger 0:b86d15c6ba29 221
Vanger 0:b86d15c6ba29 222 return 0;
Vanger 0:b86d15c6ba29 223 }
Vanger 0:b86d15c6ba29 224
Vanger 0:b86d15c6ba29 225
Vanger 0:b86d15c6ba29 226 /* internal worker, handles both escaped and normal line endings */
Vanger 0:b86d15c6ba29 227 static int DoBase64_Encode(const byte* in, word32 inLen, byte* out,
Vanger 0:b86d15c6ba29 228 word32* outLen, int escaped)
Vanger 0:b86d15c6ba29 229 {
Vanger 0:b86d15c6ba29 230 int ret = 0;
Vanger 0:b86d15c6ba29 231 word32 i = 0,
Vanger 0:b86d15c6ba29 232 j = 0,
Vanger 0:b86d15c6ba29 233 n = 0; /* new line counter */
Vanger 0:b86d15c6ba29 234
Vanger 0:b86d15c6ba29 235 word32 outSz = (inLen + 3 - 1) / 3 * 4;
Vanger 0:b86d15c6ba29 236 word32 addSz = (outSz + PEM_LINE_SZ - 1) / PEM_LINE_SZ; /* new lines */
Vanger 0:b86d15c6ba29 237
Vanger 0:b86d15c6ba29 238 if (escaped)
Vanger 0:b86d15c6ba29 239 addSz *= 3; /* instead of just \n, we're doing %0A triplet */
Vanger 0:b86d15c6ba29 240
Vanger 0:b86d15c6ba29 241 outSz += addSz;
Vanger 0:b86d15c6ba29 242
Vanger 0:b86d15c6ba29 243 /* if escaped we can't predetermine size for one pass encoding, but
Vanger 0:b86d15c6ba29 244 * make sure we have enough if no escapes are in input */
Vanger 0:b86d15c6ba29 245 if (outSz > *outLen) return BAD_FUNC_ARG;
Vanger 0:b86d15c6ba29 246
Vanger 0:b86d15c6ba29 247 while (inLen > 2) {
Vanger 0:b86d15c6ba29 248 byte b1 = in[j++];
Vanger 0:b86d15c6ba29 249 byte b2 = in[j++];
Vanger 0:b86d15c6ba29 250 byte b3 = in[j++];
Vanger 0:b86d15c6ba29 251
Vanger 0:b86d15c6ba29 252 /* encoded idx */
Vanger 0:b86d15c6ba29 253 byte e1 = b1 >> 2;
Vanger 0:b86d15c6ba29 254 byte e2 = (byte)(((b1 & 0x3) << 4) | (b2 >> 4));
Vanger 0:b86d15c6ba29 255 byte e3 = (byte)(((b2 & 0xF) << 2) | (b3 >> 6));
Vanger 0:b86d15c6ba29 256 byte e4 = b3 & 0x3F;
Vanger 0:b86d15c6ba29 257
Vanger 0:b86d15c6ba29 258 /* store */
Vanger 0:b86d15c6ba29 259 ret = CEscape(escaped, e1, out, &i, *outLen, 0);
Vanger 0:b86d15c6ba29 260 if (ret != 0) break;
Vanger 0:b86d15c6ba29 261 ret = CEscape(escaped, e2, out, &i, *outLen, 0);
Vanger 0:b86d15c6ba29 262 if (ret != 0) break;
Vanger 0:b86d15c6ba29 263 ret = CEscape(escaped, e3, out, &i, *outLen, 0);
Vanger 0:b86d15c6ba29 264 if (ret != 0) break;
Vanger 0:b86d15c6ba29 265 ret = CEscape(escaped, e4, out, &i, *outLen, 0);
Vanger 0:b86d15c6ba29 266 if (ret != 0) break;
Vanger 0:b86d15c6ba29 267
Vanger 0:b86d15c6ba29 268 inLen -= 3;
Vanger 0:b86d15c6ba29 269
Vanger 0:b86d15c6ba29 270 if ((++n % (PEM_LINE_SZ / 4)) == 0 && inLen) {
Vanger 0:b86d15c6ba29 271 ret = CEscape(escaped, '\n', out, &i, *outLen, 1);
Vanger 0:b86d15c6ba29 272 if (ret != 0) break;
Vanger 0:b86d15c6ba29 273 }
Vanger 0:b86d15c6ba29 274 }
Vanger 0:b86d15c6ba29 275
Vanger 0:b86d15c6ba29 276 /* last integral */
Vanger 0:b86d15c6ba29 277 if (inLen && ret == 0) {
Vanger 0:b86d15c6ba29 278 int twoBytes = (inLen == 2);
Vanger 0:b86d15c6ba29 279
Vanger 0:b86d15c6ba29 280 byte b1 = in[j++];
Vanger 0:b86d15c6ba29 281 byte b2 = (twoBytes) ? in[j++] : 0;
Vanger 0:b86d15c6ba29 282
Vanger 0:b86d15c6ba29 283 byte e1 = b1 >> 2;
Vanger 0:b86d15c6ba29 284 byte e2 = (byte)(((b1 & 0x3) << 4) | (b2 >> 4));
Vanger 0:b86d15c6ba29 285 byte e3 = (byte)((b2 & 0xF) << 2);
Vanger 0:b86d15c6ba29 286
Vanger 0:b86d15c6ba29 287 ret = CEscape(escaped, e1, out, &i, *outLen, 0);
Vanger 0:b86d15c6ba29 288 if (ret == 0)
Vanger 0:b86d15c6ba29 289 ret = CEscape(escaped, e2, out, &i, *outLen, 0);
Vanger 0:b86d15c6ba29 290 if (ret == 0) {
Vanger 0:b86d15c6ba29 291 /* third */
Vanger 0:b86d15c6ba29 292 if (twoBytes)
Vanger 0:b86d15c6ba29 293 ret = CEscape(escaped, e3, out, &i, *outLen, 0);
Vanger 0:b86d15c6ba29 294 else
Vanger 0:b86d15c6ba29 295 ret = CEscape(escaped, '=', out, &i, *outLen, 1);
Vanger 0:b86d15c6ba29 296 }
Vanger 0:b86d15c6ba29 297 /* fourth always pad */
Vanger 0:b86d15c6ba29 298 if (ret == 0)
Vanger 0:b86d15c6ba29 299 ret = CEscape(escaped, '=', out, &i, *outLen, 1);
Vanger 0:b86d15c6ba29 300 }
Vanger 0:b86d15c6ba29 301
Vanger 0:b86d15c6ba29 302 if (ret == 0)
Vanger 0:b86d15c6ba29 303 ret = CEscape(escaped, '\n', out, &i, *outLen, 1);
Vanger 0:b86d15c6ba29 304
Vanger 0:b86d15c6ba29 305 if (i != outSz && escaped == 0 && ret == 0)
Vanger 0:b86d15c6ba29 306 return ASN_INPUT_E;
Vanger 0:b86d15c6ba29 307
Vanger 0:b86d15c6ba29 308 *outLen = i;
Vanger 0:b86d15c6ba29 309 return ret;
Vanger 0:b86d15c6ba29 310 }
Vanger 0:b86d15c6ba29 311
Vanger 0:b86d15c6ba29 312
Vanger 0:b86d15c6ba29 313 /* Base64 Encode, PEM style, with \n line endings */
Vanger 0:b86d15c6ba29 314 int Base64_Encode(const byte* in, word32 inLen, byte* out, word32* outLen)
Vanger 0:b86d15c6ba29 315 {
Vanger 0:b86d15c6ba29 316 return DoBase64_Encode(in, inLen, out, outLen, 0);
Vanger 0:b86d15c6ba29 317 }
Vanger 0:b86d15c6ba29 318
Vanger 0:b86d15c6ba29 319
Vanger 0:b86d15c6ba29 320 /* Base64 Encode, with %0A esacped line endings instead of \n */
Vanger 0:b86d15c6ba29 321 int Base64_EncodeEsc(const byte* in, word32 inLen, byte* out, word32* outLen)
Vanger 0:b86d15c6ba29 322 {
Vanger 0:b86d15c6ba29 323 return DoBase64_Encode(in, inLen, out, outLen, 1);
Vanger 0:b86d15c6ba29 324 }
Vanger 0:b86d15c6ba29 325
Vanger 0:b86d15c6ba29 326
Vanger 0:b86d15c6ba29 327 #endif /* defined(OPENSSL_EXTRA) || defined (SESSION_CERTS) || defined(CYASSL_KEY_GEN) || defined(CYASSL_CERT_GEN) || defined(HAVE_WEBSERVER) */
Vanger 0:b86d15c6ba29 328
Vanger 0:b86d15c6ba29 329
Vanger 0:b86d15c6ba29 330 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(HAVE_FIPS)
Vanger 0:b86d15c6ba29 331
Vanger 0:b86d15c6ba29 332 static
Vanger 0:b86d15c6ba29 333 const byte hexDecode[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
Vanger 0:b86d15c6ba29 334 BAD, BAD, BAD, BAD, BAD, BAD, BAD,
Vanger 0:b86d15c6ba29 335 10, 11, 12, 13, 14, 15, /* upper case A-F */
Vanger 0:b86d15c6ba29 336 BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD,
Vanger 0:b86d15c6ba29 337 BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD,
Vanger 0:b86d15c6ba29 338 BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD,
Vanger 0:b86d15c6ba29 339 BAD, BAD, /* G - ` */
Vanger 0:b86d15c6ba29 340 10, 11, 12, 13, 14, 15 /* lower case a-f */
Vanger 0:b86d15c6ba29 341 }; /* A starts at 0x41 not 0x3A */
Vanger 0:b86d15c6ba29 342
Vanger 0:b86d15c6ba29 343 int Base16_Decode(const byte* in, word32 inLen, byte* out, word32* outLen)
Vanger 0:b86d15c6ba29 344 {
Vanger 0:b86d15c6ba29 345 word32 inIdx = 0;
Vanger 0:b86d15c6ba29 346 word32 outIdx = 0;
Vanger 0:b86d15c6ba29 347
Vanger 0:b86d15c6ba29 348 if (inLen == 1 && *outLen && in) {
Vanger 0:b86d15c6ba29 349 byte b = in[inIdx++] - 0x30; /* 0 starts at 0x30 */
Vanger 0:b86d15c6ba29 350
Vanger 0:b86d15c6ba29 351 /* sanity check */
Vanger 0:b86d15c6ba29 352 if (b >= sizeof(hexDecode)/sizeof(hexDecode[0]))
Vanger 0:b86d15c6ba29 353 return ASN_INPUT_E;
Vanger 0:b86d15c6ba29 354
Vanger 0:b86d15c6ba29 355 b = hexDecode[b];
Vanger 0:b86d15c6ba29 356
Vanger 0:b86d15c6ba29 357 if (b == BAD)
Vanger 0:b86d15c6ba29 358 return ASN_INPUT_E;
Vanger 0:b86d15c6ba29 359
Vanger 0:b86d15c6ba29 360 out[outIdx++] = b;
Vanger 0:b86d15c6ba29 361
Vanger 0:b86d15c6ba29 362 *outLen = outIdx;
Vanger 0:b86d15c6ba29 363 return 0;
Vanger 0:b86d15c6ba29 364 }
Vanger 0:b86d15c6ba29 365
Vanger 0:b86d15c6ba29 366 if (inLen % 2)
Vanger 0:b86d15c6ba29 367 return BAD_FUNC_ARG;
Vanger 0:b86d15c6ba29 368
Vanger 0:b86d15c6ba29 369 if (*outLen < (inLen / 2))
Vanger 0:b86d15c6ba29 370 return BAD_FUNC_ARG;
Vanger 0:b86d15c6ba29 371
Vanger 0:b86d15c6ba29 372 while (inLen) {
Vanger 0:b86d15c6ba29 373 byte b = in[inIdx++] - 0x30; /* 0 starts at 0x30 */
Vanger 0:b86d15c6ba29 374 byte b2 = in[inIdx++] - 0x30;
Vanger 0:b86d15c6ba29 375
Vanger 0:b86d15c6ba29 376 /* sanity checks */
Vanger 0:b86d15c6ba29 377 if (b >= sizeof(hexDecode)/sizeof(hexDecode[0]))
Vanger 0:b86d15c6ba29 378 return ASN_INPUT_E;
Vanger 0:b86d15c6ba29 379 if (b2 >= sizeof(hexDecode)/sizeof(hexDecode[0]))
Vanger 0:b86d15c6ba29 380 return ASN_INPUT_E;
Vanger 0:b86d15c6ba29 381
Vanger 0:b86d15c6ba29 382 b = hexDecode[b];
Vanger 0:b86d15c6ba29 383 b2 = hexDecode[b2];
Vanger 0:b86d15c6ba29 384
Vanger 0:b86d15c6ba29 385 if (b == BAD || b2 == BAD)
Vanger 0:b86d15c6ba29 386 return ASN_INPUT_E;
Vanger 0:b86d15c6ba29 387
Vanger 0:b86d15c6ba29 388 out[outIdx++] = (byte)((b << 4) | b2);
Vanger 0:b86d15c6ba29 389 inLen -= 2;
Vanger 0:b86d15c6ba29 390 }
Vanger 0:b86d15c6ba29 391
Vanger 0:b86d15c6ba29 392 *outLen = outIdx;
Vanger 0:b86d15c6ba29 393 return 0;
Vanger 0:b86d15c6ba29 394 }
Vanger 0:b86d15c6ba29 395
Vanger 0:b86d15c6ba29 396
Vanger 0:b86d15c6ba29 397 #endif /* (OPENSSL_EXTRA) || (HAVE_WEBSERVER) || (HAVE_FIPS) */
Vanger 0:b86d15c6ba29 398
Vanger 0:b86d15c6ba29 399 #endif /* NO_CODING */