gpt4 book ai didi

c - Polarssl Base64.c 错误检查

转载 作者:太空狗 更新时间:2023-10-29 15:38:30 26 4
gpt4 key购买 nike

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

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' 大;但是当我将这部分作为注释行功能时也能正常工作。

if( dst == NULL || *dlen < n )
{
*dlen = n;
return( POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL );
}

这段代码有没有可能是不必要的?我的意思是,如果我从函数中删除这部分,我会错过业务逻辑中的细节吗?

编辑:

例如:

源代码:A7ViV8hpIon0lisFRCvQpw==

18 岁

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

实际上“dst”中的最后两个零不应该是正确的结果,当我将“dlen”作为 16 发送并注释掉 if 语句时,我得到了正确的结果。我认为 n 计算不正确或者我遗漏了一些东西。

最佳答案

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

后面少了一行:

n = ((n * 6) + 7) >> 3;

如果你输入:

n -= j;

在那之后,它将按预期工作。

关于c - Polarssl Base64.c 错误检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24530015/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com