2002-11-20 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 Motus Technologies Inc. (http://www.motus.com)
8 //
9
10 using NUnit.Framework;
11 using System;
12 using System.Security.Cryptography;
13 using System.Security.Cryptography.Xml;
14 using System.Xml;
15
16 namespace MonoTests.System.Security.Cryptography.Xml {
17
18 public class ReferenceTest : TestCase {
19
20         public ReferenceTest () : base ("System.Security.Cryptography.Xml.Reference testsuite") {}
21         public ReferenceTest (string name) : base (name) {}
22
23         private Reference reference;
24
25         protected override void SetUp () 
26         {
27                 reference = new Reference ();
28         }
29
30         protected override void TearDown () {}
31
32         public static ITest Suite {
33                 get { 
34                         return new TestSuite (typeof (ReferenceTest)); 
35                 }
36         }
37
38         public void TestProperties () 
39         {
40                 AssertNull ("Uri (null)", reference.Uri);
41                 AssertNotNull ("TransformChain", reference.TransformChain);
42                 AssertEquals ("ToString()", "System.Security.Cryptography.Xml.Reference", reference.ToString ());
43                 // test uri constructor
44                 string uri = "uri";
45                 reference = new Reference (uri);
46                 AssertEquals ("DigestMethod", "http://www.w3.org/2000/09/xmldsig#sha1", reference.DigestMethod);
47                 AssertNull ("DigestValue", reference.DigestValue);
48                 AssertNull ("Id", reference.Id);
49                 AssertNull ("Type", reference.Type);
50                 AssertEquals ("Uri", uri, reference.Uri);
51         }
52
53         public void TestLoadNoTransform () 
54         {
55                 string value = "<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>";
56                 XmlDocument doc = new XmlDocument ();
57                 doc.LoadXml (value);
58                 reference.LoadXml (doc.DocumentElement);
59                 AssertEquals ("Load-Xml", value, (reference.GetXml().OuterXml));
60                 AssertEquals ("Load-URI", "#MyObjectId", reference.Uri);
61                 byte[] hash = { 0xFD, 0x5B, 0xEA, 0xEA, 0xC5, 0xC4, 0x55, 0xBB, 0x59, 0x0B, 0xC1, 0xB0, 0x36, 0xD2, 0xD0, 0x9C, 0x63, 0xB2, 0xFD, 0x52 };
62                 AllTests.AssertEquals("Load-Digest", hash, reference.DigestValue);
63                 AssertEquals ("Load-#Transform", 0, reference.TransformChain.Count);
64         }
65
66         public void TestLoadBase64Transform () 
67         {
68                 string value = "<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>";
69                 XmlDocument doc = new XmlDocument ();
70                 doc.LoadXml (value);
71                 reference.LoadXml (doc.DocumentElement);
72                 AssertEquals ("Load-Base64", value, (reference.GetXml().OuterXml));
73                 AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
74         }
75
76         public void TestLoadC14NTransform () 
77         {
78                 string value = "<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>";
79                 XmlDocument doc = new XmlDocument ();
80                 doc.LoadXml (value);
81                 reference.LoadXml (doc.DocumentElement);
82                 AssertEquals ("Load-C14N", value, (reference.GetXml().OuterXml));
83                 AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
84         }
85
86         public void TestLoadC14NWithCommentsTransforms () 
87         {
88                 string value = "<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>";
89                 XmlDocument doc = new XmlDocument ();
90                 doc.LoadXml (value);
91                 reference.LoadXml (doc.DocumentElement);
92                 AssertEquals ("Load-C14NWithComments", value, (reference.GetXml().OuterXml));
93                 AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
94         }
95
96         public void TestLoadEnvelopedSignatureTransforms () 
97         {
98                 string value = "<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>";
99                 XmlDocument doc = new XmlDocument ();
100                 doc.LoadXml (value);
101                 reference.LoadXml (doc.DocumentElement);
102                 AssertEquals ("Load-Enveloped", value, (reference.GetXml().OuterXml));
103                 AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
104         }
105
106         public void TestLoadXPathTransforms () 
107         {
108                 string value = "<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>";
109                 XmlDocument doc = new XmlDocument ();
110                 doc.LoadXml (value);
111                 reference.LoadXml (doc.DocumentElement);
112                 AssertEquals ("Load-XPath", value, (reference.GetXml().OuterXml));
113                 AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
114         }
115
116         public void TestLoadXsltTransforms () 
117         {
118                 string value = "<Reference xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><Transforms><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>";
119                 XmlDocument doc = new XmlDocument ();
120                 doc.LoadXml (value);
121                 try {
122                         reference.LoadXml (doc.DocumentElement);
123                 }
124                 catch (Exception e) {
125                         Fail (e.ToString ());
126                 }
127                 AssertEquals ("Load-Xslt", value, (reference.GetXml().OuterXml));
128                 AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count);
129         }
130
131         public void TestLoadAllTransforms () 
132         {
133                 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>";
134                 XmlDocument doc = new XmlDocument ();
135                 doc.LoadXml (value);
136                 reference.LoadXml (doc.DocumentElement);
137                 AssertEquals ("Load-Xml", value, (reference.GetXml().OuterXml));
138                 AssertEquals ("Load-#Transform", 6, reference.TransformChain.Count);
139         }
140
141         public void TestAllTransform () 
142         {
143                 // adding an empty hash value
144                 byte[] hash = new byte [20];
145                 reference.DigestValue = hash;
146                 XmlElement xel = reference.GetXml ();
147                 // this is the minimal Reference (DisestValue)!
148                 AssertNotNull ("GetXml", xel);
149
150                 reference.AddTransform (new XmlDsigBase64Transform ());
151                 reference.AddTransform (new XmlDsigC14NTransform ());
152                 reference.AddTransform (new XmlDsigC14NWithCommentsTransform ());
153                 reference.AddTransform (new XmlDsigEnvelopedSignatureTransform ());
154                 reference.AddTransform (new XmlDsigXPathTransform ());
155                 reference.AddTransform (new XmlDsigXsltTransform ());
156
157                 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>";
158                 AssertEquals("Get-Xml", value, (reference.GetXml().OuterXml));
159                 // however this value cannot be loaded as it's missing some transform (xslt) parameters
160
161                 // can we add them again ?
162                 reference.AddTransform (new XmlDsigBase64Transform ());
163                 reference.AddTransform (new XmlDsigC14NTransform ());
164                 reference.AddTransform (new XmlDsigC14NWithCommentsTransform ());
165                 reference.AddTransform (new XmlDsigEnvelopedSignatureTransform ());
166                 reference.AddTransform (new XmlDsigXPathTransform ());
167                 reference.AddTransform (new XmlDsigXsltTransform ());
168
169                 // seems so ;-)
170                 AssertEquals ("# Transforms", 12, reference.TransformChain.Count);
171         }
172
173         public void TestNull () 
174         {
175                 // null DigestMethod -> "" DigestMethod !!!
176                 reference.DigestMethod = null;
177                 AssertNull ("DigestMethod null", reference.DigestMethod);
178         }
179
180         public void TestBadness ()
181         {
182                 Reference reference = new Reference ();
183                 reference.Uri = "#MyObjectId";
184                 // not enough info
185                 try {
186                         XmlElement bad = reference.GetXml ();
187                         Fail ("Expected NullReferenceException but got none");
188                 }
189                 catch (NullReferenceException) {
190                         // this is expected
191                 }
192                 catch (Exception e) {
193                         Fail ("Expected NullReferenceException but got: " + e.ToString ());
194                 }
195                 // bad hash - there's no validation!
196                 reference.DigestMethod = "http://www.w3.org/2000/09/xmldsig#mono";
197         }
198 }
199 }