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