ReferenceTest.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. //
  9. using System;
  10. using System.Security.Cryptography;
  11. using System.Security.Cryptography.Xml;
  12. using System.Xml;
  13. using NUnit.Framework;
  14. namespace MonoTests.System.Security.Cryptography.Xml {
  15. [TestFixture]
  16. public class ReferenceTest : Assertion {
  17. protected Reference reference;
  18. [SetUp]
  19. void SetUp ()
  20. {
  21. reference = new Reference ();
  22. }
  23. [Test]
  24. public void Properties ()
  25. {
  26. AssertNull ("Uri (null)", reference.Uri);
  27. AssertNotNull ("TransformChain", reference.TransformChain);
  28. AssertEquals ("ToString()", "System.Security.Cryptography.Xml.Reference", reference.ToString ());
  29. // test uri constructor
  30. string uri = "uri";
  31. reference = new Reference (uri);
  32. AssertEquals ("DigestMethod", "http://www.w3.org/2000/09/xmldsig#sha1", reference.DigestMethod);
  33. AssertNull ("DigestValue", reference.DigestValue);
  34. AssertNull ("Id", reference.Id);
  35. AssertNull ("Type", reference.Type);
  36. AssertEquals ("Uri", uri, reference.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. AssertEquals ("Load-Xml", test, (reference.GetXml().OuterXml));
  46. AssertEquals ("Load-URI", "#MyObjectId", reference.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. AssertEquals ("Load-#Transform", 0, reference.TransformChain.Count);
  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. AssertEquals ("Load-Base64", test, (reference.GetXml().OuterXml));
  59. AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
  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. AssertEquals ("Load-C14N", test, (reference.GetXml().OuterXml));
  69. AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
  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. AssertEquals ("Load-C14NWithComments", test, (reference.GetXml().OuterXml));
  79. AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
  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. AssertEquals ("Load-Enveloped", test, (reference.GetXml().OuterXml));
  89. AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
  90. }
  91. [Test]
  92. public void LoadXPathTransforms ()
  93. {
  94. string test = "<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>";
  95. XmlDocument doc = new XmlDocument ();
  96. doc.LoadXml (test);
  97. reference.LoadXml (doc.DocumentElement);
  98. AssertEquals ("Load-XPath", test, (reference.GetXml().OuterXml));
  99. AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
  100. }
  101. [Test]
  102. public void LoadXsltTransforms ()
  103. {
  104. string test = "<Reference xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><Transforms>";
  105. test += "<Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xslt-19991116\">";
  106. 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\">";
  107. test += "<xsl:output encoding=\"UTF-8\" indent=\"no\" method=\"xml\" />";
  108. test += "<xsl:template match=\"/\"><html><head><title>Notaries</title>";
  109. test += "</head><body><table><xsl:for-each select=\"Notaries/Notary\">";
  110. test += "<tr><th><xsl:value-of select=\"@name\" /></th></tr></xsl:for-each>";
  111. test += "</table></body></html></xsl:template></xsl:stylesheet></Transform>";
  112. test += "</Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
  113. XmlDocument doc = new XmlDocument ();
  114. doc.LoadXml (test);
  115. reference.LoadXml (doc.DocumentElement);
  116. AssertEquals ("Load-Xslt", test, (reference.GetXml().OuterXml));
  117. AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
  118. }
  119. [Test]
  120. public void LoadAllTransforms ()
  121. {
  122. string test = "<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>";
  123. test += "<Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xslt-19991116\">";
  124. 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\">";
  125. test += "<xsl:output encoding=\"UTF-8\" indent=\"no\" method=\"xml\" />";
  126. test += "<xsl:template match=\"/\"><html><head><title>Notaries</title>";
  127. test += "</head><body><table><xsl:for-each select=\"Notaries/Notary\">";
  128. test += "<tr><th><xsl:value-of select=\"@name\" /></th></tr></xsl:for-each>";
  129. test += "</table></body></html></xsl:template></xsl:stylesheet></Transform>";
  130. test += "</Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
  131. XmlDocument doc = new XmlDocument ();
  132. doc.LoadXml (test);
  133. reference.LoadXml (doc.DocumentElement);
  134. AssertEquals ("Load-Xml", test, (reference.GetXml().OuterXml));
  135. AssertEquals ("Load-#Transform", 6, reference.TransformChain.Count);
  136. }
  137. [Test]
  138. public void AddAllTransforms ()
  139. {
  140. // adding an empty hash value
  141. byte[] hash = new byte [20];
  142. reference.DigestValue = hash;
  143. XmlElement xel = reference.GetXml ();
  144. // this is the minimal Reference (DisestValue)!
  145. AssertNotNull ("GetXml", xel);
  146. reference.AddTransform (new XmlDsigBase64Transform ());
  147. reference.AddTransform (new XmlDsigC14NTransform ());
  148. reference.AddTransform (new XmlDsigC14NWithCommentsTransform ());
  149. reference.AddTransform (new XmlDsigEnvelopedSignatureTransform ());
  150. reference.AddTransform (new XmlDsigXPathTransform ());
  151. reference.AddTransform (new XmlDsigXsltTransform ());
  152. string value = "<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>";
  153. AssertEquals("Get-Xml", value, (reference.GetXml().OuterXml));
  154. // however this value cannot be loaded as it's missing some transform (xslt) parameters
  155. // can we add them again ?
  156. reference.AddTransform (new XmlDsigBase64Transform ());
  157. reference.AddTransform (new XmlDsigC14NTransform ());
  158. reference.AddTransform (new XmlDsigC14NWithCommentsTransform ());
  159. reference.AddTransform (new XmlDsigEnvelopedSignatureTransform ());
  160. reference.AddTransform (new XmlDsigXPathTransform ());
  161. reference.AddTransform (new XmlDsigXsltTransform ());
  162. // seems so ;-)
  163. AssertEquals ("# Transforms", 12, reference.TransformChain.Count);
  164. }
  165. [Test]
  166. public void Null ()
  167. {
  168. // null DigestMethod -> "" DigestMethod !!!
  169. reference.DigestMethod = null;
  170. AssertNull ("DigestMethod null", reference.DigestMethod);
  171. }
  172. [Test]
  173. [ExpectedException (typeof (NullReferenceException))]
  174. public void Bad1 ()
  175. {
  176. reference.Uri = "#MyObjectId";
  177. // not enough info
  178. XmlElement bad = reference.GetXml ();
  179. }
  180. [Test]
  181. public void Bad2 ()
  182. {
  183. // bad hash - there's no validation!
  184. reference.DigestMethod = "http://www.w3.org/2000/09/xmldsig#mono";
  185. }
  186. }
  187. }