Я изо всех сил пытаюсь добавить аутентифицированные атрибуты (данные OCSP) в свое сообщение с помощью CryptoApi. Сначала я использовал упрощенные функции сообщений CryptoApi, но теперь переключился на низкоуровневые функции сообщений, думая, что смогу лучше контролировать структуру сообщений. Но я снова застрял. Мой процесс выглядит следующим образом:
- Инициализировать структуру CMSG_SIGNER_ENCODE_INFO и CMSG_SIGNED_ENCODE_INFO.
- Я создаю CRYPT_ATTRIBUTE для даты ocsp и указываю ее в структуре CMSG_SIGNER_ENCODE_INFO.
- Затем я вызываю CryptMsgCalculateEncodedLength, чтобы получить размер
- CryptMsgOpenToEncode с CMSG_SIGNED в качестве типа сообщения
- CryptMsgUpdate, чтобы вставить мой контент в сообщение
- CryptMsgGetParam с CMSG_CONTENT_PARAM для получения закодированного большого двоичного объекта.
- CryptMsgClose, на данный момент я закончил с сообщением.
Я снова открываю сообщение, чтобы получить CMSG_ENCRYPTED_DIGEST, который отправляется в TSA, а результат добавляется как атрибут без проверки подлинности с помощью CryptMsgControl.
Я использую это для подписи тегов подписи в Adobe. Поэтому, когда нет аутентифицированных атрибутов, я получаю три зеленых галочки от Adobe:
- Документ не изменен...
- Документ подписан текущим пользователем
- Подпись включает встроенную отметку времени (и отметка времени проверена)
Но как только аутентифицированный атрибут добавлен, личность подписывающей стороны становится недействительной, а данные метки времени неверными. CMSG_COMPUTED_HASH_PARAM, когда атрибуты аутентификации добавляются, а когда нет, отличается. Разве это не должно быть то же самое? Поскольку дайджест документа относится к содержимому документа, а не к аутентифицированному атрибуту.
Есть ли другой способ добавить аутентифицированные атрибуты? Я пытался добавить его в качестве подписанта с помощью CryptMsgControl, но это тоже не помогло...