#include "cuPem.h"
#include <stdlib.h>
#include <stdio.h>
#include <strings.h>
#include <ctype.h>
#include "cuEnc64.h"
#define PEM_SCAN_LEN 8192
int isPem(
const unsigned char *inData,
unsigned inDataLen)
{
const unsigned char *cp = inData;
for(unsigned dex=0; dex<inDataLen; dex++, cp++) {
if(!isprint(*cp) && !isspace(*cp)) {
return 0;
}
}
unsigned char buf[PEM_SCAN_LEN + 1];
unsigned len = inDataLen;
if(len > PEM_SCAN_LEN) {
len = PEM_SCAN_LEN;
}
memcpy(buf, inData, len);
buf[len] = '\0';
const char *p = strstr((const char *)buf, "-----BEGIN ");
if(p == NULL) {
return 0;
}
if(inDataLen > PEM_SCAN_LEN) {
memcpy(buf, inData + inDataLen - PEM_SCAN_LEN, PEM_SCAN_LEN);
buf[PEM_SCAN_LEN] = '\0';
}
p = strstr((const char *)buf, "-----END ");
if(p == NULL) {
return 0;
}
return 1;
}
int pemEncode(
const unsigned char *inData,
unsigned inDataLen,
unsigned char **outData,
unsigned *outDataLen,
const char *headerString)
{
unsigned char *enc;
unsigned encLen;
enc = cuEnc64WithLines(inData, inDataLen, 64, &encLen);
if(enc == NULL) {
printf("***pemEncode: Error encoding file. Aborting.\n");
return -1;
}
unsigned outSize = encLen + (2 * strlen(headerString)) + 200;
*outData = (unsigned char *)malloc(outSize);
sprintf((char *)*outData, "-----BEGIN %s-----\n%s-----END %s-----\n",
headerString, (char *)enc, headerString);
*outDataLen = strlen((char *)*outData);
if((*outData)[*outDataLen - 1] == '\0') {
(*outDataLen)--;
}
free(enc);
return 0;
}
int pemDecode(
const unsigned char *inData,
unsigned inDataLen,
unsigned char **outData,
unsigned *outDataLen)
{
char *cp;
char *curr1, *curr2;
char *startPem = NULL;
char *endPem = NULL;
unsigned char *out;
unsigned outLen;
int ourRtn = 0;
char *freeCp = NULL;
if(inData[inDataLen - 1] != '\0') {
cp = freeCp = (char *)malloc(inDataLen + 1);
memmove(cp, inData, inDataLen);
cp[inDataLen] = '\0';
inDataLen++;
}
else {
cp = (char *)inData;
}
curr1 = strstr(cp, "-----");
if(curr1 == NULL) {
printf("***pemDecode: no terminator found\n");
ourRtn = -1;
goto abort;
}
cp = curr1;
curr1 = strchr(cp, '\n');
curr2 = strchr(cp, '\r');
if((curr1 == NULL) & (curr2 == NULL)) {
printf("***pemDecode: Bad PEM format (1)\n");
ourRtn = -1;
goto abort;
}
if(curr1 == NULL) {
startPem = curr2;
}
else {
startPem = curr1;
}
curr1 = strstr(startPem, "-----");
if(curr1 == NULL) {
printf("***pemDecode: Bad PEM format (2)\n");
ourRtn = -1;
goto abort;
}
endPem = curr1;
out = cuDec64((unsigned char *)startPem, endPem-startPem, &outLen);
if(out == NULL) {
printf("Bad PEM format (3)\n");
ourRtn = -1;
goto abort;
}
*outData = out;
*outDataLen = outLen;
abort:
if(freeCp) {
free(freeCp);
}
return ourRtn;
}