| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623 |
- //
- // IssuedSecurityTokenProviderTest.cs
- //
- // Author:
- // Atsushi Enomoto <[email protected]>
- //
- // Copyright (C) 2006 Novell, Inc. http://www.novell.com
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to
- // permit persons to whom the Software is furnished to do so, subject to
- // the following conditions:
- //
- // The above copyright notice and this permission notice shall be
- // included in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- //
- using System;
- using System.Collections.Generic;
- using System.Globalization;
- using System.IO;
- using System.Security.Cryptography;
- using System.Security.Cryptography.X509Certificates;
- using System.Security.Cryptography.Xml;
- using System.ServiceModel;
- using System.ServiceModel.Channels;
- using System.ServiceModel.Security;
- using System.ServiceModel.Security.Tokens;
- using System.IdentityModel.Tokens;
- using System.Text;
- using System.Xml;
- using NUnit.Framework;
- using MonoTests.System.ServiceModel.Channels;
- namespace MonoTests.System.ServiceModel.Security.Tokens
- {
- [TestFixture]
- public class IssuedSecurityTokenProviderTest
- {
- [Test]
- public void DefaultValues ()
- {
- IssuedSecurityTokenProvider p =
- new IssuedSecurityTokenProvider ();
- Assert.AreEqual (true, p.CacheIssuedTokens, "#1");
- Assert.AreEqual (TimeSpan.FromMinutes (1), p.DefaultOpenTimeout, "#2");
- Assert.AreEqual (TimeSpan.FromMinutes (1), p.DefaultCloseTimeout, "#3");
- Assert.IsNotNull (p.IdentityVerifier, "#4");
- Assert.AreEqual (60, p.IssuedTokenRenewalThresholdPercentage, "#5");
- Assert.IsNull (p.IssuerAddress, "#6");
- Assert.AreEqual (0, p.IssuerChannelBehaviors.Count, "#7");
- Assert.AreEqual (SecurityKeyEntropyMode.CombinedEntropy, p.KeyEntropyMode, "#8");
- Assert.AreEqual (TimeSpan.MaxValue, p.MaxIssuedTokenCachingTime, "#9");
- Assert.AreEqual (MessageSecurityVersion.Default,
- p.MessageSecurityVersion, "#10");
- Assert.IsNull (p.SecurityAlgorithmSuite, "#11");
- Assert.IsNull (p.SecurityTokenSerializer, "#12");
- Assert.IsNull (p.TargetAddress, "#13");
- Assert.AreEqual (true, p.SupportsTokenCancellation, "#14");
- Assert.AreEqual (0, p.TokenRequestParameters.Count, "#15");
- Assert.IsNull (p.IssuerBinding, "#16");
- }
- [Test]
- [ExpectedException (typeof (InvalidOperationException))]
- public void OpenWithoutSerializer ()
- {
- IssuedSecurityTokenProvider p =
- new IssuedSecurityTokenProvider ();
- p.Open ();
- }
- [Test]
- [ExpectedException (typeof (InvalidOperationException))]
- public void OpenWithoutIssuerAddress ()
- {
- IssuedSecurityTokenProvider p =
- new IssuedSecurityTokenProvider ();
- p.SecurityTokenSerializer = WSSecurityTokenSerializer.DefaultInstance;
- p.Open ();
- }
- [Test]
- [ExpectedException (typeof (InvalidOperationException))]
- public void OpenWithoutBinding ()
- {
- IssuedSecurityTokenProvider p =
- new IssuedSecurityTokenProvider ();
- p.SecurityTokenSerializer = WSSecurityTokenSerializer.DefaultInstance;
- p.IssuerAddress = new EndpointAddress ("http://localhost:8080");
- p.Open ();
- }
- [Test]
- [ExpectedException (typeof (InvalidOperationException))]
- public void OpenWithoutTargetAddress ()
- {
- IssuedSecurityTokenProvider p =
- new IssuedSecurityTokenProvider ();
- p.SecurityTokenSerializer = WSSecurityTokenSerializer.DefaultInstance;
- p.IssuerAddress = new EndpointAddress ("http://localhost:8080");
- p.IssuerBinding = new BasicHttpBinding ();
- // wiithout it indigo causes NRE
- p.SecurityAlgorithmSuite = SecurityAlgorithmSuite.Default;
- p.Open ();
- }
- [Test]
- [Category ("NotWorking")]
- public void Open ()
- {
- IssuedSecurityTokenProvider p = SetupProvider (new BasicHttpBinding ());
- try {
- p.Open ();
- } finally {
- if (p.State == CommunicationState.Opened)
- p.Close ();
- }
- }
- [Test]
- [ExpectedException (typeof (InvalidOperationException))]
- public void GetTokenWithoutOpen ()
- {
- IssuedSecurityTokenProvider p =
- new IssuedSecurityTokenProvider ();
- p.GetToken (TimeSpan.FromSeconds (10));
- }
- // From WinFX beta2:
- // System.ServiceModel.Security.SecurityNegotiationException :
- // SOAP security negotiation with 'stream:dummy' for target
- // 'stream:dummy' failed. See inner exception for more details.
- // ----> System.InvalidOperationException : The request
- // message must be protected. This is required by an operation
- // of the contract ('IWsTrustFeb2005SecurityTokenService',
- // 'http://tempuri.org/'). The protection must be provided by
- // the binding ('BasicHttpBinding','http://tempuri.org/').
- [Test]
- [ExpectedException (typeof (SecurityNegotiationException))]
- [Category ("NotWorking")]
- public void GetTokenNoSecureBinding ()
- {
- IssuedSecurityTokenProvider p = SetupProvider (new BasicHttpBinding ());
- try {
- p.Open ();
- p.GetToken (TimeSpan.FromSeconds (10));
- } finally {
- if (p.State == CommunicationState.Opened)
- p.Close ();
- }
- }
- [Test]
- // SymmetricSecurityBindingElement requires protection
- // token parameters to build a channel or listener factory.
- [ExpectedException (typeof (SecurityNegotiationException))]
- [Category ("NotWorking")]
- public void GetTokenWithoutProtectionTokenParameters ()
- {
- IssuedSecurityTokenProvider p = SetupProvider (CreateIssuerBinding (null, false));
- try {
- p.Open ();
- p.GetToken (TimeSpan.FromSeconds (10));
- } finally {
- if (p.State == CommunicationState.Opened)
- p.Close ();
- }
- }
- // SecurityNegotiationException (InvalidOperationException (
- // "The service certificate is not provided for target
- // 'stream:dummy'. Specify a service certificate in
- // ClientCredentials."))
- [Test]
- [ExpectedException (typeof (SecurityNegotiationException))]
- [Category ("NotWorking")]
- public void GetTokenWithoutServiceCertificate ()
- {
- IssuedSecurityTokenProvider p = SetupProvider (CreateIssuerBinding (null, true));
- p.IssuerAddress = new EndpointAddress ("stream:dummy");
- try {
- p.Open (TimeSpan.FromSeconds (5));
- p.GetToken (TimeSpan.FromSeconds (10));
- } finally {
- if (p.State == CommunicationState.Opened)
- p.Close ();
- }
- }
- [Test]
- [Category ("NotWorking")]
- [ExpectedException (typeof (MyException))]
- public void GetTokenWrongResponse ()
- {
- IssuedSecurityTokenProvider p = SetupProvider (CreateIssuerBinding (new RequestSender (OnGetTokenWrongResponse), true));
- try {
- p.Open (TimeSpan.FromSeconds (5));
- p.GetToken (TimeSpan.FromSeconds (10));
- } finally {
- if (p.State == CommunicationState.Opened)
- p.Close ();
- }
- }
- [Test]
- [Category ("NotWorking")]
- [ExpectedException (typeof (MessageSecurityException))]
- public void GetTokenUnsignedReply ()
- {
- IssuedSecurityTokenProvider p = SetupProvider (CreateIssuerBinding (new RequestSender (OnGetTokenUnsignedReply), true));
- try {
- p.Open (TimeSpan.FromSeconds (5));
- p.GetToken (TimeSpan.FromSeconds (10));
- } finally {
- if (p.State == CommunicationState.Opened)
- p.Close ();
- }
- }
- // InnerException: System.InvalidOperationException:
- // The issuer must provide a computed key in key entropy mode
- // 'CombinedEntropy'.
- [Test]
- [Ignore ("todo")]
- [ExpectedException (typeof (SecurityNegotiationException))]
- public void GetTokenNoEntropyInResponseInCombinedMode ()
- {
- // FIXME: implement it after we get working token issuer.
- // In the reply, do not include Nonce
- }
- // on the other hand, in Client entropy mode it must not
- // provide entropy.
- [Test]
- [Ignore ("todo")]
- [ExpectedException (typeof (SecurityNegotiationException))]
- public void GetTokenIncludesEntropyInResponseInClientMode ()
- {
- // FIXME: implement it after we get working token issuer.
- // specify SecurityKeyEntropyMode.ClientEntropy on
- // client side. And in the reply, include Nonce.
- }
- [Test]
- [Ignore ("need to implement response")]
- [Category ("NotWorking")]
- public void GetToken ()
- {
- IssuedSecurityTokenProvider p = SetupProvider (CreateIssuerBinding (new RequestSender (OnGetToken), true));
- try {
- p.Open (TimeSpan.FromSeconds (5));
- p.GetToken (TimeSpan.FromSeconds (10));
- } finally {
- if (p.State == CommunicationState.Opened)
- p.Close ();
- }
- }
- class MyException : Exception
- {
- }
- Message OnGetTokenWrongResponse (Message input)
- {
- VerifyInput (input.CreateBufferedCopy (10000));
- throw new MyException ();
- }
- Message OnGetTokenUnsignedReply (Message input)
- {
- XmlDocument doc = new XmlDocument ();
- doc.LoadXml ("<Response>RESPONSE</Response>");
- Message msg = Message.CreateMessage (input.Version, "http://schemas.xmlsoap.org/ws/2005/02/trust/RST/IssueResponse", doc.DocumentElement);
- msg.Headers.Add (MessageHeader.CreateHeader (
- "Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", null, true));
- return msg;
- }
- Message OnGetToken (Message input)
- {
- MessageBuffer buf = input.CreateBufferedCopy (10000);
- VerifyInput2 (buf);
- // FIXME: create response message (when I understand what I should return.)
- // throw new MyException ();
- //*
- XmlDocument doc = new XmlDocument ();
- doc.LoadXml ("<Response>RESPONSE</Response>");
- X509Certificate2 cert = new X509Certificate2 ("Test/Resources/test.pfx", "mono");
- SignedXml sxml = new SignedXml (doc);
- MemoryStream ms = new MemoryStream (new byte [] {1, 2, 3});
- sxml.AddReference (new Reference (ms));
- sxml.SigningKey = cert.PrivateKey;
- sxml.ComputeSignature ();
- Message msg = Message.CreateMessage (input.Version, "http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue", sxml.GetXml ());
- msg.Headers.Add (MessageHeader.CreateHeader (
- "Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", null, true));
- return msg;
- //*/
- }
- void VerifyInput (MessageBuffer buf)
- {
- Message input = buf.CreateMessage ();
- /*
- XmlWriterSettings settings = new XmlWriterSettings ();
- settings.Indent = true;
- using (XmlWriter w = XmlWriter.Create (Console.Error, settings)) {
- buf.CreateMessage ().WriteMessage (w);
- }
- Console.Error.WriteLine ("******************** DONE ********************");
- Console.Error.Flush ();
- */
- Assert.AreEqual ("http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue", input.Headers.Action, "GetToken.Request.Action");
- Assert.IsNotNull (input.Headers.MessageId, "GetToken.Request.MessageID");
- // in the raw Message it is "http://www.w3.org/2005/08/addressing/anonymous", but it is replaced by MessageHeaders implementation.
- Assert.AreEqual (new EndpointAddress ("http://schemas.microsoft.com/2005/12/ServiceModel/Addressing/Anonymous"), input.Headers.ReplyTo, "GetToken.Request.ReplyTo");
- // o:Security
- // FIXME: test WSSecurity more
- // <o:Security>
- // <u:Timestamp>
- // <u:Created>...</u:Created>
- // <u:Expires>...</u:Expires>
- // </u:Timestamp>
- // <o:BinarySecurityToken>...</o:BinarySecurityToken>
- // <e:EncryptedKey>
- // <e:EncryptionMethod><DigestMethod/></e:EncryptionMethod>
- // <KeyInfo>
- // <o:SecurityTokenReference><o:Reference/></o:SecurityTokenReference>
- // </KeyInfo>
- // <e:CipherData>
- // <e:CipherValue>...</e:CipherValue>
- // </e:CipherData>
- // </e:EncryptedKey>
- // [
- // <c:DerivedKeyToken>
- // <o:SecurityTokenReference><o:Reference/></o:SecurityTokenReference>
- // <c:Offset>...</c:Offset>
- // <c:Length>...</c:Length>
- // <c:Nonce>...</c:Nonce>
- // </c:DerivedKeyToken>
- // ]
- // <e:ReferenceList>
- // [
- // <e:DataReference>
- // ]
- // </e:ReferenceList>
- // <e:EncryptedData>
- // <e:EncryptionMethod/>
- // <KeyInfo> {{....}} </KeyInfo>
- // <e:CipherData> {{....}} </e:CipherData>
- // </e:EncryptedData>
- // </o:Security>
- int i = input.Headers.FindHeader ("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
- Assert.IsTrue (i >= 0, "Security header existence");
- MessageHeaderInfo info = input.Headers [i];
- Assert.IsNotNull (info, "Security header item");
- XmlReader r = input.Headers.GetReaderAtHeader (i);
- // FIXME: test WSSecurity more
- // <o:Security>
- r.MoveToContent ();
- r.ReadStartElement ("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
- // <u:Timestamp>
- r.MoveToContent ();
- r.ReadStartElement ("Timestamp", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
- // <u:Created>...</u:Created>
- r.MoveToContent ();
- r.ReadStartElement ("Created", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
- r.ReadString ();
- r.MoveToContent ();
- r.ReadEndElement ();
- // <u:Expires>...</u:Expires>
- r.MoveToContent ();
- r.ReadStartElement ("Expires", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
- r.ReadString ();
- r.MoveToContent ();
- r.ReadEndElement ();
- // </u:Timestamp>
- r.MoveToContent ();
- r.ReadEndElement ();
- // <o:BinarySecurityToken>...</o:BinarySecurityToken>
- r.MoveToContent ();
- r.ReadStartElement ("BinarySecurityToken", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
- byte [] rawcert = Convert.FromBase64String (r.ReadString ());
- r.ReadEndElement ();
- X509Certificate2 cert = new X509Certificate2 (rawcert);
- // FIXME: test EncryptedKey
- r.MoveToContent ();
- r.Skip ();
- // <e:EncryptedKey>
- // <e:EncryptionMethod><DigestMethod/></e:EncryptionMethod>
- // <KeyInfo>
- // <o:SecurityTokenReference><o:Reference/></o:SecurityTokenReference>
- // </KeyInfo>
- // <e:CipherData>
- // <e:CipherValue>...</e:CipherValue>
- // </e:CipherData>
- // </e:EncryptedKey>
- // FIXME: test DerivedKeyTokens
- r.MoveToContent ();
- while (r.LocalName == "DerivedKeyToken") {
- r.Skip ();
- r.MoveToContent ();
- }
- // [
- // <c:DerivedKeyToken>
- // <o:SecurityTokenReference><o:Reference/></o:SecurityTokenReference>
- // <c:Offset>...</c:Offset>
- // <c:Length>...</c:Length>
- // <c:Nonce>...</c:Nonce>
- // </c:DerivedKeyToken>
- // ]
-
- // <e:ReferenceList>
- // [
- // <e:DataReference>
- // ]
- // </e:ReferenceList>
- // <e:EncryptedData>
- // <e:EncryptionMethod/>
- // <KeyInfo> {{....}} </KeyInfo>
- // <e:CipherData> {{....}} </e:CipherData>
- // </e:EncryptedData>
- // </o:Security>
- // SOAP Body
- r = input.GetReaderAtBodyContents (); // just verifying itself ;)
- }
- XmlElement VerifyInput2 (MessageBuffer buf)
- {
- Message msg2 = buf.CreateMessage ();
- StringWriter sw = new StringWriter ();
- using (XmlDictionaryWriter w = XmlDictionaryWriter.CreateDictionaryWriter (XmlWriter.Create (sw))) {
- msg2.WriteMessage (w);
- }
- XmlDocument doc = new XmlDocument ();
- doc.PreserveWhitespace = true;
- doc.LoadXml (sw.ToString ());
- // decrypt the key with service certificate privkey
- PaddingMode mode = PaddingMode.PKCS7; // not sure which is correct ... ANSIX923, ISO10126, PKCS7, Zeros, None.
- EncryptedXml encXml = new EncryptedXml (doc);
- encXml.Padding = mode;
- X509Certificate2 cert2 = new X509Certificate2 ("Test/Resources/test.pfx", "mono");
- XmlNamespaceManager nsmgr = new XmlNamespaceManager (doc.NameTable);
- nsmgr.AddNamespace ("s", "http://www.w3.org/2003/05/soap-envelope");
- nsmgr.AddNamespace ("c", "http://schemas.xmlsoap.org/ws/2005/02/sc");
- nsmgr.AddNamespace ("o", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
- nsmgr.AddNamespace ("e", "http://www.w3.org/2001/04/xmlenc#");
- nsmgr.AddNamespace ("dsig", "http://www.w3.org/2000/09/xmldsig#");
- XmlNode n = doc.SelectSingleNode ("//o:Security/e:EncryptedKey/e:CipherData/e:CipherValue", nsmgr);
- Assert.IsNotNull (n, "premise: enckey does not exist");
- string raw = n.InnerText;
- byte [] rawbytes = Convert.FromBase64String (raw);
- RSACryptoServiceProvider rsa = (RSACryptoServiceProvider) cert2.PrivateKey;
- byte [] decryptedKey = EncryptedXml.DecryptKey (rawbytes, rsa, true);//rsa.Decrypt (rawbytes, true);
- #if false
- // create derived keys
- Dictionary<string,byte[]> keys = new Dictionary<string,byte[]> ();
- InMemorySymmetricSecurityKey skey =
- new InMemorySymmetricSecurityKey (decryptedKey);
- foreach (XmlElement el in doc.SelectNodes ("//o:Security/c:DerivedKeyToken", nsmgr)) {
- n = el.SelectSingleNode ("c:Offset", nsmgr);
- int offset = (n == null) ? 0 :
- int.Parse (n.InnerText, CultureInfo.InvariantCulture);
- n = el.SelectSingleNode ("c:Length", nsmgr);
- int length = (n == null) ? 32 :
- int.Parse (n.InnerText, CultureInfo.InvariantCulture);
- n = el.SelectSingleNode ("c:Label", nsmgr);
- byte [] label = (n == null) ? decryptedKey :
- Convert.FromBase64String (n.InnerText);
- n = el.SelectSingleNode ("c:Nonce", nsmgr);
- byte [] nonce = (n == null) ? new byte [0] :
- Convert.FromBase64String (n.InnerText);
- byte [] derkey = skey.GenerateDerivedKey (
- //SecurityAlgorithms.Psha1KeyDerivation,
- "http://schemas.xmlsoap.org/ws/2005/02/sc/dk/p_sha1",
- // FIXME: maybe due to the label, this key resolution somehow does not seem to work.
- label,
- nonce,
- length * 8,
- offset);
- keys [el.GetAttribute ("Id", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd")] = derkey;
- }
- #endif
- // decrypt the signature with the decrypted key
- #if true
- n = doc.SelectSingleNode ("//o:Security/e:EncryptedData/e:CipherData/e:CipherValue", nsmgr);
- Assert.IsNotNull (n, "premise: encdata does not exist");
- raw = n.InnerText;
- rawbytes = Convert.FromBase64String (raw);
- Rijndael aes = RijndaelManaged.Create ();
- // aes.Key = keys [n.SelectSingleNode ("../../dsig:KeyInfo/o:SecurityTokenReference/o:Reference/@URI", nsmgr).InnerText.Substring (1)];
- aes.Key = decryptedKey;
- aes.Mode = CipherMode.CBC;
- aes.Padding = mode;
- MemoryStream ms = new MemoryStream ();
- CryptoStream cs = new CryptoStream (ms, aes.CreateDecryptor (), CryptoStreamMode.Write);
- cs.Write (rawbytes, 0, rawbytes.Length);
- cs.Close ();
- byte [] decryptedSignature = ms.ToArray ();
- #else
- Rijndael aes = RijndaelManaged.Create ();
- // aes.Key = keys [n.SelectSingleNode ("../../dsig:KeyInfo/o:SecurityTokenReference/o:Reference/@URI", nsmgr).InnerText.Substring (1)];
- aes.Key = decryptedKey;
- aes.Mode = CipherMode.CBC;
- aes.Padding = mode;
- EncryptedData ed = new EncryptedData ();
- n = doc.SelectSingleNode ("//o:Security/e:EncryptedData", nsmgr);
- Assert.IsNotNull (n, "premise: encdata does not exist");
- ed.LoadXml (n as XmlElement);
- byte [] decryptedSignature = encXml.DecryptData (ed, aes);
- #endif
- //Console.Error.WriteLine (Encoding.UTF8.GetString (decryptedSignature));
- //Console.Error.WriteLine ("============= Decrypted Signature End ===========");
- // decrypt the body with the decrypted key
- #if true
- n = doc.SelectSingleNode ("//s:Body/e:EncryptedData/e:CipherData/e:CipherValue", nsmgr);
- Assert.IsNotNull (n, "premise: encdata does not exist");
- raw = n.InnerText;
- rawbytes = Convert.FromBase64String (raw);
- // aes.Key = keys [n.SelectSingleNode ("../../dsig:KeyInfo/o:SecurityTokenReference/o:Reference/@URI", nsmgr).InnerText.Substring (1)];
- aes.Key = decryptedKey;
- ms = new MemoryStream ();
- cs = new CryptoStream (ms, aes.CreateDecryptor (), CryptoStreamMode.Write);
- cs.Write (rawbytes, 0, rawbytes.Length);
- cs.Close ();
- byte [] decryptedBody = ms.ToArray ();
- #else
- // decrypt the body with the decrypted key
- EncryptedData ed2 = new EncryptedData ();
- XmlElement el = doc.SelectSingleNode ("/s:Envelope/s:Body/e:EncryptedData", nsmgr) as XmlElement;
- ed2.LoadXml (el);
- // aes.Key = keys [n.SelectSingleNode ("../../dsig:KeyInfo/o:SecurityTokenReference/o:Reference/@URI", nsmgr).InnerText.Substring (1)];
- aes.Key = decryptedKey;
- byte [] decryptedBody = encXml.DecryptData (ed2, aes);
- #endif
- //foreach (byte b in decryptedBody) Console.Error.Write ("{0:X02} ", b);
- Console.Error.WriteLine (Encoding.UTF8.GetString (decryptedBody));
- Console.Error.WriteLine ("============= Decrypted Body End ===========");
- // FIXME: find out what first 16 bytes mean.
- for (int mmm = 0; mmm < 16; mmm++) decryptedBody [mmm] = 0x20;
- doc.LoadXml (Encoding.UTF8.GetString (decryptedBody));
- Assert.AreEqual ("RequestSecurityToken", doc.DocumentElement.LocalName, "#b-1");
- Assert.AreEqual ("http://schemas.xmlsoap.org/ws/2005/02/trust", doc.DocumentElement.NamespaceURI, "#b-2");
- return doc.DocumentElement;
- }
- Binding CreateIssuerBinding (RequestSender handler, bool tokenParams)
- {
- SymmetricSecurityBindingElement sbe =
- new SymmetricSecurityBindingElement ();
- if (tokenParams)
- sbe.ProtectionTokenParameters = new X509SecurityTokenParameters ();
- sbe.LocalServiceSettings.NegotiationTimeout = TimeSpan.FromSeconds (5);
- sbe.KeyEntropyMode = SecurityKeyEntropyMode.ClientEntropy;
- //sbe.IncludeTimestamp = false;
- //sbe.MessageProtectionOrder = MessageProtectionOrder.SignBeforeEncrypt;
- // for ease of decryption, let's remove DerivedKeyToken.
- sbe.SetKeyDerivation (false);
- return new CustomBinding (
- // new DebugBindingElement (),
- sbe,
- new TextMessageEncodingBindingElement (),
- new HandlerTransportBindingElement (handler));
- }
- EndpointAddress GetSecureEndpointAddress (string uri)
- {
- return new EndpointAddress (new Uri (uri),
- new X509CertificateEndpointIdentity (
- new X509Certificate2 ("Test/Resources/test.pfx", "mono")));
- }
- IssuedSecurityTokenProvider SetupProvider (Binding binding)
- {
- IssuedSecurityTokenProvider p =
- new IssuedSecurityTokenProvider ();
- p.SecurityTokenSerializer = WSSecurityTokenSerializer.DefaultInstance;
- p.IssuerAddress = GetSecureEndpointAddress ("stream:dummy");
- p.IssuerBinding = binding;
- // wiithout it indigo causes NRE
- p.SecurityAlgorithmSuite = SecurityAlgorithmSuite.Default;
- p.TargetAddress = new EndpointAddress ("http://localhost:9090");
- return p;
- }
- }
- }
|