ГОСТ-подпись: числа r и s, порядок байтов и перенос между библиотеками¶
Разбираем разницу между математической подписью, байтовым представлением и CMS SignedData.
Документация ПО — НАЙС.ОС CLOUD. Это самостоятельная учебно-справочная статья. Команды приведены для изучения и диагностики; операции с ключами, дисками и действующими сервисами выполняют только после резервного копирования и проверки назначения.
От формулы к двоичному полю¶
ГОСТ Р 34.10-2012 определяет подпись как пару математических чисел r и s. Однако в реальном файле передаются байты, поэтому совместимость зависит от принятой схемы кодирования. Для профиля X.509 по RFC 9215 подпись ГОСТ-2012/256 кодируется 64 октетами: первые 32 — s, следующие 32 — r, оба числа в прямом порядке байтов (big-endian). Для профиля 512 длина соответственно 128 октетов. Это описание относится к конкретному профилю ASN.1, а не к произвольному API любой криптобиблиотеки.
Частые взаимные перестановки¶
| Симптом | Что проверить |
|---|---|
| Подпись имеет правильную длину, но не проверяется | Не поменяны ли местами r и s |
| Совпадает OID, но проверка всегда неуспешна | Не развернут ли порядок байтов внутри каждого числа |
| Ключ импортирован, а подпись не проверяется | Верна ли кривая и параметрический набор |
| Проверка «чистого» сообщения проходит, CMS — нет | Подписаны ли DER-кодированные атрибуты, а не оригинальные байты напрямую |
| Приложение принимает ключ, но отвергает сертификат | Указаны ли KeyUsage, ExtendedKeyUsage, параметры публичного ключа и цепочка |
Разделяем уровни проверки¶
Математический уровень. Запустите генерацию и проверку подписи по контрольным векторам ГОСТ Р 34.10-2012 (раздел 7 RFC 7091). Здесь не нужны CMS, X.509, PKCS#11.
Кодирование. Убедитесь, что сериализация s || r соответствует профилю сертификатов; отдельно храните ожидаемые 64 или 128 октетов.
Контейнер. В CMS проверить необходимо не только подпись, но и фактически подписанную последовательность байтов, сведения о подписанте, алгоритмы дайджеста и сертификат.
Доверие. Даже математически правильная подпись может быть не принята приложением из-за неподходящей доверенной цепочки, срока действия, отзыва или назначения ключа.
Команды для анализа сертификата и CMS¶
openssl x509 -inform DER -in cert.der -noout -text
openssl cms -cmsout -print -inform DER -in signed.der | head -140
Не используйте openssl cms -verify -noverify как окончательный результат верификации в производственной системе: флаг отключает проверку цепочки. Для учебной диагностики математической операции он может быть информативен, но должен быть явно помечен как неполная проверка.
Правила обмена с КриптоПро¶
Для каждого найденного отличия сохраняйте четыре артефакта: публичный тестовый сертификат, входное сообщение, CMS-контейнер и текстовое описание используемых OID. Только после этого имеет смысл сравнивать сериализацию в openssl, gpgsm и КриптоПро. Порядок байтов нельзя исправлять «на глаз» для всех операций: преобразование допустимо лишь в месте, где спецификация формата требует его.