<div dir="ltr"><div dir="ltr">Привет!</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jan 13, 2020 at 11:22 AM Vitaly Chikunov <<a href="mailto:vt@altlinux.org">vt@altlinux.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Mon, Jan 13, 2020 at 09:51:18AM +0300, Dmitry Belyavsky wrote:<br>
> On Mon, Jan 13, 2020 at 8:07 AM Vitaly Chikunov <<a href="mailto:vt@altlinux.org" target="_blank">vt@altlinux.org</a>> wrote:<br>
> <br>
> > (В копилку ошибочных реализаций.)<br>
> ><br>
> > В одном российском линуксе, хэш для данных с длинной кратной 64<br>
> > считаются иначе чем у всех остальных:<br>
> ><br>
> > ...<br>
> <br>
> ><br>
> > Интересно что там могло пойти не так.<br>
> ><br>
> <br>
> Ну как. Финализация включает в себя дополнение непрохешированного остатка<br>
> до полного блока.<br>
> Вот если остаток не оставить, а всё равно дополнить - будет именно это<br>
> скорее всего.<br>
<br>
1. По-моему мы так и делаем.<br>
<br>
А вот они не делают заполнение _пустого блока_.<br></blockquote><div><br></div><div>Извини, знак перепутал :)</div><div>Писал по памяти.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">В ГОСТ (для полных блоков) они пропускают шаги 3.1, 3.2, 3.3, 3.4.<br>
В примерах сказано "длина сообщения меньше 512, _поэтому_ происходит<br>
заполнение неполного блока". А что же делать когда блок полный?<br>
<br>
Кто прав?<br></blockquote><div><br></div><div>Я предполагаю, что Дегтярёв. По-хорошему этот вопрос должен решаться примерами из стандарта.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Вот патч который дает результаты "как у них":<br>
<br>
diff --git a/gost3411-2012-core.c b/gost3411-2012-core.c<br>
index de582c6..55aad37 100644<br>
--- a/gost3411-2012-core.c<br>
+++ b/gost3411-2012-core.c<br>
@@ -163,13 +163,15 @@ stage3(GOST34112012Context *CTX)<br>
buf.QWORD[0] = BSWAP64(CTX->bufsize << 3);<br>
#endif<br>
<br>
- pad(CTX);<br>
+ if (CTX->bufsize) {<br>
+ pad(CTX);<br>
<br>
- g(&(CTX->h), &(CTX->N), (const unsigned char *) &(CTX->buffer));<br>
+ g(&(CTX->h), &(CTX->N), (const unsigned char *) &(CTX->buffer));<br>
<br>
- add512(&(CTX->N), &buf, &(CTX->N));<br>
- add512(&(CTX->Sigma), (const union uint512_u *) &CTX->buffer[0],<br>
- &(CTX->Sigma));<br>
+ add512(&(CTX->N), &buf, &(CTX->N));<br>
+ add512(&(CTX->Sigma), (const union uint512_u *) &CTX->buffer[0],<br>
+ &(CTX->Sigma));<br>
+ }<br>
<br>
g(&(CTX->h), &buffer0, (const unsigned char *) &(CTX->N));<br>
<br>
<br>
2. Кроме того, в нашем коде есть странность:<br>
<br>
| static inline void<br>
| pad(GOST34112012Context *CTX)<br>
| {<br>
| if (CTX->bufsize > 63)<br>
| return;<br>
|<br>
| memset(CTX->buffer + CTX->bufsize,<br>
| 0x00, sizeof(CTX->buffer) - CTX->bufsize);<br>
|<br>
| CTX->buffer[CTX->bufsize] = 0x01;<br>
| }<br>
<br>
<br>
`CTX->bufsize` никогда не может быть больше 63.<br>
<br></blockquote><div><br></div><div>Возможно, рудимент.</div><div><br></div></div>-- <br><div dir="ltr" class="gmail_signature">SY, Dmitry Belyavsky</div></div>