From 6291599307917b3c6ed9e94827312b6c926b7011 Mon Sep 17 00:00:00 2001 From: Zhi Guan Date: Wed, 18 Oct 2023 09:39:31 +0800 Subject: [PATCH] Update pem.c --- src/pem.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/pem.c b/src/pem.c index 0515ab649..04122e619 100644 --- a/src/pem.c +++ b/src/pem.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -38,29 +39,31 @@ static int remove_newline(char *line) int pem_write(FILE *fp, const char *name, const uint8_t *data, size_t datalen) { BASE64_CTX ctx; - uint8_t* b64 = NULL; - int len; + uint8_t out[168]; + int inlen, outlen; if (!datalen) { error_print(); return -1; } - - // FIXME: use a fixed-size buffer - if (!(b64 = malloc(datalen * 2))) { + if (datalen > INT_MAX) { error_print(); return -1; } - base64_encode_init(&ctx); - base64_encode_update(&ctx, data, (int)datalen, b64, &len); - base64_encode_finish(&ctx, b64 + len, &len); - fprintf(fp, "-----BEGIN %s-----\n", name); - fprintf(fp, "%s", (char *)b64); + base64_encode_init(&ctx); + while (datalen) { + inlen = datalen < 48 ? datalen : 48; + base64_encode_update(&ctx, data, inlen, out, &outlen); + fwrite(out, 1, outlen, fp); + data += inlen; + datalen -= inlen; + } + base64_encode_finish(&ctx, out, &outlen); + fwrite(out, 1, outlen, fp); fprintf(fp, "-----END %s-----\n", name); - free(b64); return 1; }