Перейти к содержанию

ГОСТ-подпись: числа 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 и КриптоПро. Порядок байтов нельзя исправлять «на глаз» для всех операций: преобразование допустимо лишь в месте, где спецификация формата требует его.

Первоисточники и дополнительное чтение

  • RFC 7091 — алгоритм электронной подписи ГОСТ Р 34.10-2012.
  • RFC 9215 — ГОСТ-2012 в сертификатах и списках отзыва.
  • RFC 5652 — базовая структура CMS и типы содержимого.
  • RFC 7836 — HMAC, PRF, KDF, VKO и параметры кривых.