| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972 |
- //
- // WSSecurityTokenSerializerTest.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.ObjectModel;
- 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.Policy;
- using System.IdentityModel.Selectors;
- using System.IdentityModel.Tokens;
- using System.Xml;
- using NUnit.Framework;
- namespace MonoTests.System.ServiceModel.Security
- {
- [TestFixture]
- public class WSSecurityTokenSerializerTest
- {
- const string wssNS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
- const string wsuNS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
- static X509Certificate2 cert = new X509Certificate2 ("Test/Resources/test.pfx", "mono");
- const string derived_key_token1 = @"<c:DerivedKeyToken u:Id='_1' xmlns:u='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' xmlns:c='http://schemas.xmlsoap.org/ws/2005/02/sc'>
- <o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
- <o:Reference ValueType='http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#EncryptedKey' URI='#uuid:urn:abc' />
- </o:SecurityTokenReference>
- <c:Offset>0</c:Offset>
- <c:Length>24</c:Length>
- <c:Nonce>BIUeTKeOhR5HeE646ZyA+w==</c:Nonce>
- </c:DerivedKeyToken>";
- const string derived_key_token2 = @"<c:DerivedKeyToken u:Id='_1' xmlns:u='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' xmlns:c='http://schemas.xmlsoap.org/ws/2005/02/sc'>
- <o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
- <o:Reference ValueType='urn:my-own-way' URI='#uuid:urn:abc' />
- </o:SecurityTokenReference>
- <c:Offset>0</c:Offset>
- <c:Length>24</c:Length>
- <c:Nonce>BIUeTKeOhR5HeE646ZyA+w==</c:Nonce>
- </c:DerivedKeyToken>";
- const string wrapped_key1 = @"<e:EncryptedKey Id='_0' xmlns:e='http://www.w3.org/2001/04/xmlenc#'>
- <e:EncryptionMethod Algorithm='http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p'>
- <DigestMethod Algorithm='http://www.w3.org/2000/09/xmldsig#sha1' xmlns='http://www.w3.org/2000/09/xmldsig#'></DigestMethod>
- </e:EncryptionMethod>
- <KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
- <o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
- <o:KeyIdentifier ValueType='http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1'>GQ3YHlGQhDF1bvMixHliX4uLjlY=</o:KeyIdentifier>
- </o:SecurityTokenReference>
- </KeyInfo>
- <e:CipherData>
- <e:CipherValue>RLRUq81oJNSKPZz4ToCmin7ymCdMpCJiiRx5c1RGZuILiLcU3zCZI2bN9UNgfTHnE4arcJzjwSOeuzFSn948Lr0w6kUaZQjJVzLozu2hBhhb8Kps4ekLWmrsca2c2VmjT9kKEihfCX4s1Pfv9aJyVpT3EGwH7vd9fr9k5G2RtKY=</e:CipherValue>
- </e:CipherData>
- <e:ReferenceList>
- <e:DataReference URI='#_2'></e:DataReference>
- </e:ReferenceList>
- </e:EncryptedKey>";
- XmlWriterSettings GetWriterSettings ()
- {
- XmlWriterSettings s = new XmlWriterSettings ();
- s.OmitXmlDeclaration = true;
- return s;
- }
- [Test]
- public void DefaultValues ()
- {
- WSSecurityTokenSerializer ser = new WSSecurityTokenSerializer ();
- DefaultValues (ser);
- DefaultValues (WSSecurityTokenSerializer.DefaultInstance);
- }
- void DefaultValues (WSSecurityTokenSerializer ser)
- {
- Assert.AreEqual (false, ser.EmitBspRequiredAttributes, "#1");
- Assert.AreEqual (128, ser.MaximumKeyDerivationLabelLength, "#2");
- Assert.AreEqual (128, ser.MaximumKeyDerivationNonceLength, "#3");
- Assert.AreEqual (64, ser.MaximumKeyDerivationOffset, "#4");
- Assert.AreEqual (SecurityVersion.WSSecurity11, ser.SecurityVersion, "#5");
- }
- [Test]
- public void WriteX509SecurityToken1 ()
- {
- StringWriter sw = new StringWriter ();
- X509SecurityToken t = new X509SecurityToken (cert, "urn:x509:1");
- Assert.IsNotNull (cert.GetRawCertData (), "premise: X509Certificate2.RawData");
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteToken (w, t);
- }
- string rawdata = Convert.ToBase64String (cert.RawData);
- Assert.AreEqual ("<o:BinarySecurityToken u:Id=\"urn:x509:1\" ValueType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3\" xmlns:u=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\" xmlns:o=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">" + rawdata + "</o:BinarySecurityToken>", sw.ToString ());
- }
- [Test]
- public void WriteUserNameSecurityToken1 ()
- {
- StringWriter sw = new StringWriter ();
- UserNameSecurityToken t = new UserNameSecurityToken ("mono", "poly", "urn:username:1");
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteToken (w, t);
- }
- // Hmm, no PasswordToken (and TokenType) ?
- Assert.AreEqual ("<o:UsernameToken u:Id=\"urn:username:1\" xmlns:u=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\" xmlns:o=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"><o:Username>mono</o:Username><o:Password>poly</o:Password></o:UsernameToken>", sw.ToString ());
- }
- [Test]
- public void WriteBinarySecretSecurityToken1 ()
- {
- StringWriter sw = new StringWriter ();
- byte [] bytes = new byte [] {0, 1, 2, 3, 4, 5, 6, 7};
- BinarySecretSecurityToken t = new BinarySecretSecurityToken ("urn:binary:1", bytes);
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteToken (w, t);
- }
- // AAECAwQFBgc=
- string base64 = Convert.ToBase64String (bytes);
- Assert.AreEqual ("<t:BinarySecret u:Id=\"urn:binary:1\" xmlns:u=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\" xmlns:t=\"http://schemas.xmlsoap.org/ws/2005/02/trust\">" + base64 + "</t:BinarySecret>", sw.ToString ());
- }
- [Test]
- [ExpectedException (typeof (InvalidOperationException))]
- public void WriteRsaSecurityToken ()
- {
- StringWriter sw = new StringWriter ();
- RSA rsa = (RSA) cert.PublicKey.Key;
- RsaSecurityToken t = new RsaSecurityToken (rsa, "urn:rsa:1");
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteToken (w, t);
- }
- }
- [Test]
- public void WriteGenericXmlSecurityToken1 ()
- {
- StringWriter sw = new StringWriter ();
- XmlElement xml = new XmlDocument ().CreateElement ("foo");
- SecurityToken token = new X509SecurityToken (new X509Certificate2 ("Test/Resources/test.pfx", "mono"));
- SecurityKeyIdentifierClause intref =
- token.CreateKeyIdentifierClause<X509IssuerSerialKeyIdentifierClause> ();
- SecurityKeyIdentifierClause extref =
- null; // token.CreateKeyIdentifierClause<X509IssuerSerialKeyIdentifierClause> ();
- ReadOnlyCollection<IAuthorizationPolicy> policies =
- new ReadOnlyCollection<IAuthorizationPolicy> (
- new IAuthorizationPolicy [0]);
- GenericXmlSecurityToken t = new GenericXmlSecurityToken (xml, token, DateTime.Now, new DateTime (2112, 9, 3), intref, extref, policies);
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteToken (w, t);
- }
- // Huh?
- Assert.AreEqual ("<foo />", sw.ToString ());
- }
- [Test]
- public void WriteWrappedKeySecurityToken ()
- {
- StringWriter sw = new StringWriter ();
- byte [] bytes = new byte [64];
- for (byte i = 1; i < 64; i++)
- bytes [i] = i;
- SecurityToken wt = new X509SecurityToken (cert);
- SecurityKeyIdentifier ski = new SecurityKeyIdentifier (
- wt.CreateKeyIdentifierClause< X509ThumbprintKeyIdentifierClause> ());
- WrappedKeySecurityToken t = new WrappedKeySecurityToken (
- "urn:wrapper-key:1", bytes, SecurityAlgorithms.RsaOaepKeyWrap, wt, ski);
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteToken (w, t);
- }
- string actual = sw.ToString ();
- int idx = actual.IndexOf ("<e:CipherValue>", StringComparison.Ordinal);
- Assert.IsTrue (idx >= 0, "No <CipherValue>");
- actual =
- actual.Substring (0, idx) +
- "<e:CipherValue>removed here" +
- actual.Substring (actual.IndexOf ("</e:CipherValue>", StringComparison.Ordinal));
- Assert.AreEqual ("GQ3YHlGQhDF1bvMixHliX4uLjlY=", Convert.ToBase64String (cert.GetCertHash ()), "premise#1");
- Assert.AreEqual (
- String.Format ("<e:EncryptedKey Id=\"urn:wrapper-key:1\" xmlns:e=\"{0}\"><e:EncryptionMethod Algorithm=\"{1}\"><DigestMethod Algorithm=\"{2}\" xmlns=\"{3}\" /></e:EncryptionMethod><KeyInfo xmlns=\"{3}\"><o:SecurityTokenReference xmlns:o=\"{4}\"><o:KeyIdentifier ValueType=\"{5}\">{6}</o:KeyIdentifier></o:SecurityTokenReference></KeyInfo><e:CipherData><e:CipherValue>removed here</e:CipherValue></e:CipherData></e:EncryptedKey>",
- EncryptedXml.XmlEncNamespaceUrl,
- SecurityAlgorithms.RsaOaepKeyWrap,
- SignedXml.XmlDsigSHA1Url,
- SignedXml.XmlDsigNamespaceUrl,
- "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
- "http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1",
- Convert.ToBase64String (cert.GetCertHash ())),// "GQ3YHlGQhDF1bvMixHliX4uLjlY="
- actual);
- }
- [Test]
- public void WriteSecurityContextSecurityToken ()
- {
- StringWriter sw = new StringWriter ();
- SecurityContextSecurityToken t = new SecurityContextSecurityToken (
- new UniqueId ("urn:unique-id:securitycontext:1"),
- "urn:securitycontext:1",
- Convert.FromBase64String ("o/ilseZu+keLBBWGGPlUHweqxIPc4gzZEFWr2nBt640="),
- new DateTime (2006, 9, 26), new DateTime (2006, 9, 27));
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteToken (w, t);
- }
- Assert.AreEqual ("<c:SecurityContextToken u:Id=\"urn:securitycontext:1\" xmlns:u=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\" xmlns:c=\"http://schemas.xmlsoap.org/ws/2005/02/sc\"><c:Identifier>urn:unique-id:securitycontext:1</c:Identifier></c:SecurityContextToken>", sw.ToString ());
- }
- [Test]
- public void WriteX509IssuerSerialKeyIdentifierClause1 ()
- {
- StringWriter sw = new StringWriter ();
- X509IssuerSerialKeyIdentifierClause ic = new X509IssuerSerialKeyIdentifierClause (cert);
- string expected = "<o:SecurityTokenReference xmlns:o=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"><X509Data xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><X509IssuerSerial><X509IssuerName>CN=Mono Test Root Agency</X509IssuerName><X509SerialNumber>22491767666218099257720700881460366085</X509SerialNumber></X509IssuerSerial></X509Data></o:SecurityTokenReference>";
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
- }
- Assert.AreEqual (expected, sw.ToString (), "WSS1.1");
- sw = new StringWriter ();
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- new WSSecurityTokenSerializer (SecurityVersion.WSSecurity10).WriteKeyIdentifierClause (w, ic);
- }
- Assert.AreEqual (expected, sw.ToString (), "WSS1.0");
- }
- [Test]
- public void WriteX509ThumbprintKeyIdentifierClause1 ()
- {
- StringWriter sw = new StringWriter ();
- X509ThumbprintKeyIdentifierClause ic = new X509ThumbprintKeyIdentifierClause (cert);
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
- }
- Assert.AreEqual ("<o:SecurityTokenReference xmlns:o=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"><o:KeyIdentifier ValueType=\"http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1\">GQ3YHlGQhDF1bvMixHliX4uLjlY=</o:KeyIdentifier></o:SecurityTokenReference>", sw.ToString ());
- }
- [Test]
- [ExpectedException (typeof (InvalidOperationException))]
- public void WriteX509ThumbprintKeyIdentifierClause2 ()
- {
- // WS-Security1.0 x thumbprint = death
- using (XmlWriter w = XmlWriter.Create (TextWriter.Null)) {
- new WSSecurityTokenSerializer (SecurityVersion.WSSecurity10)
- .WriteKeyIdentifierClause (w, new X509ThumbprintKeyIdentifierClause (cert));
- }
- }
- [Test]
- public void WriteX509ThumbprintKeyIdentifierClause3 ()
- {
- // EmitBspRequiredAttributes
- StringWriter sw = new StringWriter ();
- X509ThumbprintKeyIdentifierClause ic = new X509ThumbprintKeyIdentifierClause (cert);
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- new WSSecurityTokenSerializer (true).WriteKeyIdentifierClause (w, ic);
- }
- Assert.AreEqual ("<o:SecurityTokenReference xmlns:o=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"><o:KeyIdentifier ValueType=\"http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1\" EncodingType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary\">GQ3YHlGQhDF1bvMixHliX4uLjlY=</o:KeyIdentifier></o:SecurityTokenReference>", sw.ToString ());
- }
- [Test]
- public void WriteEncryptedKeyIdentifierClause ()
- {
- StringWriter sw = new StringWriter ();
- byte [] bytes = new byte [32];
- SecurityKeyIdentifier cki = new SecurityKeyIdentifier ();
- cki.Add (new X509ThumbprintKeyIdentifierClause (cert));
- EncryptedKeyIdentifierClause ic =
- new EncryptedKeyIdentifierClause (bytes, SecurityAlgorithms.Aes256KeyWrap, cki);
-
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
- }
- string expected = String.Format ("<e:EncryptedKey xmlns:e=\"{0}\"><e:EncryptionMethod Algorithm=\"{1}\" /><KeyInfo xmlns=\"{2}\"><o:SecurityTokenReference xmlns:o=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"><o:KeyIdentifier ValueType=\"{3}\">GQ3YHlGQhDF1bvMixHliX4uLjlY=</o:KeyIdentifier></o:SecurityTokenReference></KeyInfo><e:CipherData><e:CipherValue>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</e:CipherValue></e:CipherData></e:EncryptedKey>",
- EncryptedXml.XmlEncNamespaceUrl,
- SecurityAlgorithms.Aes256KeyWrap,
- SignedXml.XmlDsigNamespaceUrl,
- "http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1");
- Assert.AreEqual (expected, sw.ToString ());
- }
- [Test]
- public void WriteEncryptedKeyIdentifierClause2 () // derived key
- {
- StringWriter sw = new StringWriter ();
- byte [] bytes = new byte [32];
- SecurityKeyIdentifier cki = new SecurityKeyIdentifier ();
- cki.Add (new X509ThumbprintKeyIdentifierClause (cert));
- EncryptedKeyIdentifierClause ic =
- new EncryptedKeyIdentifierClause (bytes, SecurityAlgorithms.Aes256KeyWrap, cki, "carriedKeyNaaaaame", new byte [32], 32);
-
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
- }
- string expected = String.Format ("<e:EncryptedKey xmlns:e=\"{0}\"><e:EncryptionMethod Algorithm=\"{1}\" /><KeyInfo xmlns=\"{2}\"><o:SecurityTokenReference xmlns:o=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"><o:KeyIdentifier ValueType=\"{3}\">GQ3YHlGQhDF1bvMixHliX4uLjlY=</o:KeyIdentifier></o:SecurityTokenReference></KeyInfo><e:CipherData><e:CipherValue>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</e:CipherValue></e:CipherData><e:CarriedKeyName>carriedKeyNaaaaame</e:CarriedKeyName></e:EncryptedKey>",
- EncryptedXml.XmlEncNamespaceUrl,
- SecurityAlgorithms.Aes256KeyWrap,
- SignedXml.XmlDsigNamespaceUrl,
- "http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1");
- Assert.AreEqual (expected, sw.ToString ());
- }
- [Test]
- public void WriteEncryptedKeyIdentifierClause3 ()
- {
- StringWriter sw = new StringWriter ();
- byte [] bytes = new byte [32];
- SecurityKeyIdentifier cki = new SecurityKeyIdentifier ();
- cki.Add (new X509ThumbprintKeyIdentifierClause (cert));
- EncryptedKeyIdentifierClause ic =
- new EncryptedKeyIdentifierClause (bytes, SecurityAlgorithms.Aes256Encryption);
-
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
- }
- string expected = String.Format ("<e:EncryptedKey xmlns:e=\"{0}\"><e:EncryptionMethod Algorithm=\"{1}\" /><e:CipherData><e:CipherValue>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</e:CipherValue></e:CipherData></e:EncryptedKey>",
- EncryptedXml.XmlEncNamespaceUrl,
- SecurityAlgorithms.Aes256Encryption,
- SignedXml.XmlDsigNamespaceUrl,
- "http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1");
- Assert.AreEqual (expected, sw.ToString ());
- }
- [Test]
- public void WriteEncryptedKeyIdentifierClause4 ()
- {
- StringWriter sw = new StringWriter ();
- byte [] bytes = new byte [32];
- SecurityKeyIdentifier cki = new SecurityKeyIdentifier ();
- cki.Add (new BinarySecretKeyIdentifierClause (bytes));
- EncryptedKeyIdentifierClause ic =
- new EncryptedKeyIdentifierClause (bytes, SecurityAlgorithms.Aes256Encryption);
-
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
- }
- string expected = String.Format ("<e:EncryptedKey xmlns:e=\"{0}\"><e:EncryptionMethod Algorithm=\"{1}\" /><e:CipherData><e:CipherValue>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</e:CipherValue></e:CipherData></e:EncryptedKey>",
- EncryptedXml.XmlEncNamespaceUrl,
- SecurityAlgorithms.Aes256Encryption,
- SignedXml.XmlDsigNamespaceUrl,
- "http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1");
- Assert.AreEqual (expected, sw.ToString ());
- }
- [Test]
- public void WriteBinarySecretKeyIdentifierClause1 ()
- {
- StringWriter sw = new StringWriter ();
- byte [] bytes = new byte [32];
- BinarySecretKeyIdentifierClause ic = new BinarySecretKeyIdentifierClause (bytes);
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
- }
- string expected = String.Format ("<t:BinarySecret xmlns:t=\"http://schemas.xmlsoap.org/ws/2005/02/trust\">{0}</t:BinarySecret>", Convert.ToBase64String (bytes));
- Assert.AreEqual (expected, sw.ToString (), "#1");
- }
- class MySecurityTokenParameters : SecurityTokenParameters
- {
- public SecurityKeyIdentifierClause CallCreateKeyIdentifierClause (SecurityToken token, SecurityTokenReferenceStyle style)
- {
- return CreateKeyIdentifierClause (token, style);
- }
- protected override SecurityTokenParameters CloneCore ()
- {
- return this;
- }
- protected override bool HasAsymmetricKey {
- get { return false; }
- }
- protected override bool SupportsServerAuthentication {
- get { return false; }
- }
- protected override bool SupportsClientAuthentication {
- get { return false; }
- }
- protected override bool SupportsClientWindowsIdentity {
- get { return false; }
- }
- protected override void InitializeSecurityTokenRequirement (SecurityTokenRequirement r)
- {
- }
- protected override SecurityKeyIdentifierClause CreateKeyIdentifierClause (SecurityToken token, SecurityTokenReferenceStyle style)
- {
- throw new Exception ();
- }
- }
- /* FIXME: something should output key identifier clause xml like this ...
- [Test]
- public void WriteInternalWrappedKeyIdentifierClause ()
- {
- StringWriter sw = new StringWriter ();
- byte [] bytes = new byte [32];
- EncryptedKeyIdentifierClause eic =
- new EncryptedKeyIdentifierClause (bytes, SecurityAlgorithms.Sha1Digest);
- SecurityKeyIdentifier ski = new SecurityKeyIdentifier (eic);
- WrappedKeySecurityToken token = new WrappedKeySecurityToken ("urn:foo", bytes, SecurityAlgorithms.RsaOaepKeyWrap, new X509SecurityToken (cert), ski);
- MySecurityTokenParameters p = new MySecurityTokenParameters ();
- SecurityKeyIdentifierClause ic =
- p.CallCreateKeyIdentifierClause (token, SecurityTokenReferenceStyle.External);
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
- }
- string expected = String.Format ("<o:SecurityTokenReference xmlns:o=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"><o:KeyIdentifier ValueType=\"{0}\" Value=\"{1}\" /></o:SecurityTokenReference>",
- "http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#EncryptedKeySHA1", Convert.ToBase64String (bytes));
- Assert.AreEqual (expected, sw.ToString (), "#1");
- }
- */
- [Test]
- public void WriteLocalIdKeyIdentifierClause1 ()
- {
- StringWriter sw = new StringWriter ();
- LocalIdKeyIdentifierClause ic = new LocalIdKeyIdentifierClause ("urn:myIDValue");
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
- }
- Assert.AreEqual ("<o:SecurityTokenReference xmlns:o=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"><o:Reference URI=\"#urn:myIDValue\" /></o:SecurityTokenReference>", sw.ToString (), "#1");
- }
- [Test]
- public void WriteLocalIdKeyIdentifierClause2 ()
- {
- StringWriter sw = new StringWriter ();
- LocalIdKeyIdentifierClause ic = new LocalIdKeyIdentifierClause ("#urn:myIDValue");
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
- }
- // ... so, specifying an URI including '#' does not make sense
- Assert.AreEqual ("<o:SecurityTokenReference xmlns:o=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"><o:Reference URI=\"##urn:myIDValue\" /></o:SecurityTokenReference>", sw.ToString (), "#2");
- }
- [Test]
- public void WriteLocalIdKeyIdentifierClause3 ()
- {
- StringWriter sw = new StringWriter ();
- LocalIdKeyIdentifierClause ic = new LocalIdKeyIdentifierClause ("urn:myIDValue", typeof (WrappedKeySecurityToken));
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
- }
- Assert.AreEqual ("<o:SecurityTokenReference xmlns:o=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"><o:Reference URI=\"#urn:myIDValue\" /></o:SecurityTokenReference>", sw.ToString (), "#1");
- }
- [Test]
- public void WriteLocalIdKeyIdentifierClause4 () // EmitBsp
- {
- StringWriter sw = new StringWriter ();
- LocalIdKeyIdentifierClause ic = new LocalIdKeyIdentifierClause ("urn:myIDValue", typeof (WrappedKeySecurityToken));
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- new WSSecurityTokenSerializer (true).WriteKeyIdentifierClause (w, ic);
- }
- Assert.AreEqual ("<o:SecurityTokenReference xmlns:o=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"><o:Reference ValueType=\"http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#EncryptedKey\" URI=\"#urn:myIDValue\" /></o:SecurityTokenReference>", sw.ToString (), "#1");
- }
- [Test]
- [Ignore ("fails on .net; no further verification")]
- public void WriteLocalIdKeyIdentifierClause5 () // derivedKey
- {
- StringWriter sw = new StringWriter ();
- LocalIdKeyIdentifierClause ic = new LocalIdKeyIdentifierClause ("urn:myIDValue", new byte [32], 16, typeof (WrappedKeySecurityToken));
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- new WSSecurityTokenSerializer (true).WriteKeyIdentifierClause (w, ic);
- }
- Assert.AreEqual ("<o:SecurityTokenReference xmlns:o=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"><o:Reference ValueType=\"http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#EncryptedKey\" URI=\"#urn:myIDValue\" /></o:SecurityTokenReference>", sw.ToString (), "#1");
- }
- [Test]
- public void WriteSecurityContextKeyIdentifierClause ()
- {
- StringWriter sw = new StringWriter ();
- SecurityContextKeyIdentifierClause ic = new SecurityContextKeyIdentifierClause (new UniqueId ("urn:foo:1"), null);
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
- }
- Assert.AreEqual (@"<o:SecurityTokenReference xmlns:o=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd""><o:Reference URI=""urn:foo:1"" ValueType=""http://schemas.xmlsoap.org/ws/2005/02/sc/sct"" /></o:SecurityTokenReference>", sw.ToString (), "#1");
- XmlReader reader = XmlReader.Create (new StringReader (sw.ToString ()));
- ic = WSSecurityTokenSerializer.DefaultInstance.ReadKeyIdentifierClause (reader) as SecurityContextKeyIdentifierClause;
- Assert.IsNotNull (ic, "#2");
- }
- class MySslParameters : SslSecurityTokenParameters
- {
- public SecurityKeyIdentifierClause CallCreateKeyIdentifierClause (
- SecurityToken token, SecurityTokenReferenceStyle referenceStyle)
- {
- return CreateKeyIdentifierClause (token, referenceStyle);
- }
- }
- [Test]
- public void WriteSecurityContextKeyIdentifierClause2 ()
- {
- StringWriter sw = new StringWriter ();
- MySslParameters tp = new MySslParameters ();
- SecurityContextSecurityToken sct =
- new SecurityContextSecurityToken (new UniqueId ("urn:foo:1"), "urn:foo:2", new byte [32], DateTime.MinValue, DateTime.MaxValue);
- SecurityKeyIdentifierClause ic =
- tp.CallCreateKeyIdentifierClause (sct, SecurityTokenReferenceStyle.Internal);
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
- }
- Assert.AreEqual (@"<o:SecurityTokenReference xmlns:o=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd""><o:Reference URI=""#urn:foo:2"" /></o:SecurityTokenReference>", sw.ToString (), "#1");
- XmlReader reader = XmlReader.Create (new StringReader (sw.ToString ()));
- ic = WSSecurityTokenSerializer.DefaultInstance.ReadKeyIdentifierClause (reader) as LocalIdKeyIdentifierClause;
- Assert.IsNotNull (ic, "#2");
- }
- [Test]
- public void ReadKeyIdentifierClause ()
- {
- string xml = @"<o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
- <o:Reference URI='#uuid-9c90d2c7-c82f-4c63-9b28-fc24479ee3a7-2' />
- </o:SecurityTokenReference>";
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
- SecurityKeyIdentifierClause kic = serializer.ReadKeyIdentifierClause (xr);
- Assert.IsTrue (kic is LocalIdKeyIdentifierClause, "#1");
- }
- }
- [Test]
- public void ReadEncryptedKeyIdentifierClause ()
- {
- string xml = @"<e:EncryptedKey xmlns:ds='http://www.w3.org/2000/09/xmldsig#' xmlns:e='http://www.w3.org/2001/04/xmlenc#' Id='ID_EncryptedKeyClause'> <e:EncryptionMethod Algorithm='http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p'> <ds:DigestMethod Algorithm='http://www.w3.org/2000/09/xmldsig#sha1' /> </e:EncryptionMethod> <ds:KeyInfo> <o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'> <o:Reference URI='#uuid-9c90d2c7-c82f-4c63-9b28-fc24479ee3a7-2' /> </o:SecurityTokenReference> </ds:KeyInfo> <e:CipherData> <e:CipherValue>Iwg585s5eQP5If4/bY/PPBmHVFt23z6MaHDaD9/u1Ua7hveRfoER3d6sJTk7PL4LoLHjwaAa6EGHZyrgq7He+efvsiAhJYTeh/C/RYO7jKdSr8Gp1IIY7wA+/CBhV7SUhRZs4YJ1GE+rIQ/No6FPk/MbpIALEZ6RpqiLYVVCvUI=</e:CipherValue> </e:CipherData></e:EncryptedKey>";
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- EncryptedKeyIdentifierClause kic;
- using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
- kic = serializer.ReadKeyIdentifierClause (xr) as EncryptedKeyIdentifierClause;
- }
- Assert.IsNotNull (kic, "#1");
- Assert.IsNull (kic.CarriedKeyName, "#2");
- Assert.AreEqual (EncryptedXml.XmlEncRSAOAEPUrl, kic.EncryptionMethod, "#3");
- Assert.AreEqual (1, kic.EncryptingKeyIdentifier.Count, "#4");
- LocalIdKeyIdentifierClause ekic = kic.EncryptingKeyIdentifier [0] as LocalIdKeyIdentifierClause;
- Assert.IsNotNull (ekic, "#5");
- Assert.AreEqual ("uuid-9c90d2c7-c82f-4c63-9b28-fc24479ee3a7-2", ekic.LocalId, "#6");
- }
- [Test]
- [ExpectedException (typeof (XmlException))] // .NET says that KeyIdentifier is not the expected element, but actually it is because of ValueType.
- public void ReadKeyIdentifierReferenceWrongVallueType ()
- {
- string xml = @"<o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
- <o:KeyIdentifier ValueType='hogehoge'>xr42fAKDBNItO0aRPKFqc0kaiiU=</o:KeyIdentifier>
- </o:SecurityTokenReference>";
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
- SecurityKeyIdentifierClause kic = serializer.ReadKeyIdentifierClause (xr);
- Assert.IsTrue (kic is X509ThumbprintKeyIdentifierClause, "#1");
- }
- }
- [Test]
- public void ReadKeyIdentifierThumbprint ()
- {
- string xml = @"<o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
- <o:KeyIdentifier ValueType='http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1' EncodingType='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary'>xr42fAKDBNItO0aRPKFqc0kaiiU=</o:KeyIdentifier>
- </o:SecurityTokenReference>";
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
- SecurityKeyIdentifierClause kic = serializer.ReadKeyIdentifierClause (xr);
- Assert.IsTrue (kic is X509ThumbprintKeyIdentifierClause, "#1");
- }
- }
- [Test]
- public void ReadKeyIdentifierEncryptedKey ()
- {
- string xml = @"<o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
- <o:KeyIdentifier ValueType='http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#EncryptedKeySHA1'>xr42fAKDBNItO0aRPKFqc0kaiiU=</o:KeyIdentifier>
- </o:SecurityTokenReference>";
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
- SecurityKeyIdentifierClause kic = serializer.ReadKeyIdentifierClause (xr);
- Assert.IsTrue (kic is BinaryKeyIdentifierClause, "#1");
- }
- }
- [Test]
- [ExpectedException (typeof (XmlException))] // not sure how this exception type makes sense...
- public void ReadEmptyUsernameToken ()
- {
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- using (XmlReader xr = XmlReader.Create (new StringReader (String.Format ("<o:UsernameToken u:Id='urn:foo' xmlns:o='{0}' xmlns:u='{1}' />", wssNS, wsuNS)))) {
- serializer.ReadToken (xr, null);
- }
- }
- [Test]
- [ExpectedException (typeof (XmlException))] // tokenResolver is null
- public void ReadTokenDerivedKeyTokenNullResolver ()
- {
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- using (XmlReader xr = XmlReader.Create (new StringReader (derived_key_token1))) {
- serializer.ReadToken (xr, null);
- }
- }
- [Test]
- [ExpectedException (typeof (XmlException))] // DerivedKeyToken requires a reference to an existent token.
- public void ReadTokenDerivedKeyTokenRefToNonExistent ()
- {
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- using (XmlReader xr = XmlReader.Create (new StringReader (derived_key_token1))) {
- serializer.ReadToken (xr, GetResolver ());
- }
- }
- [Test]
- public void ReadWriteTokenDerivedKeyTokenRefToExistent ()
- {
- WSSecurityTokenSerializer serializer =
- new WSSecurityTokenSerializer (true); // emitBSP
- SecurityToken token;
- using (XmlReader xr = XmlReader.Create (new StringReader (derived_key_token1))) {
- token = serializer.ReadToken (xr,
- GetResolver (
- new WrappedKeySecurityToken ("uuid:urn:abc", new byte [32], SecurityAlgorithms.RsaOaepKeyWrap, new X509SecurityToken (cert), null)
- ));
- }
- StringWriter sw = new StringWriter ();
- using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
- serializer.WriteToken (w, token);
- }
- Assert.AreEqual (derived_key_token1.Replace ('\'', '"').Replace (" ", "").Replace ("\n", "").Replace ("\r", ""), sw.ToString ());
- }
- [Test]
- [ExpectedException (typeof (XmlException))] // not sure how this exception type makes sense.
- public void ReadTokenDerivedKeyTokenRefToExistent2 ()
- {
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- using (XmlReader xr = XmlReader.Create (new StringReader (derived_key_token1))) {
- // different token value type to be resolved
- // than what is explicitly specified in
- // <o:Reference>.
- serializer.ReadToken (xr,
- GetResolver (new X509SecurityToken (cert, "uuid:urn:abc")));
- }
- }
- [Test]
- [ExpectedException (typeof (XmlException))] // not sure how this exception type makes sense.
- public void ReadTokenDerivedKeyTokenRefUnsupported ()
- {
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- using (XmlReader xr = XmlReader.Create (new StringReader (derived_key_token2))) {
- // different token value type to be resolved
- // than what is explicitly specified in
- // <o:Reference>.
- serializer.ReadToken (xr,
- GetResolver (new X509SecurityToken (cert, "uuid:urn:abc")));
- }
- }
- [Test]
- [Category ("NotWorking")]
- public void ReadSecurityContextSecurityTokenNoRegisteredToken ()
- {
- try {
- ReadSecurityContextSecurityTokenNoRegisteredTokenCore ();
- Assert.Fail ("Exception expected.");
- } catch (SecurityTokenException) {
- }
- }
- void ReadSecurityContextSecurityTokenNoRegisteredTokenCore ()
- {
- string xml = "<c:SecurityContextToken u:Id=\"urn:securitycontext:1\" xmlns:u=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\" xmlns:c=\"http://schemas.xmlsoap.org/ws/2005/02/sc\"><c:Identifier>urn:unique-id:securitycontext:1</c:Identifier></c:SecurityContextToken>";
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
- serializer.ReadToken (xr, GetResolver (new X509SecurityToken (cert, "urn:unique-id:securitycontext:1")));
- }
- }
- [Test]
- [Category ("NotWorking")] // SslNegoCookieResolver needs updates and/or fixes.
- public void ReadSslnegoSCTNoStateEncoder ()
- {
- string cookie = "QgBCAoNCBpkrdXVpZC03MDlhYjYwOC0yMDA0LTQ0ZDUtYjM5Mi1mM2M1YmY3YzY3ZmItMUIErZ3da7enifVFg+e0dObwRLNCCJ4egLowfrwP4Hgn0lOSqlA2fr0k4NAKgRZX+0BVs2EOnwJ6xkIOjzCAEnLHQMkIQhCPMJC+QxtByQhCFI8wgBJyx0DJCEIWjzCQvkMbQckIAQ==";
- string xml = String.Format (@"<c:SecurityContextToken u:Id='uuid-709ab608-2004-44d5-b392-f3c5bf7c67fb-1' xmlns:c='http://schemas.xmlsoap.org/ws/2005/02/sc' xmlns:u='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'>
- <c:Identifier>urn:uuid:b76bdd9d-89a7-45f5-83e7-b474e6f044b3</c:Identifier>
- <dnse:Cookie xmlns:dnse='http://schemas.microsoft.com/ws/2006/05/security'>{0}</dnse:Cookie>
- </c:SecurityContextToken>", cookie);
- string expectedKey = "gLowfrwP4Hgn0lOSqlA2fr0k4NAKgRZX+0BVs2EOesY=";
- WSSecurityTokenSerializer serializer =
- new WSSecurityTokenSerializer (MessageSecurityVersion.Default.SecurityVersion,
- false,
- new SamlSerializer (),
- new MyStateEncoder (),
- null);
- SecurityContextSecurityToken sct;
- using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
- // Token is not registered, but is restored from the cookie
- sct = serializer.ReadToken (xr, null) as SecurityContextSecurityToken;
- }
- Assert.IsNotNull (sct, "#1");
- Assert.AreEqual (new UniqueId ("urn:uuid:b76bdd9d-89a7-45f5-83e7-b474e6f044b3"), sct.ContextId, "#2");
- Assert.IsNotNull (sct.AuthorizationPolicies.Count, "#3");
- Assert.AreEqual (0, sct.AuthorizationPolicies.Count, "#4");
- Assert.AreEqual (1, sct.SecurityKeys.Count, "#5");
- Assert.AreEqual (expectedKey, Convert.ToBase64String (((SymmetricSecurityKey) sct.SecurityKeys [0]).GetSymmetricKey ()), "#6");
- byte [] xmlbin = Convert.FromBase64String (cookie);
- XmlDictionary dic = new XmlDictionary ();
- for (int i = 0; i < 12; i++)
- dic.Add ("n" + i);
- XmlDictionaryReader br = XmlDictionaryReader.CreateBinaryReader (xmlbin, 0, xmlbin.Length, dic, new XmlDictionaryReaderQuotas ());
- while (br.LocalName != "n4")
- if (!br.Read ())
- Assert.Fail ("Unxpected binary xmlreader failure.");
- byte [] key = br.ReadElementContentAsBase64 ();
- // Hmm, so, looks like the Cookie binary depends not
- // on SSL protection but on the state encoder ...
- // does it make sense, or is a different key resolved
- // as a result of TLS negotiation?
- Assert.AreEqual (expectedKey, Convert.ToBase64String (key), "#7");
- }
- class MyStateEncoder : SecurityStateEncoder
- {
- protected override byte [] DecodeSecurityState (byte [] src)
- {
- return src;
- }
- protected override byte [] EncodeSecurityState (byte [] src)
- {
- return src;
- }
- }
- [Test]
- [ExpectedException (typeof (XmlException))]
- public void ReadSecurityContextSecurityTokenSslnego3 ()
- {
- // full RSTR ... fails
- string xml = @"<t:RequestSecurityTokenResponse Context='uuid-d88a7f14-97b7-4663-a548-c59a2a1c652f' xmlns:t='http://schemas.xmlsoap.org/ws/2005/02/trust' xmlns:u='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'>
- <t:TokenType>http://schemas.xmlsoap.org/ws/2005/02/sc/sct</t:TokenType>
- <t:RequestedSecurityToken>
- <c:SecurityContextToken u:Id='uuid-8921c433-1f44-4ff1-99c7-c70ba90c56c3-1' xmlns:c='http://schemas.xmlsoap.org/ws/2005/02/sc'>
- <c:Identifier>urn:uuid:6ee2d642-484a-4e08-a9f4-a2bfe4f2d540</c:Identifier>
- <dnse:Cookie xmlns:dnse='http://schemas.microsoft.com/ws/2006/05/security'>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAbwpVqF25WkyFYDXHavE7SwAAAAACAAAAAAADZgAAqAAAABAAAAD+ZtWd8MLaBeaMn+xLvyAhAAAAAASAAACgAAAAEAAAAKxhFZ5l669I+hLsZTunH12gAAAAQKjqxZo4eRtLLRO0kA0qHCNaazWddGbVdVzeMY8uIjBgl6UAMroZ6N5MAsACNbKLcYfdtEvZa1P1MTT+8dpsnWRCy5/UcQkg6mlrBAkYzEMYT8yNxRF/xEIXMpRAB5e2De4tUTFwIBIRBBKoay+oWP1M4Hcq7C8HDAqOjNyMOAUILIcz5hMFjtBDwJ4EfogiUVr02xGiXoHqEodxT75wKxQAAABQ3v/KgM1WGIDVcDypm1sNE6SASQ==</dnse:Cookie>
- </c:SecurityContextToken>
- </t:RequestedSecurityToken>
- <t:RequestedAttachedReference>
- <o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
- <o:Reference URI='#uuid-8921c433-1f44-4ff1-99c7-c70ba90c56c3-1'>
- </o:Reference>
- </o:SecurityTokenReference>
- </t:RequestedAttachedReference>
- <t:RequestedUnattachedReference>
- <o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
- <o:Reference URI='urn:uuid:6ee2d642-484a-4e08-a9f4-a2bfe4f2d540' ValueType='http://schemas.xmlsoap.org/ws/2005/02/sc/sct'>
- </o:Reference>
- </o:SecurityTokenReference>
- </t:RequestedUnattachedReference>
- <t:RequestedProofToken>
- <e:EncryptedKey xmlns:e='http://www.w3.org/2001/04/xmlenc#'>
- <e:EncryptionMethod Algorithm='http://schemas.xmlsoap.org/2005/02/trust/tlsnego#TLS_Wrap'>
- </e:EncryptionMethod>
- <e:CipherData>
- <e:CipherValue>FwMBADB9aB76Af+8UmE6nuo5bSh1OwbBjlImD1BY2NUbcByLmCgIARvC+KutimPRXwnMio8=</e:CipherValue>
- </e:CipherData>
- </e:EncryptedKey>
- </t:RequestedProofToken>
- <t:Lifetime>
- <u:Created>2007-03-09T18:51:37.109Z</u:Created>
- <u:Expires>2007-03-10T04:51:37.109Z</u:Expires>
- </t:Lifetime>
- <t:KeySize>256</t:KeySize>
- <t:BinaryExchange ValueType=' http://schemas.xmlsoap.org/ws/2005/02/trust/tlsnego' EncodingType='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary'>FAMBAAEBFgMBACALQXwZMThkzZ0m4ICTSg/tcKk2eB+IKLRIhwFKHm+G6w==</t:BinaryExchange>
- </t:RequestSecurityTokenResponse>
- <t:RequestSecurityTokenResponse Context='uuid-d88a7f14-97b7-4663-a548-c59a2a1c652f' xmlns:u='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'>
- <t:Authenticator>
- <t:CombinedHash>O6A+tpZvcUnI/+HMW2qWREreuFHDV3SVfMCJ2haq27A=</t:CombinedHash>
- </t:Authenticator>
- </t:RequestSecurityTokenResponse>";
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
- serializer.ReadToken (xr, null);
- }
- }
- [Test]
- public void ReadWrappedKeySecurityToken ()
- {
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- using (XmlReader xr = XmlReader.Create (new StringReader (wrapped_key1))) {
- WrappedKeySecurityToken token = serializer.ReadToken (xr, GetResolver (new X509SecurityToken (cert))) as WrappedKeySecurityToken;
- Assert.IsNotNull (token, "#1");
- Assert.AreEqual (1, token.SecurityKeys.Count, "#2");
- SymmetricSecurityKey sk = token.SecurityKeys [0] as SymmetricSecurityKey;
- Assert.IsNotNull (sk, "#3");
- byte [] wk = Convert.FromBase64String ("RLRUq81oJNSKPZz4ToCmin7ymCdMpCJiiRx5c1RGZuILiLcU3zCZI2bN9UNgfTHnE4arcJzjwSOeuzFSn948Lr0w6kUaZQjJVzLozu2hBhhb8Kps4ekLWmrsca2c2VmjT9kKEihfCX4s1Pfv9aJyVpT3EGwH7vd9fr9k5G2RtKY=");
- Assert.AreEqual (wk, token.GetWrappedKey (), "#4");
- }
- }
- [Test]
- public void ReadWrappedKeySecurityTokenImplCheck ()
- {
- SecurityTokenResolver tokenResolver = GetResolver (new X509SecurityToken (cert));
- XmlReader reader = XmlReader.Create (new StringReader (wrapped_key1));
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- EncryptedKey ek = new EncryptedKey ();
- ek.LoadXml (new XmlDocument ().ReadNode (reader) as XmlElement);
- SecurityKeyIdentifier ki = new SecurityKeyIdentifier ();
- foreach (KeyInfoClause kic in ek.KeyInfo)
- ki.Add (serializer.ReadKeyIdentifierClause (new XmlNodeReader (kic.GetXml ())));
- SecurityToken token = tokenResolver.ResolveToken (ki);
- string alg = ek.EncryptionMethod.KeyAlgorithm;
- SecurityKey skey = token.SecurityKeys [0];
- Assert.IsTrue (skey is X509AsymmetricSecurityKey, "#1");
- Assert.IsTrue (skey.IsSupportedAlgorithm (alg), "#2");
- Assert.AreEqual (
- EncryptedXml.DecryptKey (ek.CipherData.CipherValue, cert.PrivateKey as RSA, true),
- skey.DecryptKey (alg, ek.CipherData.CipherValue),
- "#3");
- byte [] key = skey.DecryptKey (alg, ek.CipherData.CipherValue);
- WrappedKeySecurityToken wk =
- new WrappedKeySecurityToken (ek.Id, key, alg, token, ki);
- Assert.AreEqual (
- EncryptedXml.DecryptKey (ek.CipherData.CipherValue, cert.PrivateKey as RSA, true),
- skey.DecryptKey (alg, wk.GetWrappedKey ()),
- "#4");
- }
- [Test]
- // It raises strange XmlException that wraps ArgumentNullException. Too silly to follow.
- public void ReadWrappedKeySecurityTokenNullResolver ()
- {
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- using (XmlReader xr = XmlReader.Create (new StringReader (wrapped_key1))) {
- try {
- serializer.ReadToken (xr, null);
- Assert.Fail ("Should fail due to the lack of resolver");
- } catch {
- }
- }
- }
- [Test]
- [Ignore ("not sure how we can consume this RequestedProofToken yet.")]
- public void ReadTlsnegoRequestedProofToken ()
- {
- string xml = @"<e:EncryptedKey xmlns:e=""http://www.w3.org/2001/04/xmlenc#""><e:EncryptionMethod Algorithm=""http://schemas.xmlsoap.org/2005/02/trust/tlsnego#TLS_Wrap""></e:EncryptionMethod><e:CipherData><e:CipherValue>FwMBADD/I64jS8yQM4+yn1FPr1+enSjRwoyw1c/hdEDWqfkW/parE9yq5zNKwO0g7zQaFXg=</e:CipherValue></e:CipherData></e:EncryptedKey>";
- WSSecurityTokenSerializer serializer =
- WSSecurityTokenSerializer.DefaultInstance;
- using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
- serializer.ReadToken (xr, GetResolver (new X509SecurityToken (cert, "urn:unique-id:foo")));
- }
- }
- class MyResolver : SecurityTokenResolver
- {
- protected override bool TryResolveTokenCore (SecurityKeyIdentifier ident, out SecurityToken token)
- {
- throw new Exception ("1");
- // token = null;
- // return false;
- }
- protected override bool TryResolveTokenCore (SecurityKeyIdentifierClause clause, out SecurityToken token)
- {
- throw new Exception ("2");
- // token = null;
- // return false;
- }
- protected override bool TryResolveSecurityKeyCore (SecurityKeyIdentifierClause clause, out SecurityKey key)
- {
- throw new Exception ("3");
- // key = null;
- // return false;
- }
- }
- SecurityTokenResolver GetResolver (params SecurityToken [] tokens)
- {
- return SecurityTokenResolver.CreateDefaultSecurityTokenResolver (
- new ReadOnlyCollection<SecurityToken> (tokens), true);
- }
- [Test]
- public void GetTokenTypeUri ()
- {
- new MyWSSecurityTokenSerializer ().TestGetTokenTypeUri ();
- }
- }
- class MyWSSecurityTokenSerializer : WSSecurityTokenSerializer
- {
- public void TestGetTokenTypeUri ()
- {
- Assert.IsNull (GetTokenTypeUri (GetType ()), "#1");
- Assert.AreEqual ("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3",
- GetTokenTypeUri (typeof (X509SecurityToken)), "#2");
- Assert.IsNull (GetTokenTypeUri (typeof (RsaSecurityToken)), "#3");
- Assert.AreEqual ("http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1",
- GetTokenTypeUri (typeof (SamlSecurityToken)), "#4");
- Assert.AreEqual ("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken",
- GetTokenTypeUri (typeof (UserNameSecurityToken)), "#5");
- Assert.IsNull (GetTokenTypeUri (typeof (SspiSecurityToken)), "#6");
- Assert.AreEqual ("http://schemas.xmlsoap.org/ws/2005/02/sc/sct",
- GetTokenTypeUri (typeof (SecurityContextSecurityToken)), "#7");
- Assert.IsNull (GetTokenTypeUri (typeof (GenericXmlSecurityToken)), "#8");
- Assert.AreEqual ("http://docs.oasis-open.org/wss/oasis-wss-kerberos-token-profile-1.1#GSS_Kerberosv5_AP_REQ",
- GetTokenTypeUri (typeof (KerberosRequestorSecurityToken)), "#9");
- Assert.AreEqual ("http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#EncryptedKey",
- GetTokenTypeUri (typeof (WrappedKeySecurityToken)), "#10");
- }
- }
- }
|