SignedXmlTest.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. //
  2. // SignedXmlTest.cs - NUnit Test Cases for SignedXml
  3. //
  4. // Author:
  5. // Sebastien Pouliot ([email protected])
  6. //
  7. // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
  8. //
  9. using System;
  10. using System.Security.Cryptography;
  11. using System.Security.Cryptography.Xml;
  12. using System.Text;
  13. using System.Xml;
  14. using NUnit.Framework;
  15. namespace MonoTests.System.Security.Cryptography.Xml {
  16. [TestFixture]
  17. public class SignedXmlTest : Assertion {
  18. [Test]
  19. public void StaticValues ()
  20. {
  21. AssertEquals ("XmlDsigCanonicalizationUrl", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315", SignedXml.XmlDsigCanonicalizationUrl);
  22. AssertEquals ("XmlDsigCanonicalizationWithCommentsUrl", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments", SignedXml.XmlDsigCanonicalizationWithCommentsUrl);
  23. AssertEquals ("XmlDsigDSAUrl", "http://www.w3.org/2000/09/xmldsig#dsa-sha1", SignedXml.XmlDsigDSAUrl);
  24. AssertEquals ("XmlDsigHMACSHA1Url", "http://www.w3.org/2000/09/xmldsig#hmac-sha1", SignedXml.XmlDsigHMACSHA1Url);
  25. AssertEquals ("XmlDsigMinimalCanonicalizationUrl", "http://www.w3.org/2000/09/xmldsig#minimal", SignedXml.XmlDsigMinimalCanonicalizationUrl);
  26. AssertEquals ("XmlDsigNamespaceUrl", "http://www.w3.org/2000/09/xmldsig#", SignedXml.XmlDsigNamespaceUrl);
  27. AssertEquals ("XmlDsigRSASHA1Url", "http://www.w3.org/2000/09/xmldsig#rsa-sha1", SignedXml.XmlDsigRSASHA1Url);
  28. AssertEquals ("XmlDsigSHA1Url", "http://www.w3.org/2000/09/xmldsig#sha1", SignedXml.XmlDsigSHA1Url);
  29. }
  30. // sample from MSDN (url)
  31. public SignedXml MSDNSample ()
  32. {
  33. // Create example data to sign.
  34. XmlDocument document = new XmlDocument ();
  35. XmlNode node = document.CreateNode (XmlNodeType.Element, "", "MyElement", "samples");
  36. node.InnerText = "This is some text";
  37. document.AppendChild (node);
  38. // Create the SignedXml message.
  39. SignedXml signedXml = new SignedXml ();
  40. // Create a data object to hold the data to sign.
  41. DataObject dataObject = new DataObject ();
  42. dataObject.Data = document.ChildNodes;
  43. dataObject.Id = "MyObjectId";
  44. // Add the data object to the signature.
  45. signedXml.AddObject (dataObject);
  46. // Create a reference to be able to package everything into the
  47. // message.
  48. Reference reference = new Reference ();
  49. reference.Uri = "#MyObjectId";
  50. // Add it to the message.
  51. signedXml.AddReference (reference);
  52. return signedXml;
  53. }
  54. [Test]
  55. public void AsymmetricRSASignature ()
  56. {
  57. SignedXml signedXml = MSDNSample ();
  58. RSA key = RSA.Create ();
  59. signedXml.SigningKey = key;
  60. // Add a KeyInfo.
  61. KeyInfo keyInfo = new KeyInfo ();
  62. keyInfo.AddClause (new RSAKeyValue (key));
  63. signedXml.KeyInfo = keyInfo;
  64. // Compute the signature.
  65. signedXml.ComputeSignature ();
  66. // Get the XML representation of the signature.
  67. XmlElement xmlSignature = signedXml.GetXml ();
  68. // LAMESPEC: we must reload the signature or it won't work
  69. // MS framework throw a "malformed element"
  70. SignedXml vrfy = new SignedXml ();
  71. vrfy.LoadXml (xmlSignature);
  72. // assert that we can verify our own signature
  73. Assert ("RSA-Compute/Verify", vrfy.CheckSignature ());
  74. }
  75. [Test]
  76. public void AsymmetricDSASignature ()
  77. {
  78. SignedXml signedXml = MSDNSample ();
  79. DSA key = DSA.Create ();
  80. signedXml.SigningKey = key;
  81. // Add a KeyInfo.
  82. KeyInfo keyInfo = new KeyInfo ();
  83. keyInfo.AddClause (new DSAKeyValue (key));
  84. signedXml.KeyInfo = keyInfo;
  85. // Compute the signature.
  86. signedXml.ComputeSignature ();
  87. // Get the XML representation of the signature.
  88. XmlElement xmlSignature = signedXml.GetXml ();
  89. // LAMESPEC: we must reload the signature or it won't work
  90. // MS framework throw a "malformed element"
  91. SignedXml vrfy = new SignedXml ();
  92. vrfy.LoadXml (xmlSignature);
  93. // assert that we can verify our own signature
  94. Assert ("DSA-Compute/Verify", vrfy.CheckSignature ());
  95. }
  96. [Test]
  97. public void SymmetricHMACSHA1Signature ()
  98. {
  99. SignedXml signedXml = MSDNSample ();
  100. // Compute the signature.
  101. byte[] secretkey = Encoding.Default.GetBytes ("password");
  102. HMACSHA1 hmac = new HMACSHA1 (secretkey);
  103. signedXml.ComputeSignature (hmac);
  104. // Get the XML representation of the signature.
  105. XmlElement xmlSignature = signedXml.GetXml ();
  106. // LAMESPEC: we must reload the signature or it won't work
  107. // MS framework throw a "malformed element"
  108. SignedXml vrfy = new SignedXml ();
  109. vrfy.LoadXml (xmlSignature);
  110. // assert that we can verify our own signature
  111. Assert ("HMACSHA1-Compute/Verify", vrfy.CheckSignature (hmac));
  112. }
  113. [Test]
  114. [ExpectedException (typeof (CryptographicException))]
  115. public void SymmetricMACTripleDESSignature ()
  116. {
  117. SignedXml signedXml = MSDNSample ();
  118. // Compute the signature.
  119. byte[] secretkey = Encoding.Default.GetBytes ("password");
  120. MACTripleDES hmac = new MACTripleDES (secretkey);
  121. signedXml.ComputeSignature (hmac);
  122. }
  123. // Using empty constructor
  124. // LAMESPEC: The two other constructors don't seems to apply in verifying signatures
  125. [Test]
  126. public void AsymmetricRSAVerify ()
  127. {
  128. string value = "<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\" /><SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\" /><Reference URI=\"#MyObjectId\"><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>/Vvq6sXEVbtZC8GwNtLQnGOy/VI=</DigestValue></Reference></SignedInfo><SignatureValue>A6XuE8Cy9iOffRXaW9b0+dUcMUJQnlmwLsiqtQnADbCtZXnXAaeJ6nGnQ4Mm0IGi0AJc7/2CoJReXl7iW4hltmFguG1e3nl0VxCyCTHKGOCo1u8R3K+B1rTaenFbSxs42EM7/D9KETsPlzfYfis36yM3PqatiCUOsoMsAiMGzlc=</SignatureValue><KeyInfo><KeyValue xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><RSAKeyValue><Modulus>tI8QYIpbG/m6JLyvP+S3X8mzcaAIayxomyTimSh9UCpEucRnGvLw0P73uStNpiF7wltTZA1HEsv+Ha39dY/0j/Wiy3RAodGDRNuKQao1wu34aNybZ673brbsbHFUfw/o7nlKD2xO84fbajBZmKtBBDy63NHt+QL+grSrREPfCTM=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue></KeyInfo><Object Id=\"MyObjectId\"><MyElement xmlns=\"samples\">This is some text</MyElement></Object></Signature>";
  129. XmlDocument doc = new XmlDocument ();
  130. doc.LoadXml (value);
  131. SignedXml v1 = new SignedXml ();
  132. v1.LoadXml (doc.DocumentElement);
  133. Assert ("RSA-CheckSignature()", v1.CheckSignature ());
  134. SignedXml v2 = new SignedXml ();
  135. v2.LoadXml (doc.DocumentElement);
  136. AsymmetricAlgorithm key = null;
  137. bool vrfy = v2.CheckSignatureReturningKey (out key);
  138. Assert ("RSA-CheckSignatureReturningKey()", vrfy);
  139. SignedXml v3 = new SignedXml ();
  140. v3.LoadXml (doc.DocumentElement);
  141. Assert ("RSA-CheckSignature(key)", v3.CheckSignature (key));
  142. }
  143. // Using empty constructor
  144. // LAMESPEC: The two other constructors don't seems to apply in verifying signatures
  145. [Test]
  146. public void AsymmetricDSAVerify ()
  147. {
  148. string value = "<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\" /><SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#dsa-sha1\" /><Reference URI=\"#MyObjectId\"><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>/Vvq6sXEVbtZC8GwNtLQnGOy/VI=</DigestValue></Reference></SignedInfo><SignatureValue>BYz/qRGjGsN1yMFPxWa3awUZm1y4I/IxOQroMxkOteRGgk1HIwhRYw==</SignatureValue><KeyInfo><KeyValue xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><DSAKeyValue><P>iglVaZ+LsSL8Y0aDXmFMBwva3xHqIypr3l/LtqBH9ziV2Sh1M4JVasAiKqytWIWt/s/Uk8Ckf2tO2Ww1vsNi1NL+Kg9T7FE52sn380/rF0miwGkZeidzm74OWhykb3J+wCTXaIwOzAWI1yN7FoeoN7wzF12jjlSXAXeqPMlViqk=</P><Q>u4sowiJMHilNRojtdmIuQY2YnB8=</Q><G>SdnN7d+wn1n+HH4Hr8MIryIRYgcXdbZ5TH7jAnuWc1koqRc1AZfcYAZ6RDf+orx6Lzn055FTFiN+1NHQfGUtXJCWW0zz0FVV1NJux7WRj8vGTldjJ5ef0oCenkpwDjcIxWsZgVobve4GPoyN1sAc1scnkJB59oupibklmF4y72A=</G><Y>XejzS8Z51yfl0zbYnxSYYbHqreSLjNCoGPB/KjM1TOyV5sMjz0StKtGrFWryTWc7EgvFY7kUth4e04VKf9HbK8z/FifHTXj8+Tszbjzw8GfInnBwLN+vJgbpnjtypmiI5Bm2nLiRbfkdAHP+OrKtr/EauM9GQfYuaxm3/Vj8B84=</Y><J>vGwGg9wqwwWP9xsoPoXu6kHArJtadiNKe9azBiUx5Ob883gd5wlKfEcGuKkBmBySGbgwxyOsIBovd9Kk48hF01ymfQzAAuHR0EdJECSsTsTTKVTLQNBU32O+PRbLYpv4E8kt6rNL83JLJCBY</J><Seed>sqzn8J6fd2gtEyq6YOqiUSHgPE8=</Seed><PgenCounter>sQ==</PgenCounter></DSAKeyValue></KeyValue></KeyInfo><Object Id=\"MyObjectId\"><MyElement xmlns=\"samples\">This is some text</MyElement></Object></Signature>";
  149. XmlDocument doc = new XmlDocument ();
  150. doc.LoadXml (value);
  151. SignedXml v1 = new SignedXml ();
  152. v1.LoadXml (doc.DocumentElement);
  153. Assert ("DSA-CheckSignature()", v1.CheckSignature ());
  154. SignedXml v2 = new SignedXml ();
  155. v2.LoadXml (doc.DocumentElement);
  156. AsymmetricAlgorithm key = null;
  157. bool vrfy = v2.CheckSignatureReturningKey (out key);
  158. Assert ("DSA-CheckSignatureReturningKey()", vrfy);
  159. SignedXml v3 = new SignedXml ();
  160. v3.LoadXml (doc.DocumentElement);
  161. Assert ("DSA-CheckSignature(key)", v3.CheckSignature (key));
  162. }
  163. [Test]
  164. public void SymmetricHMACSHA1Verify ()
  165. {
  166. string value = "<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\" /><SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#hmac-sha1\" /><Reference URI=\"#MyObjectId\"><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>/Vvq6sXEVbtZC8GwNtLQnGOy/VI=</DigestValue></Reference></SignedInfo><SignatureValue>e2RxYr5yGbvTqZLCFcgA2RAC0yE=</SignatureValue><Object Id=\"MyObjectId\"><MyElement xmlns=\"samples\">This is some text</MyElement></Object></Signature>";
  167. XmlDocument doc = new XmlDocument ();
  168. doc.LoadXml (value);
  169. SignedXml v1 = new SignedXml ();
  170. v1.LoadXml (doc.DocumentElement);
  171. byte[] secretkey = Encoding.Default.GetBytes ("password");
  172. HMACSHA1 hmac = new HMACSHA1 (secretkey);
  173. Assert ("HMACSHA1-CheckSignature(key)", v1.CheckSignature (hmac));
  174. }
  175. [Test]
  176. // adapted from http://bugzilla.ximian.com/show_bug.cgi?id=52084
  177. public void GetIdElement ()
  178. {
  179. string value = "<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\" /><SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\" /><Reference URI=\"#MyObjectId\"><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>CTnnhjxUQHJmD+t1MjVXrOW+MCA=</DigestValue></Reference></SignedInfo><SignatureValue>dbFt6Zw3vR+Xh7LbM/vuifyFA7gPh/NlDM2Glz/SJBsveISieuTBpZlk/zavAeuXR/Nu0Ztt4OP4tCOg09a2RNlrTP0dhkeEfL1jTzpnVaLHuQbCiwOWCgbRif7Xt7N12FuiHYb3BltP/YyXS4E12NxlGlqnDiFA1v/mkK5+C1o=</SignatureValue><KeyInfo><KeyValue xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><RSAKeyValue><Modulus>hEfTJNa2idz2u+fSYDDG4Lx/xuk4aBbvOPVNqgc1l9Y8t7Pt+ZyF+kkF3uUl8Y0700BFGAsprnhwrWENK+PGdtvM5796ZKxCCa0ooKkofiT4355HqK26hpV8dvj38vq/rkJe1jHZgkTKa+c/0vjcYZOI/RT/IZv9JfXxVWLuLxk=</Modulus><Exponent>EQ==</Exponent></RSAKeyValue></KeyValue></KeyInfo><Object Id=\"MyObjectId\" xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><ObjectListTag xmlns=\"\" /></Object></Signature>";
  180. XmlDocument doc = new XmlDocument ();
  181. doc.LoadXml (value);
  182. SignedXml v1 = new SignedXml ();
  183. v1.LoadXml (doc.DocumentElement);
  184. Assert ("CheckSignature", v1.CheckSignature ());
  185. XmlElement xel = v1.GetIdElement (doc, "MyObjectId");
  186. Assert ("GetIdElement", xel.InnerXml.StartsWith ("<ObjectListTag"));
  187. }
  188. }
  189. }