[gnupg-ru] На пути к полноценной поддержке ГОСТ в GnuPG
Paul Wolneykien
manowar на altlinux.org
Пн Янв 21 13:26:16 CET 2019
Здравствуйте. Анонсирую новую версию своих патчей, добавляющих
поддержку ГОСТ в 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
>
Подробная информация о списке рассылки Gnupg-ru