* complete copyright information.
*/
-#include <h/mh.h>
-#include <h/mime.h>
-#include <h/md5.h>
+#include "h/mh.h"
+#include "error.h"
+#include "h/mime.h"
+#include "h/md5.h"
#include <inttypes.h>
static const char nib2b64[0x40+1] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+/*
+ * Copy data from one file to another, converting to base64-encoding.
+ *
+ * Arguments include:
+ *
+ * in - Input filehandle (unencoded data)
+ * out - Output filename (base64-encoded data)
+ * crlf - If set, output encoded CRLF for every LF on input.
+ *
+ * Returns OK on success, NOTOK otherwise.
+ */
int
writeBase64aux (FILE *in, FILE *out, int crlf)
{
unsigned int cc, n;
unsigned char inbuf[3];
- int skipnl = 0;
+ bool skipnl = false;
n = BPERLIN;
while ((cc = fread (inbuf, sizeof(*inbuf), sizeof(inbuf), in)) > 0) {
unsigned long bits;
inbuf[cc++] = '\n';
else
ungetc('\n', in);
- skipnl = 1;
+ skipnl = true;
} else {
/* This only works as long as sizeof(inbuf) == 3 */
ungetc(inbuf[cc - 1], in);
inbuf[++i] = '\n';
}
} else {
- skipnl = 0;
+ skipnl = false;
}
}
}
/*
* Decode a base64 string. The result, decoded, must be freed by the caller.
- * See description of arguments with declaration in h/prototypes.h.
+ *
+ * encoded - the string to be decoded
+ * decoded - the decoded bytes
+ * len - number of decoded bytes
+ * skip-crs - non-zero for text content, and for which CR's should be
+ * skipped
+ * digest - for an MD5 digest, it can be null
*/
int
decodeBase64 (const char *encoded, unsigned char **decoded, size_t *len,
- int skip_crs, unsigned char *digest) {
+ int skip_crs, unsigned char *digest)
+{
const char *cp = encoded;
- int self_delimiting = 0;
int bitno, skip;
uint32_t bits;
/* Size the decoded string very conservatively. */
bits = 0L;
skip = 0;
+ bool self_delimiting = false;
for (; *cp; ++cp) {
switch (*cp) {
unsigned char value;
}
if (skip || (((unsigned char) *cp) & 0x80) ||
(value = b642nib[((unsigned char) *cp) & 0x7f]) > 0x3f) {
- inform("invalid BASE64 encoding in %s", cp);
+ inform("invalid base64 byte %#x: %.42s",
+ *(unsigned char *)cp, cp);
charstring_free (decoded_c);
*decoded = NULL;
case '=':
if (++skip <= 3)
goto test_end;
- self_delimiting = 1;
+ self_delimiting = true;
break;
}
}
if (! self_delimiting && bitno != 18) {
- int i;
-
/* Show some context for the error. */
- for (i = 0; i < 20 && cp > encoded; ++i, --cp) {}
- inform("premature ending (bitno %d) near %s", bitno,
- cp ? cp : encoded);
+ cp -= min(cp - encoded, 20);
+ inform("premature ending (bitno %d) near %s", bitno, cp);
charstring_free (decoded_c);
*decoded = NULL;
* is allocated by the function and must be freed by the caller.
*/
void
-hexify (const unsigned char *input, size_t len, char **output) {
+hexify (const unsigned char *input, size_t len, char **output)
+{
/* Start with a charstring capacity that's arbitrarily larger than len. */
const charstring_t tmp = charstring_create (2 * len);
const unsigned char *cp = input;