119 lines
3.3 KiB
C
119 lines
3.3 KiB
C
/*****************************************************************************
|
|
* _ _ ____ _
|
|
* Project ___| | | | _ \| |
|
|
* / __| | | | |_) | |
|
|
* | (__| |_| | _ <| |___
|
|
* \___|\___/|_| \_\_____|
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public License
|
|
* Version 1.0 (the "License"); you may not use this file except in
|
|
* compliance with the License. You may obtain a copy of the License at
|
|
* http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS"
|
|
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing rights and limitations
|
|
* under the License.
|
|
*
|
|
* The Original Code is Curl.
|
|
*
|
|
* The Initial Developer of the Original Code is Daniel Stenberg.
|
|
*
|
|
* Portions created by the Initial Developer are Copyright (C) 1998.
|
|
* All Rights Reserved.
|
|
*
|
|
* ------------------------------------------------------------
|
|
* Main author:
|
|
* - Daniel Stenberg <daniel@haxx.se>
|
|
*
|
|
* http://curl.haxx.se
|
|
*
|
|
* $Source$
|
|
* $Revision$
|
|
* $Date$
|
|
* $Author$
|
|
* $State$
|
|
* $Locker$
|
|
*
|
|
* ------------------------------------------------------------
|
|
****************************************************************************/
|
|
|
|
#include <stdio.h>
|
|
|
|
/* ---- Base64 Encoding --- */
|
|
static char table64[]=
|
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
|
|
/*
|
|
* base64Encode()
|
|
*
|
|
* Returns the length of the newly created base64 string. The third argument
|
|
* is a pointer to an allocated area holding the base64 data. If something
|
|
* went wrong, -1 is returned.
|
|
*
|
|
* Modifed my version to resemble the krb4 one. The krb4 sources then won't
|
|
* need its own.
|
|
*
|
|
*/
|
|
int base64Encode(char *indata, int insize, char **outptr)
|
|
{
|
|
unsigned char ibuf[3];
|
|
unsigned char obuf[4];
|
|
int i;
|
|
int inputparts;
|
|
char *output;
|
|
char *base64data;
|
|
|
|
if(0 == insize)
|
|
insize = strlen(indata);
|
|
|
|
base64data = output = (char*)malloc(insize*4/3+4);
|
|
if(NULL == output)
|
|
return -1;
|
|
|
|
while(insize > 0) {
|
|
for (i = inputparts = 0; i < 3; i++) {
|
|
if(*indata) {
|
|
inputparts++;
|
|
ibuf[i] = *indata;
|
|
indata++;
|
|
insize--;
|
|
}
|
|
else
|
|
ibuf[i] = 0;
|
|
}
|
|
|
|
obuf [0] = (ibuf [0] & 0xFC) >> 2;
|
|
obuf [1] = ((ibuf [0] & 0x03) << 4) | ((ibuf [1] & 0xF0) >> 4);
|
|
obuf [2] = ((ibuf [1] & 0x0F) << 2) | ((ibuf [2] & 0xC0) >> 6);
|
|
obuf [3] = ibuf [2] & 0x3F;
|
|
|
|
switch(inputparts) {
|
|
case 1: /* only one byte read */
|
|
sprintf(output, "%c%c==",
|
|
table64[obuf[0]],
|
|
table64[obuf[1]]);
|
|
break;
|
|
case 2: /* two bytes read */
|
|
sprintf(output, "%c%c%c=",
|
|
table64[obuf[0]],
|
|
table64[obuf[1]],
|
|
table64[obuf[2]]);
|
|
break;
|
|
default:
|
|
sprintf(output, "%c%c%c%c",
|
|
table64[obuf[0]],
|
|
table64[obuf[1]],
|
|
table64[obuf[2]],
|
|
table64[obuf[3]] );
|
|
break;
|
|
}
|
|
output += 4;
|
|
}
|
|
*output=0;
|
|
*outptr = base64data; /* make it return the actual data memory */
|
|
|
|
return strlen(base64data); /* return the length of the new data */
|
|
}
|
|
/* ---- End of Base64 Encoding ---- */
|