/*
This file is part of Pretty Curved Privacy (pcp1).
Copyright (C) 2013-2014 T.v.Dein.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any 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
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
You can contact me by mail: .
*/
#include "z85.h"
unsigned char *pcp_padfour(unsigned char *src, size_t srclen, size_t *dstlen) {
size_t outlen, zerolen;
unsigned char *dst;
outlen = srclen;
while (outlen % 4 != 0) outlen++;
zerolen = outlen - srclen;
dst = (unsigned char*)ucmalloc(outlen);
memcpy(dst, src, srclen); /* add the original */
memset(&dst[srclen], 0, zerolen); /* pad with zeroes */
*dstlen = outlen;
return dst;
}
unsigned char *pcp_unpadfour(unsigned char *src, size_t srclen, size_t *dstlen) {
size_t outlen;
size_t numzeroes;
size_t i;
outlen = srclen;
for(i=srclen; i>0; --i) {
if(src[i] != '\0') {
outlen = i + 1;
break;
}
}
*dstlen = outlen;
return src;
}
unsigned char *pcp_z85_decode(char *z85block, size_t *dstlen) {
unsigned char *bin;
int i, pos;
size_t zlen, binlen, outlen;
zlen = strlen(z85block);
char *z85 = ucmalloc(zlen+1);
/* remove newlines */
pos = 0;
for(i=0; i= 71) {
*z85block++ = '\r';
*z85block++ = '\n';
pos = 1;
}
else {
pos++;
}
*z85block++ = z85[i];
}
*/
char *z = &z85[0];
char *B = &z85block[0];
while(*z != '\0') {
if(pos >= 71) {
*B++ = '\r';
*B++ = '\n';
pos = 1;
}
else {
pos++;
}
*B++ = *z++;
}
*B = '\0';
/* fprintf(stderr, "z85block len: %d\n", blocklen, strlen(z85block)); */
/* fprintf(stderr, "z85block: <%s>\n", z85block); */
*dstlen = blocklen;
free(z85);
free(padded);
return z85block;
}
char *pcp_readz85file(FILE *infile) {
unsigned char *input = NULL;
unsigned char *tmp = NULL;
size_t bufsize = 0;
unsigned char byte[1];
while(!feof(infile)) {
if(!fread(&byte, 1, 1, infile))
break;
if(ferror(infile) != 0)
break;
tmp = realloc(input, bufsize + 1);
input = tmp;
memmove(&input[bufsize], byte, 1);
bufsize ++;
}
if(bufsize == 0) {
fatal("Input file is empty!\n");
free(tmp);
return NULL;
}
return pcp_readz85string(input, bufsize);
}
char *pcp_readz85string(unsigned char *input, size_t bufsize) {
char *ret;
int i, outsize, lpos, x;
lpos = outsize = 0;
size_t MAXLINE = 1024;
unsigned char *out = ucmalloc(bufsize);
char *line = ucmalloc(MAXLINE);
for(i=0; i MAXLINE) {
/* huh, now that's suspicious */
fatal("Invalid input, line is too long (%d bytes so far)!\n", lpos);
goto rferr;
}
if(input[i] != '\n' && input[i] != '\r') {
line[lpos++] = input[i];
}
else {
if(line[0] != ' ' && strncmp(line, "-----", 5) != 0) {
if(lpos > 0) {
for(x=0;x