2012-06-16 40 views
2

我必须验证使用http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256算法签名的XmlSignature。由于该算法不支持使用本机.NET SignedXml类,因此我使用BouncyCastle实现了该检查。验证使用BouncyCastle在C#中使用ECDSA(使用SHA256)签名的XML签名InvalidCastException

我的实现原理如下:

// 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); 

在最后statment出现的错误,并读取

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

由于XMLSignature中最有可能是有效的(通过使用官方认可的关联创建Java应用程序)我很确定这个错误在前面的代码块中。 任何人都可以给我一个提示如何进行?

感谢, 菲利普

回答

相关问题