преобразовать сигнатуру CMS (на основе PKCS # 7) в значение, подходящее для xmldsig поле - PullRequest
0 голосов
/ 12 марта 2020

У меня есть подпись CMS (на основе PKCS # 7), и я хочу создать из нее эквивалентный xmldsig. Я могу извлечь сертификат X509 из сообщения CMS, но я не вижу способа извлечь подпись ha sh (для повторного использования в поле xmldsig). Есть ли способ извлечь подпись ha sh из сообщения CMS?

1 Ответ

0 голосов
/ 20 апреля 2020

У меня есть подпись CMS (на основе PKCS # 7), и я хочу создать из нее эквивалентный xmldsig.

Невозможно преобразовать SignedData CMS в подписанный XmlDSig. Xml, они не подписывают одно и то же.

CMS SignedData подписывает либо необработанные данные (когда нет подписанных атрибутов), либо подписанные атрибуты (которые, если они присутствуют, должны содержать правильные значения ha * 1022) * необработанных данных как атрибута).

XmlDSig Signed Xml использует подпись над канонизированным элементом SignedInfo. Элемент SignedInfo содержит ha sh (дайджест) исходных данных как часть своей полезной нагрузки.

Если у вас есть закрытый ключ и вы понимаете, что вам нужно уйти в отставку после создания значения SignedInfo вручную, тогда мы перейдите к последней части вашего вопроса:

Есть ли способ извлечь подпись ha sh из сообщения CMS?

Я не уверен, что " подпись ха sh означает. Если вы имеете в виду «ха sh исходных данных», то в SignedCms это будет что-то вроде

byte[] digest = cms.SignerInfos[0].SignedAttributes.OfType<CryptographicAttributeObject>().
    FirstOrDefault(cao => cao.Oid.Value == "1.2.840.113549.1.9.4")?.Values.
    OfType<Pkcs9MessageDigest>().FirstOrDefault()?.MessageDigest;

if (digest == null)
{
    // Older form document, have to hash the original data again.
    throw new NotImplementedException();
}

Возможно, с меньшим количеством вызовов методов расширения Linq и / или большим количеством утверждений о корректности после правильный OID найден.

...