installed by security/heimdal PR: ports/177454 Reported by: Andriy Syrovenko <andriys@gmail.com>
1480 lines
49 KiB
Text
1480 lines
49 KiB
Text
--- lib/include/base64.h.orig 2013-12-27 16:38:14.000000000 +0000
|
|
+++ lib/include/base64.h 2013-12-27 16:38:30.000000000 +0000
|
|
@@ -1,46 +0,0 @@
|
|
-/*********************************************************
|
|
- * Copyright (C) 2004 VMware, Inc. All rights reserved.
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify it
|
|
- * under the terms of the GNU Lesser General Public License as published
|
|
- * by the Free Software Foundation version 2.1 and no 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 Lesser GNU General Public
|
|
- * License for more details.
|
|
- *
|
|
- * You should have received a copy of the GNU Lesser General Public License
|
|
- * along with this program; if not, write to the Free Software Foundation, Inc.,
|
|
- * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
- *
|
|
- *********************************************************/
|
|
-
|
|
-/*
|
|
- * base64.h --
|
|
- *
|
|
- * Functions to base64 encode/decode buffers. Implemented in
|
|
- * lib/misc/base64.c.
|
|
- */
|
|
-
|
|
-#ifndef _BASE64_H
|
|
-#define _BASE64_H
|
|
-
|
|
-Bool Base64_Encode(uint8 const *src, size_t srcLength,
|
|
- char *target, size_t targSize,
|
|
- size_t *dataLength);
|
|
-Bool Base64_Decode(char const *src,
|
|
- uint8 *target, size_t targSize,
|
|
- size_t *dataLength);
|
|
-Bool Base64_ChunkDecode(char const *src, size_t inSize,
|
|
- uint8 *target, size_t targSize,
|
|
- size_t *dataLength);
|
|
-Bool Base64_ValidEncoding(char const *src, size_t srcLength);
|
|
-size_t Base64_EncodedLength(uint8 const *src, size_t srcLength);
|
|
-size_t Base64_DecodedLength(char const *src, size_t srcLength);
|
|
-Bool Base64_EasyEncode(const uint8 *src, size_t srcLength,
|
|
- char **target);
|
|
-Bool Base64_EasyDecode(const char *src,
|
|
- uint8 **target, size_t *targSize);
|
|
-
|
|
-#endif
|
|
--- lib/misc/base64.c.orig 2013-12-27 16:38:22.000000000 +0000
|
|
+++ lib/misc/base64.c 2013-12-27 16:38:36.000000000 +0000
|
|
@@ -1,634 +0,0 @@
|
|
-/*
|
|
- * Copyright (c) 1996, 1998 by Internet Software Consortium.
|
|
- *
|
|
- * Permission to use, copy, modify, and distribute this software for any
|
|
- * purpose with or without fee is hereby granted, provided that the above
|
|
- * copyright notice and this permission notice appear in all copies.
|
|
- *
|
|
- * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
|
- * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
|
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
|
- * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
|
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
|
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
|
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
- * SOFTWARE.
|
|
- */
|
|
-
|
|
-/*
|
|
- * Portions Copyright (c) 1995 by International Business Machines, Inc.
|
|
- *
|
|
- * International Business Machines, Inc. (hereinafter called IBM) grants
|
|
- * permission under its copyrights to use, copy, modify, and distribute this
|
|
- * Software with or without fee, provided that the above copyright notice and
|
|
- * all paragraphs of this notice appear in all copies, and that the name of IBM
|
|
- * not be used in connection with the marketing of any product incorporating
|
|
- * the Software or modifications thereof, without specific, written prior
|
|
- * permission.
|
|
- *
|
|
- * To the extent it has a right to do so, IBM grants an immunity from suit
|
|
- * under its patents, if any, for the use, sale or manufacture of products to
|
|
- * the extent that such products are used for performing Domain Name System
|
|
- * dynamic updates in TCP/IP networks by means of the Software. No immunity is
|
|
- * granted for any product per se or for any other function of any product.
|
|
- *
|
|
- * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
|
|
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
- * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
|
|
- * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
|
|
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
|
|
- * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
|
- */
|
|
-
|
|
-#include <sys/types.h>
|
|
-
|
|
-#include <ctype.h>
|
|
-#include <stdio.h>
|
|
-#include <stdlib.h>
|
|
-#include <string.h>
|
|
-#include "vm_basic_types.h"
|
|
-#include "vm_assert.h"
|
|
-#include "base64.h"
|
|
-
|
|
-static const char Base64[] =
|
|
-"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
-static const char Pad64 = '=';
|
|
-
|
|
-// Special markers
|
|
-enum {
|
|
- ILLEGAL = -1, EOM = -2, WS = -3
|
|
-};
|
|
-
|
|
-/*
|
|
- * Reverse byte map used for decoding. Except for specials (negative values), contains the index
|
|
- * into Base64[] where given value is found, ie: base64Reverse[Base64[n]] = n, for 0 <= n < 64
|
|
- *
|
|
- * This static initialization replaces, and should have identical result to, this runtime init:
|
|
- *
|
|
- * for (i = 0; i < 256; ++i) {
|
|
- * base64Reverse[i] = isspace(i) ? WS : ILLEGAL;
|
|
- * }
|
|
- * base64Reverse['\0'] = EOM;
|
|
- * base64Reverse['='] = EOM;
|
|
- * for (i = 0; Base64[i]; ++i) {
|
|
- * base64Reverse[(unsigned)Base64[i]] = (char) i;
|
|
- * }
|
|
- */
|
|
-
|
|
-static const signed char base64Reverse[256] = {
|
|
- EOM, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 00-07 */
|
|
- ILLEGAL, WS, WS, WS, WS, WS, ILLEGAL, ILLEGAL, /* 08-0F */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 10-17 */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 18-1F */
|
|
- WS, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 20-27 */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, 62, ILLEGAL, ILLEGAL, ILLEGAL, 63, /* 28-2F */
|
|
- 52, 53, 54, 55, 56, 57, 58, 59, /* 30-37 */
|
|
- 60, 61, ILLEGAL, ILLEGAL, ILLEGAL, EOM, ILLEGAL, ILLEGAL, /* 38-3F */
|
|
- ILLEGAL, 0, 1, 2, 3, 4, 5, 6, /* 40-47 */
|
|
- 7, 8, 9, 10, 11, 12, 13, 14, /* 48-4F */
|
|
- 15, 16, 17, 18, 19, 20, 21, 22, /* 50-57 */
|
|
- 23, 24, 25, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 58-5F */
|
|
- ILLEGAL, 26, 27, 28, 29, 30, 31, 32, /* 60-67 */
|
|
- 33, 34, 35, 36, 37, 38, 39, 40, /* 68-6F */
|
|
- 41, 42, 43, 44, 45, 46, 47, 48, /* 70-77 */
|
|
- 49, 50, 51, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 78-7F */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 80-87 */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 88-8F */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 90-97 */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 98-9F */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* A0-A7 */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* A8-AF */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* B0-B7 */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* B8-BF */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* C0-C7 */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* C8-CF */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* D0-D7 */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* D8-DF */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* E0-E7 */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* E8-EF */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* F0-F7 */
|
|
- ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL }; /* F8-FF */
|
|
-
|
|
-/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
|
|
- The following encoding technique is taken from RFC 1521 by Borenstein
|
|
- and Freed. It is reproduced here in a slightly edited form for
|
|
- convenience.
|
|
-
|
|
- A 65-character subset of US-ASCII is used, enabling 6 bits to be
|
|
- represented per printable character. (The extra 65th character, "=",
|
|
- is used to signify a special processing function.)
|
|
-
|
|
- The encoding process represents 24-bit groups of input bits as output
|
|
- strings of 4 encoded characters. Proceeding from left to right, a
|
|
- 24-bit input group is formed by concatenating 3 8-bit input groups.
|
|
- These 24 bits are then treated as 4 concatenated 6-bit groups, each
|
|
- of which is translated into a single digit in the base64 alphabet.
|
|
-
|
|
- Each 6-bit group is used as an index into an array of 64 printable
|
|
- characters. The character referenced by the index is placed in the
|
|
- output string.
|
|
-
|
|
- Table 1: The Base64 Alphabet
|
|
-
|
|
- Value Encoding Value Encoding Value Encoding Value Encoding
|
|
- 0 A 17 R 34 i 51 z
|
|
- 1 B 18 S 35 j 52 0
|
|
- 2 C 19 T 36 k 53 1
|
|
- 3 D 20 U 37 l 54 2
|
|
- 4 E 21 V 38 m 55 3
|
|
- 5 F 22 W 39 n 56 4
|
|
- 6 G 23 X 40 o 57 5
|
|
- 7 H 24 Y 41 p 58 6
|
|
- 8 I 25 Z 42 q 59 7
|
|
- 9 J 26 a 43 r 60 8
|
|
- 10 K 27 b 44 s 61 9
|
|
- 11 L 28 c 45 t 62 +
|
|
- 12 M 29 d 46 u 63 /
|
|
- 13 N 30 e 47 v
|
|
- 14 O 31 f 48 w (pad) =
|
|
- 15 P 32 g 49 x
|
|
- 16 Q 33 h 50 y
|
|
-
|
|
- Special processing is performed if fewer than 24 bits are available
|
|
- at the end of the data being encoded. A full encoding quantum is
|
|
- always completed at the end of a quantity. When fewer than 24 input
|
|
- bits are available in an input group, zero bits are added (on the
|
|
- right) to form an integral number of 6-bit groups. Padding at the
|
|
- end of the data is performed using the '=' character.
|
|
-
|
|
- Since all base64 input is an integral number of octets, only the
|
|
- -------------------------------------------------
|
|
- following cases can arise:
|
|
-
|
|
- (1) the final quantum of encoding input is an integral
|
|
- multiple of 24 bits; here, the final unit of encoded
|
|
- output will be an integral multiple of 4 characters
|
|
- with no "=" padding,
|
|
- (2) the final quantum of encoding input is exactly 8 bits;
|
|
- here, the final unit of encoded output will be two
|
|
- characters followed by two "=" padding characters, or
|
|
- (3) the final quantum of encoding input is exactly 16 bits;
|
|
- here, the final unit of encoded output will be three
|
|
- characters followed by one "=" padding character.
|
|
-*/
|
|
-
|
|
-/*
|
|
- *----------------------------------------------------------------------------
|
|
- *
|
|
- * Base64_Encode --
|
|
- *
|
|
- * Base64-encodes srcLength bytes from src and stores result in dst.
|
|
- *
|
|
- * Results:
|
|
- * TRUE if the destination held enough space for the decoded result,
|
|
- * FALSE otherwise.
|
|
- *
|
|
- * Side effects:
|
|
- * Updates dstSize with the number of encoded bytes (excluding the
|
|
- * terminating '\0').
|
|
- *
|
|
- *----------------------------------------------------------------------------
|
|
- */
|
|
-
|
|
-Bool
|
|
-Base64_Encode(uint8 const *src, // IN:
|
|
- size_t srcSize, // IN:
|
|
- char *dst, // OUT:
|
|
- size_t dstMax, // IN: max result length, including NUL byte
|
|
- size_t *dstSize) // OUT: result length, may be NULL
|
|
-{
|
|
- char *dst0 = dst;
|
|
-
|
|
- ASSERT(src || srcSize == 0);
|
|
- ASSERT(dst);
|
|
-
|
|
- if (4 * ((srcSize + 2) / 3) >= dstMax) {
|
|
- if (dstSize) {
|
|
- *dstSize = 0;
|
|
- }
|
|
-
|
|
- return FALSE;
|
|
- }
|
|
-
|
|
- while (LIKELY(srcSize > 2)) {
|
|
- dst[0] = Base64[src[0] >> 2];
|
|
- dst[1] = Base64[(src[0] & 0x03) << 4 | src[1] >> 4];
|
|
- dst[2] = Base64[(src[1] & 0x0f) << 2 | src[2] >> 6];
|
|
- dst[3] = Base64[src[2] & 0x3f];
|
|
-
|
|
- srcSize -= 3;
|
|
- src += 3;
|
|
- dst += 4;
|
|
- }
|
|
-
|
|
- /* Now we worry about padding. */
|
|
- if (LIKELY(srcSize--)) {
|
|
- uint8 src1 = srcSize ? src[1] : 0;
|
|
-
|
|
- dst[0] = Base64[src[0] >> 2];
|
|
- dst[1] = Base64[(src[0] & 0x03) << 4 | src1 >> 4];
|
|
- dst[2] = srcSize ? Base64[(src1 & 0x0f) << 2] : Pad64;
|
|
- dst[3] = Pad64;
|
|
- dst += 4;
|
|
- }
|
|
-
|
|
- dst[0] = '\0'; /* Returned value doesn't count \0. */
|
|
- if (dstSize) {
|
|
- *dstSize = dst - dst0;
|
|
- }
|
|
-
|
|
- return TRUE;
|
|
-}
|
|
-
|
|
-
|
|
-#ifdef __I_WANT_TO_TEST_THIS__
|
|
-main()
|
|
-{
|
|
- struct {
|
|
- char *in, *out;
|
|
- } tests[] = {
|
|
- {"", ""},
|
|
- {"MQ==", "1"},
|
|
- {"MTI=", "12"},
|
|
- {"MTIz", "123"},
|
|
- {"MTIzNA==", "1234"},
|
|
- {"SGVsbG8gRWR3YXJkIGFuZCBKb2huIQ==","Hello Edward and John!"},
|
|
- {NULL, NULL}
|
|
- }, *test;
|
|
-
|
|
- size_t bufMax;
|
|
- if (1) {
|
|
- for (bufMax = 0; bufMax < 7; ++bufMax) {
|
|
- char buf[999];
|
|
- size_t bufSize;
|
|
-
|
|
- if (bufMax == 6) {
|
|
- bufMax = sizeof buf;
|
|
- }
|
|
-
|
|
- printf("\nBuffer size %ld:\n", bufMax);
|
|
-
|
|
- test = tests;
|
|
- for (; test->in; ++test) {
|
|
- Bool r;
|
|
-
|
|
- r = Base64_Decode(test->in, buf, bufMax, &bufSize);
|
|
-
|
|
- if ((bufMax > strlen(test->out)) && (bufSize < strlen(test->out))) {
|
|
- printf("Decoding of %s failed. Decoded size %ld < expected %ld\n",
|
|
- test->in, bufSize, strlen(test->out));
|
|
- }
|
|
- if (memcmp(test->out, buf, bufSize) != 0) {
|
|
- printf("Decoding of %s failed. Got %s (%ld), not %s\n",
|
|
- test->in, buf, bufSize, test->out);
|
|
- } else {
|
|
- printf("Good: %s -> %s (%ld)\n", test->in, buf, bufSize);
|
|
- }
|
|
-
|
|
- r = Base64_Encode(test->out, strlen(test->out),
|
|
- buf, bufMax, &bufSize);
|
|
- buf[bufMax] = 0;
|
|
-
|
|
- if (bufMax <= strlen(test->in) && r == 0) {
|
|
- printf("Good: %s. Failed for bufMax %ld (required %ld)\n", test->out, bufMax, strlen(test->in));
|
|
- } else {
|
|
- if (!r || bufSize != strlen(test->in) ||
|
|
- strncmp(test->in, buf, bufSize) != 0) {
|
|
- printf("Encoding of %s failed. r = %d. Got %s (%ld), not %s\n",
|
|
- test->out, r, buf, bufSize, test->in);
|
|
- } else {
|
|
- printf("Good: %s -> %s (%ld)\n", test->out, buf, bufSize);
|
|
- }
|
|
- }
|
|
- }
|
|
- }
|
|
- }
|
|
-
|
|
- for (bufMax = 0; bufMax < 100000; ++bufMax) {
|
|
- char random_in[8000];
|
|
- char random_out[16000];
|
|
- size_t bufSize;
|
|
-
|
|
- Bool r = Base64_Encode(random_in, sizeof random_in,
|
|
- random_out, sizeof random_out, &bufSize);
|
|
-
|
|
- if (!r) {
|
|
- printf("Encoding failed.\n");
|
|
- }
|
|
- }
|
|
-}
|
|
-#endif
|
|
-
|
|
-
|
|
-/*
|
|
- *----------------------------------------------------------------------------
|
|
- *
|
|
- * Base64_Decode --
|
|
- *
|
|
- * Skips all whitespace anywhere. Converts characters, four at
|
|
- * a time, starting at (or after) src from base - 64 numbers into three
|
|
- * 8 bit bytes in the target area. Returns the number of data bytes
|
|
- * stored at the target in the provided out parameter.
|
|
- *
|
|
- * Results:
|
|
- * TRUE on success, FALSE on failure.
|
|
- *
|
|
- * Side effects:
|
|
- * None.
|
|
- *
|
|
- *----------------------------------------------------------------------------
|
|
- */
|
|
-
|
|
-Bool
|
|
-Base64_Decode(char const *in, // IN:
|
|
- uint8 *out, // OUT:
|
|
- size_t outSize, // IN:
|
|
- size_t *dataLength) // OUT:
|
|
-{
|
|
- return Base64_ChunkDecode(in, -1, out, outSize, dataLength);
|
|
-}
|
|
-
|
|
-
|
|
-/*
|
|
- *----------------------------------------------------------------------------
|
|
- *
|
|
- * Base64_ChunkDecode --
|
|
- *
|
|
- * Skips all whitespace anywhere. Converts characters, four at
|
|
- * a time, starting at (or after) src from base - 64 numbers into three
|
|
- * 8 bit bytes in the target area. Conversion stops after inSize (which
|
|
- * must be a multiple of 4) characters, or an EOM marker. Returns the
|
|
- * number of data bytes stored at the target in the provided out parameter.
|
|
- *
|
|
- * Results:
|
|
- * TRUE on success, FALSE on failure.
|
|
- *
|
|
- * Side effects:
|
|
- * None.
|
|
- *
|
|
- *----------------------------------------------------------------------------
|
|
- */
|
|
-
|
|
-Bool
|
|
-Base64_ChunkDecode(char const *in, // IN:
|
|
- size_t inSize, // IN:
|
|
- uint8 *out, // OUT:
|
|
- size_t outSize, // IN:
|
|
- size_t *dataLength) // OUT:
|
|
-{
|
|
- uint32 b = 0;
|
|
- int n = 0;
|
|
- uintptr_t i = 0;
|
|
- size_t inputIndex = 0;
|
|
-
|
|
- ASSERT(in);
|
|
- ASSERT(out || outSize == 0);
|
|
- ASSERT(dataLength);
|
|
- ASSERT((inSize == -1) || (inSize % 4) == 0);
|
|
- *dataLength = 0;
|
|
-
|
|
- i = 0;
|
|
- for (;inputIndex < inSize;) {
|
|
- int p = base64Reverse[(unsigned char)in[inputIndex]];
|
|
-
|
|
- if (UNLIKELY(p < 0)) {
|
|
- switch (p) {
|
|
- case WS:
|
|
- inputIndex++;
|
|
- break;
|
|
- case EOM:
|
|
- *dataLength = i;
|
|
- return TRUE;
|
|
- case ILLEGAL:
|
|
- default:
|
|
- return FALSE;
|
|
- }
|
|
- } else {
|
|
- inputIndex++;
|
|
- if (UNLIKELY(i >= outSize)) {
|
|
- return FALSE;
|
|
- }
|
|
- b = (b << 6) | p;
|
|
- n += 6;
|
|
- if (LIKELY(n >= 8)) {
|
|
- n -= 8;
|
|
- out[i++] = b >> n;
|
|
- }
|
|
- }
|
|
- }
|
|
- *dataLength = i;
|
|
- return TRUE;
|
|
-}
|
|
-
|
|
-
|
|
-/*
|
|
- *----------------------------------------------------------------------------
|
|
- *
|
|
- * Base64_ValidEncoding --
|
|
- *
|
|
- * Returns TRUE if the specified input buffer is valid Base64 input.
|
|
- *
|
|
- * Results:
|
|
- * TRUE or FALSE.
|
|
- *
|
|
- * Side effects:
|
|
- * None.
|
|
- *
|
|
- *----------------------------------------------------------------------------
|
|
- */
|
|
-
|
|
-Bool
|
|
-Base64_ValidEncoding(char const *src, // IN:
|
|
- size_t srcLength) // IN:
|
|
-{
|
|
- size_t i;
|
|
-
|
|
- ASSERT(src);
|
|
- for (i = 0; i < srcLength; i++) {
|
|
- uint8 c = src[i]; /* MSVC CRT will die on negative arguments to is* */
|
|
-
|
|
- if (!isalpha(c) && !isdigit(c) &&
|
|
- c != '+' && c != '=' && c != '/') {
|
|
- return FALSE;
|
|
- }
|
|
- }
|
|
-
|
|
- return TRUE;
|
|
-}
|
|
-
|
|
-
|
|
-/*
|
|
- *----------------------------------------------------------------------------
|
|
- *
|
|
- * Base64_EncodedLength --
|
|
- *
|
|
- * Given a binary buffer, how many bytes would it take to encode it.
|
|
- *
|
|
- * Results:
|
|
- * Number of bytes needed to encode, including terminating NUL byte.
|
|
- *
|
|
- * Side effects:
|
|
- * None.
|
|
- *
|
|
- *----------------------------------------------------------------------------
|
|
- */
|
|
-
|
|
-size_t
|
|
-Base64_EncodedLength(uint8 const *src, // IN:
|
|
- size_t srcLength) // IN:
|
|
-{
|
|
- return ((srcLength + 2) / 3 * 4) + 1;
|
|
-}
|
|
-
|
|
-
|
|
-/*
|
|
- *----------------------------------------------------------------------------
|
|
- *
|
|
- * Base64_DecodedLength --
|
|
- *
|
|
- * Given a base64 encoded string, how many bytes do we need to decode it.
|
|
- * Assumes no whitespace. This is not necessarily the length of the
|
|
- * decoded data (Base64_Decode requires a few extra bytes... don't blame
|
|
- * me, I didn't write it).
|
|
- *
|
|
- * Results:
|
|
- * Number of bytes needed to decode input.
|
|
- *
|
|
- * Side effects:
|
|
- * None.
|
|
- *
|
|
- *----------------------------------------------------------------------------
|
|
- */
|
|
-
|
|
-size_t
|
|
-Base64_DecodedLength(char const *src, // IN:
|
|
- size_t srcLength) // IN:
|
|
-{
|
|
- size_t length;
|
|
-
|
|
- ASSERT(src);
|
|
-
|
|
- length = srcLength / 4 * 3;
|
|
- // PR 303173 - do the following check to avoid a negative value returned
|
|
- // from this function. Note: length can only be in a multiple of 3
|
|
- if (length > 2) {
|
|
- if (src[srcLength-1] == '=') {
|
|
- length--;
|
|
- }
|
|
- if (src[srcLength-2] == '=') {
|
|
- length--;
|
|
- }
|
|
- }
|
|
- return length;
|
|
-}
|
|
-
|
|
-
|
|
-/*
|
|
- *-----------------------------------------------------------------------------
|
|
- *
|
|
- * Base64_EasyEncode --
|
|
- *
|
|
- * Base64-encode 'data' into a NUL-terminated string.
|
|
- *
|
|
- * Results:
|
|
- * On success: TRUE. '*target' is set to an allocated string, that the
|
|
- * caller must eventually free().
|
|
- * On failure: FALSE. '*target' is set to NULL.
|
|
- *
|
|
- * Side effects:
|
|
- * None.
|
|
- *
|
|
- *-----------------------------------------------------------------------------
|
|
- */
|
|
-
|
|
-Bool
|
|
-Base64_EasyEncode(const uint8 *src, // IN: data to encode
|
|
- size_t srcLength, // IN: data size
|
|
- char **target) // OUT: encoded string
|
|
-{
|
|
- Bool succeeded = FALSE;
|
|
- size_t size;
|
|
-
|
|
- ASSERT(src);
|
|
- ASSERT(target);
|
|
-
|
|
- size = Base64_EncodedLength(src, srcLength);
|
|
-
|
|
- *target = (char *) malloc(size);
|
|
-
|
|
- if (!*target) {
|
|
- goto exit;
|
|
- }
|
|
-
|
|
- if (!Base64_Encode(src, srcLength, *target, size, NULL)) {
|
|
- goto exit;
|
|
- }
|
|
-
|
|
- succeeded = TRUE;
|
|
-
|
|
-exit:
|
|
- if (!succeeded) {
|
|
- free(*target);
|
|
- *target = NULL;
|
|
- }
|
|
-
|
|
- return succeeded;
|
|
-}
|
|
-
|
|
-
|
|
-/*
|
|
- *-----------------------------------------------------------------------------
|
|
- *
|
|
- * Base64_EasyDecode --
|
|
- *
|
|
- * Base64-decode 'src' into a buffer.
|
|
- *
|
|
- * Results:
|
|
- * TRUE on success, FALSE otherwise, plus the decoded data on success.
|
|
- * Caller must free 'target' with free().
|
|
- *
|
|
- * Side effects:
|
|
- * None.
|
|
- *
|
|
- *-----------------------------------------------------------------------------
|
|
- */
|
|
-
|
|
-Bool
|
|
-Base64_EasyDecode(const char *src, // IN: data to decode
|
|
- uint8 **target, // OUT: decoded data
|
|
- size_t *targSize) // OUT: data size
|
|
-{
|
|
- Bool succeeded = FALSE;
|
|
- size_t theDataSize;
|
|
- uint8 *theData;
|
|
-
|
|
- ASSERT(src);
|
|
- ASSERT(target);
|
|
- ASSERT(targSize);
|
|
-
|
|
- theDataSize = Base64_DecodedLength(src, strlen(src));
|
|
-
|
|
- theData = (uint8 *) malloc(theDataSize);
|
|
-
|
|
- if (!theData) {
|
|
- goto exit;
|
|
- }
|
|
-
|
|
- if (!Base64_Decode(src, theData, theDataSize, &theDataSize)) {
|
|
- free(theData);
|
|
- goto exit;
|
|
- }
|
|
-
|
|
- *target = theData;
|
|
- *targSize = theDataSize;
|
|
-
|
|
- succeeded = TRUE;
|
|
-
|
|
-exit:
|
|
- if (!succeeded) {
|
|
- *target = NULL;
|
|
- *targSize = 0;
|
|
- }
|
|
-
|
|
- return succeeded;
|
|
-}
|
|
--- lib/include/ovmbase64.h.orig 2013-12-27 16:39:12.000000000 +0000
|
|
+++ lib/include/ovmbase64.h 2013-12-27 16:39:46.000000000 +0000
|
|
@@ -0,0 +1,46 @@
|
|
+/*********************************************************
|
|
+ * Copyright (C) 2004 VMware, Inc. All rights reserved.
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or modify it
|
|
+ * under the terms of the GNU Lesser General Public License as published
|
|
+ * by the Free Software Foundation version 2.1 and no 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 Lesser GNU General Public
|
|
+ * License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU Lesser General Public License
|
|
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
|
|
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
+ *
|
|
+ *********************************************************/
|
|
+
|
|
+/*
|
|
+ * base64.h --
|
|
+ *
|
|
+ * Functions to base64 encode/decode buffers. Implemented in
|
|
+ * lib/misc/base64.c.
|
|
+ */
|
|
+
|
|
+#ifndef _BASE64_H
|
|
+#define _BASE64_H
|
|
+
|
|
+Bool Base64_Encode(uint8 const *src, size_t srcLength,
|
|
+ char *target, size_t targSize,
|
|
+ size_t *dataLength);
|
|
+Bool Base64_Decode(char const *src,
|
|
+ uint8 *target, size_t targSize,
|
|
+ size_t *dataLength);
|
|
+Bool Base64_ChunkDecode(char const *src, size_t inSize,
|
|
+ uint8 *target, size_t targSize,
|
|
+ size_t *dataLength);
|
|
+Bool Base64_ValidEncoding(char const *src, size_t srcLength);
|
|
+size_t Base64_EncodedLength(uint8 const *src, size_t srcLength);
|
|
+size_t Base64_DecodedLength(char const *src, size_t srcLength);
|
|
+Bool Base64_EasyEncode(const uint8 *src, size_t srcLength,
|
|
+ char **target);
|
|
+Bool Base64_EasyDecode(const char *src,
|
|
+ uint8 **target, size_t *targSize);
|
|
+
|
|
+#endif
|
|
--- lib/misc/ovmbase64.c.orig 2013-12-27 16:39:33.000000000 +0000
|
|
+++ lib/misc/ovmbase64.c 2013-12-27 16:39:56.000000000 +0000
|
|
@@ -0,0 +1,634 @@
|
|
+/*
|
|
+ * Copyright (c) 1996, 1998 by Internet Software Consortium.
|
|
+ *
|
|
+ * Permission to use, copy, modify, and distribute this software for any
|
|
+ * purpose with or without fee is hereby granted, provided that the above
|
|
+ * copyright notice and this permission notice appear in all copies.
|
|
+ *
|
|
+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
|
|
+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
|
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
|
|
+ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
|
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
|
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
|
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
+ * SOFTWARE.
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * Portions Copyright (c) 1995 by International Business Machines, Inc.
|
|
+ *
|
|
+ * International Business Machines, Inc. (hereinafter called IBM) grants
|
|
+ * permission under its copyrights to use, copy, modify, and distribute this
|
|
+ * Software with or without fee, provided that the above copyright notice and
|
|
+ * all paragraphs of this notice appear in all copies, and that the name of IBM
|
|
+ * not be used in connection with the marketing of any product incorporating
|
|
+ * the Software or modifications thereof, without specific, written prior
|
|
+ * permission.
|
|
+ *
|
|
+ * To the extent it has a right to do so, IBM grants an immunity from suit
|
|
+ * under its patents, if any, for the use, sale or manufacture of products to
|
|
+ * the extent that such products are used for performing Domain Name System
|
|
+ * dynamic updates in TCP/IP networks by means of the Software. No immunity is
|
|
+ * granted for any product per se or for any other function of any product.
|
|
+ *
|
|
+ * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
|
|
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
+ * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
|
|
+ * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
|
|
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
|
|
+ * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
|
+ */
|
|
+
|
|
+#include <sys/types.h>
|
|
+
|
|
+#include <ctype.h>
|
|
+#include <stdio.h>
|
|
+#include <stdlib.h>
|
|
+#include <string.h>
|
|
+#include "vm_basic_types.h"
|
|
+#include "vm_assert.h"
|
|
+#include "base64.h"
|
|
+
|
|
+static const char Base64[] =
|
|
+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
+static const char Pad64 = '=';
|
|
+
|
|
+// Special markers
|
|
+enum {
|
|
+ ILLEGAL = -1, EOM = -2, WS = -3
|
|
+};
|
|
+
|
|
+/*
|
|
+ * Reverse byte map used for decoding. Except for specials (negative values), contains the index
|
|
+ * into Base64[] where given value is found, ie: base64Reverse[Base64[n]] = n, for 0 <= n < 64
|
|
+ *
|
|
+ * This static initialization replaces, and should have identical result to, this runtime init:
|
|
+ *
|
|
+ * for (i = 0; i < 256; ++i) {
|
|
+ * base64Reverse[i] = isspace(i) ? WS : ILLEGAL;
|
|
+ * }
|
|
+ * base64Reverse['\0'] = EOM;
|
|
+ * base64Reverse['='] = EOM;
|
|
+ * for (i = 0; Base64[i]; ++i) {
|
|
+ * base64Reverse[(unsigned)Base64[i]] = (char) i;
|
|
+ * }
|
|
+ */
|
|
+
|
|
+static const signed char base64Reverse[256] = {
|
|
+ EOM, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 00-07 */
|
|
+ ILLEGAL, WS, WS, WS, WS, WS, ILLEGAL, ILLEGAL, /* 08-0F */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 10-17 */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 18-1F */
|
|
+ WS, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 20-27 */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, 62, ILLEGAL, ILLEGAL, ILLEGAL, 63, /* 28-2F */
|
|
+ 52, 53, 54, 55, 56, 57, 58, 59, /* 30-37 */
|
|
+ 60, 61, ILLEGAL, ILLEGAL, ILLEGAL, EOM, ILLEGAL, ILLEGAL, /* 38-3F */
|
|
+ ILLEGAL, 0, 1, 2, 3, 4, 5, 6, /* 40-47 */
|
|
+ 7, 8, 9, 10, 11, 12, 13, 14, /* 48-4F */
|
|
+ 15, 16, 17, 18, 19, 20, 21, 22, /* 50-57 */
|
|
+ 23, 24, 25, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 58-5F */
|
|
+ ILLEGAL, 26, 27, 28, 29, 30, 31, 32, /* 60-67 */
|
|
+ 33, 34, 35, 36, 37, 38, 39, 40, /* 68-6F */
|
|
+ 41, 42, 43, 44, 45, 46, 47, 48, /* 70-77 */
|
|
+ 49, 50, 51, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 78-7F */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 80-87 */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 88-8F */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 90-97 */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* 98-9F */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* A0-A7 */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* A8-AF */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* B0-B7 */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* B8-BF */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* C0-C7 */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* C8-CF */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* D0-D7 */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* D8-DF */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* E0-E7 */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* E8-EF */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /* F0-F7 */
|
|
+ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL }; /* F8-FF */
|
|
+
|
|
+/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
|
|
+ The following encoding technique is taken from RFC 1521 by Borenstein
|
|
+ and Freed. It is reproduced here in a slightly edited form for
|
|
+ convenience.
|
|
+
|
|
+ A 65-character subset of US-ASCII is used, enabling 6 bits to be
|
|
+ represented per printable character. (The extra 65th character, "=",
|
|
+ is used to signify a special processing function.)
|
|
+
|
|
+ The encoding process represents 24-bit groups of input bits as output
|
|
+ strings of 4 encoded characters. Proceeding from left to right, a
|
|
+ 24-bit input group is formed by concatenating 3 8-bit input groups.
|
|
+ These 24 bits are then treated as 4 concatenated 6-bit groups, each
|
|
+ of which is translated into a single digit in the base64 alphabet.
|
|
+
|
|
+ Each 6-bit group is used as an index into an array of 64 printable
|
|
+ characters. The character referenced by the index is placed in the
|
|
+ output string.
|
|
+
|
|
+ Table 1: The Base64 Alphabet
|
|
+
|
|
+ Value Encoding Value Encoding Value Encoding Value Encoding
|
|
+ 0 A 17 R 34 i 51 z
|
|
+ 1 B 18 S 35 j 52 0
|
|
+ 2 C 19 T 36 k 53 1
|
|
+ 3 D 20 U 37 l 54 2
|
|
+ 4 E 21 V 38 m 55 3
|
|
+ 5 F 22 W 39 n 56 4
|
|
+ 6 G 23 X 40 o 57 5
|
|
+ 7 H 24 Y 41 p 58 6
|
|
+ 8 I 25 Z 42 q 59 7
|
|
+ 9 J 26 a 43 r 60 8
|
|
+ 10 K 27 b 44 s 61 9
|
|
+ 11 L 28 c 45 t 62 +
|
|
+ 12 M 29 d 46 u 63 /
|
|
+ 13 N 30 e 47 v
|
|
+ 14 O 31 f 48 w (pad) =
|
|
+ 15 P 32 g 49 x
|
|
+ 16 Q 33 h 50 y
|
|
+
|
|
+ Special processing is performed if fewer than 24 bits are available
|
|
+ at the end of the data being encoded. A full encoding quantum is
|
|
+ always completed at the end of a quantity. When fewer than 24 input
|
|
+ bits are available in an input group, zero bits are added (on the
|
|
+ right) to form an integral number of 6-bit groups. Padding at the
|
|
+ end of the data is performed using the '=' character.
|
|
+
|
|
+ Since all base64 input is an integral number of octets, only the
|
|
+ -------------------------------------------------
|
|
+ following cases can arise:
|
|
+
|
|
+ (1) the final quantum of encoding input is an integral
|
|
+ multiple of 24 bits; here, the final unit of encoded
|
|
+ output will be an integral multiple of 4 characters
|
|
+ with no "=" padding,
|
|
+ (2) the final quantum of encoding input is exactly 8 bits;
|
|
+ here, the final unit of encoded output will be two
|
|
+ characters followed by two "=" padding characters, or
|
|
+ (3) the final quantum of encoding input is exactly 16 bits;
|
|
+ here, the final unit of encoded output will be three
|
|
+ characters followed by one "=" padding character.
|
|
+*/
|
|
+
|
|
+/*
|
|
+ *----------------------------------------------------------------------------
|
|
+ *
|
|
+ * Base64_Encode --
|
|
+ *
|
|
+ * Base64-encodes srcLength bytes from src and stores result in dst.
|
|
+ *
|
|
+ * Results:
|
|
+ * TRUE if the destination held enough space for the decoded result,
|
|
+ * FALSE otherwise.
|
|
+ *
|
|
+ * Side effects:
|
|
+ * Updates dstSize with the number of encoded bytes (excluding the
|
|
+ * terminating '\0').
|
|
+ *
|
|
+ *----------------------------------------------------------------------------
|
|
+ */
|
|
+
|
|
+Bool
|
|
+Base64_Encode(uint8 const *src, // IN:
|
|
+ size_t srcSize, // IN:
|
|
+ char *dst, // OUT:
|
|
+ size_t dstMax, // IN: max result length, including NUL byte
|
|
+ size_t *dstSize) // OUT: result length, may be NULL
|
|
+{
|
|
+ char *dst0 = dst;
|
|
+
|
|
+ ASSERT(src || srcSize == 0);
|
|
+ ASSERT(dst);
|
|
+
|
|
+ if (4 * ((srcSize + 2) / 3) >= dstMax) {
|
|
+ if (dstSize) {
|
|
+ *dstSize = 0;
|
|
+ }
|
|
+
|
|
+ return FALSE;
|
|
+ }
|
|
+
|
|
+ while (LIKELY(srcSize > 2)) {
|
|
+ dst[0] = Base64[src[0] >> 2];
|
|
+ dst[1] = Base64[(src[0] & 0x03) << 4 | src[1] >> 4];
|
|
+ dst[2] = Base64[(src[1] & 0x0f) << 2 | src[2] >> 6];
|
|
+ dst[3] = Base64[src[2] & 0x3f];
|
|
+
|
|
+ srcSize -= 3;
|
|
+ src += 3;
|
|
+ dst += 4;
|
|
+ }
|
|
+
|
|
+ /* Now we worry about padding. */
|
|
+ if (LIKELY(srcSize--)) {
|
|
+ uint8 src1 = srcSize ? src[1] : 0;
|
|
+
|
|
+ dst[0] = Base64[src[0] >> 2];
|
|
+ dst[1] = Base64[(src[0] & 0x03) << 4 | src1 >> 4];
|
|
+ dst[2] = srcSize ? Base64[(src1 & 0x0f) << 2] : Pad64;
|
|
+ dst[3] = Pad64;
|
|
+ dst += 4;
|
|
+ }
|
|
+
|
|
+ dst[0] = '\0'; /* Returned value doesn't count \0. */
|
|
+ if (dstSize) {
|
|
+ *dstSize = dst - dst0;
|
|
+ }
|
|
+
|
|
+ return TRUE;
|
|
+}
|
|
+
|
|
+
|
|
+#ifdef __I_WANT_TO_TEST_THIS__
|
|
+main()
|
|
+{
|
|
+ struct {
|
|
+ char *in, *out;
|
|
+ } tests[] = {
|
|
+ {"", ""},
|
|
+ {"MQ==", "1"},
|
|
+ {"MTI=", "12"},
|
|
+ {"MTIz", "123"},
|
|
+ {"MTIzNA==", "1234"},
|
|
+ {"SGVsbG8gRWR3YXJkIGFuZCBKb2huIQ==","Hello Edward and John!"},
|
|
+ {NULL, NULL}
|
|
+ }, *test;
|
|
+
|
|
+ size_t bufMax;
|
|
+ if (1) {
|
|
+ for (bufMax = 0; bufMax < 7; ++bufMax) {
|
|
+ char buf[999];
|
|
+ size_t bufSize;
|
|
+
|
|
+ if (bufMax == 6) {
|
|
+ bufMax = sizeof buf;
|
|
+ }
|
|
+
|
|
+ printf("\nBuffer size %ld:\n", bufMax);
|
|
+
|
|
+ test = tests;
|
|
+ for (; test->in; ++test) {
|
|
+ Bool r;
|
|
+
|
|
+ r = Base64_Decode(test->in, buf, bufMax, &bufSize);
|
|
+
|
|
+ if ((bufMax > strlen(test->out)) && (bufSize < strlen(test->out))) {
|
|
+ printf("Decoding of %s failed. Decoded size %ld < expected %ld\n",
|
|
+ test->in, bufSize, strlen(test->out));
|
|
+ }
|
|
+ if (memcmp(test->out, buf, bufSize) != 0) {
|
|
+ printf("Decoding of %s failed. Got %s (%ld), not %s\n",
|
|
+ test->in, buf, bufSize, test->out);
|
|
+ } else {
|
|
+ printf("Good: %s -> %s (%ld)\n", test->in, buf, bufSize);
|
|
+ }
|
|
+
|
|
+ r = Base64_Encode(test->out, strlen(test->out),
|
|
+ buf, bufMax, &bufSize);
|
|
+ buf[bufMax] = 0;
|
|
+
|
|
+ if (bufMax <= strlen(test->in) && r == 0) {
|
|
+ printf("Good: %s. Failed for bufMax %ld (required %ld)\n", test->out, bufMax, strlen(test->in));
|
|
+ } else {
|
|
+ if (!r || bufSize != strlen(test->in) ||
|
|
+ strncmp(test->in, buf, bufSize) != 0) {
|
|
+ printf("Encoding of %s failed. r = %d. Got %s (%ld), not %s\n",
|
|
+ test->out, r, buf, bufSize, test->in);
|
|
+ } else {
|
|
+ printf("Good: %s -> %s (%ld)\n", test->out, buf, bufSize);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ for (bufMax = 0; bufMax < 100000; ++bufMax) {
|
|
+ char random_in[8000];
|
|
+ char random_out[16000];
|
|
+ size_t bufSize;
|
|
+
|
|
+ Bool r = Base64_Encode(random_in, sizeof random_in,
|
|
+ random_out, sizeof random_out, &bufSize);
|
|
+
|
|
+ if (!r) {
|
|
+ printf("Encoding failed.\n");
|
|
+ }
|
|
+ }
|
|
+}
|
|
+#endif
|
|
+
|
|
+
|
|
+/*
|
|
+ *----------------------------------------------------------------------------
|
|
+ *
|
|
+ * Base64_Decode --
|
|
+ *
|
|
+ * Skips all whitespace anywhere. Converts characters, four at
|
|
+ * a time, starting at (or after) src from base - 64 numbers into three
|
|
+ * 8 bit bytes in the target area. Returns the number of data bytes
|
|
+ * stored at the target in the provided out parameter.
|
|
+ *
|
|
+ * Results:
|
|
+ * TRUE on success, FALSE on failure.
|
|
+ *
|
|
+ * Side effects:
|
|
+ * None.
|
|
+ *
|
|
+ *----------------------------------------------------------------------------
|
|
+ */
|
|
+
|
|
+Bool
|
|
+Base64_Decode(char const *in, // IN:
|
|
+ uint8 *out, // OUT:
|
|
+ size_t outSize, // IN:
|
|
+ size_t *dataLength) // OUT:
|
|
+{
|
|
+ return Base64_ChunkDecode(in, -1, out, outSize, dataLength);
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ *----------------------------------------------------------------------------
|
|
+ *
|
|
+ * Base64_ChunkDecode --
|
|
+ *
|
|
+ * Skips all whitespace anywhere. Converts characters, four at
|
|
+ * a time, starting at (or after) src from base - 64 numbers into three
|
|
+ * 8 bit bytes in the target area. Conversion stops after inSize (which
|
|
+ * must be a multiple of 4) characters, or an EOM marker. Returns the
|
|
+ * number of data bytes stored at the target in the provided out parameter.
|
|
+ *
|
|
+ * Results:
|
|
+ * TRUE on success, FALSE on failure.
|
|
+ *
|
|
+ * Side effects:
|
|
+ * None.
|
|
+ *
|
|
+ *----------------------------------------------------------------------------
|
|
+ */
|
|
+
|
|
+Bool
|
|
+Base64_ChunkDecode(char const *in, // IN:
|
|
+ size_t inSize, // IN:
|
|
+ uint8 *out, // OUT:
|
|
+ size_t outSize, // IN:
|
|
+ size_t *dataLength) // OUT:
|
|
+{
|
|
+ uint32 b = 0;
|
|
+ int n = 0;
|
|
+ uintptr_t i = 0;
|
|
+ size_t inputIndex = 0;
|
|
+
|
|
+ ASSERT(in);
|
|
+ ASSERT(out || outSize == 0);
|
|
+ ASSERT(dataLength);
|
|
+ ASSERT((inSize == -1) || (inSize % 4) == 0);
|
|
+ *dataLength = 0;
|
|
+
|
|
+ i = 0;
|
|
+ for (;inputIndex < inSize;) {
|
|
+ int p = base64Reverse[(unsigned char)in[inputIndex]];
|
|
+
|
|
+ if (UNLIKELY(p < 0)) {
|
|
+ switch (p) {
|
|
+ case WS:
|
|
+ inputIndex++;
|
|
+ break;
|
|
+ case EOM:
|
|
+ *dataLength = i;
|
|
+ return TRUE;
|
|
+ case ILLEGAL:
|
|
+ default:
|
|
+ return FALSE;
|
|
+ }
|
|
+ } else {
|
|
+ inputIndex++;
|
|
+ if (UNLIKELY(i >= outSize)) {
|
|
+ return FALSE;
|
|
+ }
|
|
+ b = (b << 6) | p;
|
|
+ n += 6;
|
|
+ if (LIKELY(n >= 8)) {
|
|
+ n -= 8;
|
|
+ out[i++] = b >> n;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ *dataLength = i;
|
|
+ return TRUE;
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ *----------------------------------------------------------------------------
|
|
+ *
|
|
+ * Base64_ValidEncoding --
|
|
+ *
|
|
+ * Returns TRUE if the specified input buffer is valid Base64 input.
|
|
+ *
|
|
+ * Results:
|
|
+ * TRUE or FALSE.
|
|
+ *
|
|
+ * Side effects:
|
|
+ * None.
|
|
+ *
|
|
+ *----------------------------------------------------------------------------
|
|
+ */
|
|
+
|
|
+Bool
|
|
+Base64_ValidEncoding(char const *src, // IN:
|
|
+ size_t srcLength) // IN:
|
|
+{
|
|
+ size_t i;
|
|
+
|
|
+ ASSERT(src);
|
|
+ for (i = 0; i < srcLength; i++) {
|
|
+ uint8 c = src[i]; /* MSVC CRT will die on negative arguments to is* */
|
|
+
|
|
+ if (!isalpha(c) && !isdigit(c) &&
|
|
+ c != '+' && c != '=' && c != '/') {
|
|
+ return FALSE;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return TRUE;
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ *----------------------------------------------------------------------------
|
|
+ *
|
|
+ * Base64_EncodedLength --
|
|
+ *
|
|
+ * Given a binary buffer, how many bytes would it take to encode it.
|
|
+ *
|
|
+ * Results:
|
|
+ * Number of bytes needed to encode, including terminating NUL byte.
|
|
+ *
|
|
+ * Side effects:
|
|
+ * None.
|
|
+ *
|
|
+ *----------------------------------------------------------------------------
|
|
+ */
|
|
+
|
|
+size_t
|
|
+Base64_EncodedLength(uint8 const *src, // IN:
|
|
+ size_t srcLength) // IN:
|
|
+{
|
|
+ return ((srcLength + 2) / 3 * 4) + 1;
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ *----------------------------------------------------------------------------
|
|
+ *
|
|
+ * Base64_DecodedLength --
|
|
+ *
|
|
+ * Given a base64 encoded string, how many bytes do we need to decode it.
|
|
+ * Assumes no whitespace. This is not necessarily the length of the
|
|
+ * decoded data (Base64_Decode requires a few extra bytes... don't blame
|
|
+ * me, I didn't write it).
|
|
+ *
|
|
+ * Results:
|
|
+ * Number of bytes needed to decode input.
|
|
+ *
|
|
+ * Side effects:
|
|
+ * None.
|
|
+ *
|
|
+ *----------------------------------------------------------------------------
|
|
+ */
|
|
+
|
|
+size_t
|
|
+Base64_DecodedLength(char const *src, // IN:
|
|
+ size_t srcLength) // IN:
|
|
+{
|
|
+ size_t length;
|
|
+
|
|
+ ASSERT(src);
|
|
+
|
|
+ length = srcLength / 4 * 3;
|
|
+ // PR 303173 - do the following check to avoid a negative value returned
|
|
+ // from this function. Note: length can only be in a multiple of 3
|
|
+ if (length > 2) {
|
|
+ if (src[srcLength-1] == '=') {
|
|
+ length--;
|
|
+ }
|
|
+ if (src[srcLength-2] == '=') {
|
|
+ length--;
|
|
+ }
|
|
+ }
|
|
+ return length;
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ *-----------------------------------------------------------------------------
|
|
+ *
|
|
+ * Base64_EasyEncode --
|
|
+ *
|
|
+ * Base64-encode 'data' into a NUL-terminated string.
|
|
+ *
|
|
+ * Results:
|
|
+ * On success: TRUE. '*target' is set to an allocated string, that the
|
|
+ * caller must eventually free().
|
|
+ * On failure: FALSE. '*target' is set to NULL.
|
|
+ *
|
|
+ * Side effects:
|
|
+ * None.
|
|
+ *
|
|
+ *-----------------------------------------------------------------------------
|
|
+ */
|
|
+
|
|
+Bool
|
|
+Base64_EasyEncode(const uint8 *src, // IN: data to encode
|
|
+ size_t srcLength, // IN: data size
|
|
+ char **target) // OUT: encoded string
|
|
+{
|
|
+ Bool succeeded = FALSE;
|
|
+ size_t size;
|
|
+
|
|
+ ASSERT(src);
|
|
+ ASSERT(target);
|
|
+
|
|
+ size = Base64_EncodedLength(src, srcLength);
|
|
+
|
|
+ *target = (char *) malloc(size);
|
|
+
|
|
+ if (!*target) {
|
|
+ goto exit;
|
|
+ }
|
|
+
|
|
+ if (!Base64_Encode(src, srcLength, *target, size, NULL)) {
|
|
+ goto exit;
|
|
+ }
|
|
+
|
|
+ succeeded = TRUE;
|
|
+
|
|
+exit:
|
|
+ if (!succeeded) {
|
|
+ free(*target);
|
|
+ *target = NULL;
|
|
+ }
|
|
+
|
|
+ return succeeded;
|
|
+}
|
|
+
|
|
+
|
|
+/*
|
|
+ *-----------------------------------------------------------------------------
|
|
+ *
|
|
+ * Base64_EasyDecode --
|
|
+ *
|
|
+ * Base64-decode 'src' into a buffer.
|
|
+ *
|
|
+ * Results:
|
|
+ * TRUE on success, FALSE otherwise, plus the decoded data on success.
|
|
+ * Caller must free 'target' with free().
|
|
+ *
|
|
+ * Side effects:
|
|
+ * None.
|
|
+ *
|
|
+ *-----------------------------------------------------------------------------
|
|
+ */
|
|
+
|
|
+Bool
|
|
+Base64_EasyDecode(const char *src, // IN: data to decode
|
|
+ uint8 **target, // OUT: decoded data
|
|
+ size_t *targSize) // OUT: data size
|
|
+{
|
|
+ Bool succeeded = FALSE;
|
|
+ size_t theDataSize;
|
|
+ uint8 *theData;
|
|
+
|
|
+ ASSERT(src);
|
|
+ ASSERT(target);
|
|
+ ASSERT(targSize);
|
|
+
|
|
+ theDataSize = Base64_DecodedLength(src, strlen(src));
|
|
+
|
|
+ theData = (uint8 *) malloc(theDataSize);
|
|
+
|
|
+ if (!theData) {
|
|
+ goto exit;
|
|
+ }
|
|
+
|
|
+ if (!Base64_Decode(src, theData, theDataSize, &theDataSize)) {
|
|
+ free(theData);
|
|
+ goto exit;
|
|
+ }
|
|
+
|
|
+ *target = theData;
|
|
+ *targSize = theDataSize;
|
|
+
|
|
+ succeeded = TRUE;
|
|
+
|
|
+exit:
|
|
+ if (!succeeded) {
|
|
+ *target = NULL;
|
|
+ *targSize = 0;
|
|
+ }
|
|
+
|
|
+ return succeeded;
|
|
+}
|
|
--- lib/foundryMsg/foundryMsg.c.orig 2013-12-27 16:40:58.000000000 +0000
|
|
+++ lib/foundryMsg/foundryMsg.c 2013-12-27 16:41:30.000000000 +0000
|
|
@@ -29,7 +29,7 @@
|
|
#include "vm_version.h"
|
|
#include "util.h"
|
|
#include "str.h"
|
|
-#include "base64.h"
|
|
+#include "ovmbase64.h"
|
|
|
|
#include "vixOpenSource.h"
|
|
#include "vixCommands.h"
|
|
--- lib/file/file.c.orig 2013-12-27 16:40:58.000000000 +0000
|
|
+++ lib/file/file.c 2013-12-27 16:41:39.000000000 +0000
|
|
@@ -60,7 +60,7 @@
|
|
#include "fileIO.h"
|
|
#include "fileInt.h"
|
|
#include "dynbuf.h"
|
|
-#include "base64.h"
|
|
+#include "ovmbase64.h"
|
|
#include "timeutil.h"
|
|
#include "hostinfo.h"
|
|
#include "hostType.h"
|
|
--- lib/misc/Makefile.in.orig 2013-09-23 15:51:46.000000000 +0000
|
|
+++ lib/misc/Makefile.in 2013-12-27 16:57:14.000000000 +0000
|
|
@@ -82,7 +82,7 @@
|
|
CONFIG_CLEAN_VPATH_FILES =
|
|
LTLIBRARIES = $(noinst_LTLIBRARIES)
|
|
libMisc_la_LIBADD =
|
|
-am_libMisc_la_OBJECTS = atomic.lo base64.lo codeset.lo codesetBase.lo \
|
|
+am_libMisc_la_OBJECTS = atomic.lo ovmbase64.lo codeset.lo codesetBase.lo \
|
|
codesetOld.lo dynarray.lo dynbuf.lo escape.lo hashTable.lo \
|
|
hostinfo.lo hostinfoHV.lo hostinfoPosix.lo hostname.lo \
|
|
hostType.lo idLinux.lo iovector.lo logFixed.lo machineID.lo \
|
|
@@ -301,7 +301,7 @@
|
|
top_builddir = @top_builddir@
|
|
top_srcdir = @top_srcdir@
|
|
noinst_LTLIBRARIES = libMisc.la
|
|
-libMisc_la_SOURCES = atomic.c base64.c codeset.c codesetBase.c \
|
|
+libMisc_la_SOURCES = atomic.c ovmbase64.c codeset.c codesetBase.c \
|
|
codesetOld.c dynarray.c dynbuf.c escape.c hashTable.c \
|
|
hostinfo.c hostinfoHV.c hostinfoPosix.c hostname.c hostType.c \
|
|
idLinux.c iovector.c logFixed.c machineID.c miscSolaris.c \
|
|
--- lib/misc/Makefile.am.orig 2013-12-27 16:40:58.000000000 +0000
|
|
+++ lib/misc/Makefile.am 2013-12-27 16:42:00.000000000 +0000
|
|
@@ -19,7 +19,7 @@
|
|
|
|
libMisc_la_SOURCES =
|
|
libMisc_la_SOURCES += atomic.c
|
|
-libMisc_la_SOURCES += base64.c
|
|
+libMisc_la_SOURCES += ovmbase64.c
|
|
libMisc_la_SOURCES += codeset.c
|
|
libMisc_la_SOURCES += codesetBase.c
|
|
libMisc_la_SOURCES += codesetOld.c
|
|
--- lib/user/util.c.orig 2013-12-27 16:40:58.000000000 +0000
|
|
+++ lib/user/util.c 2013-12-27 16:42:25.000000000 +0000
|
|
@@ -69,7 +69,7 @@
|
|
#include "file.h"
|
|
#include "util_shared.h"
|
|
#include "escape.h"
|
|
-#include "base64.h"
|
|
+#include "ovmbase64.h"
|
|
#include "unicode.h"
|
|
#include "posix.h"
|
|
|
|
--- services/plugins/vix/foundryToolsDaemon.c.orig 2013-12-27 16:40:58.000000000 +0000
|
|
+++ services/plugins/vix/foundryToolsDaemon.c 2013-12-27 16:42:38.000000000 +0000
|
|
@@ -68,7 +68,7 @@
|
|
#include "guest_msg_def.h"
|
|
#include "conf.h"
|
|
#include "vixCommands.h"
|
|
-#include "base64.h"
|
|
+#include "ovmbase64.h"
|
|
#include "syncDriver.h"
|
|
#include "hgfsServerManager.h"
|
|
#include "hgfs.h"
|
|
--- services/plugins/vix/vixTools.c.orig 2013-12-27 16:40:58.000000000 +0000
|
|
+++ services/plugins/vix/vixTools.c 2013-12-27 16:42:46.000000000 +0000
|
|
@@ -87,7 +87,7 @@
|
|
#include "guest_msg_def.h"
|
|
#include "conf.h"
|
|
#include "vixCommands.h"
|
|
-#include "base64.h"
|
|
+#include "ovmbase64.h"
|
|
#include "hostinfo.h"
|
|
#include "hgfsServerManager.h"
|
|
#include "hgfs.h"
|
|
--- xferlogs/xferlogs.c.orig 2013-12-27 16:40:58.000000000 +0000
|
|
+++ xferlogs/xferlogs.c 2013-12-27 16:43:01.000000000 +0000
|
|
@@ -50,7 +50,7 @@
|
|
#include "debug.h"
|
|
#include "rpcvmx.h"
|
|
#include "rpcout.h"
|
|
-#include "base64.h"
|
|
+#include "ovmbase64.h"
|
|
#include "str.h"
|
|
#include "strutil.h"
|
|
|
|
--- lib/misc/ovmbase64.c.orig 2013-12-27 16:50:49.000000000 +0000
|
|
+++ lib/misc/ovmbase64.c 2013-12-27 16:50:58.000000000 +0000
|
|
@@ -48,7 +48,7 @@
|
|
#include <string.h>
|
|
#include "vm_basic_types.h"
|
|
#include "vm_assert.h"
|
|
-#include "base64.h"
|
|
+#include "ovmbase64.h"
|
|
|
|
static const char Base64[] =
|
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|