2007-12-18 Ivan N. Zlatev <contact@i-nz.net>
[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 }
146 #endif