Update pem.c

This commit is contained in:
Zhi Guan
2023-10-18 09:39:31 +08:00
parent 0620acae2f
commit 6291599307

View File

@@ -11,6 +11,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <limits.h>
#include <gmssl/pem.h> #include <gmssl/pem.h>
#include <gmssl/error.h> #include <gmssl/error.h>
@@ -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) int pem_write(FILE *fp, const char *name, const uint8_t *data, size_t datalen)
{ {
BASE64_CTX ctx; BASE64_CTX ctx;
uint8_t* b64 = NULL; uint8_t out[168];
int len; int inlen, outlen;
if (!datalen) { if (!datalen) {
error_print(); error_print();
return -1; return -1;
} }
if (datalen > INT_MAX) {
// FIXME: use a fixed-size buffer
if (!(b64 = malloc(datalen * 2))) {
error_print(); error_print();
return -1; 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, "-----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); fprintf(fp, "-----END %s-----\n", name);
free(b64);
return 1; return 1;
} }