La fonction de signature signedXml.ComputeSignature() retourne une erreur selon le type de certificat utilisé en .NET 2.0:
SignedXml signedXml = new SignedXml();
signedXml.SigningKey = cert.PrivateKey; // cert est le certificat X509Certificate2 utilisé
Reference reference = new Reference();
reference.Uri = URIString; // la référence sur le fichier à signer
signedXml.AddReference(reference);
KeyInfo keyInfo = new KeyInfo();
KeyInfoX509Data kdata = new KeyInfoX509Data(cert);
keyInfo.AddClause(kdata);
signedXml.KeyInfo = keyInfo;
signedXml.ComputeSignature();
L'erreur remontée est:
« Hash non valide pour l’utilisation dans cet état »
La trace de l’exception est la suivante :
à System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
à System.Security.Cryptography.Utils._SignValue(SafeKeyHandle hKey, Int32 keyNumber, Int32 calgKey, Int32 calgHash, Byte[] hash, Int32 dwFlags)
à System.Security.Cryptography.RSACryptoServiceProvider.SignHash(Byte[] rgbHash, String str)
à System.Security.Cryptography.RSAPKCS1SignatureFormatter.CreateSignature(Byte[] rgbHash)
à System.Security.Cryptography.AsymmetricSignatureFormatter.CreateSignature(HashAlgorithm hash)
à System.Security.Cryptography.Xml.SignedXml.ComputeSignature()
à FileSignatureLibrary.FileSignature.SignerXMLRessourceDetachee(String URIString, String XmlSigFileName, X509Certificate2 cert, String& msgErreur)
Cette erreur survient seulement lors de l'utilisation d'un certificat ChamberSign sur clé USB Cyberflex e-gate 32K Axalto.
Quand la clé n'est pas présente, la fonction demande l'insertion d'une carte à puce, ce qui tend à démontrer que c'est bien le certificat sur la clé qui est accédé.
L'utilisation d'autres fonctions .NET comme RSACryptoServiceProvider.SignData() provoque la même erreur
Any Ideas?