From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Mon, 6 May 2019 16:21:36 +0300 From: Vitaly Chikunov To: Open-source aspects of GOST Cryptography Message-ID: <20190506132135.vbnelupki2z7duwz@altlinux.org> References: 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: Re: [oss-gost-crypto] =?koi8-r?b?8MHU3iDEzNEgIGxpYmdjcnlwdA==?= 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, 06 May 2019 13:21:36 -0000 Archived-At: List-Archive: FYI, On Mon, May 06, 2019 at 02:59:47PM +0300, Aleksei Nikiforov wrote: > Здравствуйте. > > Я узнал о проблеме со stribog в libgcrypt, и посмотрел патчи, в частности > для openssl и libgcrypt: > > https://github.com/gost-engine/engine/commit/835e0d788bfec1f51545b038cef135b02456b27b#diff-e3af9488a17fea1bdc808c139088e6ff > > https://lists.gnupg.org/pipermail/gcrypt-devel/2019-May/004700.html > > Мне патч для openssl понравился больше, в связи с чем я его переложил на > libgcrypt. Результат можно посмотреть вот здесь: > > http://git.altlinux.org/people/darktemplar/packages/?p=libgcrypt.git;a=commitdiff;h=a161d7e069ce4e6741cc89f74bdbee71cf1519d6 > > Что скажете по поводу данного патча? Можете посмотреть и проревьюить? Или же > лучше использовать уже отправленный в libgcrypt патч? Я протестил все реализации (на u8 представлении int32'ов вместо u64 представления 512-bit integers, для того чтоб можно было прогнать все релевантные значения) и они не дали ошибок (кроме одной где ошибка ожидалась). Код тестов ниже: --- #include #include void add32_kernel(unsigned char *x, unsigned char *y) { int i; unsigned char CF = 0; for (i = 0; i < sizeof(int); i++) { unsigned char left = x[i]; unsigned char sum; sum = left + y[i] + CF; if (sum != left) CF = (sum < left); x[i] = sum; } } void add32_streebog(unsigned char *x, unsigned char *y) { int i; unsigned char OF = 0, CF = 0; for (i = 0; i < sizeof(int); i++) { unsigned char tmp = x[i] + y[i]; if (tmp < x[i]) OF = 1; else OF = 0; tmp += CF; if (CF > 0 && tmp == 0) OF = 1; CF = OF; x[i] = tmp; } } void add32_darktemplar(unsigned char *Sigma, unsigned char *M) { int i; unsigned char of = 0, cf = 0; for (i = 0; i < sizeof(int); i++) { if ((unsigned char)(M[i] + Sigma[i]) < M[i]) of = 1; else of = 0; Sigma[i] += M[i] + cf; if ((cf > 0) && (Sigma[i] == 0)) of = 1; cf = of; } } void add32_libgcrypt(unsigned char *Sigma, unsigned char *M) { int i; Sigma[0] += M[0]; for (i = 1; i < sizeof(int); i++) if (Sigma[i-1] < M[i-1]) Sigma[i] += M[i] + 1; else Sigma[i] += M[i]; } void add32_libgcrypt_new(unsigned char *Sigma, unsigned char *M) { int i; unsigned char cf; Sigma[0] += M[0]; cf = 0; for (i = 1; i < sizeof(int); i++) { if (Sigma[i-1] != M[i-1]) cf = (Sigma[i-1] < M[i-1]); Sigma[i] += M[i] + cf; } } int main(int argc, char **argv) { unsigned int i, j; for (i = 0; i < 65539; i++) { printf("%u\r", i); for (j = 0; j < 65539; j++) { unsigned int k = i; add32_libgcrypt_new((unsigned char *)&k, (unsigned char *)&j); if (k != i+j) { printf("%u+%u=%u != %u\n", i, j, i+j, k); exit(1); } } } return 0; }