81 lines
2.8 KiB
C
81 lines
2.8 KiB
C
/*********************************************************************\
|
|
LICENCE: Copyright (c) 2001 Bob Trower, Trantor Standard Systems Inc.
|
|
|
|
Permission is hereby granted, free of charge, to any person
|
|
obtaining a copy of this software and associated
|
|
documentation files (the "Software"), to deal in the
|
|
Software without restriction, including without limitation
|
|
the rights to use, copy, modify, merge, publish, distribute,
|
|
sublicense, and/or sell copies of the Software, and to
|
|
permit persons to whom the Software is furnished to do so,
|
|
subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall
|
|
be included in all copies or substantial portions of the
|
|
Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
|
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
|
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
|
|
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
VERSION HISTORY:
|
|
Bob Trower 08/04/01 -- Create Version 0.00.00B
|
|
|
|
\******************************************************************* */
|
|
|
|
#include <stdlib.h>
|
|
|
|
/*
|
|
** Translation Table as described in RFC1113
|
|
*/
|
|
static const char cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
|
|
/*
|
|
** encodeblock
|
|
**
|
|
** encode 3 8-bit binary bytes as 4 '6-bit' characters
|
|
*/
|
|
void encodeblock(unsigned char in[3], unsigned char out[4], int len) {
|
|
out[0] = cb64[ in[0] >> 2 ];
|
|
out[1] = cb64[ ((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4) ];
|
|
out[2] = (unsigned char) (len > 1 ? cb64[ ((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6) ] : '=');
|
|
out[3] = (unsigned char) (len > 2 ? cb64[ in[2] & 0x3f ] : '=');
|
|
}
|
|
|
|
/*
|
|
** encode
|
|
**
|
|
** base64 encode a stream adding padding and line breaks as per spec.
|
|
*/
|
|
unsigned int base64(unsigned char *inbuf, unsigned int len, unsigned char *outbuf) {
|
|
unsigned char in[3], out[4];
|
|
int c;
|
|
unsigned int i = 0;
|
|
unsigned int outlen = 0;
|
|
while (i < len) {
|
|
int n = 0;
|
|
for(c = 0; c < 3; c++, i++) {
|
|
if (i < len) {
|
|
in[c] = inbuf[i];
|
|
n++;
|
|
}
|
|
else {
|
|
in[c] = 0;
|
|
}
|
|
}
|
|
if (n) {
|
|
encodeblock(in, out, n);
|
|
for(c = 0; c < 4; c++) {
|
|
outbuf[outlen++] = out[c];
|
|
}
|
|
}
|
|
}
|
|
return outlen;
|
|
}
|
|
|