Проверка XMLSignature, подписанного с помощью ECDSA (с SHA256) в C# с использованием BouncyCastle, вызывает InvalidCastException

Мне нужно проверить XmlSignature, подписанный с помощью http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256 алгоритм. Поскольку этот алгоритм не поддерживается с помощью собственного класса .NET SignedXml, я реализовал проверку с помощью BouncyCastle.

Моя реализация работает следующим образом:

// read certificate
var bytes = Convert.FromBase64String("...");
var cert = new X509CertificateParser().ReadCertificate(bytes);
var ecPublicKeyParameters = (ECPublicKeyParameters)cert.GetPublicKey();

// load signed XmlDocument
var xDoc = new XmlDocument();
xDoc.Load("Response_Success.xml");

// get signature value
var nav = xDoc.CreateNavigator();
nav.MoveToFollowing("SignatureValue", "http://www.w3.org/2000/09/xmldsig#");
var signatureAsString = Regex.Replace(nav.InnerXml.Trim(), @"\s", "");
var signatureValue = Convert.FromBase64String(signatureAsString);

// get and canonicalize signed info
var signedInfo = xDoc.GetElementsByTagName("SignedInfo", "http://www.w3.org/2000/09/xmldsig#")[0];
// move used NS from the document root element to the SignedInfo element
var ns = RetrieveNameSpaces((XmlElement)signedInfo);
InsertNamespacesIntoElement(ns, (XmlElement)signedInfo);

// apply an XmlDsigC14NTransformation
var signedInfoStream = canonicalizeNode(signedInfo);

// hash signed info
var hashAlgorithm = SHA256.Create();
var hashedSignedInfo = hashAlgorithm.ComputeHash(signedInfoStream);

// check signature
var signer = SignerUtilities.GetSigner("ECDSA");
signer.Init(false, ecPublicKeyParameters);
signer.BlockUpdate(hashedSignedInfo, 0, hashedSignedInfo.Length);
var isSignatureValid = signer.VerifySignature(signatureValue);

Ошибка возникает в самой последней инструкции и читается

System.InvalidCastException: Unable to cast object of type 'Org.BouncyCastle.Asn1.DerApplicationSpecific' to type 'Org.BouncyCastle.Asn1.Asn1Sequence'.

Поскольку XmlSignature, скорее всего, действителен (создан официально признанной ассоциацией с использованием приложения Java), я почти уверен, что ошибка в предыдущем блоке кода. Может ли кто-нибудь дать мне подсказку, как действовать?

Спасибо, Филипп


person bit.Id    schedule 16.06.2012    source источник


Ответы (1)


Вы правильно кодируете? Возможно, вы захотите взглянуть на следующее: Проверка цифровой подписи с использованием BouncyCastle — ECDSA с SHA 256, C#

person Philipp    schedule 13.11.2012