2
0

WSSecurityTokenSerializerTest.cs 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972
  1. //
  2. // WSSecurityTokenSerializerTest.cs
  3. //
  4. // Author:
  5. // Atsushi Enomoto <[email protected]>
  6. //
  7. // Copyright (C) 2006 Novell, Inc. http://www.novell.com
  8. //
  9. // Permission is hereby granted, free of charge, to any person obtaining
  10. // a copy of this software and associated documentation files (the
  11. // "Software"), to deal in the Software without restriction, including
  12. // without limitation the rights to use, copy, modify, merge, publish,
  13. // distribute, sublicense, and/or sell copies of the Software, and to
  14. // permit persons to whom the Software is furnished to do so, subject to
  15. // the following conditions:
  16. //
  17. // The above copyright notice and this permission notice shall be
  18. // included in all copies or substantial portions of the Software.
  19. //
  20. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  21. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  23. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  24. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  25. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  26. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27. //
  28. using System;
  29. using System.Collections.ObjectModel;
  30. using System.IO;
  31. using System.Security.Cryptography;
  32. using System.Security.Cryptography.X509Certificates;
  33. using System.Security.Cryptography.Xml;
  34. using System.ServiceModel;
  35. using System.ServiceModel.Channels;
  36. using System.ServiceModel.Security;
  37. using System.ServiceModel.Security.Tokens;
  38. using System.IdentityModel.Policy;
  39. using System.IdentityModel.Selectors;
  40. using System.IdentityModel.Tokens;
  41. using System.Xml;
  42. using NUnit.Framework;
  43. namespace MonoTests.System.ServiceModel.Security
  44. {
  45. [TestFixture]
  46. public class WSSecurityTokenSerializerTest
  47. {
  48. const string wssNS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
  49. const string wsuNS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
  50. static X509Certificate2 cert = new X509Certificate2 ("Test/Resources/test.pfx", "mono");
  51. 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'>
  52. <o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
  53. <o:Reference ValueType='http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#EncryptedKey' URI='#uuid:urn:abc' />
  54. </o:SecurityTokenReference>
  55. <c:Offset>0</c:Offset>
  56. <c:Length>24</c:Length>
  57. <c:Nonce>BIUeTKeOhR5HeE646ZyA+w==</c:Nonce>
  58. </c:DerivedKeyToken>";
  59. 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'>
  60. <o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
  61. <o:Reference ValueType='urn:my-own-way' URI='#uuid:urn:abc' />
  62. </o:SecurityTokenReference>
  63. <c:Offset>0</c:Offset>
  64. <c:Length>24</c:Length>
  65. <c:Nonce>BIUeTKeOhR5HeE646ZyA+w==</c:Nonce>
  66. </c:DerivedKeyToken>";
  67. const string wrapped_key1 = @"<e:EncryptedKey Id='_0' xmlns:e='http://www.w3.org/2001/04/xmlenc#'>
  68. <e:EncryptionMethod Algorithm='http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p'>
  69. <DigestMethod Algorithm='http://www.w3.org/2000/09/xmldsig#sha1' xmlns='http://www.w3.org/2000/09/xmldsig#'></DigestMethod>
  70. </e:EncryptionMethod>
  71. <KeyInfo xmlns='http://www.w3.org/2000/09/xmldsig#'>
  72. <o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
  73. <o:KeyIdentifier ValueType='http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1'>GQ3YHlGQhDF1bvMixHliX4uLjlY=</o:KeyIdentifier>
  74. </o:SecurityTokenReference>
  75. </KeyInfo>
  76. <e:CipherData>
  77. <e:CipherValue>RLRUq81oJNSKPZz4ToCmin7ymCdMpCJiiRx5c1RGZuILiLcU3zCZI2bN9UNgfTHnE4arcJzjwSOeuzFSn948Lr0w6kUaZQjJVzLozu2hBhhb8Kps4ekLWmrsca2c2VmjT9kKEihfCX4s1Pfv9aJyVpT3EGwH7vd9fr9k5G2RtKY=</e:CipherValue>
  78. </e:CipherData>
  79. <e:ReferenceList>
  80. <e:DataReference URI='#_2'></e:DataReference>
  81. </e:ReferenceList>
  82. </e:EncryptedKey>";
  83. XmlWriterSettings GetWriterSettings ()
  84. {
  85. XmlWriterSettings s = new XmlWriterSettings ();
  86. s.OmitXmlDeclaration = true;
  87. return s;
  88. }
  89. [Test]
  90. public void DefaultValues ()
  91. {
  92. WSSecurityTokenSerializer ser = new WSSecurityTokenSerializer ();
  93. DefaultValues (ser);
  94. DefaultValues (WSSecurityTokenSerializer.DefaultInstance);
  95. }
  96. void DefaultValues (WSSecurityTokenSerializer ser)
  97. {
  98. Assert.AreEqual (false, ser.EmitBspRequiredAttributes, "#1");
  99. Assert.AreEqual (128, ser.MaximumKeyDerivationLabelLength, "#2");
  100. Assert.AreEqual (128, ser.MaximumKeyDerivationNonceLength, "#3");
  101. Assert.AreEqual (64, ser.MaximumKeyDerivationOffset, "#4");
  102. Assert.AreEqual (SecurityVersion.WSSecurity11, ser.SecurityVersion, "#5");
  103. }
  104. [Test]
  105. public void WriteX509SecurityToken1 ()
  106. {
  107. StringWriter sw = new StringWriter ();
  108. X509SecurityToken t = new X509SecurityToken (cert, "urn:x509:1");
  109. Assert.IsNotNull (cert.GetRawCertData (), "premise: X509Certificate2.RawData");
  110. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  111. WSSecurityTokenSerializer.DefaultInstance.WriteToken (w, t);
  112. }
  113. string rawdata = Convert.ToBase64String (cert.RawData);
  114. 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 ());
  115. }
  116. [Test]
  117. public void WriteUserNameSecurityToken1 ()
  118. {
  119. StringWriter sw = new StringWriter ();
  120. UserNameSecurityToken t = new UserNameSecurityToken ("mono", "poly", "urn:username:1");
  121. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  122. WSSecurityTokenSerializer.DefaultInstance.WriteToken (w, t);
  123. }
  124. // Hmm, no PasswordToken (and TokenType) ?
  125. 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 ());
  126. }
  127. [Test]
  128. public void WriteBinarySecretSecurityToken1 ()
  129. {
  130. StringWriter sw = new StringWriter ();
  131. byte [] bytes = new byte [] {0, 1, 2, 3, 4, 5, 6, 7};
  132. BinarySecretSecurityToken t = new BinarySecretSecurityToken ("urn:binary:1", bytes);
  133. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  134. WSSecurityTokenSerializer.DefaultInstance.WriteToken (w, t);
  135. }
  136. // AAECAwQFBgc=
  137. string base64 = Convert.ToBase64String (bytes);
  138. 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 ());
  139. }
  140. [Test]
  141. [ExpectedException (typeof (InvalidOperationException))]
  142. public void WriteRsaSecurityToken ()
  143. {
  144. StringWriter sw = new StringWriter ();
  145. RSA rsa = (RSA) cert.PublicKey.Key;
  146. RsaSecurityToken t = new RsaSecurityToken (rsa, "urn:rsa:1");
  147. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  148. WSSecurityTokenSerializer.DefaultInstance.WriteToken (w, t);
  149. }
  150. }
  151. [Test]
  152. public void WriteGenericXmlSecurityToken1 ()
  153. {
  154. StringWriter sw = new StringWriter ();
  155. XmlElement xml = new XmlDocument ().CreateElement ("foo");
  156. SecurityToken token = new X509SecurityToken (new X509Certificate2 ("Test/Resources/test.pfx", "mono"));
  157. SecurityKeyIdentifierClause intref =
  158. token.CreateKeyIdentifierClause<X509IssuerSerialKeyIdentifierClause> ();
  159. SecurityKeyIdentifierClause extref =
  160. null; // token.CreateKeyIdentifierClause<X509IssuerSerialKeyIdentifierClause> ();
  161. ReadOnlyCollection<IAuthorizationPolicy> policies =
  162. new ReadOnlyCollection<IAuthorizationPolicy> (
  163. new IAuthorizationPolicy [0]);
  164. GenericXmlSecurityToken t = new GenericXmlSecurityToken (xml, token, DateTime.Now, new DateTime (2112, 9, 3), intref, extref, policies);
  165. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  166. WSSecurityTokenSerializer.DefaultInstance.WriteToken (w, t);
  167. }
  168. // Huh?
  169. Assert.AreEqual ("<foo />", sw.ToString ());
  170. }
  171. [Test]
  172. public void WriteWrappedKeySecurityToken ()
  173. {
  174. StringWriter sw = new StringWriter ();
  175. byte [] bytes = new byte [64];
  176. for (byte i = 1; i < 64; i++)
  177. bytes [i] = i;
  178. SecurityToken wt = new X509SecurityToken (cert);
  179. SecurityKeyIdentifier ski = new SecurityKeyIdentifier (
  180. wt.CreateKeyIdentifierClause< X509ThumbprintKeyIdentifierClause> ());
  181. WrappedKeySecurityToken t = new WrappedKeySecurityToken (
  182. "urn:wrapper-key:1", bytes, SecurityAlgorithms.RsaOaepKeyWrap, wt, ski);
  183. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  184. WSSecurityTokenSerializer.DefaultInstance.WriteToken (w, t);
  185. }
  186. string actual = sw.ToString ();
  187. int idx = actual.IndexOf ("<e:CipherValue>", StringComparison.Ordinal);
  188. Assert.IsTrue (idx >= 0, "No <CipherValue>");
  189. actual =
  190. actual.Substring (0, idx) +
  191. "<e:CipherValue>removed here" +
  192. actual.Substring (actual.IndexOf ("</e:CipherValue>", StringComparison.Ordinal));
  193. Assert.AreEqual ("GQ3YHlGQhDF1bvMixHliX4uLjlY=", Convert.ToBase64String (cert.GetCertHash ()), "premise#1");
  194. Assert.AreEqual (
  195. 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>",
  196. EncryptedXml.XmlEncNamespaceUrl,
  197. SecurityAlgorithms.RsaOaepKeyWrap,
  198. SignedXml.XmlDsigSHA1Url,
  199. SignedXml.XmlDsigNamespaceUrl,
  200. "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
  201. "http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1",
  202. Convert.ToBase64String (cert.GetCertHash ())),// "GQ3YHlGQhDF1bvMixHliX4uLjlY="
  203. actual);
  204. }
  205. [Test]
  206. public void WriteSecurityContextSecurityToken ()
  207. {
  208. StringWriter sw = new StringWriter ();
  209. SecurityContextSecurityToken t = new SecurityContextSecurityToken (
  210. new UniqueId ("urn:unique-id:securitycontext:1"),
  211. "urn:securitycontext:1",
  212. Convert.FromBase64String ("o/ilseZu+keLBBWGGPlUHweqxIPc4gzZEFWr2nBt640="),
  213. new DateTime (2006, 9, 26), new DateTime (2006, 9, 27));
  214. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  215. WSSecurityTokenSerializer.DefaultInstance.WriteToken (w, t);
  216. }
  217. 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 ());
  218. }
  219. [Test]
  220. public void WriteX509IssuerSerialKeyIdentifierClause1 ()
  221. {
  222. StringWriter sw = new StringWriter ();
  223. X509IssuerSerialKeyIdentifierClause ic = new X509IssuerSerialKeyIdentifierClause (cert);
  224. 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>";
  225. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  226. WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
  227. }
  228. Assert.AreEqual (expected, sw.ToString (), "WSS1.1");
  229. sw = new StringWriter ();
  230. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  231. new WSSecurityTokenSerializer (SecurityVersion.WSSecurity10).WriteKeyIdentifierClause (w, ic);
  232. }
  233. Assert.AreEqual (expected, sw.ToString (), "WSS1.0");
  234. }
  235. [Test]
  236. public void WriteX509ThumbprintKeyIdentifierClause1 ()
  237. {
  238. StringWriter sw = new StringWriter ();
  239. X509ThumbprintKeyIdentifierClause ic = new X509ThumbprintKeyIdentifierClause (cert);
  240. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  241. WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
  242. }
  243. 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 ());
  244. }
  245. [Test]
  246. [ExpectedException (typeof (InvalidOperationException))]
  247. public void WriteX509ThumbprintKeyIdentifierClause2 ()
  248. {
  249. // WS-Security1.0 x thumbprint = death
  250. using (XmlWriter w = XmlWriter.Create (TextWriter.Null)) {
  251. new WSSecurityTokenSerializer (SecurityVersion.WSSecurity10)
  252. .WriteKeyIdentifierClause (w, new X509ThumbprintKeyIdentifierClause (cert));
  253. }
  254. }
  255. [Test]
  256. public void WriteX509ThumbprintKeyIdentifierClause3 ()
  257. {
  258. // EmitBspRequiredAttributes
  259. StringWriter sw = new StringWriter ();
  260. X509ThumbprintKeyIdentifierClause ic = new X509ThumbprintKeyIdentifierClause (cert);
  261. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  262. new WSSecurityTokenSerializer (true).WriteKeyIdentifierClause (w, ic);
  263. }
  264. 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 ());
  265. }
  266. [Test]
  267. public void WriteEncryptedKeyIdentifierClause ()
  268. {
  269. StringWriter sw = new StringWriter ();
  270. byte [] bytes = new byte [32];
  271. SecurityKeyIdentifier cki = new SecurityKeyIdentifier ();
  272. cki.Add (new X509ThumbprintKeyIdentifierClause (cert));
  273. EncryptedKeyIdentifierClause ic =
  274. new EncryptedKeyIdentifierClause (bytes, SecurityAlgorithms.Aes256KeyWrap, cki);
  275. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  276. WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
  277. }
  278. 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>",
  279. EncryptedXml.XmlEncNamespaceUrl,
  280. SecurityAlgorithms.Aes256KeyWrap,
  281. SignedXml.XmlDsigNamespaceUrl,
  282. "http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1");
  283. Assert.AreEqual (expected, sw.ToString ());
  284. }
  285. [Test]
  286. public void WriteEncryptedKeyIdentifierClause2 () // derived key
  287. {
  288. StringWriter sw = new StringWriter ();
  289. byte [] bytes = new byte [32];
  290. SecurityKeyIdentifier cki = new SecurityKeyIdentifier ();
  291. cki.Add (new X509ThumbprintKeyIdentifierClause (cert));
  292. EncryptedKeyIdentifierClause ic =
  293. new EncryptedKeyIdentifierClause (bytes, SecurityAlgorithms.Aes256KeyWrap, cki, "carriedKeyNaaaaame", new byte [32], 32);
  294. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  295. WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
  296. }
  297. 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>",
  298. EncryptedXml.XmlEncNamespaceUrl,
  299. SecurityAlgorithms.Aes256KeyWrap,
  300. SignedXml.XmlDsigNamespaceUrl,
  301. "http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1");
  302. Assert.AreEqual (expected, sw.ToString ());
  303. }
  304. [Test]
  305. public void WriteEncryptedKeyIdentifierClause3 ()
  306. {
  307. StringWriter sw = new StringWriter ();
  308. byte [] bytes = new byte [32];
  309. SecurityKeyIdentifier cki = new SecurityKeyIdentifier ();
  310. cki.Add (new X509ThumbprintKeyIdentifierClause (cert));
  311. EncryptedKeyIdentifierClause ic =
  312. new EncryptedKeyIdentifierClause (bytes, SecurityAlgorithms.Aes256Encryption);
  313. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  314. WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
  315. }
  316. string expected = String.Format ("<e:EncryptedKey xmlns:e=\"{0}\"><e:EncryptionMethod Algorithm=\"{1}\" /><e:CipherData><e:CipherValue>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</e:CipherValue></e:CipherData></e:EncryptedKey>",
  317. EncryptedXml.XmlEncNamespaceUrl,
  318. SecurityAlgorithms.Aes256Encryption,
  319. SignedXml.XmlDsigNamespaceUrl,
  320. "http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1");
  321. Assert.AreEqual (expected, sw.ToString ());
  322. }
  323. [Test]
  324. public void WriteEncryptedKeyIdentifierClause4 ()
  325. {
  326. StringWriter sw = new StringWriter ();
  327. byte [] bytes = new byte [32];
  328. SecurityKeyIdentifier cki = new SecurityKeyIdentifier ();
  329. cki.Add (new BinarySecretKeyIdentifierClause (bytes));
  330. EncryptedKeyIdentifierClause ic =
  331. new EncryptedKeyIdentifierClause (bytes, SecurityAlgorithms.Aes256Encryption);
  332. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  333. WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
  334. }
  335. string expected = String.Format ("<e:EncryptedKey xmlns:e=\"{0}\"><e:EncryptionMethod Algorithm=\"{1}\" /><e:CipherData><e:CipherValue>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</e:CipherValue></e:CipherData></e:EncryptedKey>",
  336. EncryptedXml.XmlEncNamespaceUrl,
  337. SecurityAlgorithms.Aes256Encryption,
  338. SignedXml.XmlDsigNamespaceUrl,
  339. "http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#ThumbprintSHA1");
  340. Assert.AreEqual (expected, sw.ToString ());
  341. }
  342. [Test]
  343. public void WriteBinarySecretKeyIdentifierClause1 ()
  344. {
  345. StringWriter sw = new StringWriter ();
  346. byte [] bytes = new byte [32];
  347. BinarySecretKeyIdentifierClause ic = new BinarySecretKeyIdentifierClause (bytes);
  348. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  349. WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
  350. }
  351. string expected = String.Format ("<t:BinarySecret xmlns:t=\"http://schemas.xmlsoap.org/ws/2005/02/trust\">{0}</t:BinarySecret>", Convert.ToBase64String (bytes));
  352. Assert.AreEqual (expected, sw.ToString (), "#1");
  353. }
  354. class MySecurityTokenParameters : SecurityTokenParameters
  355. {
  356. public SecurityKeyIdentifierClause CallCreateKeyIdentifierClause (SecurityToken token, SecurityTokenReferenceStyle style)
  357. {
  358. return CreateKeyIdentifierClause (token, style);
  359. }
  360. protected override SecurityTokenParameters CloneCore ()
  361. {
  362. return this;
  363. }
  364. protected override bool HasAsymmetricKey {
  365. get { return false; }
  366. }
  367. protected override bool SupportsServerAuthentication {
  368. get { return false; }
  369. }
  370. protected override bool SupportsClientAuthentication {
  371. get { return false; }
  372. }
  373. protected override bool SupportsClientWindowsIdentity {
  374. get { return false; }
  375. }
  376. protected override void InitializeSecurityTokenRequirement (SecurityTokenRequirement r)
  377. {
  378. }
  379. protected override SecurityKeyIdentifierClause CreateKeyIdentifierClause (SecurityToken token, SecurityTokenReferenceStyle style)
  380. {
  381. throw new Exception ();
  382. }
  383. }
  384. /* FIXME: something should output key identifier clause xml like this ...
  385. [Test]
  386. public void WriteInternalWrappedKeyIdentifierClause ()
  387. {
  388. StringWriter sw = new StringWriter ();
  389. byte [] bytes = new byte [32];
  390. EncryptedKeyIdentifierClause eic =
  391. new EncryptedKeyIdentifierClause (bytes, SecurityAlgorithms.Sha1Digest);
  392. SecurityKeyIdentifier ski = new SecurityKeyIdentifier (eic);
  393. WrappedKeySecurityToken token = new WrappedKeySecurityToken ("urn:foo", bytes, SecurityAlgorithms.RsaOaepKeyWrap, new X509SecurityToken (cert), ski);
  394. MySecurityTokenParameters p = new MySecurityTokenParameters ();
  395. SecurityKeyIdentifierClause ic =
  396. p.CallCreateKeyIdentifierClause (token, SecurityTokenReferenceStyle.External);
  397. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  398. WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
  399. }
  400. 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>",
  401. "http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#EncryptedKeySHA1", Convert.ToBase64String (bytes));
  402. Assert.AreEqual (expected, sw.ToString (), "#1");
  403. }
  404. */
  405. [Test]
  406. public void WriteLocalIdKeyIdentifierClause1 ()
  407. {
  408. StringWriter sw = new StringWriter ();
  409. LocalIdKeyIdentifierClause ic = new LocalIdKeyIdentifierClause ("urn:myIDValue");
  410. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  411. WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
  412. }
  413. 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");
  414. }
  415. [Test]
  416. public void WriteLocalIdKeyIdentifierClause2 ()
  417. {
  418. StringWriter sw = new StringWriter ();
  419. LocalIdKeyIdentifierClause ic = new LocalIdKeyIdentifierClause ("#urn:myIDValue");
  420. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  421. WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
  422. }
  423. // ... so, specifying an URI including '#' does not make sense
  424. 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");
  425. }
  426. [Test]
  427. public void WriteLocalIdKeyIdentifierClause3 ()
  428. {
  429. StringWriter sw = new StringWriter ();
  430. LocalIdKeyIdentifierClause ic = new LocalIdKeyIdentifierClause ("urn:myIDValue", typeof (WrappedKeySecurityToken));
  431. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  432. WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
  433. }
  434. 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");
  435. }
  436. [Test]
  437. public void WriteLocalIdKeyIdentifierClause4 () // EmitBsp
  438. {
  439. StringWriter sw = new StringWriter ();
  440. LocalIdKeyIdentifierClause ic = new LocalIdKeyIdentifierClause ("urn:myIDValue", typeof (WrappedKeySecurityToken));
  441. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  442. new WSSecurityTokenSerializer (true).WriteKeyIdentifierClause (w, ic);
  443. }
  444. 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");
  445. }
  446. [Test]
  447. [Ignore ("fails on .net; no further verification")]
  448. public void WriteLocalIdKeyIdentifierClause5 () // derivedKey
  449. {
  450. StringWriter sw = new StringWriter ();
  451. LocalIdKeyIdentifierClause ic = new LocalIdKeyIdentifierClause ("urn:myIDValue", new byte [32], 16, typeof (WrappedKeySecurityToken));
  452. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  453. new WSSecurityTokenSerializer (true).WriteKeyIdentifierClause (w, ic);
  454. }
  455. 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");
  456. }
  457. [Test]
  458. public void WriteSecurityContextKeyIdentifierClause ()
  459. {
  460. StringWriter sw = new StringWriter ();
  461. SecurityContextKeyIdentifierClause ic = new SecurityContextKeyIdentifierClause (new UniqueId ("urn:foo:1"), null);
  462. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  463. WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
  464. }
  465. 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");
  466. XmlReader reader = XmlReader.Create (new StringReader (sw.ToString ()));
  467. ic = WSSecurityTokenSerializer.DefaultInstance.ReadKeyIdentifierClause (reader) as SecurityContextKeyIdentifierClause;
  468. Assert.IsNotNull (ic, "#2");
  469. }
  470. class MySslParameters : SslSecurityTokenParameters
  471. {
  472. public SecurityKeyIdentifierClause CallCreateKeyIdentifierClause (
  473. SecurityToken token, SecurityTokenReferenceStyle referenceStyle)
  474. {
  475. return CreateKeyIdentifierClause (token, referenceStyle);
  476. }
  477. }
  478. [Test]
  479. public void WriteSecurityContextKeyIdentifierClause2 ()
  480. {
  481. StringWriter sw = new StringWriter ();
  482. MySslParameters tp = new MySslParameters ();
  483. SecurityContextSecurityToken sct =
  484. new SecurityContextSecurityToken (new UniqueId ("urn:foo:1"), "urn:foo:2", new byte [32], DateTime.MinValue, DateTime.MaxValue);
  485. SecurityKeyIdentifierClause ic =
  486. tp.CallCreateKeyIdentifierClause (sct, SecurityTokenReferenceStyle.Internal);
  487. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  488. WSSecurityTokenSerializer.DefaultInstance.WriteKeyIdentifierClause (w, ic);
  489. }
  490. 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");
  491. XmlReader reader = XmlReader.Create (new StringReader (sw.ToString ()));
  492. ic = WSSecurityTokenSerializer.DefaultInstance.ReadKeyIdentifierClause (reader) as LocalIdKeyIdentifierClause;
  493. Assert.IsNotNull (ic, "#2");
  494. }
  495. [Test]
  496. public void ReadKeyIdentifierClause ()
  497. {
  498. string xml = @"<o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
  499. <o:Reference URI='#uuid-9c90d2c7-c82f-4c63-9b28-fc24479ee3a7-2' />
  500. </o:SecurityTokenReference>";
  501. WSSecurityTokenSerializer serializer =
  502. WSSecurityTokenSerializer.DefaultInstance;
  503. using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
  504. SecurityKeyIdentifierClause kic = serializer.ReadKeyIdentifierClause (xr);
  505. Assert.IsTrue (kic is LocalIdKeyIdentifierClause, "#1");
  506. }
  507. }
  508. [Test]
  509. public void ReadEncryptedKeyIdentifierClause ()
  510. {
  511. 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>";
  512. WSSecurityTokenSerializer serializer =
  513. WSSecurityTokenSerializer.DefaultInstance;
  514. EncryptedKeyIdentifierClause kic;
  515. using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
  516. kic = serializer.ReadKeyIdentifierClause (xr) as EncryptedKeyIdentifierClause;
  517. }
  518. Assert.IsNotNull (kic, "#1");
  519. Assert.IsNull (kic.CarriedKeyName, "#2");
  520. Assert.AreEqual (EncryptedXml.XmlEncRSAOAEPUrl, kic.EncryptionMethod, "#3");
  521. Assert.AreEqual (1, kic.EncryptingKeyIdentifier.Count, "#4");
  522. LocalIdKeyIdentifierClause ekic = kic.EncryptingKeyIdentifier [0] as LocalIdKeyIdentifierClause;
  523. Assert.IsNotNull (ekic, "#5");
  524. Assert.AreEqual ("uuid-9c90d2c7-c82f-4c63-9b28-fc24479ee3a7-2", ekic.LocalId, "#6");
  525. }
  526. [Test]
  527. [ExpectedException (typeof (XmlException))] // .NET says that KeyIdentifier is not the expected element, but actually it is because of ValueType.
  528. public void ReadKeyIdentifierReferenceWrongVallueType ()
  529. {
  530. string xml = @"<o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
  531. <o:KeyIdentifier ValueType='hogehoge'>xr42fAKDBNItO0aRPKFqc0kaiiU=</o:KeyIdentifier>
  532. </o:SecurityTokenReference>";
  533. WSSecurityTokenSerializer serializer =
  534. WSSecurityTokenSerializer.DefaultInstance;
  535. using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
  536. SecurityKeyIdentifierClause kic = serializer.ReadKeyIdentifierClause (xr);
  537. Assert.IsTrue (kic is X509ThumbprintKeyIdentifierClause, "#1");
  538. }
  539. }
  540. [Test]
  541. public void ReadKeyIdentifierThumbprint ()
  542. {
  543. string xml = @"<o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
  544. <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>
  545. </o:SecurityTokenReference>";
  546. WSSecurityTokenSerializer serializer =
  547. WSSecurityTokenSerializer.DefaultInstance;
  548. using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
  549. SecurityKeyIdentifierClause kic = serializer.ReadKeyIdentifierClause (xr);
  550. Assert.IsTrue (kic is X509ThumbprintKeyIdentifierClause, "#1");
  551. }
  552. }
  553. [Test]
  554. public void ReadKeyIdentifierEncryptedKey ()
  555. {
  556. string xml = @"<o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
  557. <o:KeyIdentifier ValueType='http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#EncryptedKeySHA1'>xr42fAKDBNItO0aRPKFqc0kaiiU=</o:KeyIdentifier>
  558. </o:SecurityTokenReference>";
  559. WSSecurityTokenSerializer serializer =
  560. WSSecurityTokenSerializer.DefaultInstance;
  561. using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
  562. SecurityKeyIdentifierClause kic = serializer.ReadKeyIdentifierClause (xr);
  563. Assert.IsTrue (kic is BinaryKeyIdentifierClause, "#1");
  564. }
  565. }
  566. [Test]
  567. [ExpectedException (typeof (XmlException))] // not sure how this exception type makes sense...
  568. public void ReadEmptyUsernameToken ()
  569. {
  570. WSSecurityTokenSerializer serializer =
  571. WSSecurityTokenSerializer.DefaultInstance;
  572. using (XmlReader xr = XmlReader.Create (new StringReader (String.Format ("<o:UsernameToken u:Id='urn:foo' xmlns:o='{0}' xmlns:u='{1}' />", wssNS, wsuNS)))) {
  573. serializer.ReadToken (xr, null);
  574. }
  575. }
  576. [Test]
  577. [ExpectedException (typeof (XmlException))] // tokenResolver is null
  578. public void ReadTokenDerivedKeyTokenNullResolver ()
  579. {
  580. WSSecurityTokenSerializer serializer =
  581. WSSecurityTokenSerializer.DefaultInstance;
  582. using (XmlReader xr = XmlReader.Create (new StringReader (derived_key_token1))) {
  583. serializer.ReadToken (xr, null);
  584. }
  585. }
  586. [Test]
  587. [ExpectedException (typeof (XmlException))] // DerivedKeyToken requires a reference to an existent token.
  588. public void ReadTokenDerivedKeyTokenRefToNonExistent ()
  589. {
  590. WSSecurityTokenSerializer serializer =
  591. WSSecurityTokenSerializer.DefaultInstance;
  592. using (XmlReader xr = XmlReader.Create (new StringReader (derived_key_token1))) {
  593. serializer.ReadToken (xr, GetResolver ());
  594. }
  595. }
  596. [Test]
  597. public void ReadWriteTokenDerivedKeyTokenRefToExistent ()
  598. {
  599. WSSecurityTokenSerializer serializer =
  600. new WSSecurityTokenSerializer (true); // emitBSP
  601. SecurityToken token;
  602. using (XmlReader xr = XmlReader.Create (new StringReader (derived_key_token1))) {
  603. token = serializer.ReadToken (xr,
  604. GetResolver (
  605. new WrappedKeySecurityToken ("uuid:urn:abc", new byte [32], SecurityAlgorithms.RsaOaepKeyWrap, new X509SecurityToken (cert), null)
  606. ));
  607. }
  608. StringWriter sw = new StringWriter ();
  609. using (XmlWriter w = XmlWriter.Create (sw, GetWriterSettings ())) {
  610. serializer.WriteToken (w, token);
  611. }
  612. Assert.AreEqual (derived_key_token1.Replace ('\'', '"').Replace (" ", "").Replace ("\n", "").Replace ("\r", ""), sw.ToString ());
  613. }
  614. [Test]
  615. [ExpectedException (typeof (XmlException))] // not sure how this exception type makes sense.
  616. public void ReadTokenDerivedKeyTokenRefToExistent2 ()
  617. {
  618. WSSecurityTokenSerializer serializer =
  619. WSSecurityTokenSerializer.DefaultInstance;
  620. using (XmlReader xr = XmlReader.Create (new StringReader (derived_key_token1))) {
  621. // different token value type to be resolved
  622. // than what is explicitly specified in
  623. // <o:Reference>.
  624. serializer.ReadToken (xr,
  625. GetResolver (new X509SecurityToken (cert, "uuid:urn:abc")));
  626. }
  627. }
  628. [Test]
  629. [ExpectedException (typeof (XmlException))] // not sure how this exception type makes sense.
  630. public void ReadTokenDerivedKeyTokenRefUnsupported ()
  631. {
  632. WSSecurityTokenSerializer serializer =
  633. WSSecurityTokenSerializer.DefaultInstance;
  634. using (XmlReader xr = XmlReader.Create (new StringReader (derived_key_token2))) {
  635. // different token value type to be resolved
  636. // than what is explicitly specified in
  637. // <o:Reference>.
  638. serializer.ReadToken (xr,
  639. GetResolver (new X509SecurityToken (cert, "uuid:urn:abc")));
  640. }
  641. }
  642. [Test]
  643. [Category ("NotWorking")]
  644. public void ReadSecurityContextSecurityTokenNoRegisteredToken ()
  645. {
  646. try {
  647. ReadSecurityContextSecurityTokenNoRegisteredTokenCore ();
  648. Assert.Fail ("Exception expected.");
  649. } catch (SecurityTokenException) {
  650. }
  651. }
  652. void ReadSecurityContextSecurityTokenNoRegisteredTokenCore ()
  653. {
  654. 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>";
  655. WSSecurityTokenSerializer serializer =
  656. WSSecurityTokenSerializer.DefaultInstance;
  657. using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
  658. serializer.ReadToken (xr, GetResolver (new X509SecurityToken (cert, "urn:unique-id:securitycontext:1")));
  659. }
  660. }
  661. [Test]
  662. [Category ("NotWorking")] // SslNegoCookieResolver needs updates and/or fixes.
  663. public void ReadSslnegoSCTNoStateEncoder ()
  664. {
  665. string cookie = "QgBCAoNCBpkrdXVpZC03MDlhYjYwOC0yMDA0LTQ0ZDUtYjM5Mi1mM2M1YmY3YzY3ZmItMUIErZ3da7enifVFg+e0dObwRLNCCJ4egLowfrwP4Hgn0lOSqlA2fr0k4NAKgRZX+0BVs2EOnwJ6xkIOjzCAEnLHQMkIQhCPMJC+QxtByQhCFI8wgBJyx0DJCEIWjzCQvkMbQckIAQ==";
  666. 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'>
  667. <c:Identifier>urn:uuid:b76bdd9d-89a7-45f5-83e7-b474e6f044b3</c:Identifier>
  668. <dnse:Cookie xmlns:dnse='http://schemas.microsoft.com/ws/2006/05/security'>{0}</dnse:Cookie>
  669. </c:SecurityContextToken>", cookie);
  670. string expectedKey = "gLowfrwP4Hgn0lOSqlA2fr0k4NAKgRZX+0BVs2EOesY=";
  671. WSSecurityTokenSerializer serializer =
  672. new WSSecurityTokenSerializer (MessageSecurityVersion.Default.SecurityVersion,
  673. false,
  674. new SamlSerializer (),
  675. new MyStateEncoder (),
  676. null);
  677. SecurityContextSecurityToken sct;
  678. using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
  679. // Token is not registered, but is restored from the cookie
  680. sct = serializer.ReadToken (xr, null) as SecurityContextSecurityToken;
  681. }
  682. Assert.IsNotNull (sct, "#1");
  683. Assert.AreEqual (new UniqueId ("urn:uuid:b76bdd9d-89a7-45f5-83e7-b474e6f044b3"), sct.ContextId, "#2");
  684. Assert.IsNotNull (sct.AuthorizationPolicies.Count, "#3");
  685. Assert.AreEqual (0, sct.AuthorizationPolicies.Count, "#4");
  686. Assert.AreEqual (1, sct.SecurityKeys.Count, "#5");
  687. Assert.AreEqual (expectedKey, Convert.ToBase64String (((SymmetricSecurityKey) sct.SecurityKeys [0]).GetSymmetricKey ()), "#6");
  688. byte [] xmlbin = Convert.FromBase64String (cookie);
  689. XmlDictionary dic = new XmlDictionary ();
  690. for (int i = 0; i < 12; i++)
  691. dic.Add ("n" + i);
  692. XmlDictionaryReader br = XmlDictionaryReader.CreateBinaryReader (xmlbin, 0, xmlbin.Length, dic, new XmlDictionaryReaderQuotas ());
  693. while (br.LocalName != "n4")
  694. if (!br.Read ())
  695. Assert.Fail ("Unxpected binary xmlreader failure.");
  696. byte [] key = br.ReadElementContentAsBase64 ();
  697. // Hmm, so, looks like the Cookie binary depends not
  698. // on SSL protection but on the state encoder ...
  699. // does it make sense, or is a different key resolved
  700. // as a result of TLS negotiation?
  701. Assert.AreEqual (expectedKey, Convert.ToBase64String (key), "#7");
  702. }
  703. class MyStateEncoder : SecurityStateEncoder
  704. {
  705. protected override byte [] DecodeSecurityState (byte [] src)
  706. {
  707. return src;
  708. }
  709. protected override byte [] EncodeSecurityState (byte [] src)
  710. {
  711. return src;
  712. }
  713. }
  714. [Test]
  715. [ExpectedException (typeof (XmlException))]
  716. public void ReadSecurityContextSecurityTokenSslnego3 ()
  717. {
  718. // full RSTR ... fails
  719. 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'>
  720. <t:TokenType>http://schemas.xmlsoap.org/ws/2005/02/sc/sct</t:TokenType>
  721. <t:RequestedSecurityToken>
  722. <c:SecurityContextToken u:Id='uuid-8921c433-1f44-4ff1-99c7-c70ba90c56c3-1' xmlns:c='http://schemas.xmlsoap.org/ws/2005/02/sc'>
  723. <c:Identifier>urn:uuid:6ee2d642-484a-4e08-a9f4-a2bfe4f2d540</c:Identifier>
  724. <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>
  725. </c:SecurityContextToken>
  726. </t:RequestedSecurityToken>
  727. <t:RequestedAttachedReference>
  728. <o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
  729. <o:Reference URI='#uuid-8921c433-1f44-4ff1-99c7-c70ba90c56c3-1'>
  730. </o:Reference>
  731. </o:SecurityTokenReference>
  732. </t:RequestedAttachedReference>
  733. <t:RequestedUnattachedReference>
  734. <o:SecurityTokenReference xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
  735. <o:Reference URI='urn:uuid:6ee2d642-484a-4e08-a9f4-a2bfe4f2d540' ValueType='http://schemas.xmlsoap.org/ws/2005/02/sc/sct'>
  736. </o:Reference>
  737. </o:SecurityTokenReference>
  738. </t:RequestedUnattachedReference>
  739. <t:RequestedProofToken>
  740. <e:EncryptedKey xmlns:e='http://www.w3.org/2001/04/xmlenc#'>
  741. <e:EncryptionMethod Algorithm='http://schemas.xmlsoap.org/2005/02/trust/tlsnego#TLS_Wrap'>
  742. </e:EncryptionMethod>
  743. <e:CipherData>
  744. <e:CipherValue>FwMBADB9aB76Af+8UmE6nuo5bSh1OwbBjlImD1BY2NUbcByLmCgIARvC+KutimPRXwnMio8=</e:CipherValue>
  745. </e:CipherData>
  746. </e:EncryptedKey>
  747. </t:RequestedProofToken>
  748. <t:Lifetime>
  749. <u:Created>2007-03-09T18:51:37.109Z</u:Created>
  750. <u:Expires>2007-03-10T04:51:37.109Z</u:Expires>
  751. </t:Lifetime>
  752. <t:KeySize>256</t:KeySize>
  753. <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>
  754. </t:RequestSecurityTokenResponse>
  755. <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'>
  756. <t:Authenticator>
  757. <t:CombinedHash>O6A+tpZvcUnI/+HMW2qWREreuFHDV3SVfMCJ2haq27A=</t:CombinedHash>
  758. </t:Authenticator>
  759. </t:RequestSecurityTokenResponse>";
  760. WSSecurityTokenSerializer serializer =
  761. WSSecurityTokenSerializer.DefaultInstance;
  762. using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
  763. serializer.ReadToken (xr, null);
  764. }
  765. }
  766. [Test]
  767. public void ReadWrappedKeySecurityToken ()
  768. {
  769. WSSecurityTokenSerializer serializer =
  770. WSSecurityTokenSerializer.DefaultInstance;
  771. using (XmlReader xr = XmlReader.Create (new StringReader (wrapped_key1))) {
  772. WrappedKeySecurityToken token = serializer.ReadToken (xr, GetResolver (new X509SecurityToken (cert))) as WrappedKeySecurityToken;
  773. Assert.IsNotNull (token, "#1");
  774. Assert.AreEqual (1, token.SecurityKeys.Count, "#2");
  775. SymmetricSecurityKey sk = token.SecurityKeys [0] as SymmetricSecurityKey;
  776. Assert.IsNotNull (sk, "#3");
  777. byte [] wk = Convert.FromBase64String ("RLRUq81oJNSKPZz4ToCmin7ymCdMpCJiiRx5c1RGZuILiLcU3zCZI2bN9UNgfTHnE4arcJzjwSOeuzFSn948Lr0w6kUaZQjJVzLozu2hBhhb8Kps4ekLWmrsca2c2VmjT9kKEihfCX4s1Pfv9aJyVpT3EGwH7vd9fr9k5G2RtKY=");
  778. Assert.AreEqual (wk, token.GetWrappedKey (), "#4");
  779. }
  780. }
  781. [Test]
  782. public void ReadWrappedKeySecurityTokenImplCheck ()
  783. {
  784. SecurityTokenResolver tokenResolver = GetResolver (new X509SecurityToken (cert));
  785. XmlReader reader = XmlReader.Create (new StringReader (wrapped_key1));
  786. WSSecurityTokenSerializer serializer =
  787. WSSecurityTokenSerializer.DefaultInstance;
  788. EncryptedKey ek = new EncryptedKey ();
  789. ek.LoadXml (new XmlDocument ().ReadNode (reader) as XmlElement);
  790. SecurityKeyIdentifier ki = new SecurityKeyIdentifier ();
  791. foreach (KeyInfoClause kic in ek.KeyInfo)
  792. ki.Add (serializer.ReadKeyIdentifierClause (new XmlNodeReader (kic.GetXml ())));
  793. SecurityToken token = tokenResolver.ResolveToken (ki);
  794. string alg = ek.EncryptionMethod.KeyAlgorithm;
  795. SecurityKey skey = token.SecurityKeys [0];
  796. Assert.IsTrue (skey is X509AsymmetricSecurityKey, "#1");
  797. Assert.IsTrue (skey.IsSupportedAlgorithm (alg), "#2");
  798. Assert.AreEqual (
  799. EncryptedXml.DecryptKey (ek.CipherData.CipherValue, cert.PrivateKey as RSA, true),
  800. skey.DecryptKey (alg, ek.CipherData.CipherValue),
  801. "#3");
  802. byte [] key = skey.DecryptKey (alg, ek.CipherData.CipherValue);
  803. WrappedKeySecurityToken wk =
  804. new WrappedKeySecurityToken (ek.Id, key, alg, token, ki);
  805. Assert.AreEqual (
  806. EncryptedXml.DecryptKey (ek.CipherData.CipherValue, cert.PrivateKey as RSA, true),
  807. skey.DecryptKey (alg, wk.GetWrappedKey ()),
  808. "#4");
  809. }
  810. [Test]
  811. // It raises strange XmlException that wraps ArgumentNullException. Too silly to follow.
  812. public void ReadWrappedKeySecurityTokenNullResolver ()
  813. {
  814. WSSecurityTokenSerializer serializer =
  815. WSSecurityTokenSerializer.DefaultInstance;
  816. using (XmlReader xr = XmlReader.Create (new StringReader (wrapped_key1))) {
  817. try {
  818. serializer.ReadToken (xr, null);
  819. Assert.Fail ("Should fail due to the lack of resolver");
  820. } catch {
  821. }
  822. }
  823. }
  824. [Test]
  825. [Ignore ("not sure how we can consume this RequestedProofToken yet.")]
  826. public void ReadTlsnegoRequestedProofToken ()
  827. {
  828. 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>";
  829. WSSecurityTokenSerializer serializer =
  830. WSSecurityTokenSerializer.DefaultInstance;
  831. using (XmlReader xr = XmlReader.Create (new StringReader (xml))) {
  832. serializer.ReadToken (xr, GetResolver (new X509SecurityToken (cert, "urn:unique-id:foo")));
  833. }
  834. }
  835. class MyResolver : SecurityTokenResolver
  836. {
  837. protected override bool TryResolveTokenCore (SecurityKeyIdentifier ident, out SecurityToken token)
  838. {
  839. throw new Exception ("1");
  840. // token = null;
  841. // return false;
  842. }
  843. protected override bool TryResolveTokenCore (SecurityKeyIdentifierClause clause, out SecurityToken token)
  844. {
  845. throw new Exception ("2");
  846. // token = null;
  847. // return false;
  848. }
  849. protected override bool TryResolveSecurityKeyCore (SecurityKeyIdentifierClause clause, out SecurityKey key)
  850. {
  851. throw new Exception ("3");
  852. // key = null;
  853. // return false;
  854. }
  855. }
  856. SecurityTokenResolver GetResolver (params SecurityToken [] tokens)
  857. {
  858. return SecurityTokenResolver.CreateDefaultSecurityTokenResolver (
  859. new ReadOnlyCollection<SecurityToken> (tokens), true);
  860. }
  861. [Test]
  862. public void GetTokenTypeUri ()
  863. {
  864. new MyWSSecurityTokenSerializer ().TestGetTokenTypeUri ();
  865. }
  866. }
  867. class MyWSSecurityTokenSerializer : WSSecurityTokenSerializer
  868. {
  869. public void TestGetTokenTypeUri ()
  870. {
  871. Assert.IsNull (GetTokenTypeUri (GetType ()), "#1");
  872. Assert.AreEqual ("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3",
  873. GetTokenTypeUri (typeof (X509SecurityToken)), "#2");
  874. Assert.IsNull (GetTokenTypeUri (typeof (RsaSecurityToken)), "#3");
  875. Assert.AreEqual ("http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1",
  876. GetTokenTypeUri (typeof (SamlSecurityToken)), "#4");
  877. Assert.AreEqual ("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken",
  878. GetTokenTypeUri (typeof (UserNameSecurityToken)), "#5");
  879. Assert.IsNull (GetTokenTypeUri (typeof (SspiSecurityToken)), "#6");
  880. Assert.AreEqual ("http://schemas.xmlsoap.org/ws/2005/02/sc/sct",
  881. GetTokenTypeUri (typeof (SecurityContextSecurityToken)), "#7");
  882. Assert.IsNull (GetTokenTypeUri (typeof (GenericXmlSecurityToken)), "#8");
  883. Assert.AreEqual ("http://docs.oasis-open.org/wss/oasis-wss-kerberos-token-profile-1.1#GSS_Kerberosv5_AP_REQ",
  884. GetTokenTypeUri (typeof (KerberosRequestorSecurityToken)), "#9");
  885. Assert.AreEqual ("http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#EncryptedKey",
  886. GetTokenTypeUri (typeof (WrappedKeySecurityToken)), "#10");
  887. }
  888. }
  889. }