SignedXmlTest.cs 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142
  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. // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
  9. //
  10. using System;
  11. using System.Globalization;
  12. using System.IO;
  13. using System.Security.Cryptography;
  14. using System.Security.Cryptography.X509Certificates;
  15. using System.Security.Cryptography.Xml;
  16. using System.Text;
  17. using System.Xml;
  18. using NUnit.Framework;
  19. namespace MonoTests.System.Security.Cryptography.Xml {
  20. public class SignedXmlEx : SignedXml {
  21. // required to test protected GetPublicKey in SignedXml
  22. public AsymmetricAlgorithm PublicGetPublicKey ()
  23. {
  24. return base.GetPublicKey ();
  25. }
  26. }
  27. [TestFixture]
  28. public class SignedXmlTest : Assertion {
  29. private const string signature = "<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>";
  30. [Test]
  31. public void StaticValues ()
  32. {
  33. AssertEquals ("XmlDsigCanonicalizationUrl", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315", SignedXml.XmlDsigCanonicalizationUrl);
  34. AssertEquals ("XmlDsigCanonicalizationWithCommentsUrl", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments", SignedXml.XmlDsigCanonicalizationWithCommentsUrl);
  35. AssertEquals ("XmlDsigDSAUrl", "http://www.w3.org/2000/09/xmldsig#dsa-sha1", SignedXml.XmlDsigDSAUrl);
  36. AssertEquals ("XmlDsigHMACSHA1Url", "http://www.w3.org/2000/09/xmldsig#hmac-sha1", SignedXml.XmlDsigHMACSHA1Url);
  37. AssertEquals ("XmlDsigMinimalCanonicalizationUrl", "http://www.w3.org/2000/09/xmldsig#minimal", SignedXml.XmlDsigMinimalCanonicalizationUrl);
  38. AssertEquals ("XmlDsigNamespaceUrl", "http://www.w3.org/2000/09/xmldsig#", SignedXml.XmlDsigNamespaceUrl);
  39. AssertEquals ("XmlDsigRSASHA1Url", "http://www.w3.org/2000/09/xmldsig#rsa-sha1", SignedXml.XmlDsigRSASHA1Url);
  40. AssertEquals ("XmlDsigSHA1Url", "http://www.w3.org/2000/09/xmldsig#sha1", SignedXml.XmlDsigSHA1Url);
  41. }
  42. [Test]
  43. public void Constructor_Empty ()
  44. {
  45. XmlDocument doc = new XmlDocument ();
  46. doc.LoadXml (signature);
  47. XmlNodeList xnl = doc.GetElementsByTagName ("Signature", SignedXml.XmlDsigNamespaceUrl);
  48. XmlElement xel = (XmlElement) xnl [0];
  49. SignedXml sx = new SignedXml (doc);
  50. sx.LoadXml (xel);
  51. Assert ("CheckSignature", sx.CheckSignature ());
  52. }
  53. [Test]
  54. public void Constructor_XmlDocument ()
  55. {
  56. XmlDocument doc = new XmlDocument ();
  57. doc.LoadXml (signature);
  58. XmlNodeList xnl = doc.GetElementsByTagName ("Signature", SignedXml.XmlDsigNamespaceUrl);
  59. XmlElement xel = (XmlElement) xnl [0];
  60. SignedXml sx = new SignedXml (doc);
  61. sx.LoadXml (doc.DocumentElement);
  62. Assert ("CheckSignature", sx.CheckSignature ());
  63. }
  64. [Test]
  65. #if NET_2_0
  66. [Ignore ("2.0 throws a NullReferenceException - reported as FDBK25892")]
  67. // http://lab.msdn.microsoft.com/ProductFeedback/viewfeedback.aspx?feedbackid=02dd9730-d1ad-4170-8c82-36858c55fbe2
  68. #endif
  69. [ExpectedException (typeof (ArgumentNullException))]
  70. public void Constructor_XmlDocument_Null ()
  71. {
  72. XmlDocument doc = null;
  73. SignedXml sx = new SignedXml (doc);
  74. }
  75. [Test]
  76. public void Constructor_XmlElement ()
  77. {
  78. XmlDocument doc = new XmlDocument ();
  79. doc.LoadXml (signature);
  80. XmlNodeList xnl = doc.GetElementsByTagName ("Signature", SignedXml.XmlDsigNamespaceUrl);
  81. XmlElement xel = (XmlElement) xnl [0];
  82. SignedXml sx = new SignedXml (doc.DocumentElement);
  83. sx.LoadXml (xel);
  84. Assert ("CheckSignature", sx.CheckSignature ());
  85. }
  86. [Test]
  87. #if !NET_2_0
  88. [ExpectedException (typeof (CryptographicException))]
  89. #endif
  90. public void Constructor_XmlElement_WithoutLoadXml ()
  91. {
  92. XmlDocument doc = new XmlDocument ();
  93. doc.LoadXml (signature);
  94. XmlNodeList xnl = doc.GetElementsByTagName ("Signature", SignedXml.XmlDsigNamespaceUrl);
  95. XmlElement xel = (XmlElement) xnl [0];
  96. SignedXml sx = new SignedXml (doc.DocumentElement);
  97. Assert ("!CheckSignature", !sx.CheckSignature ());
  98. // SignedXml (XmlElement) != SignedXml () + LoadXml (XmlElement)
  99. }
  100. [Test]
  101. [ExpectedException (typeof (ArgumentNullException))]
  102. public void Constructor_XmlElement_Null ()
  103. {
  104. XmlElement xel = null;
  105. SignedXml sx = new SignedXml (xel);
  106. }
  107. // sample from MSDN (url)
  108. public SignedXml MSDNSample ()
  109. {
  110. // Create example data to sign.
  111. XmlDocument document = new XmlDocument ();
  112. XmlNode node = document.CreateNode (XmlNodeType.Element, "", "MyElement", "samples");
  113. node.InnerText = "This is some text";
  114. document.AppendChild (node);
  115. // Create the SignedXml message.
  116. SignedXml signedXml = new SignedXml ();
  117. // Create a data object to hold the data to sign.
  118. DataObject dataObject = new DataObject ();
  119. dataObject.Data = document.ChildNodes;
  120. dataObject.Id = "MyObjectId";
  121. // Add the data object to the signature.
  122. signedXml.AddObject (dataObject);
  123. // Create a reference to be able to package everything into the
  124. // message.
  125. Reference reference = new Reference ();
  126. reference.Uri = "#MyObjectId";
  127. // Add it to the message.
  128. signedXml.AddReference (reference);
  129. return signedXml;
  130. }
  131. [Test]
  132. [ExpectedException (typeof (CryptographicException))]
  133. public void SignatureMethodMismatch ()
  134. {
  135. SignedXml signedXml = MSDNSample ();
  136. RSA key = RSA.Create ();
  137. signedXml.SigningKey = key;
  138. signedXml.SignedInfo.SignatureMethod = SignedXml.XmlDsigHMACSHA1Url;
  139. // Add a KeyInfo.
  140. KeyInfo keyInfo = new KeyInfo ();
  141. keyInfo.AddClause (new RSAKeyValue (key));
  142. signedXml.KeyInfo = keyInfo;
  143. AssertNotNull ("SignatureMethod", signedXml.SignatureMethod);
  144. // Compute the signature - causes unsupported algorithm by the key.
  145. signedXml.ComputeSignature ();
  146. }
  147. [Test]
  148. public void AsymmetricRSASignature ()
  149. {
  150. SignedXml signedXml = MSDNSample ();
  151. RSA key = RSA.Create ();
  152. signedXml.SigningKey = key;
  153. // Add a KeyInfo.
  154. KeyInfo keyInfo = new KeyInfo ();
  155. keyInfo.AddClause (new RSAKeyValue (key));
  156. signedXml.KeyInfo = keyInfo;
  157. AssertEquals ("KeyInfo", 1, signedXml.KeyInfo.Count);
  158. AssertNull ("SignatureLength", signedXml.SignatureLength);
  159. AssertNull ("SignatureMethod", signedXml.SignatureMethod);
  160. AssertNull ("SignatureValue", signedXml.SignatureValue);
  161. AssertNull ("SigningKeyName", signedXml.SigningKeyName);
  162. // Compute the signature.
  163. signedXml.ComputeSignature ();
  164. AssertNull ("SigningKeyName", signedXml.SigningKeyName);
  165. AssertEquals ("SignatureMethod", SignedXml.XmlDsigRSASHA1Url, signedXml.SignatureMethod);
  166. AssertEquals ("SignatureValue", 128, signedXml.SignatureValue.Length);
  167. AssertNull ("SigningKeyName", signedXml.SigningKeyName);
  168. // Get the XML representation of the signature.
  169. XmlElement xmlSignature = signedXml.GetXml ();
  170. // LAMESPEC: we must reload the signature or it won't work
  171. // MS framework throw a "malformed element"
  172. SignedXml vrfy = new SignedXml ();
  173. vrfy.LoadXml (xmlSignature);
  174. // assert that we can verify our own signature
  175. Assert ("RSA-Compute/Verify", vrfy.CheckSignature ());
  176. }
  177. [Test]
  178. public void AsymmetricDSASignature ()
  179. {
  180. SignedXml signedXml = MSDNSample ();
  181. DSA key = DSA.Create ();
  182. signedXml.SigningKey = key;
  183. // Add a KeyInfo.
  184. KeyInfo keyInfo = new KeyInfo ();
  185. keyInfo.AddClause (new DSAKeyValue (key));
  186. signedXml.KeyInfo = keyInfo;
  187. AssertEquals ("KeyInfo", 1, signedXml.KeyInfo.Count);
  188. AssertNull ("SignatureLength", signedXml.SignatureLength);
  189. AssertNull ("SignatureMethod", signedXml.SignatureMethod);
  190. AssertNull ("SignatureValue", signedXml.SignatureValue);
  191. AssertNull ("SigningKeyName", signedXml.SigningKeyName);
  192. // Compute the signature.
  193. signedXml.ComputeSignature ();
  194. AssertNull ("SignatureLength", signedXml.SignatureLength);
  195. AssertEquals ("SignatureMethod", SignedXml.XmlDsigDSAUrl, signedXml.SignatureMethod);
  196. AssertEquals ("SignatureValue", 40, signedXml.SignatureValue.Length);
  197. AssertNull ("SigningKeyName", signedXml.SigningKeyName);
  198. // Get the XML representation of the signature.
  199. XmlElement xmlSignature = signedXml.GetXml ();
  200. // LAMESPEC: we must reload the signature or it won't work
  201. // MS framework throw a "malformed element"
  202. SignedXml vrfy = new SignedXml ();
  203. vrfy.LoadXml (xmlSignature);
  204. // assert that we can verify our own signature
  205. Assert ("DSA-Compute/Verify", vrfy.CheckSignature ());
  206. }
  207. [Test]
  208. public void SymmetricHMACSHA1Signature ()
  209. {
  210. SignedXml signedXml = MSDNSample ();
  211. // Compute the signature.
  212. byte[] secretkey = Encoding.Default.GetBytes ("password");
  213. HMACSHA1 hmac = new HMACSHA1 (secretkey);
  214. #if NET_2_0
  215. AssertEquals ("KeyInfo", 0, signedXml.KeyInfo.Count);
  216. #else
  217. AssertNull ("KeyInfo", signedXml.KeyInfo);
  218. #endif
  219. AssertNull ("SignatureLength", signedXml.SignatureLength);
  220. AssertNull ("SignatureMethod", signedXml.SignatureMethod);
  221. AssertNull ("SignatureValue", signedXml.SignatureValue);
  222. AssertNull ("SigningKeyName", signedXml.SigningKeyName);
  223. signedXml.ComputeSignature (hmac);
  224. #if NET_2_0
  225. AssertEquals ("KeyInfo", 0, signedXml.KeyInfo.Count);
  226. #else
  227. AssertNull ("KeyInfo", signedXml.KeyInfo);
  228. #endif
  229. AssertNull ("SignatureLength", signedXml.SignatureLength);
  230. AssertEquals ("SignatureMethod", SignedXml.XmlDsigHMACSHA1Url, signedXml.SignatureMethod);
  231. AssertEquals ("SignatureValue", 20, signedXml.SignatureValue.Length);
  232. AssertNull ("SigningKeyName", signedXml.SigningKeyName);
  233. // Get the XML representation of the signature.
  234. XmlElement xmlSignature = signedXml.GetXml ();
  235. // LAMESPEC: we must reload the signature or it won't work
  236. // MS framework throw a "malformed element"
  237. SignedXml vrfy = new SignedXml ();
  238. vrfy.LoadXml (xmlSignature);
  239. // assert that we can verify our own signature
  240. Assert ("HMACSHA1-Compute/Verify", vrfy.CheckSignature (hmac));
  241. }
  242. [Test]
  243. [ExpectedException (typeof (CryptographicException))]
  244. public void SymmetricMACTripleDESSignature ()
  245. {
  246. SignedXml signedXml = MSDNSample ();
  247. // Compute the signature.
  248. byte[] secretkey = Encoding.Default.GetBytes ("password");
  249. MACTripleDES hmac = new MACTripleDES (secretkey);
  250. signedXml.ComputeSignature (hmac);
  251. }
  252. // Using empty constructor
  253. // LAMESPEC: The two other constructors don't seems to apply in verifying signatures
  254. [Test]
  255. public void AsymmetricRSAVerify ()
  256. {
  257. 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>";
  258. XmlDocument doc = new XmlDocument ();
  259. doc.LoadXml (value);
  260. SignedXml v1 = new SignedXml ();
  261. v1.LoadXml (doc.DocumentElement);
  262. Assert ("RSA-CheckSignature()", v1.CheckSignature ());
  263. SignedXml v2 = new SignedXml ();
  264. v2.LoadXml (doc.DocumentElement);
  265. AsymmetricAlgorithm key = null;
  266. bool vrfy = v2.CheckSignatureReturningKey (out key);
  267. Assert ("RSA-CheckSignatureReturningKey()", vrfy);
  268. SignedXml v3 = new SignedXml ();
  269. v3.LoadXml (doc.DocumentElement);
  270. Assert ("RSA-CheckSignature(key)", v3.CheckSignature (key));
  271. }
  272. // Using empty constructor
  273. // LAMESPEC: The two other constructors don't seems to apply in verifying signatures
  274. [Test]
  275. public void AsymmetricDSAVerify ()
  276. {
  277. 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>";
  278. XmlDocument doc = new XmlDocument ();
  279. doc.LoadXml (value);
  280. SignedXml v1 = new SignedXml ();
  281. v1.LoadXml (doc.DocumentElement);
  282. Assert ("DSA-CheckSignature()", v1.CheckSignature ());
  283. SignedXml v2 = new SignedXml ();
  284. v2.LoadXml (doc.DocumentElement);
  285. AsymmetricAlgorithm key = null;
  286. bool vrfy = v2.CheckSignatureReturningKey (out key);
  287. Assert ("DSA-CheckSignatureReturningKey()", vrfy);
  288. SignedXml v3 = new SignedXml ();
  289. v3.LoadXml (doc.DocumentElement);
  290. Assert ("DSA-CheckSignature(key)", v3.CheckSignature (key));
  291. }
  292. [Test]
  293. public void SymmetricHMACSHA1Verify ()
  294. {
  295. 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>";
  296. XmlDocument doc = new XmlDocument ();
  297. doc.LoadXml (value);
  298. SignedXml v1 = new SignedXml ();
  299. v1.LoadXml (doc.DocumentElement);
  300. byte[] secretkey = Encoding.Default.GetBytes ("password");
  301. HMACSHA1 hmac = new HMACSHA1 (secretkey);
  302. Assert ("HMACSHA1-CheckSignature(key)", v1.CheckSignature (hmac));
  303. }
  304. [Test]
  305. // adapted from http://bugzilla.ximian.com/show_bug.cgi?id=52084
  306. public void GetIdElement ()
  307. {
  308. XmlDocument doc = new XmlDocument ();
  309. doc.LoadXml (signature);
  310. SignedXml v1 = new SignedXml ();
  311. v1.LoadXml (doc.DocumentElement);
  312. Assert ("CheckSignature", v1.CheckSignature ());
  313. XmlElement xel = v1.GetIdElement (doc, "MyObjectId");
  314. Assert ("GetIdElement", xel.InnerXml.StartsWith ("<ObjectListTag"));
  315. }
  316. [Test]
  317. public void GetPublicKey ()
  318. {
  319. XmlDocument doc = new XmlDocument ();
  320. doc.LoadXml (signature);
  321. SignedXmlEx sxe = new SignedXmlEx ();
  322. sxe.LoadXml (doc.DocumentElement);
  323. AsymmetricAlgorithm aa1 = sxe.PublicGetPublicKey ();
  324. Assert ("First Public Key is RSA", (aa1 is RSA));
  325. AsymmetricAlgorithm aa2 = sxe.PublicGetPublicKey ();
  326. AssertNull ("Second Public Key is null", aa2);
  327. }
  328. #if NET_2_0
  329. [Test]
  330. // [ExpectedException (typeof (ArgumentNullException))]
  331. public void AddObject_Null ()
  332. {
  333. SignedXml sx = new SignedXml ();
  334. // still no ArgumentNullExceptions for this one
  335. sx.AddObject (null);
  336. }
  337. [Test]
  338. [ExpectedException (typeof (ArgumentNullException))]
  339. public void AddReference_Null ()
  340. {
  341. SignedXml sx = new SignedXml ();
  342. sx.AddReference (null);
  343. }
  344. #else
  345. [Test]
  346. public void Add_Null ()
  347. {
  348. SignedXml sx = new SignedXml ();
  349. // no ArgumentNull exceptions for those
  350. sx.AddObject (null);
  351. sx.AddReference (null);
  352. }
  353. #endif
  354. [Test]
  355. [ExpectedException (typeof (CryptographicException))]
  356. public void GetXml_WithoutInfo ()
  357. {
  358. SignedXml sx = new SignedXml ();
  359. XmlElement xel = sx.GetXml ();
  360. }
  361. [Test]
  362. [ExpectedException (typeof (ArgumentNullException))]
  363. public void LoadXml_Null ()
  364. {
  365. SignedXml sx = new SignedXml ();
  366. sx.LoadXml (null);
  367. }
  368. [Test]
  369. public void SigningKeyName ()
  370. {
  371. SignedXmlEx sxe = new SignedXmlEx ();
  372. AssertNull ("SigningKeyName", sxe.SigningKeyName);
  373. sxe.SigningKeyName = "mono";
  374. AssertEquals ("SigningKeyName", "mono", sxe.SigningKeyName);
  375. }
  376. [Test]
  377. public void CheckSignatureEmptySafe ()
  378. {
  379. SignedXml sx;
  380. KeyInfoClause kic;
  381. KeyInfo ki;
  382. // empty keyinfo passes...
  383. sx = new SignedXml ();
  384. sx.KeyInfo = new KeyInfo ();
  385. Assert (!sx.CheckSignature ());
  386. // with empty KeyInfoName
  387. kic = new KeyInfoName ();
  388. ki = new KeyInfo ();
  389. ki.AddClause (kic);
  390. sx.KeyInfo = ki;
  391. Assert (!sx.CheckSignature ());
  392. }
  393. [Test]
  394. #if !NET_2_0
  395. [ExpectedException (typeof (CryptographicException))]
  396. #endif
  397. public void CheckSignatureEmpty ()
  398. {
  399. SignedXml sx = new SignedXml ();
  400. Assert (!sx.CheckSignature ());
  401. }
  402. [Test]
  403. [ExpectedException (typeof (CryptographicException))]
  404. public void ComputeSignatureNoSigningKey ()
  405. {
  406. XmlDocument doc = new XmlDocument ();
  407. doc.LoadXml ("<foo/>");
  408. SignedXml signedXml = new SignedXml (doc);
  409. Reference reference = new Reference ();
  410. reference.Uri = "";
  411. XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform ();
  412. reference.AddTransform (env);
  413. signedXml.AddReference (reference);
  414. signedXml.ComputeSignature ();
  415. }
  416. [Test]
  417. [ExpectedException (typeof (CryptographicException))]
  418. public void ComputeSignatureMissingReferencedObject ()
  419. {
  420. XmlDocument doc = new XmlDocument ();
  421. doc.LoadXml ("<foo/>");
  422. SignedXml signedXml = new SignedXml (doc);
  423. DSA key = DSA.Create ();
  424. signedXml.SigningKey = key;
  425. Reference reference = new Reference ();
  426. reference.Uri = "#bleh";
  427. XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform ();
  428. reference.AddTransform (env);
  429. signedXml.AddReference (reference);
  430. signedXml.ComputeSignature ();
  431. }
  432. [Test]
  433. public void DataReferenceToNonDataObject ()
  434. {
  435. XmlDocument doc = new XmlDocument ();
  436. doc.LoadXml ("<foo Id='id:1'/>");
  437. SignedXml signedXml = new SignedXml (doc);
  438. DSA key = DSA.Create ();
  439. signedXml.SigningKey = key;
  440. Reference reference = new Reference ();
  441. reference.Uri = "#id:1";
  442. XmlDsigC14NTransform t = new XmlDsigC14NTransform ();
  443. reference.AddTransform (t);
  444. signedXml.AddReference (reference);
  445. signedXml.ComputeSignature ();
  446. }
  447. [Test]
  448. public void SignElementWithoutPrefixedNamespace ()
  449. {
  450. string input = "<Action xmlns='urn:foo'>http://tempuri.org/IFoo/Echo</Action>";
  451. string expected = @"<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=""#_1""><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>zdFEZB8rNzvpNG/gFEJBWk/M5Nk=</DigestValue></Reference></SignedInfo><SignatureValue>+OyGVzrHjmKSDWLNyvgx8pjbPfM=</SignatureValue><Object Id=""_1""><Action xmlns=""urn:foo"">http://tempuri.org/IFoo/Echo</Action></Object></Signature>";
  452. byte [] decrypted = Convert.FromBase64String (
  453. "1W5EigVnbnRjGLbg99ElieOmuUgYO+KcwMJtE35SAGI=");
  454. AssertEquals (expected, SignWithHMACSHA1 (input, decrypted));
  455. }
  456. [Test]
  457. [Category ("NotWorking")]
  458. public void SignElementWithPrefixedNamespace ()
  459. {
  460. string input = "<a:Action xmlns:a='urn:foo'>http://tempuri.org/IFoo/Echo</a:Action>";
  461. string expected = @"<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=""#_1""><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>6i5FlqkEfJOdUaOMCK7xn0I0HDg=</DigestValue></Reference></SignedInfo><SignatureValue>tASp+e2A0xqcm02jKg5TGqlhKpI=</SignatureValue><Object Id=""_1""><a:Action xmlns:a=""urn:foo"">http://tempuri.org/IFoo/Echo</a:Action></Object></Signature>";
  462. byte [] decrypted = Convert.FromBase64String (
  463. "1W5EigVnbnRjGLbg99ElieOmuUgYO+KcwMJtE35SAGI=");
  464. AssertEquals (expected, SignWithHMACSHA1 (input, decrypted));
  465. }
  466. string SignWithHMACSHA1 (string input, byte [] key)
  467. {
  468. XmlDocument doc = new XmlDocument ();
  469. doc.LoadXml (input);
  470. SignedXml sxml = new SignedXml (doc);
  471. HMACSHA1 keyhash = new HMACSHA1 (key);
  472. DataObject d = new DataObject ();
  473. //d.Data = doc.SelectNodes ("//*[local-name()='Body']/*");
  474. d.Data = doc.SelectNodes ("//*[local-name()='Action']");
  475. d.Id = "_1";
  476. sxml.AddObject (d);
  477. Reference r = new Reference ("#_1");
  478. //r.AddTransform (new XmlDsigExcC14NTransform ());
  479. r.AddTransform (new XmlDsigC14NTransform ());
  480. r.DigestMethod = SignedXml.XmlDsigSHA1Url;
  481. sxml.SignedInfo.AddReference (r);
  482. sxml.ComputeSignature (keyhash);
  483. StringWriter sw = new StringWriter ();
  484. XmlWriter w = new XmlTextWriter (sw);
  485. sxml.GetXml ().WriteTo (w);
  486. w.Close ();
  487. return sw.ToString ();
  488. }
  489. #if NET_2_0
  490. [Test]
  491. [Category ("NotWorking")] // bug #79483
  492. public void DigestValue_CRLF ()
  493. {
  494. XmlDocument doc = CreateSomeXml ("\r\n");
  495. XmlDsigExcC14NTransform transform = new XmlDsigExcC14NTransform ();
  496. transform.LoadInput (doc);
  497. Stream s = (Stream) transform.GetOutput ();
  498. string output = Stream2String (s);
  499. AssertEquals ("#1", "<person>&#xD;\n <birthplace>Brussels</birthplace>&#xD;\n</person>", output);
  500. s.Position = 0;
  501. HashAlgorithm hash = HashAlgorithm.Create ("System.Security.Cryptography.SHA1CryptoServiceProvider");
  502. byte[] digest = hash.ComputeHash (s);
  503. AssertEquals ("#2", "IKbfdK2/DMfXyezCf5QggVCXfk8=", Convert.ToBase64String (digest));
  504. X509Certificate2 cert = new X509Certificate2 (_pkcs12, "mono");
  505. SignedXml signedXml = new SignedXml (doc);
  506. signedXml.SigningKey = cert.PrivateKey;
  507. signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;
  508. Reference reference = new Reference ();
  509. reference.Uri = "";
  510. XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform ();
  511. reference.AddTransform (env);
  512. signedXml.AddReference (reference);
  513. KeyInfo keyInfo = new KeyInfo ();
  514. KeyInfoX509Data x509KeyInfo = new KeyInfoX509Data ();
  515. x509KeyInfo.AddCertificate (new X509Certificate2 (_cert));
  516. x509KeyInfo.AddCertificate (cert);
  517. keyInfo.AddClause (x509KeyInfo);
  518. signedXml.KeyInfo = keyInfo;
  519. signedXml.ComputeSignature ();
  520. digest = reference.DigestValue;
  521. AssertEquals ("#3", "e3dsi1xK8FAx1vsug7J203JbEAU=", Convert.ToBase64String (digest));
  522. AssertEquals ("#4", "<SignedInfo xmlns=\"http://www.w3.org/2000/09/xmldsig#\">"
  523. + "<CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" />"
  524. + "<SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\" />"
  525. + "<Reference URI=\"\">"
  526. + "<Transforms>"
  527. + "<Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\" />"
  528. + "</Transforms>"
  529. + "<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" />"
  530. + "<DigestValue>e3dsi1xK8FAx1vsug7J203JbEAU=</DigestValue>"
  531. + "</Reference>"
  532. + "</SignedInfo>", signedXml.SignedInfo.GetXml ().OuterXml);
  533. }
  534. [Test]
  535. public void DigestValue_LF ()
  536. {
  537. XmlDocument doc = CreateSomeXml ("\n");
  538. XmlDsigExcC14NTransform transform = new XmlDsigExcC14NTransform ();
  539. transform.LoadInput (doc);
  540. Stream s = (Stream) transform.GetOutput ();
  541. string output = Stream2String (s);
  542. AssertEquals ("#1", "<person>\n <birthplace>Brussels</birthplace>\n</person>", output);
  543. s.Position = 0;
  544. HashAlgorithm hash = HashAlgorithm.Create ("System.Security.Cryptography.SHA1CryptoServiceProvider");
  545. byte[] digest = hash.ComputeHash (s);
  546. AssertEquals ("#2", "e3dsi1xK8FAx1vsug7J203JbEAU=", Convert.ToBase64String (digest));
  547. X509Certificate2 cert = new X509Certificate2 (_pkcs12, "mono");
  548. SignedXml signedXml = new SignedXml (doc);
  549. signedXml.SigningKey = cert.PrivateKey;
  550. signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;
  551. Reference reference = new Reference ();
  552. reference.Uri = "";
  553. XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform ();
  554. reference.AddTransform (env);
  555. signedXml.AddReference (reference);
  556. KeyInfo keyInfo = new KeyInfo ();
  557. KeyInfoX509Data x509KeyInfo = new KeyInfoX509Data ();
  558. x509KeyInfo.AddCertificate (new X509Certificate2 (_cert));
  559. x509KeyInfo.AddCertificate (cert);
  560. keyInfo.AddClause (x509KeyInfo);
  561. signedXml.KeyInfo = keyInfo;
  562. signedXml.ComputeSignature ();
  563. digest = reference.DigestValue;
  564. AssertEquals ("#3", "e3dsi1xK8FAx1vsug7J203JbEAU=", Convert.ToBase64String (digest));
  565. AssertEquals ("#4", "<SignedInfo xmlns=\"http://www.w3.org/2000/09/xmldsig#\">"
  566. + "<CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" />"
  567. + "<SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\" />"
  568. + "<Reference URI=\"\">"
  569. + "<Transforms>"
  570. + "<Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\" />"
  571. + "</Transforms>"
  572. + "<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" />"
  573. + "<DigestValue>e3dsi1xK8FAx1vsug7J203JbEAU=</DigestValue>"
  574. + "</Reference>"
  575. + "</SignedInfo>", signedXml.SignedInfo.GetXml ().OuterXml);
  576. }
  577. [Test]
  578. [Category ("NotWorking")] // bug #79483
  579. public void SignedXML_CRLF_Invalid ()
  580. {
  581. X509Certificate2 cert = new X509Certificate2 (_pkcs12, "mono");
  582. XmlDocument doc = new XmlDocument ();
  583. doc.LoadXml (string.Format (CultureInfo.InvariantCulture,
  584. "<person>{0}" +
  585. " <birthplace>Brussels</birthplace>{0}" +
  586. "<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\">" +
  587. "<SignedInfo>" +
  588. "<CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" />" +
  589. "<SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\" />" +
  590. "<Reference URI=\"\">" +
  591. "<Transforms>" +
  592. "<Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\" />" +
  593. "</Transforms>" +
  594. "<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" />" +
  595. "<DigestValue>IKbfdK2/DMfXyezCf5QggVCXfk8=</DigestValue>" +
  596. "</Reference>" +
  597. "</SignedInfo>" +
  598. "<SignatureValue>" +
  599. "JuSd68PyARsZqGKSo5xX5yYHDuu6whHEhoXqxxFmGeEdvkKY2bgroWJ1ZTGHGr" +
  600. "VI7mtG3h0w1ibOKdltm9j4lZaZWo87CAJiJ2syeLbMyIVSw6OyZEsiFF/VqLKK" +
  601. "4T4AO6q7HYsC55zJrOvL1j9IIr8zBnJfvBdKckf0lczYbXc=" +
  602. "</SignatureValue>" +
  603. "<KeyInfo>" +
  604. "<X509Data>" +
  605. "<X509Certificate>" +
  606. "MIIBozCCAQygAwIBAgIQHc+8iURSTUarmg4trmrnGTANBgkqhkiG9w0BAQUFAD" +
  607. "ARMQ8wDQYDVQQDEwZOb3ZlbGwwIBcNMDYwOTIxMDcyNjUxWhgPMjA5MDAxMjEw" +
  608. "ODI2NTFaMA8xDTALBgNVBAMTBE1vbm8wgZ0wDQYJKoZIhvcNAQEBBQADgYsAMI" +
  609. "GHAoGBAJhFB1KHv2WzsHqih9Mvm3KffEOSMv+sh1mPW3sWI/95VOOVqJnhemMM" +
  610. "s82phSbNZeoPHny4btbykbRRaRQv94rtIM6geJR1e2c5mfJWtHSq3EYQarHC68" +
  611. "cAZvCAmQZGa1eQRNRqcTSKX8yfqH0SouIE9ohJtpiluNe+Xgk5fKv3AgERMA0G" +
  612. "CSqGSIb3DQEBBQUAA4GBAE6pqSgK8QKRHSh6YvYs9oRh1n8iREco7QmZCFj7UB" +
  613. "kn/QgJ9mKsT8o12VnYHqBCEwBNaT1ay3z/SR4/Z383zuu4Y6xxjqOqnM6gtwUV" +
  614. "u5/0hvz+ThtuTjItG6Ny5JkLZZQt/XbI5kg920t9jq3vbHBMuX2HxivwQe5sug" +
  615. "jPaTEY" +
  616. "</X509Certificate>" +
  617. "<X509Certificate>" +
  618. "MIIBpTCCAQ6gAwIBAgIQXo6Lr3rrSkW4xmNPRbHMbjANBgkqhkiG9w0BAQUFAD" +
  619. "ARMQ8wDQYDVQQDEwZOb3ZlbGwwIBcNMDYwOTIxMDcxNDE4WhgPMjA5MDAxMjEw" +
  620. "ODE0MThaMBExDzANBgNVBAMTBk1pZ3VlbDCBnTANBgkqhkiG9w0BAQEFAAOBiw" +
  621. "AwgYcCgYEArCkeSZ6U3U3Fm2qSuQsM7xvvsSzZGQLPDUHFQ/BZxA7LiGRfXbmO" +
  622. "yPkkYRYItXdy0yDl/8rAjelaL8jQ4me6Uexyeq+5xEgHn9VbNJny5apGNi4kF1" +
  623. "8DR5DK9Zme9d6icusgW8krv3//5SVE8ao7X5qrIOGS825eCJL73YWbxKkCAREw" +
  624. "DQYJKoZIhvcNAQEFBQADgYEASqBgYTkIJpDO28ZEXnF5Q/G3xDR/MxhdcrCISJ" +
  625. "tDbuGVZzK+xhFhiYD5Q1NiGhD4oDIVJPwKmZH4L3YP96iSh6RdtO27V05ET/X5" +
  626. "yWMKdeIsq6r9jXXv7NaWTmvNfMLKLNgEBCJ00+wN0u4xHUC7yCJc0KNQ3fjDLU" +
  627. "AT1oaVjWI=" +
  628. "</X509Certificate>" +
  629. "</X509Data>" +
  630. "</KeyInfo>" +
  631. "</Signature>" +
  632. "</person>", "\r\n"));
  633. SignedXml signedXml = new SignedXml (doc);
  634. XmlNodeList nodeList = doc.GetElementsByTagName ("Signature");
  635. signedXml.LoadXml ((XmlElement) nodeList [0]);
  636. Assert ("#2", !signedXml.CheckSignature ());
  637. }
  638. [Test]
  639. [Category ("NotWorking")] // bug #79483
  640. public void SignedXML_CRLF_Valid ()
  641. {
  642. X509Certificate2 cert = new X509Certificate2 (_pkcs12, "mono");
  643. XmlDocument doc = CreateSignedXml (cert, SignedXml.XmlDsigExcC14NTransformUrl, "\r\n");
  644. AssertEquals ("#1", string.Format (CultureInfo.InvariantCulture,
  645. "<person>{0}" +
  646. " <birthplace>Brussels</birthplace>{0}" +
  647. "<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\">" +
  648. "<SignedInfo>" +
  649. "<CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" />" +
  650. "<SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\" />" +
  651. "<Reference URI=\"\">" +
  652. "<Transforms>" +
  653. "<Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\" />" +
  654. "</Transforms>" +
  655. "<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" />" +
  656. "<DigestValue>e3dsi1xK8FAx1vsug7J203JbEAU=</DigestValue>" +
  657. "</Reference>" +
  658. "</SignedInfo>" +
  659. "<SignatureValue>" +
  660. "X29nbkOR/Xk3KwsEpEvpDOqfI6/NTtiewIxNqKMrPCoM0HLawK5HKsCw3lL07C" +
  661. "8SwqvoXJL9VS05gsSia85YCB8NPDeHuHY3CPGT7DVpgeHFA0oefMnOi8IAqKD2" +
  662. "nx29A222u5OmwbDO0qFqbtsgvIFiP5YJg04cwmnqs+eL+WA=" +
  663. "</SignatureValue>" +
  664. "<KeyInfo>" +
  665. "<X509Data>" +
  666. "<X509Certificate>" +
  667. "MIIBozCCAQygAwIBAgIQHc+8iURSTUarmg4trmrnGTANBgkqhkiG9w0BAQUFAD" +
  668. "ARMQ8wDQYDVQQDEwZOb3ZlbGwwIBcNMDYwOTIxMDcyNjUxWhgPMjA5MDAxMjEw" +
  669. "ODI2NTFaMA8xDTALBgNVBAMTBE1vbm8wgZ0wDQYJKoZIhvcNAQEBBQADgYsAMI" +
  670. "GHAoGBAJhFB1KHv2WzsHqih9Mvm3KffEOSMv+sh1mPW3sWI/95VOOVqJnhemMM" +
  671. "s82phSbNZeoPHny4btbykbRRaRQv94rtIM6geJR1e2c5mfJWtHSq3EYQarHC68" +
  672. "cAZvCAmQZGa1eQRNRqcTSKX8yfqH0SouIE9ohJtpiluNe+Xgk5fKv3AgERMA0G" +
  673. "CSqGSIb3DQEBBQUAA4GBAE6pqSgK8QKRHSh6YvYs9oRh1n8iREco7QmZCFj7UB" +
  674. "kn/QgJ9mKsT8o12VnYHqBCEwBNaT1ay3z/SR4/Z383zuu4Y6xxjqOqnM6gtwUV" +
  675. "u5/0hvz+ThtuTjItG6Ny5JkLZZQt/XbI5kg920t9jq3vbHBMuX2HxivwQe5sug" +
  676. "jPaTEY" +
  677. "</X509Certificate>" +
  678. "<X509Certificate>" +
  679. "MIIBpTCCAQ6gAwIBAgIQXo6Lr3rrSkW4xmNPRbHMbjANBgkqhkiG9w0BAQUFAD" +
  680. "ARMQ8wDQYDVQQDEwZOb3ZlbGwwIBcNMDYwOTIxMDcxNDE4WhgPMjA5MDAxMjEw" +
  681. "ODE0MThaMBExDzANBgNVBAMTBk1pZ3VlbDCBnTANBgkqhkiG9w0BAQEFAAOBiw" +
  682. "AwgYcCgYEArCkeSZ6U3U3Fm2qSuQsM7xvvsSzZGQLPDUHFQ/BZxA7LiGRfXbmO" +
  683. "yPkkYRYItXdy0yDl/8rAjelaL8jQ4me6Uexyeq+5xEgHn9VbNJny5apGNi4kF1" +
  684. "8DR5DK9Zme9d6icusgW8krv3//5SVE8ao7X5qrIOGS825eCJL73YWbxKkCAREw" +
  685. "DQYJKoZIhvcNAQEFBQADgYEASqBgYTkIJpDO28ZEXnF5Q/G3xDR/MxhdcrCISJ" +
  686. "tDbuGVZzK+xhFhiYD5Q1NiGhD4oDIVJPwKmZH4L3YP96iSh6RdtO27V05ET/X5" +
  687. "yWMKdeIsq6r9jXXv7NaWTmvNfMLKLNgEBCJ00+wN0u4xHUC7yCJc0KNQ3fjDLU" +
  688. "AT1oaVjWI=" +
  689. "</X509Certificate>" +
  690. "</X509Data>" +
  691. "</KeyInfo>" +
  692. "</Signature>" +
  693. "</person>", "\r\n"), doc.OuterXml);
  694. }
  695. [Test]
  696. #if NET_2_0
  697. [Ignore ("This is a bad test case which should basically just check the computed signature value instead of comparing XML document literal string, and thus caused inconsistency between .NET 1.1 and .NET 2.0. Not deleting this test case, to easily find the reason for potentially happening regression in the future (which should not waste time).")]
  698. #endif
  699. public void SignedXML_LF_Valid ()
  700. {
  701. X509Certificate2 cert = new X509Certificate2 (_pkcs12, "mono");
  702. XmlDocument doc = CreateSignedXml (cert, SignedXml.XmlDsigExcC14NTransformUrl, "\n");
  703. AssertEquals ("#1", string.Format (CultureInfo.InvariantCulture,
  704. "<person>{0}" +
  705. " <birthplace>Brussels</birthplace>{0}" +
  706. "<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\">" +
  707. "<SignedInfo>" +
  708. "<CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" />" +
  709. "<SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\" />" +
  710. "<Reference URI=\"\">" +
  711. "<Transforms>" +
  712. "<Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\" />" +
  713. "</Transforms>" +
  714. "<DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" />" +
  715. "<DigestValue>e3dsi1xK8FAx1vsug7J203JbEAU=</DigestValue>" +
  716. "</Reference>" +
  717. "</SignedInfo>" +
  718. "<SignatureValue>" +
  719. "X29nbkOR/Xk3KwsEpEvpDOqfI6/NTtiewIxNqKMrPCoM0HLawK5HKsCw3lL07C" +
  720. "8SwqvoXJL9VS05gsSia85YCB8NPDeHuHY3CPGT7DVpgeHFA0oefMnOi8IAqKD2" +
  721. "nx29A222u5OmwbDO0qFqbtsgvIFiP5YJg04cwmnqs+eL+WA=" +
  722. "</SignatureValue>" +
  723. "<KeyInfo>" +
  724. "<X509Data>" +
  725. "<X509Certificate>" +
  726. "MIIBozCCAQygAwIBAgIQHc+8iURSTUarmg4trmrnGTANBgkqhkiG9w0BAQUFAD" +
  727. "ARMQ8wDQYDVQQDEwZOb3ZlbGwwIBcNMDYwOTIxMDcyNjUxWhgPMjA5MDAxMjEw" +
  728. "ODI2NTFaMA8xDTALBgNVBAMTBE1vbm8wgZ0wDQYJKoZIhvcNAQEBBQADgYsAMI" +
  729. "GHAoGBAJhFB1KHv2WzsHqih9Mvm3KffEOSMv+sh1mPW3sWI/95VOOVqJnhemMM" +
  730. "s82phSbNZeoPHny4btbykbRRaRQv94rtIM6geJR1e2c5mfJWtHSq3EYQarHC68" +
  731. "cAZvCAmQZGa1eQRNRqcTSKX8yfqH0SouIE9ohJtpiluNe+Xgk5fKv3AgERMA0G" +
  732. "CSqGSIb3DQEBBQUAA4GBAE6pqSgK8QKRHSh6YvYs9oRh1n8iREco7QmZCFj7UB" +
  733. "kn/QgJ9mKsT8o12VnYHqBCEwBNaT1ay3z/SR4/Z383zuu4Y6xxjqOqnM6gtwUV" +
  734. "u5/0hvz+ThtuTjItG6Ny5JkLZZQt/XbI5kg920t9jq3vbHBMuX2HxivwQe5sug" +
  735. "jPaTEY" +
  736. "</X509Certificate>" +
  737. "<X509Certificate>" +
  738. "MIIBpTCCAQ6gAwIBAgIQXo6Lr3rrSkW4xmNPRbHMbjANBgkqhkiG9w0BAQUFAD" +
  739. "ARMQ8wDQYDVQQDEwZOb3ZlbGwwIBcNMDYwOTIxMDcxNDE4WhgPMjA5MDAxMjEw" +
  740. "ODE0MThaMBExDzANBgNVBAMTBk1pZ3VlbDCBnTANBgkqhkiG9w0BAQEFAAOBiw" +
  741. "AwgYcCgYEArCkeSZ6U3U3Fm2qSuQsM7xvvsSzZGQLPDUHFQ/BZxA7LiGRfXbmO" +
  742. "yPkkYRYItXdy0yDl/8rAjelaL8jQ4me6Uexyeq+5xEgHn9VbNJny5apGNi4kF1" +
  743. "8DR5DK9Zme9d6icusgW8krv3//5SVE8ao7X5qrIOGS825eCJL73YWbxKkCAREw" +
  744. "DQYJKoZIhvcNAQEFBQADgYEASqBgYTkIJpDO28ZEXnF5Q/G3xDR/MxhdcrCISJ" +
  745. "tDbuGVZzK+xhFhiYD5Q1NiGhD4oDIVJPwKmZH4L3YP96iSh6RdtO27V05ET/X5" +
  746. "yWMKdeIsq6r9jXXv7NaWTmvNfMLKLNgEBCJ00+wN0u4xHUC7yCJc0KNQ3fjDLU" +
  747. "AT1oaVjWI=" +
  748. "</X509Certificate>" +
  749. "</X509Data>" +
  750. "</KeyInfo>" +
  751. "</Signature>" +
  752. "</person>", "\n"), doc.OuterXml);
  753. }
  754. [Test] // part of bug #79454
  755. public void MultipleX509Certificates ()
  756. {
  757. XmlDocument doc = null;
  758. X509Certificate2 cert = new X509Certificate2 (_pkcs12, "mono");
  759. doc = CreateSignedXml (cert, SignedXml.XmlDsigExcC14NTransformUrl, "\n");
  760. Assert ("#1", VerifySignedXml (doc));
  761. doc = CreateSignedXml (cert, SignedXml.XmlDsigExcC14NWithCommentsTransformUrl, "\n");
  762. Assert ("#2", VerifySignedXml (doc));
  763. doc = CreateSignedXml (cert, SignedXml.XmlDsigCanonicalizationUrl, "\n");
  764. Assert ("#3", VerifySignedXml (doc));
  765. doc = CreateSignedXml (cert, SignedXml.XmlDsigCanonicalizationWithCommentsUrl, "\n");
  766. Assert ("#4", VerifySignedXml (doc));
  767. }
  768. // creates a signed XML document with two certificates in the X509Data
  769. // element, with the second being the one that should be used to verify
  770. // the signature
  771. static XmlDocument CreateSignedXml (X509Certificate2 cert, string canonicalizationMethod, string lineFeed)
  772. {
  773. XmlDocument doc = CreateSomeXml (lineFeed);
  774. SignedXml signedXml = new SignedXml (doc);
  775. signedXml.SigningKey = cert.PrivateKey;
  776. signedXml.SignedInfo.CanonicalizationMethod = canonicalizationMethod;
  777. Reference reference = new Reference ();
  778. reference.Uri = "";
  779. XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform ();
  780. reference.AddTransform (env);
  781. signedXml.AddReference (reference);
  782. KeyInfo keyInfo = new KeyInfo ();
  783. KeyInfoX509Data x509KeyInfo = new KeyInfoX509Data ();
  784. x509KeyInfo.AddCertificate (new X509Certificate2 (_cert));
  785. x509KeyInfo.AddCertificate (cert);
  786. keyInfo.AddClause (x509KeyInfo);
  787. signedXml.KeyInfo = keyInfo;
  788. signedXml.ComputeSignature ();
  789. XmlElement xmlDigitalSignature = signedXml.GetXml ();
  790. doc.DocumentElement.AppendChild (doc.ImportNode (xmlDigitalSignature, true));
  791. return doc;
  792. }
  793. static bool VerifySignedXml (XmlDocument signedDoc)
  794. {
  795. SignedXml signedXml = new SignedXml (signedDoc);
  796. XmlNodeList nodeList = signedDoc.GetElementsByTagName ("Signature");
  797. signedXml.LoadXml ((XmlElement) nodeList [0]);
  798. return signedXml.CheckSignature ();
  799. }
  800. static XmlDocument CreateSomeXml (string lineFeed)
  801. {
  802. StringWriter sw = new StringWriter ();
  803. sw.NewLine = lineFeed;
  804. XmlTextWriter xtw = new XmlTextWriter (sw);
  805. xtw.Formatting = Formatting.Indented;
  806. xtw.WriteStartElement ("person");
  807. xtw.WriteElementString ("birthplace", "Brussels");
  808. xtw.WriteEndElement ();
  809. xtw.Flush ();
  810. XmlDocument doc = new XmlDocument ();
  811. doc.PreserveWhitespace = true;
  812. doc.Load (new StringReader (sw.ToString ()));
  813. return doc;
  814. }
  815. string Stream2String (Stream s)
  816. {
  817. StringBuilder sb = new StringBuilder ();
  818. int b = s.ReadByte ();
  819. while (b != -1) {
  820. sb.Append (Convert.ToChar (b));
  821. b = s.ReadByte ();
  822. }
  823. return sb.ToString ();
  824. }
  825. private static byte [] _cert = new byte [] {
  826. 0x30, 0x82, 0x01, 0xa3, 0x30, 0x82, 0x01, 0x0c, 0xa0, 0x03, 0x02,
  827. 0x01, 0x02, 0x02, 0x10, 0x1d, 0xcf, 0xbc, 0x89, 0x44, 0x52, 0x4d,
  828. 0x46, 0xab, 0x9a, 0x0e, 0x2d, 0xae, 0x6a, 0xe7, 0x19, 0x30, 0x0d,
  829. 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,
  830. 0x05, 0x00, 0x30, 0x11, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55,
  831. 0x04, 0x03, 0x13, 0x06, 0x4e, 0x6f, 0x76, 0x65, 0x6c, 0x6c, 0x30,
  832. 0x20, 0x17, 0x0d, 0x30, 0x36, 0x30, 0x39, 0x32, 0x31, 0x30, 0x37,
  833. 0x32, 0x36, 0x35, 0x31, 0x5a, 0x18, 0x0f, 0x32, 0x30, 0x39, 0x30,
  834. 0x30, 0x31, 0x32, 0x31, 0x30, 0x38, 0x32, 0x36, 0x35, 0x31, 0x5a,
  835. 0x30, 0x0f, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x03,
  836. 0x13, 0x04, 0x4d, 0x6f, 0x6e, 0x6f, 0x30, 0x81, 0x9d, 0x30, 0x0d,
  837. 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
  838. 0x05, 0x00, 0x03, 0x81, 0x8b, 0x00, 0x30, 0x81, 0x87, 0x02, 0x81,
  839. 0x81, 0x00, 0x98, 0x45, 0x07, 0x52, 0x87, 0xbf, 0x65, 0xb3, 0xb0,
  840. 0x7a, 0xa2, 0x87, 0xd3, 0x2f, 0x9b, 0x72, 0x9f, 0x7c, 0x43, 0x92,
  841. 0x32, 0xff, 0xac, 0x87, 0x59, 0x8f, 0x5b, 0x7b, 0x16, 0x23, 0xff,
  842. 0x79, 0x54, 0xe3, 0x95, 0xa8, 0x99, 0xe1, 0x7a, 0x63, 0x0c, 0xb3,
  843. 0xcd, 0xa9, 0x85, 0x26, 0xcd, 0x65, 0xea, 0x0f, 0x1e, 0x7c, 0xb8,
  844. 0x6e, 0xd6, 0xf2, 0x91, 0xb4, 0x51, 0x69, 0x14, 0x2f, 0xf7, 0x8a,
  845. 0xed, 0x20, 0xce, 0xa0, 0x78, 0x94, 0x75, 0x7b, 0x67, 0x39, 0x99,
  846. 0xf2, 0x56, 0xb4, 0x74, 0xaa, 0xdc, 0x46, 0x10, 0x6a, 0xb1, 0xc2,
  847. 0xeb, 0xc7, 0x00, 0x66, 0xf0, 0x80, 0x99, 0x06, 0x46, 0x6b, 0x57,
  848. 0x90, 0x44, 0xd4, 0x6a, 0x71, 0x34, 0x8a, 0x5f, 0xcc, 0x9f, 0xa8,
  849. 0x7d, 0x12, 0xa2, 0xe2, 0x04, 0xf6, 0x88, 0x49, 0xb6, 0x98, 0xa5,
  850. 0xb8, 0xd7, 0xbe, 0x5e, 0x09, 0x39, 0x7c, 0xab, 0xf7, 0x02, 0x01,
  851. 0x11, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
  852. 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x4e, 0xa9,
  853. 0xa9, 0x28, 0x0a, 0xf1, 0x02, 0x91, 0x1d, 0x28, 0x7a, 0x62, 0xf6,
  854. 0x2c, 0xf6, 0x84, 0x61, 0xd6, 0x7f, 0x22, 0x44, 0x47, 0x28, 0xed,
  855. 0x09, 0x99, 0x08, 0x58, 0xfb, 0x50, 0x19, 0x27, 0xfd, 0x08, 0x09,
  856. 0xf6, 0x62, 0xac, 0x4f, 0xca, 0x35, 0xd9, 0x59, 0xd8, 0x1e, 0xa0,
  857. 0x42, 0x13, 0x00, 0x4d, 0x69, 0x3d, 0x5a, 0xcb, 0x7c, 0xff, 0x49,
  858. 0x1e, 0x3f, 0x67, 0x7f, 0x37, 0xce, 0xeb, 0xb8, 0x63, 0xac, 0x71,
  859. 0x8e, 0xa3, 0xaa, 0x9c, 0xce, 0xa0, 0xb7, 0x05, 0x15, 0xbb, 0x9f,
  860. 0xf4, 0x86, 0xfc, 0xfe, 0x4e, 0x1b, 0x6e, 0x4e, 0x32, 0x2d, 0x1b,
  861. 0xa3, 0x72, 0xe4, 0x99, 0x0b, 0x65, 0x94, 0x2d, 0xfd, 0x76, 0xc8,
  862. 0xe6, 0x48, 0x3d, 0xdb, 0x4b, 0x7d, 0x8e, 0xad, 0xef, 0x6c, 0x70,
  863. 0x4c, 0xb9, 0x7d, 0x87, 0xc6, 0x2b, 0xf0, 0x41, 0xee, 0x6c, 0xba,
  864. 0x08, 0xcf, 0x69, 0x31, 0x18 };
  865. private static byte [] _pkcs12 = new byte [] {
  866. 0x30, 0x82, 0x05, 0x8d, 0x02, 0x01, 0x03, 0x30, 0x82, 0x05, 0x47,
  867. 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01,
  868. 0xa0, 0x82, 0x05, 0x38, 0x04, 0x82, 0x05, 0x34, 0x30, 0x82, 0x05,
  869. 0x30, 0x30, 0x82, 0x02, 0x3f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
  870. 0xf7, 0x0d, 0x01, 0x07, 0x06, 0xa0, 0x82, 0x02, 0x30, 0x30, 0x82,
  871. 0x02, 0x2c, 0x02, 0x01, 0x00, 0x30, 0x82, 0x02, 0x25, 0x06, 0x09,
  872. 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0x30, 0x1c,
  873. 0x06, 0x0a, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x01,
  874. 0x03, 0x30, 0x0e, 0x04, 0x08, 0x6e, 0x0a, 0x50, 0x20, 0xc3, 0x11,
  875. 0x49, 0x07, 0x02, 0x02, 0x07, 0xd0, 0x80, 0x82, 0x01, 0xf8, 0x74,
  876. 0x40, 0x07, 0x44, 0x6b, 0x80, 0x46, 0xe1, 0x4e, 0x65, 0x5e, 0xf2,
  877. 0xf6, 0x38, 0x90, 0xd1, 0x75, 0x24, 0xd9, 0x72, 0x92, 0x5b, 0x4a,
  878. 0xb9, 0x9e, 0xbd, 0xab, 0xe2, 0xb8, 0x91, 0xc9, 0x48, 0x14, 0x88,
  879. 0x61, 0x7d, 0x06, 0xf9, 0x24, 0x80, 0xb5, 0x36, 0xaf, 0xfe, 0xc0,
  880. 0x59, 0x00, 0x39, 0x3f, 0x78, 0xc0, 0x57, 0xea, 0x1e, 0xcb, 0x29,
  881. 0xa4, 0x5f, 0xba, 0x4b, 0xd9, 0xca, 0x95, 0xab, 0x55, 0x4a, 0x11,
  882. 0x1a, 0xf8, 0xe9, 0xd4, 0xc0, 0x08, 0x55, 0xfb, 0x69, 0x09, 0x0d,
  883. 0x5b, 0xed, 0x02, 0xcc, 0x55, 0xfe, 0x05, 0x2e, 0x45, 0xa7, 0x8d,
  884. 0x63, 0x9a, 0xda, 0x6c, 0xc7, 0xe1, 0xcb, 0x5c, 0xa7, 0xd9, 0x9b,
  885. 0x4a, 0xfb, 0x7d, 0x31, 0xe5, 0x89, 0x3e, 0xf2, 0x32, 0xc9, 0x78,
  886. 0xd0, 0x66, 0x1e, 0x38, 0xc7, 0xbf, 0x41, 0xf9, 0xe7, 0xbd, 0xce,
  887. 0x8b, 0xc3, 0x14, 0x19, 0x4b, 0xfa, 0x3a, 0xa2, 0x1f, 0xb0, 0xd4,
  888. 0xfa, 0x33, 0x39, 0x12, 0xd9, 0x36, 0x7f, 0x7e, 0xf0, 0xc4, 0xdc,
  889. 0xf0, 0xb5, 0x7a, 0x50, 0x2c, 0x99, 0x9d, 0x02, 0x40, 0xec, 0x6a,
  890. 0x23, 0x83, 0x16, 0xec, 0x8f, 0x58, 0x14, 0xa0, 0xa0, 0x9c, 0xa0,
  891. 0xe1, 0xd0, 0x6f, 0x54, 0x1a, 0x10, 0x47, 0x69, 0x6b, 0x55, 0x7f,
  892. 0x67, 0x7d, 0xb8, 0x38, 0xa0, 0x40, 0x99, 0x13, 0xe8, 0x15, 0x73,
  893. 0x8d, 0x18, 0x86, 0x29, 0x74, 0xec, 0x66, 0xa3, 0xb8, 0x14, 0x10,
  894. 0x61, 0xef, 0xa5, 0x79, 0x89, 0x01, 0xaa, 0xf2, 0x1f, 0x0c, 0xdd,
  895. 0x0d, 0x8c, 0xbb, 0x7a, 0x4e, 0x0f, 0x47, 0x91, 0x37, 0xa3, 0x8a,
  896. 0x43, 0x0f, 0xeb, 0xc7, 0x9b, 0x8d, 0xaf, 0x39, 0xdf, 0x23, 0x1c,
  897. 0xa4, 0xf7, 0x66, 0x1c, 0x61, 0x42, 0x24, 0x9a, 0x0a, 0x3a, 0x31,
  898. 0x9c, 0x51, 0xa2, 0x30, 0xbe, 0x85, 0xa6, 0xe8, 0x18, 0xfa, 0x8b,
  899. 0xff, 0xdd, 0xdc, 0x34, 0x46, 0x4f, 0x15, 0xde, 0xdb, 0xc4, 0xeb,
  900. 0x62, 0x3b, 0x7c, 0x25, 0x1a, 0x13, 0x8b, 0xda, 0x3b, 0x59, 0x2a,
  901. 0xb8, 0x50, 0xe3, 0x9f, 0x76, 0xfc, 0xe8, 0x00, 0xfc, 0xf7, 0xba,
  902. 0xd2, 0x45, 0x92, 0x14, 0xb5, 0xe2, 0x93, 0x41, 0x09, 0xea, 0x5b,
  903. 0x5e, 0xda, 0x66, 0x92, 0xd1, 0x93, 0x7a, 0xc0, 0xe1, 0x2f, 0xed,
  904. 0x29, 0x78, 0x80, 0xff, 0x79, 0x0e, 0xda, 0x78, 0x7e, 0x71, 0xa4,
  905. 0x31, 0x2f, 0xe9, 0x48, 0xab, 0xc9, 0x40, 0x7d, 0x63, 0x06, 0xd6,
  906. 0xb5, 0x2b, 0x49, 0xba, 0x43, 0x56, 0x69, 0xc5, 0xc2, 0x85, 0x37,
  907. 0xdb, 0xe7, 0x39, 0x87, 0x8d, 0x14, 0x15, 0x55, 0x76, 0x3f, 0x70,
  908. 0xf6, 0xd7, 0x80, 0x82, 0x48, 0x02, 0x64, 0xe1, 0x73, 0x1a, 0xd9,
  909. 0x35, 0x1a, 0x43, 0xf3, 0xde, 0xd4, 0x00, 0x9d, 0x49, 0x2b, 0xc6,
  910. 0x66, 0x19, 0x3e, 0xb8, 0xcc, 0x43, 0xcc, 0xa8, 0x12, 0xa4, 0xad,
  911. 0xcd, 0xe2, 0xe6, 0xb3, 0xdd, 0x7e, 0x80, 0x50, 0xc0, 0xb4, 0x0c,
  912. 0x4c, 0xd2, 0x31, 0xf3, 0xf8, 0x49, 0x31, 0xbe, 0xf2, 0x7d, 0x60,
  913. 0x38, 0xe0, 0x60, 0xdf, 0x7b, 0x58, 0xe0, 0xf9, 0x6e, 0x68, 0x79,
  914. 0x33, 0xb2, 0x2a, 0x53, 0x4c, 0x5a, 0x9d, 0xb3, 0x81, 0x4b, 0x19,
  915. 0x21, 0xe2, 0x3a, 0x42, 0x07, 0x25, 0x5a, 0xee, 0x1f, 0x5d, 0xa2,
  916. 0xca, 0xf7, 0x2f, 0x3c, 0x9b, 0xb0, 0xbc, 0xe7, 0xaf, 0x8c, 0x2f,
  917. 0x52, 0x43, 0x79, 0x94, 0xb0, 0xee, 0xc4, 0x53, 0x09, 0xc0, 0xc9,
  918. 0x21, 0x39, 0x64, 0x82, 0xc3, 0x54, 0xb8, 0x65, 0xf8, 0xdc, 0xb3,
  919. 0xdf, 0x4d, 0xc4, 0x63, 0x59, 0x14, 0x37, 0xd6, 0xba, 0xa3, 0x98,
  920. 0xda, 0x99, 0x02, 0xdd, 0x7a, 0x87, 0x3e, 0x34, 0xb5, 0x4b, 0x0a,
  921. 0xb4, 0x2d, 0xea, 0x19, 0x24, 0xd1, 0xc2, 0x9f, 0x30, 0x82, 0x02,
  922. 0xe9, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07,
  923. 0x01, 0xa0, 0x82, 0x02, 0xda, 0x04, 0x82, 0x02, 0xd6, 0x30, 0x82,
  924. 0x02, 0xd2, 0x30, 0x82, 0x02, 0xce, 0x06, 0x0b, 0x2a, 0x86, 0x48,
  925. 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x0a, 0x01, 0x02, 0xa0, 0x82, 0x02,
  926. 0xa6, 0x30, 0x82, 0x02, 0xa2, 0x30, 0x1c, 0x06, 0x0a, 0x2a, 0x86,
  927. 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x01, 0x03, 0x30, 0x0e, 0x04,
  928. 0x08, 0xe0, 0x21, 0x4f, 0x90, 0x7d, 0x86, 0x72, 0xc7, 0x02, 0x02,
  929. 0x07, 0xd0, 0x04, 0x82, 0x02, 0x80, 0x92, 0xac, 0xe8, 0x52, 0xa6,
  930. 0x3e, 0xed, 0x3d, 0xbc, 0x28, 0x5f, 0xb9, 0x45, 0x76, 0x27, 0x95,
  931. 0xf8, 0x6a, 0xc5, 0x17, 0x97, 0x46, 0x58, 0xe9, 0x15, 0x7c, 0x68,
  932. 0x62, 0x67, 0xb5, 0x2f, 0x1b, 0x64, 0x27, 0x9d, 0xfd, 0x67, 0x66,
  933. 0x42, 0x21, 0x5c, 0xf4, 0x64, 0x37, 0xcc, 0xc0, 0x04, 0x01, 0x91,
  934. 0x6c, 0x6b, 0x84, 0x96, 0xae, 0x04, 0xfe, 0xcc, 0x88, 0x6a, 0x84,
  935. 0xd7, 0x59, 0x28, 0x78, 0xc9, 0xb4, 0xf6, 0x4d, 0x86, 0x8d, 0x59,
  936. 0xc6, 0x74, 0x30, 0xca, 0x2f, 0x0a, 0xa7, 0x66, 0x99, 0xf4, 0x8f,
  937. 0x44, 0x6d, 0x97, 0x3c, 0xd6, 0xdb, 0xd6, 0x31, 0x8c, 0xf7, 0x75,
  938. 0xd9, 0x0b, 0xf5, 0xd2, 0x27, 0x80, 0x81, 0x28, 0x0f, 0x6b, 0x8b,
  939. 0x45, 0x11, 0x08, 0x1d, 0x06, 0x31, 0x4d, 0x98, 0x68, 0xc9, 0x09,
  940. 0x9b, 0x51, 0x84, 0x81, 0x74, 0x76, 0x57, 0x63, 0xb5, 0x38, 0xc8,
  941. 0xe1, 0x96, 0xe4, 0xcd, 0xd4, 0xe8, 0xf8, 0x26, 0x88, 0x88, 0xaa,
  942. 0xdf, 0x1b, 0xc6, 0x37, 0xb8, 0xc4, 0xe1, 0xcb, 0xc0, 0x71, 0x3d,
  943. 0xd6, 0xd7, 0x8b, 0xc6, 0xec, 0x5f, 0x42, 0x86, 0xb0, 0x8d, 0x1c,
  944. 0x49, 0xb9, 0xc6, 0x96, 0x11, 0xa5, 0xd6, 0xd2, 0xc0, 0x18, 0xca,
  945. 0xe7, 0xf6, 0x93, 0xb4, 0xf5, 0x7a, 0xe4, 0xec, 0xa2, 0x90, 0xf8,
  946. 0xef, 0x66, 0x0f, 0xa8, 0x52, 0x0c, 0x3f, 0x85, 0x4a, 0x76, 0x3a,
  947. 0xb8, 0x5a, 0x2d, 0x03, 0x5d, 0x99, 0x70, 0xbb, 0x02, 0x1c, 0x77,
  948. 0x43, 0x12, 0xd9, 0x1f, 0x7c, 0x6f, 0x69, 0x15, 0x17, 0x30, 0x51,
  949. 0x7d, 0x53, 0xc2, 0x06, 0xe0, 0xd2, 0x31, 0x17, 0x2a, 0x98, 0xe3,
  950. 0xe0, 0x20, 0xfb, 0x01, 0xfd, 0xd1, 0x1b, 0x50, 0x00, 0xad, 0x1d,
  951. 0xff, 0xa1, 0xae, 0xd6, 0xac, 0x38, 0x8b, 0x71, 0x28, 0x44, 0x66,
  952. 0x8c, 0xb6, 0x34, 0xc5, 0x86, 0xc9, 0x34, 0xda, 0x6c, 0x2a, 0xef,
  953. 0x69, 0x3c, 0xb7, 0xbd, 0xa5, 0x05, 0x3c, 0x7c, 0xfb, 0x0c, 0x2d,
  954. 0x49, 0x09, 0xdb, 0x91, 0x3b, 0x41, 0x2a, 0xe4, 0xfa, 0x4a, 0xc2,
  955. 0xea, 0x9e, 0x6f, 0xc3, 0x46, 0x2a, 0x77, 0x83, 0x4e, 0x22, 0x01,
  956. 0xfb, 0x0c, 0x2d, 0x5a, 0xcf, 0x8d, 0xa7, 0x55, 0x24, 0x7c, 0xda,
  957. 0x9e, 0xd8, 0xbc, 0xf6, 0x81, 0x63, 0x8a, 0x36, 0xd0, 0x13, 0x74,
  958. 0x30, 0x4d, 0xd8, 0x4e, 0xa6, 0x81, 0x71, 0x71, 0xff, 0x9f, 0xf3,
  959. 0x8d, 0x75, 0xad, 0x6b, 0x93, 0x93, 0x8c, 0xf8, 0x7d, 0xa6, 0x62,
  960. 0x9d, 0xf7, 0x86, 0x6f, 0xcb, 0x5b, 0x6f, 0xe5, 0xee, 0xcd, 0xb0,
  961. 0xb2, 0xfd, 0x96, 0x2c, 0xde, 0xa0, 0xcf, 0x46, 0x8c, 0x66, 0x0e,
  962. 0xf9, 0xa3, 0xdb, 0xfa, 0x8f, 0x1b, 0x54, 0x9d, 0x13, 0x13, 0x6b,
  963. 0x97, 0x43, 0x97, 0x64, 0xec, 0x2a, 0xc5, 0xc0, 0x26, 0xab, 0xea,
  964. 0x37, 0xd6, 0xcb, 0xb9, 0x83, 0x18, 0x53, 0x5a, 0xcd, 0x28, 0xb3,
  965. 0x3b, 0x9c, 0x13, 0xaa, 0x78, 0x6c, 0xcf, 0xe9, 0x75, 0x7c, 0x80,
  966. 0x04, 0x05, 0x52, 0xda, 0x13, 0x41, 0xb0, 0x27, 0x0f, 0x82, 0xa3,
  967. 0x81, 0xd8, 0xf7, 0xdc, 0x61, 0xbb, 0x98, 0x32, 0x5a, 0x88, 0xbf,
  968. 0x49, 0xc1, 0x76, 0x83, 0xcd, 0xc4, 0xb4, 0xca, 0x8d, 0x36, 0x88,
  969. 0xee, 0xdb, 0xc5, 0xf4, 0x13, 0x28, 0x4d, 0xae, 0x7a, 0x31, 0x3e,
  970. 0x77, 0x19, 0xab, 0x11, 0x15, 0x29, 0xd4, 0xcf, 0xb4, 0x73, 0x36,
  971. 0x92, 0x1e, 0x4e, 0x5d, 0x35, 0x57, 0x84, 0x45, 0x9d, 0x05, 0x3c,
  972. 0x44, 0x86, 0x08, 0x0b, 0x90, 0x29, 0xf9, 0xe6, 0x48, 0xaf, 0xf4,
  973. 0x62, 0xd2, 0x4d, 0x32, 0x1a, 0xe9, 0xbf, 0x3a, 0x7b, 0x25, 0x4a,
  974. 0x03, 0xfb, 0x40, 0x1d, 0x71, 0x2c, 0x10, 0x54, 0xdc, 0xbf, 0xf4,
  975. 0x50, 0x85, 0x15, 0x11, 0xb1, 0x2d, 0x03, 0x2c, 0xe4, 0x8a, 0xce,
  976. 0xec, 0x6e, 0x46, 0x06, 0x13, 0x3c, 0x97, 0x8d, 0xdd, 0xf6, 0x1e,
  977. 0x62, 0xb4, 0x8d, 0xfa, 0x2c, 0x86, 0x87, 0x64, 0x5e, 0xec, 0xc8,
  978. 0x84, 0xd1, 0x3d, 0xc5, 0x76, 0x4a, 0x31, 0xd3, 0xdb, 0x34, 0x6e,
  979. 0x8a, 0x49, 0xd6, 0x38, 0xbb, 0x05, 0xe9, 0x4d, 0xf1, 0xde, 0x3e,
  980. 0xa4, 0x47, 0xdd, 0xe8, 0xa8, 0xf1, 0xba, 0x55, 0xce, 0xca, 0x5b,
  981. 0x57, 0xd7, 0xc8, 0x9f, 0x09, 0xa3, 0x8e, 0x58, 0x83, 0x21, 0x0a,
  982. 0x6e, 0xd3, 0x70, 0x9c, 0xb9, 0x7c, 0x52, 0x98, 0x53, 0xcb, 0xda,
  983. 0x9d, 0xaf, 0xb7, 0x4b, 0xf7, 0x48, 0x91, 0x7e, 0x78, 0x20, 0x19,
  984. 0xe3, 0x41, 0x9d, 0xc8, 0x68, 0x11, 0xfb, 0x5f, 0x6b, 0xc8, 0x09,
  985. 0x74, 0xcb, 0x76, 0x08, 0xbc, 0x28, 0x63, 0x57, 0x04, 0xb0, 0x80,
  986. 0xd1, 0x53, 0x60, 0x50, 0x44, 0xba, 0x80, 0x48, 0x5e, 0x0e, 0x9a,
  987. 0xe5, 0x64, 0x26, 0x7a, 0x88, 0xb9, 0xc6, 0x33, 0x31, 0x15, 0x30,
  988. 0x13, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09,
  989. 0x15, 0x31, 0x06, 0x04, 0x04, 0x01, 0x00, 0x00, 0x00, 0x30, 0x3d,
  990. 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a,
  991. 0x05, 0x00, 0x04, 0x14, 0x32, 0x55, 0x07, 0xa2, 0x67, 0xf3, 0x76,
  992. 0x4d, 0x0b, 0x6f, 0xa4, 0xa0, 0x7b, 0xce, 0x2f, 0xc5, 0xff, 0xbe,
  993. 0x3e, 0x38, 0x04, 0x14, 0x52, 0xf8, 0xb3, 0xeb, 0xc3, 0xda, 0x79,
  994. 0xfa, 0x75, 0x89, 0x67, 0x33, 0x01, 0xd0, 0xb0, 0x13, 0xfa, 0x11,
  995. 0x94, 0xac, 0x02, 0x02, 0x07, 0xd0 };
  996. #endif
  997. }
  998. }