处理libcrypto BIO base64解码中的错误

时间:2016-08-01 14:06:37

标签: c error-handling openssl base64 libcrypto

我一直在玩libcrypto的BIO,我找不到在base64解码过程中检测错误的方法。

即使数据是完全垃圾,BIO_read只返回零,错误队列 - 如ERR_get_error检查 - 仍然为空。

同样的问题发生在BIO_FLAGS_BASE64_NO_NL标志上:如果不匹配(即数据包含换行符,但标志已设置;反之亦然),则没有错误迹象,那里&# 39;没有数据。

那么,有没有办法捕捉解码错误?

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;
}

1 个答案:

答案 0 :(得分:1)

不幸的是,如果数据格式错误,BIO_read不会发出错误。您可以检查预期大小(4/3)或重新实现而无需openssl。