// // ReferenceTest.cs - NUnit Test Cases for Reference // // Author: // Sebastien Pouliot // // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com) // (C) 2004 Novell (http://www.novell.com) // using System; using System.Security.Cryptography; using System.Security.Cryptography.Xml; using System.Xml; using NUnit.Framework; namespace MonoTests.System.Security.Cryptography.Xml { [TestFixture] public class ReferenceTest : Assertion { protected Reference reference; [SetUp] public void SetUp () { reference = new Reference (); } [Test] public void Properties () { AssertNull ("Uri (null)", reference.Uri); AssertNotNull ("TransformChain", reference.TransformChain); AssertEquals ("ToString()", "System.Security.Cryptography.Xml.Reference", reference.ToString ()); // test uri constructor string uri = "uri"; reference = new Reference (uri); AssertEquals ("DigestMethod", "http://www.w3.org/2000/09/xmldsig#sha1", reference.DigestMethod); AssertNull ("DigestValue", reference.DigestValue); AssertNull ("Id", reference.Id); AssertNull ("Type", reference.Type); AssertEquals ("Uri", uri, reference.Uri); } [Test] public void LoadNoTransform () { string test = "/Vvq6sXEVbtZC8GwNtLQnGOy/VI="; XmlDocument doc = new XmlDocument (); doc.LoadXml (test); reference.LoadXml (doc.DocumentElement); AssertEquals ("Load-Xml", test, (reference.GetXml().OuterXml)); AssertEquals ("Load-URI", "#MyObjectId", reference.Uri); byte[] hash = { 0xFD, 0x5B, 0xEA, 0xEA, 0xC5, 0xC4, 0x55, 0xBB, 0x59, 0x0B, 0xC1, 0xB0, 0x36, 0xD2, 0xD0, 0x9C, 0x63, 0xB2, 0xFD, 0x52 }; AssertCrypto.AssertEquals("Load-Digest", hash, reference.DigestValue); AssertEquals ("Load-#Transform", 0, reference.TransformChain.Count); } [Test] public void LoadBase64Transform () { string test = "AAAAAAAAAAAAAAAAAAAAAAAAAAA="; XmlDocument doc = new XmlDocument (); doc.LoadXml (test); reference.LoadXml (doc.DocumentElement); AssertEquals ("Load-Base64", test, (reference.GetXml().OuterXml)); AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count); } [Test] public void LoadC14NTransform () { string test = "AAAAAAAAAAAAAAAAAAAAAAAAAAA="; XmlDocument doc = new XmlDocument (); doc.LoadXml (test); reference.LoadXml (doc.DocumentElement); AssertEquals ("Load-C14N", test, (reference.GetXml().OuterXml)); AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count); } [Test] public void LoadC14NWithCommentsTransforms () { string test = "AAAAAAAAAAAAAAAAAAAAAAAAAAA="; XmlDocument doc = new XmlDocument (); doc.LoadXml (test); reference.LoadXml (doc.DocumentElement); AssertEquals ("Load-C14NWithComments", test, (reference.GetXml().OuterXml)); AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count); } [Test] public void LoadEnvelopedSignatureTransforms () { string test = "AAAAAAAAAAAAAAAAAAAAAAAAAAA="; XmlDocument doc = new XmlDocument (); doc.LoadXml (test); reference.LoadXml (doc.DocumentElement); AssertEquals ("Load-Enveloped", test, (reference.GetXml().OuterXml)); AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count); } [Test] public void LoadXPathTransforms () { // test1 (MS) is an XML equivalent to test2 (Mono) string test1 = "AAAAAAAAAAAAAAAAAAAAAAAAAAA="; string test2 = "AAAAAAAAAAAAAAAAAAAAAAAAAAA="; XmlDocument doc = new XmlDocument (); doc.LoadXml (test1); reference.LoadXml (doc.DocumentElement); string result = (reference.GetXml().OuterXml); Assert (result, ((test1 == result) || (test2 == result))); AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count); } [Test] public void LoadXsltTransforms () { string test = ""; test += ""; test += ""; test += ""; test += "Notaries"; test += ""; test += ""; test += "
"; test += "
AAAAAAAAAAAAAAAAAAAAAAAAAAA=
"; XmlDocument doc = new XmlDocument (); doc.LoadXml (test); reference.LoadXml (doc.DocumentElement); string result = reference.GetXml().OuterXml; AssertEquals (result, test, result); AssertEquals ("Load-#Transform", 1, reference.TransformChain.Count); } [Test] public void LoadAllTransforms () { string test1 = ""; test1 += ""; test1 += ""; test1 += ""; test1 += "Notaries"; test1 += ""; test1 += ""; test1 += "
"; test1 += "
AAAAAAAAAAAAAAAAAAAAAAAAAAA=
"; string test2 = test1.Replace ("", ""); // Mono XmlDocument doc = new XmlDocument (); doc.LoadXml (test1); reference.LoadXml (doc.DocumentElement); string result = reference.GetXml().OuterXml; Assert (result, ((result == test1) || (result == test2))); AssertEquals ("Load-#Transform", 6, reference.TransformChain.Count); } [Test] #if NET_2_0 [Category ("NotDotNet")] // MS throws a NullReferenceException (reported as FDBK25886) but only when executed in NUnit // http://lab.msdn.microsoft.com/ProductFeedback/viewfeedback.aspx?feedbackid=3596d1e3-362b-40bd-bca9-2e8be75261ff #endif public void AddAllTransforms () { // adding an empty hash value byte[] hash = new byte [20]; reference.DigestValue = hash; XmlElement xel = reference.GetXml (); // this is the minimal Reference (DigestValue)! AssertNotNull ("GetXml", xel); reference.AddTransform (new XmlDsigBase64Transform ()); reference.AddTransform (new XmlDsigC14NTransform ()); reference.AddTransform (new XmlDsigC14NWithCommentsTransform ()); reference.AddTransform (new XmlDsigEnvelopedSignatureTransform ()); reference.AddTransform (new XmlDsigXPathTransform ()); reference.AddTransform (new XmlDsigXsltTransform ()); // MS's results string test1 = "AAAAAAAAAAAAAAAAAAAAAAAAAAA="; // Mono's result (xml is equivalent but not identical) string test2 = test1.Replace ("", ""); string result = reference.GetXml().OuterXml; Assert (result, ((result == test1) || (result == test2))); // however this value cannot be loaded as it's missing some transform (xslt) parameters // can we add them again ? reference.AddTransform (new XmlDsigBase64Transform ()); reference.AddTransform (new XmlDsigC14NTransform ()); reference.AddTransform (new XmlDsigC14NWithCommentsTransform ()); reference.AddTransform (new XmlDsigEnvelopedSignatureTransform ()); reference.AddTransform (new XmlDsigXPathTransform ()); reference.AddTransform (new XmlDsigXsltTransform ()); // seems so ;-) AssertEquals ("# Transforms", 12, reference.TransformChain.Count); } [Test] public void Null () { // null DigestMethod -> "" DigestMethod !!! reference.DigestMethod = null; AssertNull ("DigestMethod null", reference.DigestMethod); } [Test] [ExpectedException (typeof (NullReferenceException))] public void Bad1 () { reference.Uri = "#MyObjectId"; // not enough info XmlElement bad = reference.GetXml (); } [Test] public void Bad2 () { // bad hash - there's no validation! reference.DigestMethod = "http://www.w3.org/2000/09/xmldsig#mono"; } const string xml = @" Alfonso Soriano 2B New York Yankees " + @"" + @"nDF2V/bzRd0VE3EwShWtsBzTEDc=fbye4Xm//RPUTsLd1dwJPo0gPZYX6gVYCEB/gz2348EARNk/nCCch1fFfpuqAGMKg4ayVC0yWkUyE5V4QB33jaGlh9wuNQSjxs6TIvFwSsT+0ioDgVgFv0gVeasbyNL4rFEHuAWL8QKwDT9L6b2wUvJC90DmpBs9GMR2jTZIWlM=MIIC0DCCAjmgAwIBAgIDD0JBMA0GCSqGSIb3DQEBBAUAMHwxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhOZXcgWW9yazERMA8GA1UEBxMITmV3IFlvcmsxGTAXBgNVBAoTEFBoYW9zIFRlY2hub2xvZ3kxFDASBgNVBAsTC0VuZ2luZWVyaW5nMRYwFAYDVQQDEw1UZXN0IENBIChSU0EpMB4XDTAyMDQyOTE5MTY0MFoXDTEyMDQyNjE5MTY0MFowgYAxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhOZXcgWW9yazERMA8GA1UEBxMITmV3IFlvcmsxGTAXBgNVBAoTEFBoYW9zIFRlY2hub2xvZ3kxFDASBgNVBAsTC0VuZ2luZWVyaW5nMRowGAYDVQQDExFUZXN0IENsaWVudCAoUlNBKTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAgIb6nAB9oS/AI5jIj6WymvQhRxiMlE07G4abmMliYi5zWzvaFE2tnU+RZIBgtoXcgDEIU/vsLQut7nzCn9mHxC8JEaV4D4U91j64AyZakShqJw7qjJfqUxxPL0yJv2oFiouPDjGuJ9JPi0NrsZq+yfWfM54s4b9SNkcOIVMybZUCAwEAAaNbMFkwDAYDVR0TAQH/BAIwADAPBgNVHQ8BAf8EBQMDB9gAMBkGA1UdEQQSMBCBDnRlY2hAcGhhb3MuY29tMB0GA1UdDgQWBBQT58rBCxPmVLeZaYGRqVROnQlFbzANBgkqhkiG9w0BAQQFAAOBgQCxbCovFST25t+ryN1RipqozxJQcguKfeCwbfgBNobzcRvoW0kSIf7zi4mtQajDM0NfslFF51/dex5Rn64HmFFshSwSvQQMyf5Cfaqv2XQ60OXq6nAFG6WbHoge6RqfIez2MWDLoSB6plsjKtMmL3mcybBhROtX5GGuLx1NtfhNFQ==CN=Test CA (RSA),OU=Engineering,O=Phaos Technology,L=New York,ST=New York,C=US1000001CN=Test Client (RSA),OU=Engineering,O=Phaos Technology,L=New York,ST=New York,C=USE+fKwQsT5lS3mWmBkalUTp0JRW8="; [Test] public void KeepDocument () { string result = @"nDF2V/bzRd0VE3EwShWtsBzTEDc="; XmlDocument doc = new XmlDocument (); doc.LoadXml (xml); XmlElement org = (XmlElement) doc.SelectSingleNode ("//*[local-name()='Reference']"); Reference r = new Reference (); r.LoadXml (org); XmlElement el = r.GetXml (); AssertEquals (doc, el.OwnerDocument); AssertEquals (org, el); AssertEquals (result, el.OuterXml); } } }