From manowar на altlinux.org Mon Jan 21 13:26:16 2019 From: manowar на altlinux.org (Paul Wolneykien) Date: Mon, 21 Jan 2019 15:26:16 +0300 Subject: [gnupg-ru] =?utf-8?b?0J3QsCDQv9GD0YLQuCDQuiDQv9C+0LvQvdC+0YY=?= =?utf-8?b?0LXQvdC90L7QuSDQv9C+0LTQtNC10YDQttC60LUg0JPQntCh0KIg0LIgR251?= =?utf-8?q?PG?= In-Reply-To: <69ef0314-1748-865d-690a-1740f6d27826@altlinux.org> References: <20180623160754.1b6266dc@job.localdomain> <69ef0314-1748-865d-690a-1740f6d27826@altlinux.org> Message-ID: <93542040-e424-7c0a-d561-6d36a41a117b@altlinux.org> Здравствуйте. Анонсирую новую версию своих патчей, добавляющих поддержку ГОСТ в GnuPG. В новой версии поддерживается: * подпись/проверка подписи в формате S/MIME; * шифрование/расшифровка в формате S/MIME. Остальное, кажется, тоже не сломано. Итого: ГОСТ теперь работает как в PGP, так и в S/MIME. Однако, поддержка ГОСТ всё ещё ограничена: * работой с аппаратными токенами (картами); * отсутствием возможности выбора параметров кривых. Ссылки на патчи: * gnupg: ** https://packages.altlinux.org/ru/sisyphus/srpms/gnupg2/patches/gnupg2-2.2.10-gost-1.0.0.patch/download ** https://packages.altlinux.org/ru/sisyphus/srpms/gnupg2/patches/gnupg2-2.2.10-issuers-1.0.0.patch/download * https://packages.altlinux.org/ru/sisyphus/srpms/libgcrypt/patches/libgcrypt-1.8.3-vko-1.0.0.patch/download * https://packages.altlinux.org/ru/sisyphus/srpms/libksba/patches/libksba-1.3.6-gost-1.0.0.patch/download * https://packages.altlinux.org/ru/sisyphus/srpms/gnupg-pkcs11-scd/patches/gnupg-pkcs11-scd-0.9.2-gost-1.0.0.patch/download * https://packages.altlinux.org/ru/sisyphus/srpms/libpkcs11-helper/patches/libpkcs11-helper-1.25.1-gost-derive-1.0.0.patch/download 25.07.2018 13:18, Paul Wolneykien пишет: > 25.06.2018 19:53, Paul Wolneykien пишет: >> 23.06.2018 16:07, Dmitrii Tcvetkov пишет: >>>> Здравствуйте, уважаемые подписчики. Представляю вашему вниманию >>>> небольшой шаг в сторону поддержки цифровой подписи ГОСТ в GnuPG. > > Здравствуйте. В новой итерации, в дополнение к поддержке цифровой > подписи по ГОСТ, я добавил поддержку ГОСТового шифрования > (enсrypt/decrypt) данных. Это потребовало: > > 1. Прежде всего, реализации алгоритмов VKO GOST (RFC 4357) внутри > Libgcrypt. Реализацию сделал прозрачную — в том смысле, что данные > операции доступны снаружи через стандартные gcry_pk_encrypt() / > gcry_pk_decrypt(). Единственное, о чём нужно помнить, что таким способом > шифруются (расшифровываются) не данные, а симметричный ключ, который > затем используется для собственно шифрования (расшифрования) данных. > Обновлённый патч доступен по адресу: > http://git.altlinux.org/people/manowar/packages/?p=libgcrypt.git;a=blob;f=libgcrypt-1.8.2-gost.patch;h=2cf069617f12efab3ef8289384eb9c91ec7ef9ed;hb=5b3d051a59d95628943f3597068e393a8f6eb1df > . > > 2. Добавить в GnuPG отдельную (от Libgcrypt) реализацию > размаскирования ключа (key unwrap). Это вызвано тем обстоятельством, что > данная реализация в целом рассчитана, пока что, на использование > совместно с аппаратными токенами. Операция же выработки общего ключа с > помощью токена включает в себя и его так называемую диверсификацию. По > этой причине, алгоритм размаскирования симметричного ключа, связанный с > аппаратным токеном (через gpg-агент) оказывается урезанным по сравнению > с аналогичной операцией, реализованной мной в Libgcrypt. Кроме этого > момента, для ВКО ГОСТ в GnuPG потребовалось реализовать отдельную > обвязку вокруг вызова gcry_pk_encrypt(), поскольку стандартная обвязка > рассчитана на работу с ECC shared point и ничего не знает об UKM. > Обновлённый патч доступен по адресу: > http://git.altlinux.org/people/manowar/packages/?p=gnupg2.git;a=blob;f=gnupg-2.2.8-gost.patch;h=a4ab5be731bc72536e5eea360c97185c5801dd6f;hb=a72c8dd7e206bfbbc1239fa9d7f32d7ec09808ca > . > > 3. В части работы со смарт-картами (токенами) потребовалось сделать > две вещи: использовать механизм выработки общего ключа > (CKM_GOSTR3410_DERIVE) со стороны gnupg-pkcs11-scd (включая сюда > подготовку бинарных данных UKM + публичный ключ с правильным порядком > байт) и реализовать вызов этого механизма в libpkcs11-helper, причём с > поддержкой ГОСТовой специфики. По аналогии с Libgcrypt, я решил не > добавлять в libpkcs11-helper отдельный тип операции "derive", а сделал > его частным случаем "decrypt". > Обновлённые патчи доступны по адресам: > http://git.altlinux.org/people/manowar/packages/?p=gnupg-pkcs11-scd.git;a=blob;f=gnupg-pkcs11-scd-0.9.2-gost.patch;h=e167433b02823324544c169d04a1fda5597f47b6;hb=8ba10a0014a7f0d1d69dcb29f3fbd708b56ecee4 > и > http://git.altlinux.org/people/manowar/packages/?p=libpkcs11-helper.git;a=blob;f=libpkcs11-helper-1.22.0-gost-derive.patch;h=f64fe32a52c6a5abb784494347f4211c97e69b6c;hb=cddda377cc0a3c3aba2b806e47323f9f98aab95c > соответственно. > > Реализация проверена на работоспособность (подпись + шифрование / > расшифровка + проверка) совместно с токенами "Рутокен ГОСТ ECP". > > Из интересного. Алгоритм диверсификации ключа, реализованный в > настоящее время в OpenSSL (engines/ccgost) скорее всего содержит в себе > ошибку. Либо же ошибку содержит реализация на "Рутокен". Дело же в том, > что одинаковый результат диверсификации мне удалось получить только > после того, как я перевернул UKM (точнее, использовал его в обратном > порядке). Применительно к OpenSSL это выглядит так: > > --- a/openssl/engines/ccgost/gost_keywrap.c > +++ b/openssl/engines/ccgost/gost_keywrap.c > @@ -35,7 +35,7 @@ void keyDiversifyCryptoPro(gost_ctx * ctx, const > unsigned char *inputKey, > for (j = 0, mask = 1; j < 8; j++, mask <<= 1) { > k = ((u4) outputKey[4 * j]) | (outputKey[4 * j + 1] << 8) | > (outputKey[4 * j + 2] << 16) | (outputKey[4 * j + 3] << > 24); > - if (mask & ukm[i]) { > + if (mask & ukm[7 - i]) { > s1 += k; > } else { > s2 += k; > > _______________________________________________ > Gnupg-ru mailing list > Gnupg-ru на gnupg.org > http://lists.gnupg.org/mailman/listinfo/gnupg-ru >