首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Polarssl Base64.c错误检查

Polarssl Base64.c错误检查
EN

Stack Overflow用户
提问于 2014-07-02 11:31:48
回答 1查看 252关注 0票数 4

我使用polarssl的some 64.c文件来解码一些数据。

代码语言:javascript
复制
int base64_decode( unsigned char *dst, size_t *dlen,
                   const unsigned char *src, size_t slen ){
size_t i, n=0;
uint32_t j, x;
unsigned char *p;

for( i = n = j = 0; i < slen; i++ )
{
    if( ( slen - i ) >= 2 &&
        src[i] == '\r' && src[i + 1] == '\n' )
        continue;

    if( src[i] == '\n' )
        continue;

    if( src[i] == '=' && ++j > 2 )
        return( POLARSSL_ERR_BASE64_INVALID_CHARACTER );

    if( src[i] > 127 || base64_dec_map[src[i]] == 127 )
        return( POLARSSL_ERR_BASE64_INVALID_CHARACTER );

    if( base64_dec_map[src[i]] < 64 && j != 0 )
        return( POLARSSL_ERR_BASE64_INVALID_CHARACTER );

    n++;
}
n = ((n * 6) + 7) >> 3;
if( dst == NULL || *dlen < n )
{
    *dlen = n;
    return( POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL );
}
for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ ){
    if( *src == '\r' || *src == '\n' )
        continue;

    j -= ( base64_dec_map[*src] == 64 );
    x  = (x << 6) | ( base64_dec_map[*src] & 0x3F );

    if( ++n == 4 )
    {
        n = 0;
        if( j > 0 ) *p++ = (unsigned char)( x >> 16 );
        if( j > 1 ) *p++ = (unsigned char)( x >>  8 );
        if( j > 2 ) *p++ = (unsigned char)( x       );
    }
}

*dlen = p - dst;

return( 0 );
}

当我的数据涉及到代码的这一部分时,'n‘比’*dlen‘更大;但是当我将这个部分作为注释行时,函数也能很好地工作。

代码语言:javascript
复制
if( dst == NULL || *dlen < n )
{
    *dlen = n;
    return( POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL );
}

有没有可能这个代码部分是不必要的?我的意思是,如果我把这部分从功能中删除,我会不会错过商业逻辑中的一个细节?

编辑:

例如:

src : A7ViV8hpIon0lisFRCvQpw==

dlen: 18

dst: 3 b5 62 57 c8 69 22 89 f4 96 2b 5 44 2b d0 a7 0 0

实际上,'dst‘中的最后两个零不应该在正确的结果中,当我将'dlen’作为16发送并注释说,如果语句,我得到了正确的结果。我认为n的计算是不正确的,或者我遗漏了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-04 10:58:17

你说得对!在base64_decode()中返回的长度(和长度检查)中存在一个错误。

在以下几个字之后缺少一行:

代码语言:javascript
复制
n = ((n * 6) + 7) >> 3;

如果你说:

代码语言:javascript
复制
n -= j;

在此之后,它将如预期的那样工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24530015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档