【问题标题】:Handling errors in libcrypto BIO base64 decoding处理 libcrypto BIO base64 解码中的错误
【发布时间】:2016-08-01 14:06:37
【问题描述】:

我一直在玩 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;
}

【问题讨论】:

    标签: c error-handling openssl base64 libcrypto


    【解决方案1】:

    很遗憾,BIO_read 不会在数据格式错误时发出错误。您可以检查预期大小 (4/3) 或在不使用 openssl 的情况下重新实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      相关资源
      最近更新 更多