[oss-gost-crypto] Streebog padding bug Ex: "Об open-source реализациях

Dmitry Belyavsky beldmit at gmail.com
Mon Jan 13 11:31:15 MSK 2020


Привет!

On Mon, Jan 13, 2020 at 11:22 AM Vitaly Chikunov <vt at altlinux.org> wrote:

> On Mon, Jan 13, 2020 at 09:51:18AM +0300, Dmitry Belyavsky wrote:
> > On Mon, Jan 13, 2020 at 8:07 AM Vitaly Chikunov <vt at altlinux.org> wrote:
> >
> > > (В копилку ошибочных реализаций.)
> > >
> > > В одном российском линуксе, хэш для данных с длинной кратной 64
> > > считаются иначе чем у всех остальных:
> > >
> > > ...
> >
> > >
> > > Интересно что там могло пойти не так.
> > >
> >
> > Ну как. Финализация включает в себя дополнение непрохешированного остатка
> > до полного блока.
> > Вот если остаток не оставить, а всё равно дополнить - будет именно это
> > скорее всего.
>
> 1. По-моему мы так и делаем.
>
> А вот они не делают заполнение _пустого блока_.
>

Извини, знак перепутал :)
Писал по памяти.


> В ГОСТ (для полных блоков) они пропускают шаги 3.1, 3.2, 3.3, 3.4.
> В примерах сказано "длина сообщения меньше 512, _поэтому_ происходит
> заполнение неполного блока". А что же делать когда блок полный?
>
> Кто прав?
>

Я предполагаю, что Дегтярёв. По-хорошему этот вопрос должен решаться
примерами из стандарта.


> Вот патч который дает результаты "как у них":
>
> diff --git a/gost3411-2012-core.c b/gost3411-2012-core.c
> index de582c6..55aad37 100644
> --- a/gost3411-2012-core.c
> +++ b/gost3411-2012-core.c
> @@ -163,13 +163,15 @@ stage3(GOST34112012Context *CTX)
>      buf.QWORD[0] = BSWAP64(CTX->bufsize << 3);
>  #endif
>
> -    pad(CTX);
> +    if (CTX->bufsize) {
> +       pad(CTX);
>
> -    g(&(CTX->h), &(CTX->N), (const unsigned char *) &(CTX->buffer));
> +       g(&(CTX->h), &(CTX->N), (const unsigned char *) &(CTX->buffer));
>
> -    add512(&(CTX->N), &buf, &(CTX->N));
> -    add512(&(CTX->Sigma), (const union uint512_u *) &CTX->buffer[0],
> -           &(CTX->Sigma));
> +       add512(&(CTX->N), &buf, &(CTX->N));
> +       add512(&(CTX->Sigma), (const union uint512_u *) &CTX->buffer[0],
> +           &(CTX->Sigma));
> +    }
>
>      g(&(CTX->h), &buffer0, (const unsigned char *) &(CTX->N));
>
>
> 2. Кроме того, в нашем коде есть странность:
>
> | static inline void
> | pad(GOST34112012Context *CTX)
> | {
> |     if (CTX->bufsize > 63)
> |         return;
> |
> |     memset(CTX->buffer + CTX->bufsize,
> |         0x00, sizeof(CTX->buffer) - CTX->bufsize);
> |
> |     CTX->buffer[CTX->bufsize] = 0x01;
> | }
>
>
> `CTX->bufsize` никогда не может быть больше 63.
>
>
Возможно, рудимент.

-- 
SY, Dmitry Belyavsky
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.altlinux.org/pipermail/oss-gost-crypto/attachments/20200113/dc6ed2f9/attachment.html>


More information about the oss-gost-crypto mailing list