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

Vitaly Chikunov vt at altlinux.org
Mon Jan 13 11:22:04 MSK 2020


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.




More information about the oss-gost-crypto mailing list