ReferenceTest.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. //
  2. // ReferenceTest.cs - NUnit Test Cases for Reference
  3. //
  4. // Author:
  5. // Sebastien Pouliot <[email protected]>
  6. //
  7. // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
  8. // (C) 2004 Novell (http://www.novell.com)
  9. //
  10. using System;
  11. using System.Security.Cryptography;
  12. using System.Security.Cryptography.Xml;
  13. using System.Xml;
  14. using NUnit.Framework;
  15. namespace MonoTests.System.Security.Cryptography.Xml {
  16. [TestFixture]
  17. public class ReferenceTest {
  18. protected Reference reference;
  19. [SetUp]
  20. public void SetUp ()
  21. {
  22. reference = new Reference ();
  23. }
  24. [Test]
  25. public void Properties ()
  26. {
  27. Assert.IsNull (reference.Uri, "Uri (null)");
  28. Assert.IsNotNull (reference.TransformChain, "TransformChain");
  29. // test uri constructor
  30. string uri = "uri";
  31. reference = new Reference (uri);
  32. Assert.AreEqual (SignedXml.XmlDsigSHA256Url, reference.DigestMethod, "DigestMethod");
  33. Assert.IsNull (reference.DigestValue, "DigestValue");
  34. Assert.IsNull (reference.Id, "Id");
  35. Assert.IsNull (reference.Type, "Type");
  36. Assert.AreEqual (uri, reference.Uri, "Uri");
  37. }
  38. [Test]
  39. public void LoadNoTransform ()
  40. {
  41. string test = "<Reference URI=\"#MyObjectId\" xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>/Vvq6sXEVbtZC8GwNtLQnGOy/VI=</DigestValue></Reference>";
  42. XmlDocument doc = new XmlDocument ();
  43. doc.LoadXml (test);
  44. reference.LoadXml (doc.DocumentElement);
  45. Assert.AreEqual (test, (reference.GetXml().OuterXml), "Load-Xml");
  46. Assert.AreEqual ("#MyObjectId", reference.Uri, "Load-URI");
  47. byte[] hash = { 0xFD, 0x5B, 0xEA, 0xEA, 0xC5, 0xC4, 0x55, 0xBB, 0x59, 0x0B, 0xC1, 0xB0, 0x36, 0xD2, 0xD0, 0x9C, 0x63, 0xB2, 0xFD, 0x52 };
  48. AssertCrypto.AssertEquals("Load-Digest", hash, reference.DigestValue);
  49. Assert.AreEqual (0, reference.TransformChain.Count, "Load-#Transform");
  50. }
  51. [Test]
  52. public void LoadBase64Transform ()
  53. {
  54. string test = "<Reference xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><Transforms><Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#base64\" /></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
  55. XmlDocument doc = new XmlDocument ();
  56. doc.LoadXml (test);
  57. reference.LoadXml (doc.DocumentElement);
  58. Assert.AreEqual (test, (reference.GetXml().OuterXml), "Load-Base64");
  59. Assert.AreEqual (1, reference.TransformChain.Count, "Load-#Transform");
  60. }
  61. [Test]
  62. public void LoadC14NTransform ()
  63. {
  64. string test = "<Reference xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><Transforms><Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\" /></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
  65. XmlDocument doc = new XmlDocument ();
  66. doc.LoadXml (test);
  67. reference.LoadXml (doc.DocumentElement);
  68. Assert.AreEqual (test, (reference.GetXml().OuterXml), "Load-C14N");
  69. Assert.AreEqual (1, reference.TransformChain.Count, "Load-#Transform");
  70. }
  71. [Test]
  72. public void LoadC14NWithCommentsTransforms ()
  73. {
  74. string test = "<Reference xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><Transforms><Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments\" /></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
  75. XmlDocument doc = new XmlDocument ();
  76. doc.LoadXml (test);
  77. reference.LoadXml (doc.DocumentElement);
  78. Assert.AreEqual (test, (reference.GetXml().OuterXml), "Load-C14NWithComments");
  79. Assert.AreEqual (1, reference.TransformChain.Count, "Load-#Transform");
  80. }
  81. [Test]
  82. public void LoadEnvelopedSignatureTransforms ()
  83. {
  84. string test = "<Reference xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><Transforms><Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\" /></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
  85. XmlDocument doc = new XmlDocument ();
  86. doc.LoadXml (test);
  87. reference.LoadXml (doc.DocumentElement);
  88. Assert.AreEqual (test, (reference.GetXml().OuterXml), "Load-Enveloped");
  89. Assert.AreEqual (1, reference.TransformChain.Count, "Load-#Transform");
  90. }
  91. [Test]
  92. public void LoadXPathTransforms ()
  93. {
  94. // test1 (MS) is an XML equivalent to test2 (Mono)
  95. string test1 = "<Reference xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><Transforms><Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xpath-19991116\"><XPath></XPath></Transform></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
  96. string test2 = "<Reference xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><Transforms><Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xpath-19991116\"><XPath /></Transform></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
  97. XmlDocument doc = new XmlDocument ();
  98. doc.LoadXml (test1);
  99. reference.LoadXml (doc.DocumentElement);
  100. string result = (reference.GetXml().OuterXml);
  101. Assert.IsTrue (((test1 == result) || (test2 == result)), result);
  102. Assert.AreEqual (1, reference.TransformChain.Count, "Load-#Transform");
  103. }
  104. [Test]
  105. public void LoadXsltTransforms ()
  106. {
  107. string test = "<Reference xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><Transforms>";
  108. test += "<Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xslt-19991116\">";
  109. test += "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns=\"http://www.w3.org/TR/xhtml1/strict\" exclude-result-prefixes=\"foo\" version=\"1.0\">";
  110. test += "<xsl:output encoding=\"UTF-8\" indent=\"no\" method=\"xml\" />";
  111. test += "<xsl:template match=\"/\"><html><head><title>Notaries</title>";
  112. test += "</head><body><table><xsl:for-each select=\"Notaries/Notary\">";
  113. test += "<tr><th><xsl:value-of select=\"@name\" /></th></tr></xsl:for-each>";
  114. test += "</table></body></html></xsl:template></xsl:stylesheet></Transform>";
  115. test += "</Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
  116. XmlDocument doc = new XmlDocument ();
  117. doc.LoadXml (test);
  118. reference.LoadXml (doc.DocumentElement);
  119. string result = reference.GetXml().OuterXml;
  120. Assert.AreEqual (test, result, result);
  121. Assert.AreEqual (1, reference.TransformChain.Count, "Load-#Transform");
  122. }
  123. [Test]
  124. public void LoadAllTransforms ()
  125. {
  126. string test1 = "<Reference xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><Transforms><Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#base64\" /><Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\" /><Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments\" /><Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\" /><Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xpath-19991116\"><XPath></XPath></Transform>";
  127. test1 += "<Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xslt-19991116\">";
  128. test1 += "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns=\"http://www.w3.org/TR/xhtml1/strict\" exclude-result-prefixes=\"foo\" version=\"1.0\">";
  129. test1 += "<xsl:output encoding=\"UTF-8\" indent=\"no\" method=\"xml\" />";
  130. test1 += "<xsl:template match=\"/\"><html><head><title>Notaries</title>";
  131. test1 += "</head><body><table><xsl:for-each select=\"Notaries/Notary\">";
  132. test1 += "<tr><th><xsl:value-of select=\"@name\" /></th></tr></xsl:for-each>";
  133. test1 += "</table></body></html></xsl:template></xsl:stylesheet></Transform>";
  134. test1 += "</Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
  135. string test2 = test1.Replace ("<XPath></XPath>", "<XPath />"); // Mono
  136. XmlDocument doc = new XmlDocument ();
  137. doc.LoadXml (test1);
  138. reference.LoadXml (doc.DocumentElement);
  139. string result = reference.GetXml().OuterXml;
  140. Assert.IsTrue (((result == test1) || (result == test2)), result);
  141. Assert.AreEqual (6, reference.TransformChain.Count, "Load-#Transform");
  142. }
  143. [Test]
  144. public void AddAllTransforms ()
  145. {
  146. reference.DigestMethod = SignedXml.XmlDsigSHA1Url;
  147. reference.DigestValue = new byte [20];
  148. reference.AddTransform (new XmlDsigBase64Transform ());
  149. reference.AddTransform (new XmlDsigC14NTransform ());
  150. reference.AddTransform (new XmlDsigC14NWithCommentsTransform ());
  151. reference.AddTransform (new XmlDsigEnvelopedSignatureTransform ());
  152. reference.AddTransform (new XmlDsigXPathTransform ());
  153. reference.AddTransform (new XmlDsigXsltTransform ());
  154. const string expected = "<Reference xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><Transforms><Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#base64\" /><Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\" /><Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments\" /><Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\" /><Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xpath-19991116\"><XPath /></Transform><Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xslt-19991116\" /></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
  155. Assert.That (reference.GetXml ().OuterXml, Is.EqualTo (expected), "OuterXml");
  156. // can we add them again ?
  157. reference.AddTransform (new XmlDsigBase64Transform ());
  158. reference.AddTransform (new XmlDsigC14NTransform ());
  159. reference.AddTransform (new XmlDsigC14NWithCommentsTransform ());
  160. reference.AddTransform (new XmlDsigEnvelopedSignatureTransform ());
  161. reference.AddTransform (new XmlDsigXPathTransform ());
  162. reference.AddTransform (new XmlDsigXsltTransform ());
  163. // seems so ;-)
  164. Assert.AreEqual (12, reference.TransformChain.Count, "# Transforms");
  165. }
  166. [Test]
  167. public void Null ()
  168. {
  169. // null DigestMethod -> "" DigestMethod !!!
  170. reference.DigestMethod = null;
  171. Assert.IsNull (reference.DigestMethod, "DigestMethod null");
  172. }
  173. [Test]
  174. [ExpectedException (typeof (NullReferenceException))]
  175. public void Bad1 ()
  176. {
  177. reference.Uri = "#MyObjectId";
  178. // not enough info
  179. XmlElement bad = reference.GetXml ();
  180. }
  181. [Test]
  182. public void Bad2 ()
  183. {
  184. // bad hash - there's no validation!
  185. reference.DigestMethod = "http://www.w3.org/2000/09/xmldsig#mono";
  186. }
  187. const string xml = @"<player bats=""left"" id=""10012"" throws=""right"">
  188. <!-- Here&apos;s a comment -->
  189. <name>Alfonso Soriano</name>
  190. <position>2B</position>
  191. <team>New York Yankees</team>
  192. <dsig:Signature xmlns=""http://www.w3.org/2000/09/xmldsig#"" xmlns:dsig=""http://www.w3.org/2000/09/xmldsig#"">"
  193. + @"<dsig:SignedInfo><dsig:CanonicalizationMethod Algorithm=""http://www.w3.org/TR/2001/REC-xml-c14n-withcomments-20010315""/><dsig:SignatureMethod Algorithm=""http://www.w3.org/2000/09/xmldsig#rsa-sha1""/>"
  194. + @"<dsig:Reference URI=""""><dsig:Transforms><dsig:Transform Algorithm=""http://www.w3.org/2000/09/xmldsig#enveloped-signature""/></dsig:Transforms><dsig:DigestMethod Algorithm=""http://www.w3.org/2000/09/xmldsig#sha1""/><dsig:DigestValue>nDF2V/bzRd0VE3EwShWtsBzTEDc=</dsig:DigestValue></dsig:Reference></dsig:SignedInfo><dsig:SignatureValue>fbye4Xm//RPUTsLd1dwJPo0gPZYX6gVYCEB/gz2348EARNk/nCCch1fFfpuqAGMKg4ayVC0yWkUyE5V4QB33jaGlh9wuNQSjxs6TIvFwSsT+0ioDgVgFv0gVeasbyNL4rFEHuAWL8QKwDT9L6b2wUvJC90DmpBs9GMR2jTZIWlM=</dsig:SignatureValue><dsig:KeyInfo><dsig:X509Data><dsig:X509Certificate>MIIC0DCCAjmgAwIBAgIDD0JBMA0GCSqGSIb3DQEBBAUAMHwxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhOZXcgWW9yazERMA8GA1UEBxMITmV3IFlvcmsxGTAXBgNVBAoTEFBoYW9zIFRlY2hub2xvZ3kxFDASBgNVBAsTC0VuZ2luZWVyaW5nMRYwFAYDVQQDEw1UZXN0IENBIChSU0EpMB4XDTAyMDQyOTE5MTY0MFoXDTEyMDQyNjE5MTY0MFowgYAxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhOZXcgWW9yazERMA8GA1UEBxMITmV3IFlvcmsxGTAXBgNVBAoTEFBoYW9zIFRlY2hub2xvZ3kxFDASBgNVBAsTC0VuZ2luZWVyaW5nMRowGAYDVQQDExFUZXN0IENsaWVudCAoUlNBKTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAgIb6nAB9oS/AI5jIj6WymvQhRxiMlE07G4abmMliYi5zWzvaFE2tnU+RZIBgtoXcgDEIU/vsLQut7nzCn9mHxC8JEaV4D4U91j64AyZakShqJw7qjJfqUxxPL0yJv2oFiouPDjGuJ9JPi0NrsZq+yfWfM54s4b9SNkcOIVMybZUCAwEAAaNbMFkwDAYDVR0TAQH/BAIwADAPBgNVHQ8BAf8EBQMDB9gAMBkGA1UdEQQSMBCBDnRlY2hAcGhhb3MuY29tMB0GA1UdDgQWBBQT58rBCxPmVLeZaYGRqVROnQlFbzANBgkqhkiG9w0BAQQFAAOBgQCxbCovFST25t+ryN1RipqozxJQcguKfeCwbfgBNobzcRvoW0kSIf7zi4mtQajDM0NfslFF51/dex5Rn64HmFFshSwSvQQMyf5Cfaqv2XQ60OXq6nAFG6WbHoge6RqfIez2MWDLoSB6plsjKtMmL3mcybBhROtX5GGuLx1NtfhNFQ==</dsig:X509Certificate><dsig:X509IssuerSerial><dsig:X509IssuerName>CN=Test CA (RSA),OU=Engineering,O=Phaos Technology,L=New York,ST=New York,C=US</dsig:X509IssuerName><dsig:X509SerialNumber>1000001</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509SubjectName>CN=Test Client (RSA),OU=Engineering,O=Phaos Technology,L=New York,ST=New York,C=US</dsig:X509SubjectName><dsig:X509SKI>E+fKwQsT5lS3mWmBkalUTp0JRW8=</dsig:X509SKI></dsig:X509Data></dsig:KeyInfo></dsig:Signature></player>";
  195. [Test]
  196. public void KeepDocument ()
  197. {
  198. string result = @"<dsig:Reference URI="""" xmlns:dsig=""http://www.w3.org/2000/09/xmldsig#""><dsig:Transforms><dsig:Transform Algorithm=""http://www.w3.org/2000/09/xmldsig#enveloped-signature"" /></dsig:Transforms><dsig:DigestMethod Algorithm=""http://www.w3.org/2000/09/xmldsig#sha1"" /><dsig:DigestValue>nDF2V/bzRd0VE3EwShWtsBzTEDc=</dsig:DigestValue></dsig:Reference>";
  199. XmlDocument doc = new XmlDocument ();
  200. doc.LoadXml (xml);
  201. XmlElement org = (XmlElement) doc.SelectSingleNode ("//*[local-name()='Reference']");
  202. Reference r = new Reference ();
  203. r.LoadXml (org);
  204. XmlElement el = r.GetXml ();
  205. Assert.AreEqual (doc, el.OwnerDocument);
  206. Assert.AreEqual (org, el);
  207. Assert.AreEqual (result, el.OuterXml);
  208. }
  209. }
  210. }