Класс KJUR.asn1.cades.SignaturePolicyIdentifier

Назначение SignaturePolicyIdentifier связано с реализацией политики электронной подписи в формате CAdES, где каждая подпись может быть привязана к формально определённому набору правил. Этот идентификатор позволяет однозначно указать, по какой политике сформирована подпись, и обеспечивает возможность проверки соответствия подписи требованиям регламента, установленного заранее.

В рамках ASN.1 структура SignaturePolicyIdentifier представляет собой элемент, который может принимать два состояния: указание конкретной политики либо значение отсутствия политики. В случае наличия политики она описывается через идентификатор OID, хэш-значение политики и дополнительные квалификаторы. Такая конструкция обеспечивает криптографическую привязку подписи к документированному набору правил, исключая возможность подмены интерпретации условий формирования подписи.

Структура в терминах ASN.1 обычно описывается следующим образом:

  • SignaturePolicyIdentifier ::= CHOICE { signaturePolicyId SignaturePolicyId, signaturePolicyImplied NULL }

  • SignaturePolicyId ::= SEQUENCE { sigPolicyId SigPolicyId, sigPolicyHash SigPolicyHash, sigPolicyQualifiers SEQUENCE SIZE (1..MAX) OF SigPolicyQualifierInfo OPTIONAL }

  • SigPolicyId ::= OBJECT IDENTIFIER

  • SigPolicyHash ::= SEQUENCE { hashAlgorithm AlgorithmIdentifier, hashValue OCTET STRING }

Эта модель задаёт строгую структуру, в которой политика подписи не является произвольной строкой, а формализована через криптографические и идентификационные элементы.

Реализация в Jsrsasign

Класс KJUR.asn1.cades.SignaturePolicyIdentifier в библиотеке Jsrsasign предназначен для построения ASN.1 структуры SignaturePolicyIdentifier в соответствии с требованиями CAdES. Он входит в пространство имён KJUR.asn1.cades, которое содержит набор инструментов для работы с CMS/PKCS#7 и расширениями CAdES.

Основная задача класса заключается в генерации корректного ASN.1 объекта, который затем может быть встроен в SignedAttributes подписи CMS.

Внутренняя логика класса опирается на базовые ASN.1 примитивы Jsrsasign: SEQUENCE, OBJECT IDENTIFIER, OCTET STRING и конструкции алгоритмов хэширования.

Параметры и структура входных данных

Конструктор KJUR.asn1.cades.SignaturePolicyIdentifier принимает объект с описанием политики подписи. Типичная структура параметров включает:

  • sigPolicyId — строка OID политики
  • sigPolicyHash — объект, содержащий алгоритм хэширования и значение хэша
  • sigPolicyQualifiers — массив дополнительных квалификаторов (опционально)
  • implied — логический флаг, указывающий на отсутствие явной политики

В зависимости от переданных данных формируется либо CHOICE с NULL (implied policy), либо полная структура SignaturePolicyId.

Формирование идентификатора политики

Идентификатор политики представляет собой OID, например:

  • 2.16.756.1.89.1.2.1.1

Этот идентификатор включается в ASN.1 как OBJECT IDENTIFIER и служит ключевым элементом привязки подписи к конкретной нормативной политике.

В Jsrsasign данный элемент формируется через ASN1ObjectIdentifier, который обеспечивает корректное кодирование OID в DER-формате.

Хэш политики и его роль

Хэш политики используется для криптографической фиксации содержимого политики подписи. Это предотвращает возможность изменения политики после того, как подпись была сформирована.

Структура включает:

  • алгоритм хэширования (например, SHA-256)
  • значение хэша в виде OCTET STRING

Пример логики формирования:

  • вычисляется хэш документа политики
  • выбирается алгоритм (например, sha256)
  • результат кодируется в ASN.1 структуру SigPolicyHash

В Jsrsasign алгоритм задаётся через идентификаторы из KJUR.crypto.Util, а значение хэша передаётся в hex или byte representation.

Квалификаторы политики

Поле sigPolicyQualifiers является необязательным и предназначено для расширения описания политики. Оно может содержать:

  • URL на документ политики
  • текстовые описания
  • дополнительные XML или URI ссылки

Каждый квалификатор кодируется как SigPolicyQualifierInfo, который включает OID типа квалификатора и значение.

В Jsrsasign квалификаторы передаются как массив объектов, каждый из которых преобразуется в ASN.1 SEQUENCE.

Логика выбора CHOICE: implied или explicit

SignaturePolicyIdentifier может быть представлена в двух формах:

  1. implied — политика подразумевается и не указывается явно
  2. explicit — политика описана полностью

В Jsrsasign это реализуется через условие:

  • если implied = true, создаётся ASN.1 NULL
  • иначе формируется SEQUENCE SignaturePolicyId

Такой подход соответствует требованиям ETSI TS 101 733.

Пример формирования структуры

var sigPolicy = new KJUR.asn1.cades.SignaturePolicyIdentifier({
  sigPolicyId: "2.16.756.1.89.1.2.1.1",
  sigPolicyHash: {
    alg: "sha256",
    hash: "9f2c7a..."
  },
  sigPolicyQualifiers: [
    {
      oid: "1.2.840.113549.1.9.16.5.1",
      uri: "https://example.com/policy.pdf"
    }
  ]
});

В результате выполнения создаётся ASN.1 объект, который может быть сериализован в DER и включён в структуру SignedAttributes.

Встраивание в CMS/PKCS#7 подпись

SignaturePolicyIdentifier используется внутри SignedAttributes CMS подписи. При формировании PKCS#7 структуры она включается как один из атрибутов:

  • id-aa-signaturePolicyIdentifier (OID: 1.2.840.113549.1.9.16.2.15)

Jsrsasign автоматически кодирует этот атрибут как контекстно-зависимый ASN.1 элемент, который затем участвует в вычислении подписываемого хэша.

Важно, что SignaturePolicyIdentifier влияет на итоговое значение SignedData, поскольку входит в набор подписываемых атрибутов.

Внутренние классы и зависимости Jsrsasign

Реализация SignaturePolicyIdentifier опирается на следующие компоненты:

  • KJUR.asn1.DERSequence
  • KJUR.asn1.DERObjectIdentifier
  • KJUR.asn1.DEROctetString
  • KJUR.crypto.Util (алгоритмы хэширования)
  • KJUR.asn1.cms.Attribute

Каждый из этих модулей отвечает за отдельный уровень абстракции ASN.1/CMS модели.

Кодирование в DER

После формирования объекта SignaturePolicyIdentifier выполняется кодирование в DER (Distinguished Encoding Rules). Это строго бинарный формат, в котором:

  • структура SEQUENCE кодируется с длиной
  • OID представляется в base-128 encoding
  • хэш фиксируется как OCTET STRING

Jsrsasign обеспечивает автоматическое выполнение этих преобразований через метод toHex() или getEncodedHex().

Особенности обработки ошибок

При формировании SignaturePolicyIdentifier возможны типовые ошибки:

  • отсутствие обязательного sigPolicyId при explicit режиме
  • несоответствие длины hashValue алгоритму
  • некорректный OID формат
  • несовместимость алгоритма хэширования

Jsrsasign в большинстве случаев не выполняет строгую валидацию бизнес-логики, ограничиваясь проверкой ASN.1 корректности, поэтому контроль входных данных остаётся на уровне приложения.

Совместимость с ETSI CAdES

Класс SignaturePolicyIdentifier соответствует требованиям:

  • ETSI EN 319 122
  • ETSI EN 319 132
  • ETSI TS 101 733

Эти стандарты определяют структуру расширенных электронных подписей, включая обязательность или опциональность политики подписи в зависимости от профиля CAdES-BES, CAdES-EPES и других.

SignaturePolicyIdentifier особенно важен в профиле EPES (Explicit Policy-based Electronic Signature), где наличие политики является обязательным.

Использование в цепочке формирования подписи

В типичном процессе создания подписи:

  1. формируется документ CMS SignedData
  2. создаются SignedAttributes
  3. добавляется SignaturePolicyIdentifier
  4. вычисляется хэш SignedAttributes
  5. выполняется криптографическая подпись

SignaturePolicyIdentifier участвует до шага подписи, влияя на итоговый подписываемый блок.

Расширенные сценарии использования

В корпоративных системах SignaturePolicyIdentifier применяется для:

  • юридически значимого документооборота
  • банковских транзакций
  • государственных сервисов электронной подписи
  • межсистемного обмена подписанными данными

Наличие политики позволяет валидатору подписи проверять не только криптографическую корректность, но и соответствие регламенту.

Взаимодействие с другими атрибутами CAdES

SignaturePolicyIdentifier часто используется совместно с:

  • SigningCertificate / SigningCertificateV2
  • ContentType
  • MessageDigest
  • SigningTime

Эти атрибуты образуют полный набор SignedAttributes, обеспечивающий семантическую и криптографическую целостность подписи.

Особенности сериализации в Jsrsasign

При сериализации важно учитывать:

  • порядок атрибутов (DER требует канонического порядка)
  • корректное кодирование SET OF
  • отсутствие лишних optional полей
  • строгую типизацию ASN.1 элементов

Jsrsasign автоматически упорядочивает SET, но структура данных должна быть корректной на уровне входа.

Практическая архитектурная роль класса

KJUR.asn1.cades.SignaturePolicyIdentifier является не самостоятельным криптографическим механизмом, а генератором ASN.1 структуры, встроенной в более широкий процесс CMS-подписи. Его функция заключается в формализации политики подписи в виде стандартизированного бинарного представления, совместимого с PKCS#7 и CAdES.