ReferenceTest.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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 : Assertion {
  18. protected Reference reference;
  19. [SetUp]
  20. void SetUp ()
  21. {
  22. reference = new Reference ();
  23. }
  24. [Test]
  25. public void Properties ()
  26. {
  27. AssertNull ("Uri (null)", reference.Uri);
  28. AssertNotNull ("TransformChain", reference.TransformChain);
  29. AssertEquals ("ToString()", "System.Security.Cryptography.Xml.Reference", reference.ToString ());
  30. // test uri constructor
  31. string uri = "uri";
  32. reference = new Reference (uri);
  33. AssertEquals ("DigestMethod", "http://www.w3.org/2000/09/xmldsig#sha1", reference.DigestMethod);
  34. AssertNull ("DigestValue", reference.DigestValue);
  35. AssertNull ("Id", reference.Id);
  36. AssertNull ("Type", reference.Type);
  37. AssertEquals ("Uri", uri, reference.Uri);
  38. }
  39. [Test]
  40. public void LoadNoTransform ()
  41. {
  42. 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>";
  43. XmlDocument doc = new XmlDocument ();
  44. doc.LoadXml (test);
  45. reference.LoadXml (doc.DocumentElement);
  46. AssertEquals ("Load-Xml", test, (reference.GetXml().OuterXml));
  47. AssertEquals ("Load-URI", "#MyObjectId", reference.Uri);
  48. byte[] hash = { 0xFD, 0x5B, 0xEA, 0xEA, 0xC5, 0xC4, 0x55, 0xBB, 0x59, 0x0B, 0xC1, 0xB0, 0x36, 0xD2, 0xD0, 0x9C, 0x63, 0xB2, 0xFD, 0x52 };
  49. AssertCrypto.AssertEquals("Load-Digest", hash, reference.DigestValue);
  50. AssertEquals ("Load-#Transform", 0, reference.TransformChain.Count);
  51. }
  52. [Test]
  53. public void LoadBase64Transform ()
  54. {
  55. 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>";
  56. XmlDocument doc = new XmlDocument ();
  57. doc.LoadXml (test);
  58. reference.LoadXml (doc.DocumentElement);
  59. AssertEquals ("Load-Base64", test, (reference.GetXml().OuterXml));
  60. AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
  61. }
  62. [Test]
  63. public void LoadC14NTransform ()
  64. {
  65. 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>";
  66. XmlDocument doc = new XmlDocument ();
  67. doc.LoadXml (test);
  68. reference.LoadXml (doc.DocumentElement);
  69. AssertEquals ("Load-C14N", test, (reference.GetXml().OuterXml));
  70. AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
  71. }
  72. [Test]
  73. public void LoadC14NWithCommentsTransforms ()
  74. {
  75. 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>";
  76. XmlDocument doc = new XmlDocument ();
  77. doc.LoadXml (test);
  78. reference.LoadXml (doc.DocumentElement);
  79. AssertEquals ("Load-C14NWithComments", test, (reference.GetXml().OuterXml));
  80. AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
  81. }
  82. [Test]
  83. public void LoadEnvelopedSignatureTransforms ()
  84. {
  85. 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>";
  86. XmlDocument doc = new XmlDocument ();
  87. doc.LoadXml (test);
  88. reference.LoadXml (doc.DocumentElement);
  89. AssertEquals ("Load-Enveloped", test, (reference.GetXml().OuterXml));
  90. AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
  91. }
  92. [Test]
  93. public void LoadXPathTransforms ()
  94. {
  95. // test1 (MS) is an XML equivalent to test2 (Mono)
  96. 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>";
  97. 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>";
  98. XmlDocument doc = new XmlDocument ();
  99. doc.LoadXml (test1);
  100. reference.LoadXml (doc.DocumentElement);
  101. string result = (reference.GetXml().OuterXml);
  102. Assert (result, ((test1 == result) || (test2 == result)));
  103. AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
  104. }
  105. [Test]
  106. public void LoadXsltTransforms ()
  107. {
  108. string test = "<Reference xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><Transforms>";
  109. test += "<Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xslt-19991116\">";
  110. 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\">";
  111. test += "<xsl:output encoding=\"UTF-8\" indent=\"no\" method=\"xml\" />";
  112. test += "<xsl:template match=\"/\"><html><head><title>Notaries</title>";
  113. test += "</head><body><table><xsl:for-each select=\"Notaries/Notary\">";
  114. test += "<tr><th><xsl:value-of select=\"@name\" /></th></tr></xsl:for-each>";
  115. test += "</table></body></html></xsl:template></xsl:stylesheet></Transform>";
  116. test += "</Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
  117. XmlDocument doc = new XmlDocument ();
  118. doc.LoadXml (test);
  119. reference.LoadXml (doc.DocumentElement);
  120. string result = reference.GetXml().OuterXml;
  121. AssertEquals (result, test, result);
  122. AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
  123. }
  124. [Test]
  125. public void LoadAllTransforms ()
  126. {
  127. 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>";
  128. test1 += "<Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xslt-19991116\">";
  129. 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\">";
  130. test1 += "<xsl:output encoding=\"UTF-8\" indent=\"no\" method=\"xml\" />";
  131. test1 += "<xsl:template match=\"/\"><html><head><title>Notaries</title>";
  132. test1 += "</head><body><table><xsl:for-each select=\"Notaries/Notary\">";
  133. test1 += "<tr><th><xsl:value-of select=\"@name\" /></th></tr></xsl:for-each>";
  134. test1 += "</table></body></html></xsl:template></xsl:stylesheet></Transform>";
  135. test1 += "</Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
  136. string test2 = test1.Replace ("<XPath></XPath>", "<XPath />"); // Mono
  137. XmlDocument doc = new XmlDocument ();
  138. doc.LoadXml (test1);
  139. reference.LoadXml (doc.DocumentElement);
  140. string result = reference.GetXml().OuterXml;
  141. Assert (result, ((result == test1) || (result == test2)));
  142. AssertEquals ("Load-#Transform", 6, reference.TransformChain.Count);
  143. }
  144. [Test]
  145. public void AddAllTransforms ()
  146. {
  147. // adding an empty hash value
  148. byte[] hash = new byte [20];
  149. reference.DigestValue = hash;
  150. XmlElement xel = reference.GetXml ();
  151. // this is the minimal Reference (DisestValue)!
  152. AssertNotNull ("GetXml", xel);
  153. reference.AddTransform (new XmlDsigBase64Transform ());
  154. reference.AddTransform (new XmlDsigC14NTransform ());
  155. reference.AddTransform (new XmlDsigC14NWithCommentsTransform ());
  156. reference.AddTransform (new XmlDsigEnvelopedSignatureTransform ());
  157. reference.AddTransform (new XmlDsigXPathTransform ());
  158. reference.AddTransform (new XmlDsigXsltTransform ());
  159. // MS's results
  160. 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><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>";
  161. // Mono's result (xml is equivalent but not identical)
  162. string test2 = test1.Replace ("<XPath></XPath>", "<XPath xmlns=\"http://www.w3.org/2000/09/xmldsig#\" />");
  163. string result = reference.GetXml().OuterXml;
  164. Assert (result, ((result == test1) || (result == test2)));
  165. // however this value cannot be loaded as it's missing some transform (xslt) parameters
  166. // can we add them again ?
  167. reference.AddTransform (new XmlDsigBase64Transform ());
  168. reference.AddTransform (new XmlDsigC14NTransform ());
  169. reference.AddTransform (new XmlDsigC14NWithCommentsTransform ());
  170. reference.AddTransform (new XmlDsigEnvelopedSignatureTransform ());
  171. reference.AddTransform (new XmlDsigXPathTransform ());
  172. reference.AddTransform (new XmlDsigXsltTransform ());
  173. // seems so ;-)
  174. AssertEquals ("# Transforms", 12, reference.TransformChain.Count);
  175. }
  176. [Test]
  177. public void Null ()
  178. {
  179. // null DigestMethod -> "" DigestMethod !!!
  180. reference.DigestMethod = null;
  181. AssertNull ("DigestMethod null", reference.DigestMethod);
  182. }
  183. [Test]
  184. [ExpectedException (typeof (NullReferenceException))]
  185. public void Bad1 ()
  186. {
  187. reference.Uri = "#MyObjectId";
  188. // not enough info
  189. XmlElement bad = reference.GetXml ();
  190. }
  191. [Test]
  192. public void Bad2 ()
  193. {
  194. // bad hash - there's no validation!
  195. reference.DigestMethod = "http://www.w3.org/2000/09/xmldsig#mono";
  196. }
  197. }
  198. }