while generating digital signature with sha256 algorithm showing malformed reference element on signedxml.computesignature.
Code :- Algorithm is SHA256
private SignedXml Sign(XmlDocument doc,string LogoutResponseID)
{
doc.PreserveWhitespace = true;
var TimestampID = Guid.NewGuid().ToString();
X509Certificate2 cert=new X509Certificate2();
X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
X509Certificate2Collection certificates = store.Certificates.Find(X509FindType.FindByThumbprint, CertThumbprint, false);
if (certificates.Count == 0)
{
// "Certificate not installed."
}
else
{
cert = certificates[0];
}
store.Close();
MySignedXml signed = new MySignedXml(doc) { SigningKey = cert.GetRSAPrivateKey() };
//MySignedXml signed = new MySignedXml(doc.DocumentElement);
//signed.SigningKey = cert.PrivateKey;
string signatureCanonicalizationMethod = "";
string signatureMethod = "";
string digestMethod = "";
signed.SignedInfo.CanonicalizationMethod = signatureCanonicalizationMethod;
signed.SignedInfo.SignatureMethod = signatureMethod;
XmlDsigEnvelopedSignatureTransform envelopeTransform = new XmlDsigEnvelopedSignatureTransform();
envelopeTransform.Algorithm = SignedXml.XmlDsigEnvelopedSignatureTransformUrl;
XmlUrlResolver xmlresolver = new XmlUrlResolver();
xmlresolver.Credentials = System.Net.CredentialCache.DefaultCredentials;
XmlDsigExcC14NTransform cn14Transform = new XmlDsigExcC14NTransform();
cn14Transform.Algorithm = SignedXml.XmlDsigExcC14NTransformUrl;
var signatureReference = new Reference() { Uri = "#"+ LogoutResponseID };
//signatureReference.Uri = "#"+ signed.GetIdElement(doc, LogoutResponseID);
signatureReference.AddTransform(envelopeTransform);
signatureReference.AddTransform(cn14Transform);
signatureReference.DigestMethod = digestMethod;
signed.AddReference(signatureReference);
signed.ComputeSignature();
return signed;
}
internal sealed class MySignedXml : SignedXml
{
public MySignedXml(XmlDocument xml)
: base(xml)
{
}
public MySignedXml(XmlElement xmlElement)
: base(xmlElement)
{
}
public override XmlElement GetIdElement(XmlDocument doc, string ID)
{
XmlElement idElem = base.GetIdElement(doc, ID);
if (idElem == null)
{
XmlNamespaceManager xMan = new XmlNamespaceManager(doc.NameTable);
xMan.AddNamespace("samlp", "urn:oasis:names:tc:SAML:2.0:protocol");
idElem = doc.SelectSingleNode("/samlp:LogoutResponse/@ID='{ID}'", xMan) as XmlElement;
}
return idElem;
}
}