2

我一直在玩 libcrypto 的 BIO,但找不到在 base64 解码期间检测错误的方法。

即使数据完全是垃圾,BIO_read也只会返回零,并且错误队列(通过 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;
}
4

1 回答 1

1

不幸的是BIO_read,如果数据格式错误,它不会发出错误。您可以检查预期大小 (4/3) 或在没有 openssl 的情况下重新实现。

于 2016-08-01T15:01:22.893 回答