1
libcrypto의 BIO에서 놀았으며 base64 디코딩 중에 오류를 감지 할 수있는 방법을 찾지 못했습니다.libcrypto BIO base64 디코딩의 오류 처리
데이터가 완전히 불필요하더라도 BIO_read
은 단지 0을 반환하고 ERR_get_error로 검사 한 오류 대기열은 비어 있습니다.
BIO_FLAGS_BASE64_NO_NL
플래그와 동일한 문제가 발생합니다. 불일치 (즉, 데이터에 개행 문자가 포함되어 있지만 플래그가 설정되고 그 반대의 경우)에는 오류가 표시되지 않으며 데이터가 없습니다.
그래서 디코딩 오류를 포착 할 수있는 방법이 있습니까?
static unsigned char *base64_decode(unsigned char *data, size_t len, size_t *out_len)
{
// chain should look like this
// b64 - mem
// so when we read from b64, it gets data from mem and decodes it
BIO *bio_b64;
BIO *bio_mem;
size_t res_capacity;
size_t res_size;
unsigned char *res;
size_t ret;
bio_b64 = BIO_new(BIO_f_base64());
bio_mem = BIO_new_mem_buf(data, len);
res_capacity = 1024;
res_size = 0;
res = malloc(res_capacity);
// don't care about newlines
BIO_set_flags(bio_b64, BIO_FLAGS_BASE64_NO_NL);
BIO_push(bio_b64, bio_mem);
// empty error queue, just in case
while (ERR_get_error() != 0);
while (1) {
ret = BIO_read(bio_b64, &res[res_size], res_capacity - res_size);
if (ret == (res_capacity - res_size)) {
res_size += ret;
res_capacity *= 2;
res = realloc(res, res_capacity);
} else if (ret == 0) {
break;
} else {
res_size += ret;
}
}
if (ERR_get_error() != 0) {
free(res);
return NULL;
}
BIO_free_all(bio_b64);
*out_len = res_size;
return res;
}