EncryptedXmlTest.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. #if NET_2_0
  10. using System;
  11. using System.Collections;
  12. using System.IO;
  13. using System.Security.Cryptography;
  14. using System.Security.Cryptography.X509Certificates;
  15. using System.Security.Cryptography.Xml;
  16. using System.Xml;
  17. using NUnit.Framework;
  18. namespace MonoTests.System.Security.Cryptography.Xml
  19. {
  20. [TestFixture]
  21. public class EncryptedXmlTest
  22. {
  23. [Test]
  24. public void Sample1 ()
  25. {
  26. XmlDocument doc = new XmlDocument ();
  27. doc.PreserveWhitespace = true;
  28. doc.Load ("Test/System.Security.Cryptography.Xml/EncryptedXmlSample1.xml");
  29. EncryptedXml encxml = new EncryptedXml (doc);
  30. RSACryptoServiceProvider rsa = new X509Certificate2 ("Test/System.Security.Cryptography.Xml/sample.pfx", "mono").PrivateKey as RSACryptoServiceProvider;
  31. XmlNamespaceManager nm = new XmlNamespaceManager (doc.NameTable);
  32. nm.AddNamespace ("s", "http://www.w3.org/2003/05/soap-envelope");
  33. nm.AddNamespace ("o", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
  34. nm.AddNamespace ("e", EncryptedXml.XmlEncNamespaceUrl);
  35. XmlElement el = doc.SelectSingleNode ("/s:Envelope/s:Header/o:Security/e:EncryptedKey", nm) as XmlElement;
  36. EncryptedKey ekey = new EncryptedKey ();
  37. ekey.LoadXml (el);
  38. byte [] key = rsa.Decrypt (ekey.CipherData.CipherValue, true);
  39. Rijndael aes = new RijndaelManaged ();
  40. aes.Key = key;
  41. aes.Mode = CipherMode.CBC;
  42. ArrayList al = new ArrayList ();
  43. foreach (XmlElement ed in doc.SelectNodes ("//e:EncryptedData", nm))
  44. al.Add (ed);
  45. foreach (XmlElement ed in al) {
  46. EncryptedData edata = new EncryptedData ();
  47. edata.LoadXml (ed);
  48. encxml.ReplaceData (ed, encxml.DecryptData (edata, aes));
  49. }
  50. }
  51. [Test]
  52. public void Sample2 ()
  53. {
  54. RijndaelManaged aes = new RijndaelManaged ();
  55. aes.Mode = CipherMode.CBC;
  56. aes.KeySize = 256;
  57. aes.Key = Convert.FromBase64String ("o/ilseZu+keLBBWGGPlUHweqxIPc4gzZEFWr2nBt640=");
  58. aes.Padding = PaddingMode.Zeros;
  59. XmlDocument doc = new XmlDocument ();
  60. doc.PreserveWhitespace = true;
  61. doc.Load ("Test/System.Security.Cryptography.Xml/EncryptedXmlSample2.xml");
  62. EncryptedXml encxml = new EncryptedXml (doc);
  63. EncryptedData edata = new EncryptedData ();
  64. edata.LoadXml (doc.DocumentElement);
  65. encxml.ReplaceData (doc.DocumentElement, encxml.DecryptData (edata, aes));
  66. }
  67. [Test]
  68. public void RoundtripSample1 ()
  69. {
  70. StringWriter sw = new StringWriter ();
  71. // Encryption
  72. {
  73. XmlDocument doc = new XmlDocument ();
  74. doc.PreserveWhitespace = true;
  75. doc.LoadXml ("<root> <child>sample</child> </root>");
  76. XmlElement body = doc.DocumentElement;
  77. RijndaelManaged aes = new RijndaelManaged ();
  78. aes.Mode = CipherMode.CBC;
  79. aes.KeySize = 256;
  80. aes.IV = Convert.FromBase64String ("pBUM5P03rZ6AE4ZK5EyBrw==");
  81. aes.Key = Convert.FromBase64String ("o/ilseZu+keLBBWGGPlUHweqxIPc4gzZEFWr2nBt640=");
  82. aes.Padding = PaddingMode.Zeros;
  83. EncryptedXml exml = new EncryptedXml ();
  84. byte [] encrypted = exml.EncryptData (body, aes, false);
  85. EncryptedData edata = new EncryptedData ();
  86. edata.Type = EncryptedXml.XmlEncElementUrl;
  87. edata.EncryptionMethod = new EncryptionMethod (EncryptedXml.XmlEncAES256Url);
  88. EncryptedKey ekey = new EncryptedKey ();
  89. // omit key encryption, here for testing
  90. byte [] encKeyBytes = aes.Key;
  91. ekey.CipherData = new CipherData (encKeyBytes);
  92. ekey.EncryptionMethod = new EncryptionMethod (EncryptedXml.XmlEncRSA15Url);
  93. DataReference dr = new DataReference ();
  94. dr.Uri = "_0";
  95. ekey.AddReference (dr);
  96. edata.KeyInfo.AddClause (new KeyInfoEncryptedKey (ekey));
  97. edata.KeyInfo = new KeyInfo ();
  98. ekey.KeyInfo.AddClause (new RSAKeyValue (RSA.Create ()));
  99. edata.CipherData.CipherValue = encrypted;
  100. EncryptedXml.ReplaceElement (doc.DocumentElement, edata, false);
  101. doc.Save (new XmlTextWriter (sw));
  102. }
  103. // Decryption
  104. {
  105. RijndaelManaged aes = new RijndaelManaged ();
  106. aes.Mode = CipherMode.CBC;
  107. aes.KeySize = 256;
  108. aes.Key = Convert.FromBase64String (
  109. "o/ilseZu+keLBBWGGPlUHweqxIPc4gzZEFWr2nBt640=");
  110. aes.Padding = PaddingMode.Zeros;
  111. XmlDocument doc = new XmlDocument ();
  112. doc.PreserveWhitespace = true;
  113. doc.LoadXml (sw.ToString ());
  114. EncryptedXml encxml = new EncryptedXml (doc);
  115. EncryptedData edata = new EncryptedData ();
  116. edata.LoadXml (doc.DocumentElement);
  117. encxml.ReplaceData (doc.DocumentElement, encxml.DecryptData (edata, aes));
  118. }
  119. }
  120. }
  121. }
  122. #endif