4

一部のデータをデコードするために、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 );
}

このコード部分が不要になる可能性はありますか? この部分を関数から削除すると、ビジネスロジックの詳細が見逃されるでしょうか?

編集:

例えば:

src : A7ViV8hpIon0lisFRCvQpw==

ドレン: 18

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

実際には、「dst」の最後の 2 つのゼロは正しい結果にはならないはずです。「dlen」を 16 として送信し、その if ステートメントをコメントアウトすると、正しい結果が得られます。n の計算が正しくないか、何か不足していると思います。

4

1 に答える 1