2016-08-01 1 views
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; 
} 

답변

1

불행히도 BIO_read은 잘못된 데이터를 표시하는 경우 오류를 발생시키지 않습니다. 예상 크기 (4/3)를 확인하거나 openssl없이 다시 구현할 수 있습니다.