У меня есть подпись 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 найден.