From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Mon, 13 Jan 2020 11:22:04 +0300 From: Vitaly Chikunov To: Open-source aspects of GOST Cryptography Message-ID: <20200113082204.frjobaxuod3lq2iv@altlinux.org> Mail-Followup-To: Open-source aspects of GOST Cryptography References: <20190502124105.tpwugswkvswnskhj@altlinux.org> <20190504215721.d236qhknugo2xf4r@altlinux.org> <20190525200312.ui3zb2oouaxabaau@altlinux.org> <20190525213202.53cbwyxfjixrevcq@altlinux.org> <20200113050725.sycc2knb2wir5d5v@altlinux.org> MIME-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: NeoMutt/20171215-106-ac61c7 Subject: [oss-gost-crypto] =?koi8-r?b?U3RyZWVib2cgcGFkZGluZyBidWcgRXg6ICAi?= =?koi8-r?b?78Igb3Blbi1zb3VyY2Ug0sXBzMnawcPJ0cg=?= X-BeenThere: oss-gost-crypto@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: Open-source aspects of GOST Cryptography List-Id: Open-source aspects of GOST Cryptography List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 13 Jan 2020 08:22:05 -0000 Archived-At: List-Archive: On Mon, Jan 13, 2020 at 09:51:18AM +0300, Dmitry Belyavsky wrote: > On Mon, Jan 13, 2020 at 8:07 AM Vitaly Chikunov 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.