public static void Main(String[] args) { //calculate caninicalized xml var t = new XmlDsigEnvelopedSignatureTransform(false); XmlDocument doc = new XmlDocument(); //doc.PreserveWhitespace = true; doc.Load(@"c:\temp\x.xml"); t.LoadInput(doc); FieldInfo field = t.GetType().GetField("_signaturePosition", BindingFlags.NonPublic | BindingFlags.Instance); field.SetValue(t, 1); var res = (XmlDocument)t.GetOutput(); var s = res.OuterXml; var c14 = new XmlDsigC14NTransform(); c14.LoadInput(res); var mem = (MemoryStream)c14.GetOutput(); var sha = new SHA256Managed(); var byte1 = c14.GetDigestedOutput(new SHA256Managed()); var digest1 = Convert.ToBase64String(byte1); var byte2 = sha.ComputeHash(mem.ToArray()); var digest2 = Convert.ToBase64String(byte2); var s1 = System.Text.Encoding.UTF8.GetString(mem.ToArray()); var byte3 = sha.ComputeHash(System.Text.Encoding.UTF8.GetBytes(s1)); var digest3 = Convert.ToBase64String(byte3); //return; //validate signature CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(@"c:\temp\x.xml"); XmlNode node = xmlDoc.DocumentElement; X509Certificate2 cert = new X509Certificate2(File.ReadAllBytes(@"c:\temp\x.cer")); bool isValid = ValidateXml(xmlDoc, cert); //return; //calc hash var sha1 = new SHA256Managed(); var b1 = sha1.ComputeHash(System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(@"c:\temp\x_no_sig.xml"))); var b64 = Convert.ToBase64String(b1); }
//-------------------------------------------------------------------------------------------------------------------------// // //-------------------------------------------------------------------------------------------------------------------------// /// <summary> /// /// </summary> /// <param name="source_xml"></param> /// <returns></returns> public MemoryStream EnvelopedTransformToStream(Stream source_xml) { MemoryStream _result = new MemoryStream(); XmlDsigEnvelopedSignatureTransform _envTransform = new XmlDsigEnvelopedSignatureTransform(true); { _envTransform.Algorithm = SignedXml.XmlDsigEnvelopedSignatureTransformUrl; Type[] _validInTypes = _envTransform.InputTypes; for (int i = 0; i < _validInTypes.Length; i++) { if (_validInTypes[i] == typeof(System.IO.Stream)) { _envTransform.LoadInput(source_xml); break; } } Type[] _validOutTypes = _envTransform.OutputTypes; for (int i = 0; i < _validOutTypes.Length; i++) { if (_validOutTypes[i] == typeof(XmlDocument)) { Type streamType = typeof(XmlDocument); XmlDocument _doc = (XmlDocument)_envTransform.GetOutput(streamType); _result = new MemoryStream(Encoding.UTF8.GetBytes(_doc.OuterXml)); break; } } } return(_result); }
// Encrypt the text in the specified XmlDocument. private static void ShowTransformProperties(XmlDocument xmlDoc) { //<Snippet1> XmlDsigEnvelopedSignatureTransform xmlTransform = new XmlDsigEnvelopedSignatureTransform(); //</Snippet1> // Ensure the transform is using the proper algorithm. //<Snippet4> xmlTransform.Algorithm = SignedXml.XmlDsigEnvelopedSignatureTransformUrl; //</Snippet4> // Retrieve the XML representation of the current transform. //<Snippet10> XmlElement xmlInTransform = xmlTransform.GetXml(); //</Snippet10> Console.WriteLine("\nXml representation of the current transform: "); Console.WriteLine(xmlInTransform.OuterXml); // Retrieve the valid input types for the current transform. //<Snippet5> Type[] validInTypes = xmlTransform.InputTypes; //</Snippet5> // Verify the xmlTransform can accept the XMLDocument as an // input type. for (int i = 0; i < validInTypes.Length; i++) { if (validInTypes[i] == xmlDoc.GetType()) { // Load the document into the transfrom. //<Snippet12> xmlTransform.LoadInput(xmlDoc); //</Snippet12> //<Snippet3> bool IncludeComments = true; // This transform is created for demonstration purposes. XmlDsigEnvelopedSignatureTransform secondTransform = new XmlDsigEnvelopedSignatureTransform(IncludeComments); //</Snippet3> //<Snippet13> string classDescription = secondTransform.ToString(); //</Snippet13> // This call does not perform as expected. //<Snippet11> // An enveloped signature has no inner XML elements secondTransform.LoadInnerXml(xmlDoc.SelectNodes("//.")); //</Snippet11> break; } } //<Snippet6> Type[] validOutTypes = xmlTransform.OutputTypes; //</Snippet6> for (int i = validOutTypes.Length - 1; i >= 0; i--) { if (validOutTypes[i] == typeof(System.Xml.XmlDocument)) { try { //<Snippet9> Type xmlDocumentType = typeof(System.Xml.XmlDocument); XmlDocument xmlDocumentOutput = (XmlDocument) xmlTransform.GetOutput(xmlDocumentType); //</Snippet9> // Display to the console the Xml before and after // encryption. Console.WriteLine("Result of the GetOutput method call" + " from the current transform: " + xmlDocumentOutput.OuterXml); } catch (Exception ex) { Console.WriteLine("Unexpected exception caught: " + ex.ToString()); } break; } else if (validOutTypes[i] == typeof(System.Xml.XmlNodeList)) { try { Type xmlNodeListType = typeof(System.Xml.XmlNodeList); XmlNodeList xmlNodes = (XmlNodeList) xmlTransform.GetOutput(xmlNodeListType); // Display to the console the Xml before and after // encryption. Console.WriteLine("Encoding the following message: " + xmlDoc.InnerText); Console.WriteLine("Nodes of the XmlNodeList retrieved " + "from GetOutput:"); for (int j = 0; j < xmlNodes.Count; j++) { Console.WriteLine("Node " + j + " has the following name: " + xmlNodes.Item(j).Name + " and the following InnerXml: " + xmlNodes.Item(j).InnerXml); } } catch (Exception ex) { Console.WriteLine("Unexpected exception caught: " + ex.ToString()); } break; } else { //<Snippet8> object outputObject = xmlTransform.GetOutput(); //</Snippet8> } } }