Support PEM with Windows-style newline

This commit is contained in:
Zhi Guan
2022-12-30 10:37:50 +08:00
parent 8ff829dbcd
commit 7be0df2b82
2 changed files with 254 additions and 18 deletions

View File

@@ -15,6 +15,27 @@
#include <gmssl/error.h>
static int remove_newline(char *line)
{
size_t len;
len = strlen(line);
if (len >= 2) {
if (line[len - 2] == '\r' && line[len - 1] == '\n') {
line[len - 2] = line[len - 1] = 0;
return 1;
}
}
if (len) {
if (line[len - 1] == '\n') {
line[len - 1] = 0;
return 1;
}
}
return 0; // No newline found, might not be an error
}
int pem_write(FILE* fp, const char* name, const uint8_t* data, size_t datalen)
{
int ret = 0;
@@ -51,8 +72,8 @@ int pem_read(FILE *fp, const char *name, uint8_t *data, size_t *datalen, size_t
int len;
BASE64_CTX ctx;
snprintf(begin_line, sizeof(begin_line), "-----BEGIN %s-----\n", name);
snprintf(end_line, sizeof(end_line), "-----END %s-----\n", name);
snprintf(begin_line, sizeof(begin_line), "-----BEGIN %s-----", name);
snprintf(end_line, sizeof(end_line), "-----END %s-----", name);
if (feof(fp)) {
return 0;
@@ -66,13 +87,11 @@ int pem_read(FILE *fp, const char *name, uint8_t *data, size_t *datalen, size_t
return -1;
}
}
remove_newline(line);
if (strcmp(line, begin_line) != 0) {
// FIXME: 这里是不是应该容忍一些错误呢?
fprintf(stderr, "%s %d: %s\n", __FILE__, __LINE__, line);
fprintf(stderr, "%s %d: %s\n", __FILE__, __LINE__, begin_line);
error_print();
return -1;
}
@@ -83,20 +102,11 @@ int pem_read(FILE *fp, const char *name, uint8_t *data, size_t *datalen, size_t
for (;;) {
if (!fgets(line, sizeof(line), fp)) {
if (feof(fp)){
//如果END xxx最后一行没有换行符提前跳出循环
if (strncmp(line, end_line, strlen(end_line)-1) == 0) {
break;
} else {
error_print();
return -1;
}
}
else {
error_print();
return -1;
}
error_print();
return -1;
}
remove_newline(line);
if (strcmp(line, end_line) == 0) {
break;
}