2003-02-19 Sebastien Pouliot <spouliot@videotron.ca>
[mono.git] / mcs / class / System.Security / Test / System.Security.Cryptography.Xml / ReferenceTest.cs
1 //
2 // ReferenceTest.cs - NUnit Test Cases for Reference
3 //
4 // Author:
5 //      Sebastien Pouliot (spouliot@motus.com)
6 //
7 // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
8 //
9
10 using System;
11 using System.Security.Cryptography;
12 using System.Security.Cryptography.Xml;
13 using System.Xml;
14
15 using NUnit.Framework;
16
17 namespace MonoTests.System.Security.Cryptography.Xml {
18
19         [TestFixture]
20         public class ReferenceTest {
21
22                 protected Reference reference;
23
24                 [SetUp]
25                 void SetUp () 
26                 {
27                         reference = new Reference ();
28                 }
29
30                 [Test]
31                 public void Properties () 
32                 {
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
37                         string uri = "uri";
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);
44                 }
45
46                 [Test]
47                 public void LoadNoTransform () 
48                 {
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 ();
51                         doc.LoadXml (test);
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);
58                 }
59
60                 [Test]
61                 public void LoadBase64Transform () 
62                 {
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 ();
65                         doc.LoadXml (test);
66                         reference.LoadXml (doc.DocumentElement);
67                         Assertion.AssertEquals ("Load-Base64", test, (reference.GetXml().OuterXml));
68                         Assertion.AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
69                 }
70
71                 [Test]
72                 public void LoadC14NTransform () 
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\" /></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                         Assertion.AssertEquals ("Load-C14N", test, (reference.GetXml().OuterXml));
79                         Assertion.AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
80                 }
81
82                 [Test]
83                 public void LoadC14NWithCommentsTransforms () 
84                 {
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 ();
87                         doc.LoadXml (test);
88                         reference.LoadXml (doc.DocumentElement);
89                         Assertion.AssertEquals ("Load-C14NWithComments", test, (reference.GetXml().OuterXml));
90                         Assertion.AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
91                 }
92
93                 [Test]
94                 public void LoadEnvelopedSignatureTransforms () 
95                 {
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 ();
98                         doc.LoadXml (test);
99                         reference.LoadXml (doc.DocumentElement);
100                         Assertion.AssertEquals ("Load-Enveloped", test, (reference.GetXml().OuterXml));
101                         Assertion.AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
102                 }
103
104                 [Test]
105                 public void LoadXPathTransforms () 
106                 {
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 ();
109                         doc.LoadXml (test);
110                         reference.LoadXml (doc.DocumentElement);
111                         Assertion.AssertEquals ("Load-XPath", test, (reference.GetXml().OuterXml));
112                         Assertion.AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
113                 }
114
115                 [Test]
116                 public void LoadXsltTransforms () 
117                 {
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 ();
128                         doc.LoadXml (test);
129                         reference.LoadXml (doc.DocumentElement);
130                         Assertion.AssertEquals ("Load-Xslt", test, (reference.GetXml().OuterXml));
131                         Assertion.AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
132                 }
133
134                 [Test]
135                 public void LoadAllTransforms () 
136                 {
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 ();
147                         doc.LoadXml (test);
148                         reference.LoadXml (doc.DocumentElement);
149                         Assertion.AssertEquals ("Load-Xml", test, (reference.GetXml().OuterXml));
150                         Assertion.AssertEquals ("Load-#Transform", 6, reference.TransformChain.Count);
151                 }
152
153                 [Test]
154                 public void AddAllTransforms () 
155                 {
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);
162
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 ());
169
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
173
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 ());
181
182                         // seems so ;-)
183                         Assertion.AssertEquals ("# Transforms", 12, reference.TransformChain.Count);
184                 }
185
186                 [Test]
187                 public void Null () 
188                 {
189                         // null DigestMethod -> "" DigestMethod !!!
190                         reference.DigestMethod = null;
191                         Assertion.AssertNull ("DigestMethod null", reference.DigestMethod);
192                 }
193
194                 [Test]
195                 [ExpectedException (typeof (NullReferenceException))]
196                 public void Bad1 () 
197                 {
198                         reference.Uri = "#MyObjectId";
199                         // not enough info
200                         XmlElement bad = reference.GetXml ();
201                 }
202
203                 [Test]
204                 public void Bad2 () 
205                 {
206                         // bad hash - there's no validation!
207                         reference.DigestMethod = "http://www.w3.org/2000/09/xmldsig#mono";
208                 }
209         }
210 }