2 // ReferenceTest.cs - NUnit Test Cases for Reference
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
8 // (C) 2004 Novell (http://www.novell.com)
12 using System
.Security
.Cryptography
;
13 using System
.Security
.Cryptography
.Xml
;
16 using NUnit
.Framework
;
18 namespace MonoTests
.System
.Security
.Cryptography
.Xml
{
21 public class ReferenceTest
: Assertion
{
23 protected Reference reference
;
28 reference
= new Reference ();
32 public void Properties ()
34 AssertNull ("Uri (null)", reference
.Uri
);
35 AssertNotNull ("TransformChain", reference
.TransformChain
);
36 AssertEquals ("ToString()", "System.Security.Cryptography.Xml.Reference", reference
.ToString ());
37 // test uri constructor
39 reference
= new Reference (uri
);
40 AssertEquals ("DigestMethod", "http://www.w3.org/2000/09/xmldsig#sha1", reference
.DigestMethod
);
41 AssertNull ("DigestValue", reference
.DigestValue
);
42 AssertNull ("Id", reference
.Id
);
43 AssertNull ("Type", reference
.Type
);
44 AssertEquals ("Uri", uri
, reference
.Uri
);
48 public void LoadNoTransform ()
50 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>";
51 XmlDocument doc
= new XmlDocument ();
53 reference
.LoadXml (doc
.DocumentElement
);
54 AssertEquals ("Load-Xml", test
, (reference
.GetXml().OuterXml
));
55 AssertEquals ("Load-URI", "#MyObjectId", reference
.Uri
);
56 byte[] hash
= { 0xFD, 0x5B, 0xEA, 0xEA, 0xC5, 0xC4, 0x55, 0xBB, 0x59, 0x0B, 0xC1, 0xB0, 0x36, 0xD2, 0xD0, 0x9C, 0x63, 0xB2, 0xFD, 0x52 }
;
57 AssertCrypto
.AssertEquals("Load-Digest", hash
, reference
.DigestValue
);
58 AssertEquals ("Load-#Transform", 0, reference
.TransformChain
.Count
);
62 public void LoadBase64Transform ()
64 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>";
65 XmlDocument doc
= new XmlDocument ();
67 reference
.LoadXml (doc
.DocumentElement
);
68 AssertEquals ("Load-Base64", test
, (reference
.GetXml().OuterXml
));
69 AssertEquals ("Load-#Transform", 1, reference
.TransformChain
.Count
);
73 public void LoadC14NTransform ()
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\" /></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
76 XmlDocument doc
= new XmlDocument ();
78 reference
.LoadXml (doc
.DocumentElement
);
79 AssertEquals ("Load-C14N", test
, (reference
.GetXml().OuterXml
));
80 AssertEquals ("Load-#Transform", 1, reference
.TransformChain
.Count
);
84 public void LoadC14NWithCommentsTransforms ()
86 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>";
87 XmlDocument doc
= new XmlDocument ();
89 reference
.LoadXml (doc
.DocumentElement
);
90 AssertEquals ("Load-C14NWithComments", test
, (reference
.GetXml().OuterXml
));
91 AssertEquals ("Load-#Transform", 1, reference
.TransformChain
.Count
);
95 public void LoadEnvelopedSignatureTransforms ()
97 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>";
98 XmlDocument doc
= new XmlDocument ();
100 reference
.LoadXml (doc
.DocumentElement
);
101 AssertEquals ("Load-Enveloped", test
, (reference
.GetXml().OuterXml
));
102 AssertEquals ("Load-#Transform", 1, reference
.TransformChain
.Count
);
106 public void LoadXPathTransforms ()
108 // test1 (MS) is an XML equivalent to test2 (Mono)
109 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>";
110 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>";
111 XmlDocument doc
= new XmlDocument ();
113 reference
.LoadXml (doc
.DocumentElement
);
114 string result
= (reference
.GetXml().OuterXml
);
115 Assert (result
, ((test1
== result
) || (test2
== result
)));
116 AssertEquals ("Load-#Transform", 1, reference
.TransformChain
.Count
);
120 public void LoadXsltTransforms ()
122 string test
= "<Reference xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><Transforms>";
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 ();
133 reference
.LoadXml (doc
.DocumentElement
);
134 string result
= reference
.GetXml().OuterXml
;
135 AssertEquals (result
, test
, result
);
136 AssertEquals ("Load-#Transform", 1, reference
.TransformChain
.Count
);
140 public void LoadAllTransforms ()
142 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>";
143 test1
+= "<Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xslt-19991116\">";
144 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\">";
145 test1
+= "<xsl:output encoding=\"UTF-8\" indent=\"no\" method=\"xml\" />";
146 test1
+= "<xsl:template match=\"/\"><html><head><title>Notaries</title>";
147 test1
+= "</head><body><table><xsl:for-each select=\"Notaries/Notary\">";
148 test1
+= "<tr><th><xsl:value-of select=\"@name\" /></th></tr></xsl:for-each>";
149 test1
+= "</table></body></html></xsl:template></xsl:stylesheet></Transform>";
150 test1
+= "</Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>AAAAAAAAAAAAAAAAAAAAAAAAAAA=</DigestValue></Reference>";
151 string test2
= test1
.Replace ("<XPath></XPath>", "<XPath />"); // Mono
152 XmlDocument doc
= new XmlDocument ();
154 reference
.LoadXml (doc
.DocumentElement
);
155 string result
= reference
.GetXml().OuterXml
;
156 Assert (result
, ((result
== test1
) || (result
== test2
)));
157 AssertEquals ("Load-#Transform", 6, reference
.TransformChain
.Count
);
161 public void AddAllTransforms ()
163 // adding an empty hash value
164 byte[] hash
= new byte [20];
165 reference
.DigestValue
= hash
;
166 XmlElement xel
= reference
.GetXml ();
167 // this is the minimal Reference (DisestValue)!
168 AssertNotNull ("GetXml", xel
);
170 reference
.AddTransform (new XmlDsigBase64Transform ());
171 reference
.AddTransform (new XmlDsigC14NTransform ());
172 reference
.AddTransform (new XmlDsigC14NWithCommentsTransform ());
173 reference
.AddTransform (new XmlDsigEnvelopedSignatureTransform ());
174 reference
.AddTransform (new XmlDsigXPathTransform ());
175 reference
.AddTransform (new XmlDsigXsltTransform ());
178 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>";
179 // Mono's result (xml is equivalent but not identical)
180 string test2
= test1
.Replace ("<XPath></XPath>", "<XPath xmlns=\"http://www.w3.org/2000/09/xmldsig#\" />");
181 string result
= reference
.GetXml().OuterXml
;
182 Assert (result
, ((result
== test1
) || (result
== test2
)));
183 // however this value cannot be loaded as it's missing some transform (xslt) parameters
185 // can we add them again ?
186 reference
.AddTransform (new XmlDsigBase64Transform ());
187 reference
.AddTransform (new XmlDsigC14NTransform ());
188 reference
.AddTransform (new XmlDsigC14NWithCommentsTransform ());
189 reference
.AddTransform (new XmlDsigEnvelopedSignatureTransform ());
190 reference
.AddTransform (new XmlDsigXPathTransform ());
191 reference
.AddTransform (new XmlDsigXsltTransform ());
194 AssertEquals ("# Transforms", 12, reference
.TransformChain
.Count
);
200 // null DigestMethod -> "" DigestMethod !!!
201 reference
.DigestMethod
= null;
202 AssertNull ("DigestMethod null", reference
.DigestMethod
);
206 [ExpectedException (typeof (NullReferenceException
))]
209 reference
.Uri
= "#MyObjectId";
211 XmlElement bad
= reference
.GetXml ();
217 // bad hash - there's no validation!
218 reference
.DigestMethod
= "http://www.w3.org/2000/09/xmldsig#mono";
221 const string xml
= @"<player bats=""left"" id=""10012"" throws=""right"">
222 <!-- Here's a comment -->
223 <name>Alfonso Soriano</name>
224 <position>2B</position>
225 <team>New York Yankees</team>
226 <dsig:Signature xmlns=""http://www.w3.org/2000/09/xmldsig#"" xmlns:dsig=""http://www.w3.org/2000/09/xmldsig#"">"
227 + @"<dsig:SignedInfo><dsig:CanonicalizationMethod Algorithm=""http://www.w3.org/TR/2001/REC-xml-c14n-withcomments-20010315""/><dsig:SignatureMethod Algorithm=""http://www.w3.org/2000/09/xmldsig#rsa-sha1""/>"
228 + @"<dsig:Reference URI=""""><dsig:Transforms><dsig:Transform Algorithm=""http://www.w3.org/2000/09/xmldsig#enveloped-signature""/></dsig:Transforms><dsig:DigestMethod Algorithm=""http://www.w3.org/2000/09/xmldsig#sha1""/><dsig:DigestValue>nDF2V/bzRd0VE3EwShWtsBzTEDc=</dsig:DigestValue></dsig:Reference></dsig:SignedInfo><dsig:SignatureValue>fbye4Xm//RPUTsLd1dwJPo0gPZYX6gVYCEB/gz2348EARNk/nCCch1fFfpuqAGMKg4ayVC0yWkUyE5V4QB33jaGlh9wuNQSjxs6TIvFwSsT+0ioDgVgFv0gVeasbyNL4rFEHuAWL8QKwDT9L6b2wUvJC90DmpBs9GMR2jTZIWlM=</dsig:SignatureValue><dsig:KeyInfo><dsig:X509Data><dsig:X509Certificate>MIIC0DCCAjmgAwIBAgIDD0JBMA0GCSqGSIb3DQEBBAUAMHwxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhOZXcgWW9yazERMA8GA1UEBxMITmV3IFlvcmsxGTAXBgNVBAoTEFBoYW9zIFRlY2hub2xvZ3kxFDASBgNVBAsTC0VuZ2luZWVyaW5nMRYwFAYDVQQDEw1UZXN0IENBIChSU0EpMB4XDTAyMDQyOTE5MTY0MFoXDTEyMDQyNjE5MTY0MFowgYAxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhOZXcgWW9yazERMA8GA1UEBxMITmV3IFlvcmsxGTAXBgNVBAoTEFBoYW9zIFRlY2hub2xvZ3kxFDASBgNVBAsTC0VuZ2luZWVyaW5nMRowGAYDVQQDExFUZXN0IENsaWVudCAoUlNBKTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAgIb6nAB9oS/AI5jIj6WymvQhRxiMlE07G4abmMliYi5zWzvaFE2tnU+RZIBgtoXcgDEIU/vsLQut7nzCn9mHxC8JEaV4D4U91j64AyZakShqJw7qjJfqUxxPL0yJv2oFiouPDjGuJ9JPi0NrsZq+yfWfM54s4b9SNkcOIVMybZUCAwEAAaNbMFkwDAYDVR0TAQH/BAIwADAPBgNVHQ8BAf8EBQMDB9gAMBkGA1UdEQQSMBCBDnRlY2hAcGhhb3MuY29tMB0GA1UdDgQWBBQT58rBCxPmVLeZaYGRqVROnQlFbzANBgkqhkiG9w0BAQQFAAOBgQCxbCovFST25t+ryN1RipqozxJQcguKfeCwbfgBNobzcRvoW0kSIf7zi4mtQajDM0NfslFF51/dex5Rn64HmFFshSwSvQQMyf5Cfaqv2XQ60OXq6nAFG6WbHoge6RqfIez2MWDLoSB6plsjKtMmL3mcybBhROtX5GGuLx1NtfhNFQ==</dsig:X509Certificate><dsig:X509IssuerSerial><dsig:X509IssuerName>CN=Test CA (RSA),OU=Engineering,O=Phaos Technology,L=New York,ST=New York,C=US</dsig:X509IssuerName><dsig:X509SerialNumber>1000001</dsig:X509SerialNumber></dsig:X509IssuerSerial><dsig:X509SubjectName>CN=Test Client (RSA),OU=Engineering,O=Phaos Technology,L=New York,ST=New York,C=US</dsig:X509SubjectName><dsig:X509SKI>E+fKwQsT5lS3mWmBkalUTp0JRW8=</dsig:X509SKI></dsig:X509Data></dsig:KeyInfo></dsig:Signature></player>";
232 public void KeepDocument ()
234 string result
= @"<dsig:Reference URI="""" xmlns:dsig=""http://www.w3.org/2000/09/xmldsig#""><dsig:Transforms><dsig:Transform Algorithm=""http://www.w3.org/2000/09/xmldsig#enveloped-signature"" /></dsig:Transforms><dsig:DigestMethod Algorithm=""http://www.w3.org/2000/09/xmldsig#sha1"" /><dsig:DigestValue>nDF2V/bzRd0VE3EwShWtsBzTEDc=</dsig:DigestValue></dsig:Reference>";
236 XmlDocument doc
= new XmlDocument ();
238 XmlElement org
= (XmlElement
) doc
.SelectSingleNode ("//*[local-name()='Reference']");
239 Reference r
= new Reference ();
241 XmlElement el
= r
.GetXml ();
242 AssertEquals (doc
, el
.OwnerDocument
);
243 AssertEquals (org
, el
);
244 AssertEquals (result
, el
.OuterXml
);