Author: atsushi
Date: 2007-02-20 21:34:10 -0500 (Tue, 20 Feb 2007)
New Revision: 73230

Added:
   
trunk/olive/class/System.ServiceModel/System.ServiceModel.Security.Tokens/DerivedKeySecurityToken.cs
Modified:
   trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog
   
trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/SecureMessageDecryptor.cs
   
trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/SecureMessageGenerator.cs
   
trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/WSSecurityMessageHeader.cs
   
trunk/olive/class/System.ServiceModel/System.ServiceModel.Security.Tokens/ChangeLog
   trunk/olive/class/System.ServiceModel/System.ServiceModel.Security/ChangeLog
   
trunk/olive/class/System.ServiceModel/System.ServiceModel.Security/WSSecurityTokenSerializer.cs
   trunk/olive/class/System.ServiceModel/System.ServiceModel.dll.sources
   trunk/olive/class/System.ServiceModel/System.ServiceModel/ChangeLog
   trunk/olive/class/System.ServiceModel/System.ServiceModel/Constants.cs
   
trunk/olive/class/System.ServiceModel/Test/System.ServiceModel.Security/ChangeLog
   
trunk/olive/class/System.ServiceModel/Test/System.ServiceModel.Security/WSSecurityTokenSerializerTest.cs
Log:
2007-02-21  Atsushi Enomoto  <[EMAIL PROTECTED]>

        * DerivedKeySecurityToken.cs : new internal class to represent
          wssc:DerivedKeyToken.

        * WSSecurityTokenSerializer.cs : read/write DerivedKeyToken.
          Supply OwnerType for LocalId key when there is ValueType attribute.

        * Constants.cs : added WssdDefaultLabel.

        * WSSecurityMessageHeader.cs, SecureMessageDecryptor.cs,
          SecureMessageDecryptor.cs :
          Implemented increment token reading in o:Security, as
          DerivedKeyToken could reference to existing wrapped key.
          Removed WsscDerivedKeyToken and all relevant code.
        * SecureMessageGenerator.cs : replaced WsscDerivedKeyToken with
          DerivedKeySecurityToken.

        * WSSecurityTokenSerializerTest.cs : fixed DerivedKeyToken reader
          tests, and added more.



Modified: trunk/olive/class/System.ServiceModel/System.ServiceModel/ChangeLog
===================================================================
--- trunk/olive/class/System.ServiceModel/System.ServiceModel/ChangeLog 
2007-02-21 01:41:09 UTC (rev 73229)
+++ trunk/olive/class/System.ServiceModel/System.ServiceModel/ChangeLog 
2007-02-21 02:34:10 UTC (rev 73230)
@@ -1,3 +1,7 @@
+2007-02-21  Atsushi Enomoto  <[EMAIL PROTECTED]>
+
+       * Constants.cs : added WssdDefaultLabel.
+
 2007-02-14  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
        * ServiceRuntimeChannel.cs : ... and largely implemented.

Modified: trunk/olive/class/System.ServiceModel/System.ServiceModel/Constants.cs
===================================================================
--- trunk/olive/class/System.ServiceModel/System.ServiceModel/Constants.cs      
2007-02-21 01:41:09 UTC (rev 73229)
+++ trunk/olive/class/System.ServiceModel/System.ServiceModel/Constants.cs      
2007-02-21 02:34:10 UTC (rev 73230)
@@ -82,5 +82,7 @@
                public const string WstCancelReplyAction = 
"http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Cancel";;
 
                public const string WstValidateReplyAction = 
"http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Validate";;
+
+               public const string WsscDefaultLabel = 
"WS-SecureConversationWS-SecureConversation";
        }
 }

Modified: 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog
===================================================================
--- 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog    
    2007-02-21 01:41:09 UTC (rev 73229)
+++ 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/ChangeLog    
    2007-02-21 02:34:10 UTC (rev 73230)
@@ -1,3 +1,13 @@
+2007-02-21  Atsushi Enomoto  <[EMAIL PROTECTED]>
+
+       * WSSecurityMessageHeader.cs, SecureMessageDecryptor.cs,
+         SecureMessageDecryptor.cs :
+         Implemented increment token reading in o:Security, as
+         DerivedKeyToken could reference to existing wrapped key.
+         Removed WsscDerivedKeyToken and all relevant code.
+       * SecureMessageGenerator.cs : replaced WsscDerivedKeyToken with
+         DerivedKeySecurityToken.
+
 2007-02-16  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
        * SecureMessageGenerator.cs : it was setting security tokens into

Modified: 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/SecureMessageDecryptor.cs
===================================================================
--- 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/SecureMessageDecryptor.cs
        2007-02-21 01:41:09 UTC (rev 73229)
+++ 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/SecureMessageDecryptor.cs
        2007-02-21 02:34:10 UTC (rev 73230)
@@ -221,7 +221,7 @@
                                    header.Name == "Security") {
                                        wss_header = 
WSSecurityMessageHeader.Read (
                                                
srcmsg.Headers.GetReaderAtHeader (i),
-                                               serializer, TokenResolver, doc, 
nsmgr);
+                                               serializer, TokenResolver, doc, 
nsmgr, tokens);
                                        headers.Add (wss_header);
                                }
                                else
@@ -229,10 +229,6 @@
                        }
                        if (wss_header == null)
                                throw new InvalidOperationException ("In this 
service contract, a WS-Security header is required in the Message, but was not 
found.");
-
-                       foreach (object obj in wss_header.Contents)
-                               if (obj is SecurityToken)
-                                       tokens.Add ((SecurityToken) obj);
                }
 
                void ExtractSecurity (XmlElement secElem)

Modified: 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/SecureMessageGenerator.cs
===================================================================
--- 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/SecureMessageGenerator.cs
        2007-02-21 01:41:09 UTC (rev 73229)
+++ 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/SecureMessageGenerator.cs
        2007-02-21 02:34:10 UTC (rev 73230)
@@ -322,10 +322,9 @@
                        Signature sig = null;
                        EncryptedData sigenc = null;
 
+                       List<DerivedKeySecurityToken> derivedKeys =
+                               new List<DerivedKeySecurityToken> ();
 
-                       List<WsscDerivedKeyToken> derivedKeys =
-                               new List<WsscDerivedKeyToken> ();
-
                        XmlElement body = doc.SelectSingleNode 
("/s:Envelope/s:Body/*", nsmgr) as XmlElement;
                        string bodyId = null;
 
@@ -357,29 +356,11 @@
                        MessagePartSpecification sigSpec = SignaturePart;
                        MessagePartSpecification encSpec = EncryptionPart;
 
-                       WsscDerivedKeyToken derivedKey = null;
-
                        // encryption key (possibly also used for signing)
                        // FIXME: get correct SymmetricAlgorithm according to 
the algorithm suite
                        if (secprop.EncryptionKey != null)
                                pkey.Key = secprop.EncryptionKey;
 
-                       // generate derived key if needed
-                       if (CounterParameters.RequireDerivedKeys) {
-                               // FIXME: it should replace pkey
-                               RijndaelManaged deriv = new RijndaelManaged ();
-                               deriv.KeySize = 
suite.DefaultEncryptionKeyDerivationLength;
-                               deriv.Mode = CipherMode.CBC;
-                               deriv.Padding = PaddingMode.ISO10126;
-                               deriv.GenerateKey ();
-                               derivedKey = new WsscDerivedKeyToken ();
-                               derivedKey.Id = GenerateId (doc);
-                               derivedKey.Offset = 0;
-                               derivedKey.Nonce = deriv.Key;
-                               derivedKey.Length = derivedKey.Nonce.Length;
-                               derivedKeys.Add (derivedKey);
-                       }
-
                        string ekeyId = messageId + "-" + identForMessageId++;
 
                        ekey = new WrappedKeySecurityToken (ekeyId,
@@ -391,15 +372,33 @@
                                encToken,
                                encClause != null ? new SecurityKeyIdentifier 
(encClause) : null);
 
-                       if (derivedKey != null)
-                               derivedKey.SecurityTokenReference =
-                                       new LocalIdKeyIdentifierClause (ekeyId, 
typeof (WrappedKeySecurityToken));
-
                        WrappedKeySecurityToken reqEncKey = 
ShouldOutputEncryptedKey ? null : 
RequestContext.RequestMessage.Properties.Security.ProtectionToken.SecurityToken 
as WrappedKeySecurityToken;
                        ekeyClause = reqEncKey == null ? 
(SecurityKeyIdentifierClause)
                                new LocalIdKeyIdentifierClause (ekeyId, typeof 
(WrappedKeySecurityToken)) :
                                new InternalEncryptedKeyIdentifierClause 
(sha1.ComputeHash (reqEncKey.GetWrappedKey ()));
 
+                       // generate derived key if needed
+                       if (CounterParameters.RequireDerivedKeys) {
+                               // FIXME: it should replace pkey
+                               RijndaelManaged deriv = new RijndaelManaged ();
+                               deriv.KeySize = 
suite.DefaultEncryptionKeyDerivationLength;
+                               deriv.Mode = CipherMode.CBC;
+                               deriv.Padding = PaddingMode.ISO10126;
+                               deriv.GenerateKey ();
+                               DerivedKeySecurityToken derivedKey = new 
DerivedKeySecurityToken (
+                                       GenerateId (doc),
+                                       null, // algorithm
+                                       ekeyClause,
+                                       new InMemorySymmetricSecurityKey 
(pkey.Key),
+                                       null, // name
+                                       null, // generation
+                                       null, // offset
+                                       deriv.Key.Length,
+                                       null, // label
+                                       deriv.Key);
+                               derivedKeys.Add (derivedKey);
+                       }
+
                        switch (protectionOrder) {
                        case MessageProtectionOrder.EncryptBeforeSign:
                                // FIXME: implement
@@ -524,7 +523,7 @@
                        if (ShouldOutputEncryptedKey)
                                header.Contents.Add (ekey);
 
-                       foreach (WsscDerivedKeyToken dk in derivedKeys)
+                       foreach (DerivedKeySecurityToken dk in derivedKeys)
                                header.Contents.Add (dk);
 
                        // When we do not output EncryptedKey, output 
ReferenceList here.

Modified: 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/WSSecurityMessageHeader.cs
===================================================================
--- 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/WSSecurityMessageHeader.cs
       2007-02-21 01:41:09 UTC (rev 73229)
+++ 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Channels/WSSecurityMessageHeader.cs
       2007-02-21 02:34:10 UTC (rev 73230)
@@ -45,7 +45,7 @@
 {
        internal class WSSecurityMessageHeader : MessageHeader
        {
-               public static WSSecurityMessageHeader Read (XmlDictionaryReader 
reader, SecurityTokenSerializer serializer, SecurityTokenResolver resolver, 
XmlDocument doc, XmlNamespaceManager nsmgr)
+               public static WSSecurityMessageHeader Read (XmlDictionaryReader 
reader, SecurityTokenSerializer serializer, SecurityTokenResolver resolver, 
XmlDocument doc, XmlNamespaceManager nsmgr, List<SecurityToken> tokens)
                {
                        WSSecurityMessageHeader ret = new 
WSSecurityMessageHeader (serializer);
 
@@ -65,14 +65,6 @@
                                                continue;
                                        }
                                        break;
-                               case Constants.WsscNamespace:
-                                       switch (reader.LocalName) {
-                                       case "DerivedKeyToken":
-                                               // FIXME: actually 
DerivedKeyToken should be read via WSSecurityTokenSerializer, but o
-                                               ret.Contents.Add 
(ReadDerivedKeyToken (reader, doc, serializer));
-                                               continue;
-                                       }
-                                       break;
                                //case Constants.WstNamespace:
                                case Constants.Wss11Namespace:
                                        if (reader.LocalName == 
"SignatureConfirmation") {
@@ -127,8 +119,11 @@
                                // This order (Token->KeyIdentifierClause) is
                                // important because WrappedKey could be read
                                // in both context (but must be a token here).
-                               if (serializer.CanReadToken (reader))
-                                       ret.Contents.Add (serializer.ReadToken 
(reader, resolver));
+                               if (serializer.CanReadToken (reader)) {
+                                       SecurityToken token = 
serializer.ReadToken (reader, resolver);
+                                       tokens.Add (token);
+                                       ret.Contents.Add (token);
+                               }
                                else if (serializer.CanReadKeyIdentifierClause 
(reader))
                                        ret.Contents.Add 
(serializer.ReadKeyIdentifierClause (reader));
                                else
@@ -164,46 +159,6 @@
                        return new Wss11SignatureConfirmation (id, value);
                }
 
-               static WsscDerivedKeyToken ReadDerivedKeyToken (XmlReader 
reader, XmlDocument doc, SecurityTokenSerializer serializer)
-               {
-                       WsscDerivedKeyToken dkt = new WsscDerivedKeyToken ();
-                       dkt.Id = reader.GetAttribute ("Id", 
Constants.WsuNamespace);
-                       dkt.Algorithm = reader.GetAttribute ("Algorithm", 
String.Empty);
-                       reader.ReadStartElement ();
-                       
-                       for (reader.MoveToContent ();
-                            reader.NodeType != XmlNodeType.EndElement;
-                            reader.MoveToContent ()) {
-                               if (reader.NodeType != XmlNodeType.Element)
-                                       throw new XmlException (String.Format 
("Unexpected {0} node in DerivedKeyToken element.", reader.NodeType));
-                               switch (reader.NamespaceURI) {
-                               case Constants.WssNamespace:
-                                       switch (reader.LocalName) {
-                                       case "SecurityTokenReference":
-                                               dkt.SecurityTokenReference = 
serializer.ReadKeyIdentifierClause (reader);
-                                               continue;
-                                       }
-                                       break;
-                               case Constants.WsscNamespace:
-                                       switch (reader.LocalName) {
-                                       case "Length":
-                                               dkt.Length = 
reader.ReadElementContentAsInt ();
-                                               continue;
-                                       case "Offset":
-                                               dkt.Offset= 
reader.ReadElementContentAsInt ();
-                                               continue;
-                                       case "Nonce":
-                                               dkt.Nonce = 
Convert.FromBase64String (reader.ReadElementContentAsString ());
-                                               continue;
-                                       }
-                                       break;
-                               }
-                               throw new XmlException (String.Format 
("Unexpected element in DerivedKeyToken element. Name is '{0}' and namespace 
URI is '{1}'.", reader.Name, reader.NamespaceURI));
-                       }
-                       reader.ReadEndElement ();
-                       return dkt;
-               }
-
                static WsuTimestamp ReadTimestamp (XmlDictionaryReader reader)
                {
                        WsuTimestamp ret = new WsuTimestamp ();
@@ -280,28 +235,6 @@
                                if (obj is WsuTimestamp) {
                                        WsuTimestamp ts = (WsuTimestamp) obj;
                                        ts.WriteTo (writer);
-                               } else if (obj is WsscDerivedKeyToken) {
-                                       WsscDerivedKeyToken dk = 
(WsscDerivedKeyToken) obj;
-                                       writer.WriteStartElement ("c", 
"DerivedKeyToken", Constants.WsscNamespace);
-                                       if (dk.Id != null)
-                                               writer.WriteAttributeString 
("u", "Id", Constants.WsuNamespace, dk.Id);
-                                       if (dk.Algorithm != null)
-                                               writer.WriteAttributeString 
("Algorithm", dk.Algorithm);
-                                       serializer.WriteKeyIdentifierClause 
(writer, dk.SecurityTokenReference);
-                                       writer.WriteStartElement ("Offset", 
Constants.WsscNamespace);
-                                       writer.WriteValue (dk.Offset);
-                                       writer.WriteEndElement ();
-
-                                       writer.WriteStartElement ("Length", 
Constants.WsscNamespace);
-                                       writer.WriteValue (dk.Length);
-                                       writer.WriteEndElement ();
-
-                                       writer.WriteStartElement ("Nonce", 
Constants.WsscNamespace);
-                                       byte [] bytes = dk.Nonce;
-                                       writer.WriteBase64 (bytes, 0, 
bytes.Length);
-                                       writer.WriteEndElement ();
-
-                                       writer.WriteEndElement ();
                                } else if (obj is SecurityToken) {
                                        serializer.WriteToken (writer, 
(SecurityToken) obj);
                                } else if (obj is EncryptedKey) {
@@ -369,16 +302,6 @@
                }
        }
 
-       internal class WsscDerivedKeyToken
-       {
-               public string Id;
-               public string Algorithm;
-               public SecurityKeyIdentifierClause SecurityTokenReference;
-               public int Length;
-               public int Offset;
-               public byte [] Nonce;
-       }
-
        internal class SecurityTokenReferenceKeyInfo : KeyInfoClause
        {
                SecurityKeyIdentifierClause clause;

Modified: 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Security/ChangeLog
===================================================================
--- 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Security/ChangeLog    
    2007-02-21 01:41:09 UTC (rev 73229)
+++ 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Security/ChangeLog    
    2007-02-21 02:34:10 UTC (rev 73230)
@@ -1,3 +1,8 @@
+2007-02-21  Atsushi Enomoto  <[EMAIL PROTECTED]>
+
+       * WSSecurityTokenSerializer.cs : read/write DerivedKeyToken.
+         Supply OwnerType for LocalId key when there is ValueType attribute.
+
 2007-02-20  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
        * WSSecurityTokenSerializer.cs : handle X509 issue serial key

Modified: 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Security/WSSecurityTokenSerializer.cs
===================================================================
--- 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Security/WSSecurityTokenSerializer.cs
     2007-02-21 01:41:09 UTC (rev 73229)
+++ 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Security/WSSecurityTokenSerializer.cs
     2007-02-21 02:34:10 UTC (rev 73230)
@@ -32,6 +32,7 @@
 using System.Security.Cryptography.X509Certificates;
 using System.Security.Cryptography.Xml;
 using System.ServiceModel.Security.Tokens;
+using System.Text;
 using System.Xml;
 
 namespace System.ServiceModel.Security
@@ -216,6 +217,10 @@
                                        return true;
                                }
                                break;
+                       case Constants.WsscNamespace:
+                               if (reader.LocalName == "DerivedKeyToken")
+                                       return true;
+                               break;
                        case EncryptedXml.XmlEncNamespaceUrl:
                                switch (reader.LocalName) {
                                case "EncryptedKey":
@@ -281,10 +286,17 @@
 
                        switch (reader.LocalName) {
                        case "Reference":
+                               Type ownerType = null;
+                               if (reader.MoveToAttribute ("ValueType")) {
+                                       if (reader.Value != 
Constants.WSSEncryptedKeyToken)
+                                               throw new XmlException 
("Unexpected ValueType in 'Reference' element");
+                                       ownerType = typeof 
(WrappedKeySecurityToken);
+                               }
+                               reader.MoveToElement ();
                                string uri = reader.GetAttribute ("URI");
                                if (uri == null)
                                        uri = "#";
-                               LocalIdKeyIdentifierClause local = new 
LocalIdKeyIdentifierClause (uri.Substring (1));
+                               LocalIdKeyIdentifierClause local = new 
LocalIdKeyIdentifierClause (uri.Substring (1), ownerType);
                                reader.Skip ();
                                reader.MoveToContent ();
                                reader.ReadEndElement ();
@@ -378,6 +390,10 @@
                                        return ReadUserNameTokenCore (reader, 
tokenResolver);
                                }
                                break;
+                       case Constants.WsscNamespace:
+                               if (reader.LocalName == "DerivedKeyToken")
+                                       return ReadDerivedKeyToken (reader, 
tokenResolver);
+                               break;
                        case EncryptedXml.XmlEncNamespaceUrl:
                                switch (reader.LocalName) {
                                case "EncryptedKey":
@@ -389,6 +405,77 @@
                        throw new NotImplementedException ();
                }
 
+               DerivedKeySecurityToken ReadDerivedKeyToken (
+                       XmlReader reader, SecurityTokenResolver tokenResolver)
+               {
+                       try {
+                               return ReadDerivedKeyTokenCore (reader, 
tokenResolver);
+                       } catch (XmlException) {
+                               throw;
+                       } catch (Exception ex) {
+                               throw new XmlException ("Cannot read 
DerivedKeyToken", ex);
+                       }
+               }
+               
+               DerivedKeySecurityToken ReadDerivedKeyTokenCore (
+                       XmlReader reader, SecurityTokenResolver tokenResolver)
+               {
+                       if (tokenResolver == null)
+                               throw new ArgumentNullException 
("tokenResolver");
+                       string id = reader.GetAttribute ("Id", 
Constants.WsuNamespace);
+                       string algorithm = reader.MoveToAttribute ("Algorithm") 
? reader.Value : null;
+                       reader.MoveToElement ();
+                       reader.ReadStartElement ();
+                       reader.MoveToContent ();
+                       SecurityKeyIdentifierClause kic = 
ReadKeyIdentifierClause (reader);
+                       int? generation = null, offset = null, length = null;
+                       byte [] nonce = null;
+                       string name = null, label = null;
+                       for (reader.MoveToContent ();
+                              reader.NodeType != XmlNodeType.EndElement;
+                              reader.MoveToContent ())
+                               switch (reader.LocalName) {
+                               case "Properties":
+                                       reader.ReadStartElement ("Properties", 
Constants.WsscNamespace);
+                                       for (reader.MoveToContent ();
+                                              reader.NodeType != 
XmlNodeType.EndElement;
+                                              reader.MoveToContent ())
+                                               switch (reader.LocalName) {
+                                               case "Name":
+                                                       name = 
reader.ReadElementContentAsString ("Name", Constants.WsscNamespace);
+                                                       break;
+                                               case "Label":
+                                                       label = 
reader.ReadElementContentAsString ("Label", Constants.WsscNamespace);
+                                                       break;
+                                               case "Nonce":
+                                                       nonce = 
Convert.FromBase64String (reader.ReadElementContentAsString ("Nonce", 
Constants.WsscNamespace));
+                                                       break;
+                                               }
+                                       reader.ReadEndElement ();
+                                       break;
+                               case "Offset":
+                                       offset = reader.ReadElementContentAsInt 
("Offset", Constants.WsscNamespace);
+                                       break;
+                               case "Length":
+                                       length = reader.ReadElementContentAsInt 
("Length", Constants.WsscNamespace);
+                                       break;
+                               case "Nonce":
+                                       nonce = Convert.FromBase64String 
(reader.ReadElementContentAsString ("Nonce", Constants.WsscNamespace));
+                                       break;
+                               case "Label":
+                                       label = 
reader.ReadElementContentAsString ("Label", Constants.WsscNamespace);
+                                       break;
+                               }
+                       reader.ReadEndElement ();
+
+                       // resolve key reference
+                       SymmetricSecurityKey key = 
tokenResolver.ResolveSecurityKey (kic) as SymmetricSecurityKey;
+                       if (key == null)
+                               throw new XmlException ("Cannot resolve the 
security key referenced by the DerivedKeyToken as a symmetric key");
+
+                       return new DerivedKeySecurityToken (id, algorithm, kic, 
key, name, generation, offset, length, label, nonce);
+               }
+
                WrappedKeySecurityToken ReadWrappedKeySecurityTokenCore (
                        XmlReader reader, SecurityTokenResolver tokenResolver)
                {
@@ -632,6 +719,8 @@
                                throw new NotImplementedException 
("WriteTokenCore() is not implemented for " + token);
                        else if (token is WrappedKeySecurityToken)
                                WriteWrappedKeySecurityToken (writer, 
(WrappedKeySecurityToken) token);
+                       else if (token is DerivedKeySecurityToken)
+                               WriteDerivedKeySecurityToken (writer, 
(DerivedKeySecurityToken) token);
                        else if (token is SecurityContextSecurityToken)
                                throw new NotImplementedException 
("WriteTokenCore() is not implemented for " + token);
                        else if (token is SspiSecurityToken)
@@ -674,6 +763,27 @@
                        w.WriteEndElement ();
                }
 
+               void WriteDerivedKeySecurityToken (XmlWriter w, 
DerivedKeySecurityToken token)
+               {
+                       string ns = Constants.WsscNamespace;
+                       w.WriteStartElement ("c", "DerivedKeyToken", ns);
+                       w.WriteAttributeString ("u", "Id", 
Constants.WsuNamespace, token.Id);
+                       WriteKeyIdentifierClause (w, token.TokenReference);
+                       if (token.Name != null) {
+                               w.WriteStartElement ("Properties", ns);
+                               w.WriteElementString ("Name", ns, token.Name);
+                               w.WriteEndElement ();
+                       }
+                       if (token.Offset != null)
+                               w.WriteElementString ("Offset", ns, 
Convert.ToString (token.Offset));
+                       if (token.Length != null)
+                               w.WriteElementString ("Length", ns, 
Convert.ToString (token.Length));
+                       if (token.Label != null)
+                               w.WriteElementString ("Label", ns, token.Label);
+                       w.WriteElementString ("Nonce", ns, 
Convert.ToBase64String (token.Nonce));
+                       w.WriteEndElement ();
+               }
+
                void WriteWrappedKeySecurityToken (XmlWriter w, 
WrappedKeySecurityToken token)
                {
                        string encNS = EncryptedXml.XmlEncNamespaceUrl;

Modified: 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Security.Tokens/ChangeLog
===================================================================
--- 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Security.Tokens/ChangeLog
 2007-02-21 01:41:09 UTC (rev 73229)
+++ 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Security.Tokens/ChangeLog
 2007-02-21 02:34:10 UTC (rev 73230)
@@ -1,3 +1,8 @@
+2007-02-21  Atsushi Enomoto  <[EMAIL PROTECTED]>
+
+       * DerivedKeySecurityToken.cs : new internal class to represent
+         wssc:DerivedKeyToken.
+
 2007-02-16  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
        * WrappedKeySecurityToken.cs : reverted previous change. Key hash

Added: 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Security.Tokens/DerivedKeySecurityToken.cs
===================================================================
--- 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Security.Tokens/DerivedKeySecurityToken.cs
        2007-02-21 01:41:09 UTC (rev 73229)
+++ 
trunk/olive/class/System.ServiceModel/System.ServiceModel.Security.Tokens/DerivedKeySecurityToken.cs
        2007-02-21 02:34:10 UTC (rev 73230)
@@ -0,0 +1,115 @@
+using System;
+using System.Collections.ObjectModel;
+using System.IdentityModel.Selectors;
+using System.IdentityModel.Tokens;
+using System.ServiceModel;
+using System.ServiceModel.Security;
+using System.Text;
+
+namespace System.ServiceModel.Security.Tokens
+{
+       internal class DerivedKeySecurityToken : SecurityToken
+       {
+               string algorithm;
+               SecurityKeyIdentifierClause reference;
+               SecurityToken resolved_token; // store resolved one.
+               int? generation, offset, length;
+               // properties
+               string id, name, label;
+               byte [] nonce;
+               ReadOnlyCollection<SecurityKey> keys;
+
+               public DerivedKeySecurityToken (string id, string algorithm,
+                       SecurityKeyIdentifierClause reference,
+                       SymmetricSecurityKey referencedKey,
+                       string name,
+                       int? generation,
+                       int? offset,
+                       int? length,
+                       string label,
+                       byte [] nonce)
+               {
+                       algorithm = algorithm ?? 
SecurityAlgorithms.Psha1KeyDerivation;
+
+                       this.id = id;
+                       this.algorithm = algorithm;
+                       this.reference = reference;
+                       this.generation = generation;
+                       this.offset = offset;
+                       this.length = length;
+                       this.nonce = nonce;
+                       this.name = name;
+                       this.label = label;
+
+                       SecurityKey key = new InMemorySymmetricSecurityKey (
+                               referencedKey.GenerateDerivedKey (
+                                       algorithm,
+                                       Encoding.UTF8.GetBytes (label ?? 
Constants.WsscDefaultLabel),
+                                       nonce,
+                                       (length ?? 32) * 8,
+                                       offset ?? 0));
+                       keys = new ReadOnlyCollection<SecurityKey> (
+                               new SecurityKey [] {key});
+               }
+
+               public override string Id {
+                       get { return id; }
+               }
+
+               public override ReadOnlyCollection<SecurityKey> SecurityKeys {
+                       get { return keys; }
+               }
+
+               public override DateTime ValidFrom {
+                       get { return resolved_token.ValidFrom; }
+               }
+
+               public override DateTime ValidTo {
+                       get { return resolved_token.ValidTo; }
+               }
+
+               public SecurityKeyIdentifierClause TokenReference {
+                       get { return reference; }
+               }
+
+               public int? Generation {
+                       get { return generation; }
+               }
+
+               public int? Length {
+                       get { return length; }
+               }
+
+               public int? Offset {
+                       get { return offset; }
+               }
+
+               public string Label {
+                       get { return label; }
+               }
+
+               public byte [] Nonce {
+                       get { return nonce; }
+               }
+
+               public string Name {
+                       get { return name; }
+               }
+
+               public override bool MatchesKeyIdentifierClause (
+                       SecurityKeyIdentifierClause keyIdentifierClause)
+               {
+                       LocalIdKeyIdentifierClause l = keyIdentifierClause
+                               as LocalIdKeyIdentifierClause;
+                       return l != null && l.LocalId == Id;
+               }
+
+               public override SecurityKey ResolveKeyIdentifierClause (
+                       SecurityKeyIdentifierClause keyIdentifierClause)
+               {
+                       LocalIdKeyIdentifierClause l = keyIdentifierClause
+                               as LocalIdKeyIdentifierClause;
+                       return keys [0];
+               }
+       }
+}

Modified: trunk/olive/class/System.ServiceModel/System.ServiceModel.dll.sources
===================================================================
--- trunk/olive/class/System.ServiceModel/System.ServiceModel.dll.sources       
2007-02-21 01:41:09 UTC (rev 73229)
+++ trunk/olive/class/System.ServiceModel/System.ServiceModel.dll.sources       
2007-02-21 02:34:10 UTC (rev 73230)
@@ -535,6 +535,7 @@
 System.ServiceModel.Security.Tokens/BinarySecretSecurityToken.cs
 System.ServiceModel.Security.Tokens/ClaimTypeRequirement.cs
 System.ServiceModel.Security.Tokens/CommunicationSecurityTokenProvider.cs
+System.ServiceModel.Security.Tokens/DerivedKeySecurityToken.cs
 System.ServiceModel.Security.Tokens/IIssuanceSecurityTokenAuthenticator.cs
 System.ServiceModel.Security.Tokens/ISecurityContextSecurityTokenCache.cs
 
System.ServiceModel.Security.Tokens/InitiatorServiceModelSecurityTokenRequirement.cs

Modified: 
trunk/olive/class/System.ServiceModel/Test/System.ServiceModel.Security/ChangeLog
===================================================================
--- 
trunk/olive/class/System.ServiceModel/Test/System.ServiceModel.Security/ChangeLog
   2007-02-21 01:41:09 UTC (rev 73229)
+++ 
trunk/olive/class/System.ServiceModel/Test/System.ServiceModel.Security/ChangeLog
   2007-02-21 02:34:10 UTC (rev 73230)
@@ -1,3 +1,8 @@
+2007-02-21  Atsushi Enomoto  <[EMAIL PROTECTED]>
+
+       * WSSecurityTokenSerializerTest.cs : fixed DerivedKeyToken reader
+         tests, and added more.
+
 2007-02-16  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
        * WSSecurityTokenSerializerTest.cs : more WrappedKeySecurityToken.

Modified: 
trunk/olive/class/System.ServiceModel/Test/System.ServiceModel.Security/WSSecurityTokenSerializerTest.cs
===================================================================
--- 
trunk/olive/class/System.ServiceModel/Test/System.ServiceModel.Security/WSSecurityTokenSerializerTest.cs
    2007-02-21 01:41:09 UTC (rev 73229)
+++ 
trunk/olive/class/System.ServiceModel/Test/System.ServiceModel.Security/WSSecurityTokenSerializerTest.cs
    2007-02-21 02:34:10 UTC (rev 73230)
@@ -51,17 +51,24 @@
 
                static X509Certificate2 cert = new X509Certificate2 
("Test/Resources/test.pfx", "mono");
 
-               const string derived_key_token1 = @"<c:DerivedKeyToken 
xmlns:c='http://schemas.xmlsoap.org/ws/2005/02/sc'>
-        <o:SecurityTokenReference 
xmlns:o='http://docs.oasis-open.org/wss/2004/0
-1/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' />
+               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>
@@ -585,7 +592,6 @@
 
                [Test]
                [ExpectedException (typeof (XmlException))] // tokenResolver is 
null
-               [Category ("NotWorking")]
                public void ReadTokenDerivedKeyTokenNullResolver ()
                {
                        WSSecurityTokenSerializer serializer =
@@ -597,7 +603,6 @@
 
                [Test]
                [ExpectedException (typeof (XmlException))] // DerivedKeyToken 
requires a reference to an existent token.
-               [Category ("NotWorking")]
                public void ReadTokenDerivedKeyTokenRefToNonExistent ()
                {
                        WSSecurityTokenSerializer serializer =
@@ -608,19 +613,55 @@
                }
 
                [Test]
-               [Ignore ("still fails")]
-               public void ReadTokenDerivedKeyTokenRefToExistent ()
+               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", ""), 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))) {
-                               SecurityToken token = serializer.ReadToken (xr,
+                               // 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")));
-                               Assert.IsTrue (token is 
SecurityContextSecurityToken, "#1");
                        }
                }
 
                [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 ()
                {

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to