mirror of
https://github.com/guanzhi/GmSSL.git
synced 2026-05-15 04:46:24 +08:00
Support PEM with Windows-style newline
This commit is contained in:
46
src/pem.c
46
src/pem.c
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user