2 // ReferenceTest.cs - NUnit Test Cases for Reference
5 // Sebastien Pouliot (spouliot@motus.com)
7 // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
11 using System.Security.Cryptography;
12 using System.Security.Cryptography.Xml;
15 using NUnit.Framework;
17 namespace MonoTests.System.Security.Cryptography.Xml {
20 public class ReferenceTest {
22 protected Reference reference;
27 reference = new Reference ();
31 public void Properties ()
33 Assertion.AssertNull ("Uri (null)", reference.Uri);
34 Assertion.AssertNotNull ("TransformChain", reference.TransformChain);
35 Assertion.AssertEquals ("ToString()", "System.Security.Cryptography.Xml.Reference", reference.ToString ());
36 // test uri constructor
38 reference = new Reference (uri);
39 Assertion.AssertEquals ("DigestMethod", "http://www.w3.org/2000/09/xmldsig#sha1", reference.DigestMethod);
40 Assertion.AssertNull ("DigestValue", reference.DigestValue);
41 Assertion.AssertNull ("Id", reference.Id);
42 Assertion.AssertNull ("Type", reference.Type);
43 Assertion.AssertEquals ("Uri", uri, reference.Uri);
47 public void LoadNoTransform ()
49 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>";
50 XmlDocument doc = new XmlDocument ();
52 reference.LoadXml (doc.DocumentElement);
53 Assertion.AssertEquals ("Load-Xml", test, (reference.GetXml().OuterXml));
54 Assertion.AssertEquals ("Load-URI", "#MyObjectId", reference.Uri);
55 byte[] hash = { 0xFD, 0x5B, 0xEA, 0xEA, 0xC5, 0xC4, 0x55, 0xBB, 0x59, 0x0B, 0xC1, 0xB0, 0x36, 0xD2, 0xD0, 0x9C, 0x63, 0xB2, 0xFD, 0x52 };
56 AssertCrypto.AssertEquals("Load-Digest", hash, reference.DigestValue);
57 Assertion.AssertEquals ("Load-#Transform", 0, reference.TransformChain.Count);
61 public void LoadBase64Transform ()
63 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>";
64 XmlDocument doc = new XmlDocument ();
66 reference.LoadXml (doc.DocumentElement);
67 Assertion.AssertEquals ("Load-Base64", test, (reference.GetXml().OuterXml));
68 Assertion.AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
72 public void LoadC14NTransform ()
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\" /></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
75 XmlDocument doc = new XmlDocument ();
77 reference.LoadXml (doc.DocumentElement);
78 Assertion.AssertEquals ("Load-C14N", test, (reference.GetXml().OuterXml));
79 Assertion.AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
83 public void LoadC14NWithCommentsTransforms ()
85 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>";
86 XmlDocument doc = new XmlDocument ();
88 reference.LoadXml (doc.DocumentElement);
89 Assertion.AssertEquals ("Load-C14NWithComments", test, (reference.GetXml().OuterXml));
90 Assertion.AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
94 public void LoadEnvelopedSignatureTransforms ()
96 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>";
97 XmlDocument doc = new XmlDocument ();
99 reference.LoadXml (doc.DocumentElement);
100 Assertion.AssertEquals ("Load-Enveloped", test, (reference.GetXml().OuterXml));
101 Assertion.AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
105 public void LoadXPathTransforms ()
107 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>";
108 XmlDocument doc = new XmlDocument ();
110 reference.LoadXml (doc.DocumentElement);
111 Assertion.AssertEquals ("Load-XPath", test, (reference.GetXml().OuterXml));
112 Assertion.AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
116 public void LoadXsltTransforms ()
118 string test = "<Reference xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><Transforms>";
119 test += "<Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xslt-19991116\">";
120 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\">";
121 test += "<xsl:output encoding=\"UTF-8\" indent=\"no\" method=\"xml\" />";
122 test += "<xsl:template match=\"/\"><html><head><title>Notaries</title>";
123 test += "</head><body><table><xsl:for-each select=\"Notaries/Notary\">";
124 test += "<tr><th><xsl:value-of select=\"@name\" /></th></tr></xsl:for-each>";
125 test += "</table></body></html></xsl:template></xsl:stylesheet></Transform>";
126 test += "</Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
127 XmlDocument doc = new XmlDocument ();
129 reference.LoadXml (doc.DocumentElement);
130 Assertion.AssertEquals ("Load-Xslt", test, (reference.GetXml().OuterXml));
131 Assertion.AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
135 public void LoadAllTransforms ()
137 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>";
138 test += "<Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xslt-19991116\">";
139 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\">";
140 test += "<xsl:output encoding=\"UTF-8\" indent=\"no\" method=\"xml\" />";
141 test += "<xsl:template match=\"/\"><html><head><title>Notaries</title>";
142 test += "</head><body><table><xsl:for-each select=\"Notaries/Notary\">";
143 test += "<tr><th><xsl:value-of select=\"@name\" /></th></tr></xsl:for-each>";
144 test += "</table></body></html></xsl:template></xsl:stylesheet></Transform>";
145 test += "</Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
146 XmlDocument doc = new XmlDocument ();
148 reference.LoadXml (doc.DocumentElement);
149 Assertion.AssertEquals ("Load-Xml", test, (reference.GetXml().OuterXml));
150 Assertion.AssertEquals ("Load-#Transform", 6, reference.TransformChain.Count);
154 public void AddAllTransforms ()
156 // adding an empty hash value
157 byte[] hash = new byte [20];
158 reference.DigestValue = hash;
159 XmlElement xel = reference.GetXml ();
160 // this is the minimal Reference (DisestValue)!
161 Assertion.AssertNotNull ("GetXml", xel);
163 reference.AddTransform (new XmlDsigBase64Transform ());
164 reference.AddTransform (new XmlDsigC14NTransform ());
165 reference.AddTransform (new XmlDsigC14NWithCommentsTransform ());
166 reference.AddTransform (new XmlDsigEnvelopedSignatureTransform ());
167 reference.AddTransform (new XmlDsigXPathTransform ());
168 reference.AddTransform (new XmlDsigXsltTransform ());
170 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>";
171 Assertion.AssertEquals("Get-Xml", value, (reference.GetXml().OuterXml));
172 // however this value cannot be loaded as it's missing some transform (xslt) parameters
174 // can we add them again ?
175 reference.AddTransform (new XmlDsigBase64Transform ());
176 reference.AddTransform (new XmlDsigC14NTransform ());
177 reference.AddTransform (new XmlDsigC14NWithCommentsTransform ());
178 reference.AddTransform (new XmlDsigEnvelopedSignatureTransform ());
179 reference.AddTransform (new XmlDsigXPathTransform ());
180 reference.AddTransform (new XmlDsigXsltTransform ());
183 Assertion.AssertEquals ("# Transforms", 12, reference.TransformChain.Count);
189 // null DigestMethod -> "" DigestMethod !!!
190 reference.DigestMethod = null;
191 Assertion.AssertNull ("DigestMethod null", reference.DigestMethod);
195 [ExpectedException (typeof (NullReferenceException))]
198 reference.Uri = "#MyObjectId";
200 XmlElement bad = reference.GetXml ();
206 // bad hash - there's no validation!
207 reference.DigestMethod = "http://www.w3.org/2000/09/xmldsig#mono";