EncryptedXmlTest.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. //
  2. // EncryptedXmlTest.cs
  3. //
  4. // Author:
  5. // Atsushi Enomoto <[email protected]>
  6. //
  7. // Copyright (C) 2006 Novell, Inc (http://www.novell.com)
  8. //
  9. using System;
  10. using System.Collections;
  11. using System.IO;
  12. using System.Security.Cryptography;
  13. using System.Security.Cryptography.X509Certificates;
  14. using System.Security.Cryptography.Xml;
  15. using System.Xml;
  16. using NUnit.Framework;
  17. namespace MonoTests.System.Security.Cryptography.Xml
  18. {
  19. [TestFixture]
  20. public class EncryptedXmlTest
  21. {
  22. [Test]
  23. public void Sample1 ()
  24. {
  25. AssertDecryption1 ("Test/System.Security.Cryptography.Xml/EncryptedXmlSample1.xml");
  26. }
  27. void AssertDecryption1 (string filename)
  28. {
  29. XmlDocument doc = new XmlDocument ();
  30. doc.PreserveWhitespace = true;
  31. doc.Load (filename);
  32. EncryptedXml encxml = new EncryptedXml (doc);
  33. RSACryptoServiceProvider rsa = new X509Certificate2 ("Test/System.Security.Cryptography.Xml/sample.pfx", "mono").PrivateKey as RSACryptoServiceProvider;
  34. XmlNamespaceManager nm = new XmlNamespaceManager (doc.NameTable);
  35. nm.AddNamespace ("s", "http://www.w3.org/2003/05/soap-envelope");
  36. nm.AddNamespace ("o", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
  37. nm.AddNamespace ("e", EncryptedXml.XmlEncNamespaceUrl);
  38. XmlElement el = doc.SelectSingleNode ("/s:Envelope/s:Header/o:Security/e:EncryptedKey", nm) as XmlElement;
  39. EncryptedKey ekey = new EncryptedKey ();
  40. ekey.LoadXml (el);
  41. byte [] key = rsa.Decrypt (ekey.CipherData.CipherValue, true);
  42. Rijndael aes = new RijndaelManaged ();
  43. aes.Key = key;
  44. aes.Mode = CipherMode.CBC;
  45. ArrayList al = new ArrayList ();
  46. foreach (XmlElement ed in doc.SelectNodes ("//e:EncryptedData", nm))
  47. al.Add (ed);
  48. foreach (XmlElement ed in al) {
  49. EncryptedData edata = new EncryptedData ();
  50. edata.LoadXml (ed);
  51. encxml.ReplaceData (ed, encxml.DecryptData (edata, aes));
  52. }
  53. }
  54. [Test]
  55. public void Sample2 ()
  56. {
  57. RijndaelManaged aes = new RijndaelManaged ();
  58. aes.Mode = CipherMode.CBC;
  59. aes.KeySize = 256;
  60. aes.Key = Convert.FromBase64String ("o/ilseZu+keLBBWGGPlUHweqxIPc4gzZEFWr2nBt640=");
  61. aes.Padding = PaddingMode.Zeros;
  62. XmlDocument doc = new XmlDocument ();
  63. doc.PreserveWhitespace = true;
  64. doc.Load ("Test/System.Security.Cryptography.Xml/EncryptedXmlSample2.xml");
  65. EncryptedXml encxml = new EncryptedXml (doc);
  66. EncryptedData edata = new EncryptedData ();
  67. edata.LoadXml (doc.DocumentElement);
  68. encxml.ReplaceData (doc.DocumentElement, encxml.DecryptData (edata, aes));
  69. }
  70. [Test]
  71. public void Sample3 ()
  72. {
  73. AssertDecryption1 ("Test/System.Security.Cryptography.Xml/EncryptedXmlSample3.xml");
  74. }
  75. [Test]
  76. public void RoundtripSample1 ()
  77. {
  78. StringWriter sw = new StringWriter ();
  79. // Encryption
  80. {
  81. XmlDocument doc = new XmlDocument ();
  82. doc.PreserveWhitespace = true;
  83. doc.LoadXml ("<root> <child>sample</child> </root>");
  84. XmlElement body = doc.DocumentElement;
  85. RijndaelManaged aes = new RijndaelManaged ();
  86. aes.Mode = CipherMode.CBC;
  87. aes.KeySize = 256;
  88. aes.IV = Convert.FromBase64String ("pBUM5P03rZ6AE4ZK5EyBrw==");
  89. aes.Key = Convert.FromBase64String ("o/ilseZu+keLBBWGGPlUHweqxIPc4gzZEFWr2nBt640=");
  90. aes.Padding = PaddingMode.Zeros;
  91. EncryptedXml exml = new EncryptedXml ();
  92. byte [] encrypted = exml.EncryptData (body, aes, false);
  93. EncryptedData edata = new EncryptedData ();
  94. edata.Type = EncryptedXml.XmlEncElementUrl;
  95. edata.EncryptionMethod = new EncryptionMethod (EncryptedXml.XmlEncAES256Url);
  96. EncryptedKey ekey = new EncryptedKey ();
  97. // omit key encryption, here for testing
  98. byte [] encKeyBytes = aes.Key;
  99. ekey.CipherData = new CipherData (encKeyBytes);
  100. ekey.EncryptionMethod = new EncryptionMethod (EncryptedXml.XmlEncRSA15Url);
  101. DataReference dr = new DataReference ();
  102. dr.Uri = "_0";
  103. ekey.AddReference (dr);
  104. edata.KeyInfo.AddClause (new KeyInfoEncryptedKey (ekey));
  105. edata.KeyInfo = new KeyInfo ();
  106. ekey.KeyInfo.AddClause (new RSAKeyValue (RSA.Create ()));
  107. edata.CipherData.CipherValue = encrypted;
  108. EncryptedXml.ReplaceElement (doc.DocumentElement, edata, false);
  109. doc.Save (new XmlTextWriter (sw));
  110. }
  111. // Decryption
  112. {
  113. RijndaelManaged aes = new RijndaelManaged ();
  114. aes.Mode = CipherMode.CBC;
  115. aes.KeySize = 256;
  116. aes.Key = Convert.FromBase64String (
  117. "o/ilseZu+keLBBWGGPlUHweqxIPc4gzZEFWr2nBt640=");
  118. aes.Padding = PaddingMode.Zeros;
  119. XmlDocument doc = new XmlDocument ();
  120. doc.PreserveWhitespace = true;
  121. doc.LoadXml (sw.ToString ());
  122. EncryptedXml encxml = new EncryptedXml (doc);
  123. EncryptedData edata = new EncryptedData ();
  124. edata.LoadXml (doc.DocumentElement);
  125. encxml.ReplaceData (doc.DocumentElement, encxml.DecryptData (edata, aes));
  126. }
  127. }
  128. [Test]
  129. [ExpectedException (typeof (ArgumentNullException))]
  130. public void ReplaceData_XmlElementNull ()
  131. {
  132. EncryptedXml ex = new EncryptedXml ();
  133. ex.ReplaceData (null, new byte[0]);
  134. }
  135. [Test]
  136. [ExpectedException (typeof (ArgumentNullException))]
  137. public void ReplaceData_EncryptedDataNull ()
  138. {
  139. EncryptedXml ex = new EncryptedXml ();
  140. XmlDocument doc = new XmlDocument ();
  141. ex.ReplaceData (doc.DocumentElement, null);
  142. }
  143. [Test]
  144. [ExpectedException (typeof (ArgumentNullException))]
  145. public void ReplaceElement_XmlElementNull ()
  146. {
  147. EncryptedXml.ReplaceElement (null, new EncryptedData (), true);
  148. }
  149. [Test]
  150. [ExpectedException (typeof (ArgumentNullException))]
  151. public void ReplaceElement_EncryptedDataNull ()
  152. {
  153. XmlDocument doc = new XmlDocument ();
  154. EncryptedXml.ReplaceElement (doc.DocumentElement, null, false);
  155. }
  156. [Test]
  157. public void GetIdElement_XmlDocumentNull ()
  158. {
  159. EncryptedXml ex = new EncryptedXml ();
  160. Assert.IsNull (ex.GetIdElement (null, "value"));
  161. }
  162. [Test]
  163. public void GetIdElement_StringNull ()
  164. {
  165. EncryptedXml ex = new EncryptedXml ();
  166. Assert.IsNull (ex.GetIdElement (new XmlDocument (), null));
  167. }
  168. [Test]
  169. [ExpectedException (typeof (ArgumentNullException))]
  170. public void GetDecryptionKey_EncryptedDataNull ()
  171. {
  172. EncryptedXml ex = new EncryptedXml ();
  173. ex.GetDecryptionKey (null, EncryptedXml.XmlEncAES128Url);
  174. }
  175. [Test]
  176. public void GetDecryptionKey_StringNull ()
  177. {
  178. EncryptedXml ex = new EncryptedXml ();
  179. Assert.IsNull (ex.GetDecryptionKey (new EncryptedData (), null));
  180. }
  181. [Test]
  182. [ExpectedException (typeof (ArgumentNullException))]
  183. public void GetDecryptionIV_EncryptedDataNull ()
  184. {
  185. EncryptedXml ex = new EncryptedXml ();
  186. ex.GetDecryptionIV (null, EncryptedXml.XmlEncAES128Url);
  187. }
  188. [Test]
  189. [ExpectedException (typeof (CryptographicException))]
  190. public void GetDecryptionIV_StringNull ()
  191. {
  192. EncryptedXml ex = new EncryptedXml ();
  193. Assert.IsNull (ex.GetDecryptionIV (new EncryptedData (), null));
  194. }
  195. [Test]
  196. [ExpectedException (typeof (ArgumentNullException))]
  197. public void DecryptKey_KeyNull ()
  198. {
  199. EncryptedXml.DecryptKey (null, Rijndael.Create ());
  200. }
  201. [Test]
  202. [ExpectedException (typeof (ArgumentNullException))]
  203. public void DecryptKey_SymmetricAlgorithmNull ()
  204. {
  205. EncryptedXml.DecryptKey (new byte [16], null);
  206. }
  207. [Test]
  208. [ExpectedException (typeof (ArgumentNullException))]
  209. public void EncryptKey_KeyNull ()
  210. {
  211. EncryptedXml.EncryptKey (null, Rijndael.Create ());
  212. }
  213. [Test]
  214. [ExpectedException (typeof (ArgumentNullException))]
  215. public void EncryptKey_SymmetricAlgorithmNull ()
  216. {
  217. EncryptedXml.EncryptKey (new byte [16], null);
  218. }
  219. [Test]
  220. [ExpectedException (typeof (ArgumentNullException))]
  221. public void DecryptData_EncryptedDataNull ()
  222. {
  223. EncryptedXml ex = new EncryptedXml ();
  224. ex.DecryptData (null, Rijndael.Create ());
  225. }
  226. [Test]
  227. [ExpectedException (typeof (ArgumentNullException))]
  228. public void DecryptData_SymmetricAlgorithmNull ()
  229. {
  230. EncryptedXml ex = new EncryptedXml ();
  231. ex.DecryptData (new EncryptedData (), null);
  232. }
  233. [Test]
  234. [ExpectedException (typeof (ArgumentNullException))]
  235. public void EncryptData_DataNull ()
  236. {
  237. EncryptedXml ex = new EncryptedXml ();
  238. ex.EncryptData (null, Rijndael.Create ());
  239. }
  240. [Test]
  241. [ExpectedException (typeof (ArgumentNullException))]
  242. public void EncryptData_SymmetricAlgorithmNull ()
  243. {
  244. EncryptedXml ex = new EncryptedXml ();
  245. ex.EncryptData (new byte[16], null);
  246. }
  247. [Test]
  248. [ExpectedException (typeof (ArgumentNullException))]
  249. public void EncryptData_XmlElementNull ()
  250. {
  251. EncryptedXml ex = new EncryptedXml ();
  252. ex.EncryptData (null, Rijndael.Create (), true);
  253. }
  254. [Test]
  255. [ExpectedException (typeof (ArgumentNullException))]
  256. public void DecryptEncryptedKey_Null ()
  257. {
  258. EncryptedXml ex = new EncryptedXml ();
  259. ex.DecryptEncryptedKey (null);
  260. }
  261. }
  262. }