public inbox for gost@lists.stargrave.org
Atom feed
* Проблема с верификацией ЭЦП pygost
@ 2025-07-07 13:41 Богдан ветров
  2025-07-07 14:03 ` Sergey Matveev
  0 siblings, 1 reply; 2+ messages in thread
From: Богдан ветров @ 2025-07-07 13:41 UTC (permalink / raw)
  To: gost

[-- Attachment #1: Type: text/plain, Size: 696 bytes --]


Здравствуйте. Благодарю Вас за создание библиотеки PyGost.

Я использую Вашу библиотеку, что бы проверить валидность мой открепленной ЭЦП. Но что бы я не пробовал всегда проверка равна False. У меня есть только ПДФ и SIG файлы.

Буду крайне признателен,если вы посмотрите мой код и поможете понять в чем я не прав.

Ссылка на github:  https://github.com/sebastianfym/pygost_test.git
 
С уважением, Богдан Великородов.

[-- Attachment #2: Type: text/html, Size: 2064 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Проблема с верификацией ЭЦП pygost
  2025-07-07 13:41 Проблема с верификацией ЭЦП pygost Богдан ветров
@ 2025-07-07 14:03 ` Sergey Matveev
  0 siblings, 0 replies; 2+ messages in thread
From: Sergey Matveev @ 2025-07-07 14:03 UTC (permalink / raw)
  To: gost

[-- Attachment #1: Type: text/plain, Size: 3929 bytes --]

Приветствую!

*** Богдан ветров [2025-07-07 16:41]:
>Буду крайне признателен,если вы посмотрите мой код и поможете понять в чем я не прав.
>Ссылка на github:  https://github.com/sebastianfym/pygost_test.git

* Если что, то я совершенно не знаю как устроен и работает asn1crypto.
  Не то чтобы это проблема, но с ним ничего не подскажу
* PyGOST ничего не знает про ASN.1 и он выполняет только низкоуровневые
  функции чисто криптографии

--8<--# 0 [                                  8a41d3c09 | main.py ]--8<--
  14 curve = CURVES["id-tc26-gost-3410-12-256-paramSetA"]
--8<----------------------------------------------------------------8<--
Судя по сертификату приложенному к вашей CMS, в нём используется

    publicKeyParamSet: OBJECT IDENTIFIER 1.2.643.2.2.36.0 (id_GostR3410_2001_CryptoPro_XchA_ParamSet)

а вы используете id-tc26-gost-3410-12-256-paramSetA. Это две разные
эллиптические кривые. id-tc26-gost-3410-12-256-paramSetB должна подойти.

--8<--# 1 [                                  8a41d3c09 | main.py ]--8<--
  35 public_key_info = certificate['tbs_certificate']['subject_public_key_info']
  37 public_key_bytes = public_key_info['public_key'].native
  39 pub = pub_unmarshal(public_key_bytes)
--8<----------------------------------------------------------------8<--

В ГОСТовых сертификатах хранится не сырое значение 512/1024 бит значение
ключа, а обёрнутое в ASN.1 OCTET STRING. pub_unmarshal просто преобразует
набор байт которые вы ему предоставили и не проверяет всё ли с ними корректно.

--8<--# 2 [                                  8a41d3c09 | main.py ]--8<--
  42 dgst = gost34112012256.new(pdf_data).digest()
  44 # Читаем подпись из файла .sig в бинарном режиме
  45 signer_info = signed_data['signer_infos'][0]
  46 signature = signer_info['signature'].native
  56 # Проверяем подпись
  57 result = verify(curve, pub, dgst, signature)
--8<----------------------------------------------------------------8<--
Так проверка подписи точно не пройдёт, так как у вас современный CMS,
где подпись делается не над detached данными, а над структурой
signedAttrs из CMS (содержащей id_pkcs9_at_contentType,
id_pkcs9_at_signingTime, id_pkcs9_at_messageDigest,
id_aa_signingCertificateV2 атрибуты). Необходимо проверять подпись над
этой signedAttrs структуры закодированной в DER, без IMPLICIT ASN.1 tag.
Как это сделать asn1crypto -- понятия не имею. Есть много примеров
работы с ГОСТ CMS и сертификатами в PyDERASN проекте:
http://www.pyderasn.cypherpunks.su/ -- там же и проверка совместно с
PyGOST напротив многочисленных примеров из ТК26 рекомендаций.

Хэш PDF-ки можно проверить напротив атрибута id_pkcs9_at_messageDigest.
Возможно хэш придётся перевернуть (у нас с ГОСТовыми алгоритмами разброд
и шатание касательно endianness).

-- 
Sergey Matveev (http://www.stargrave.org/)
LibrePGP: 12AD 3268 9C66 0D42 6967  FD75 CB82 0563 2107 AD8A

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2025-07-07 14:03 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-07-07 13:41 Проблема с верификацией ЭЦП pygost Богдан ветров
2025-07-07 14:03 ` Sergey Matveev