132 lines
4.7 KiB
C#
132 lines
4.7 KiB
C#
|
//------------------------------------------------------------
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//------------------------------------------------------------
|
||
|
|
||
|
namespace System.ServiceModel.Security
|
||
|
{
|
||
|
using System.IdentityModel;
|
||
|
using System.Runtime.CompilerServices;
|
||
|
using System.Xml;
|
||
|
|
||
|
[TypeForwardedFrom("System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
|
||
|
sealed class EncryptedKey : EncryptedType
|
||
|
{
|
||
|
internal static readonly XmlDictionaryString CarriedKeyElementName = XD.XmlEncryptionDictionary.CarriedKeyName;
|
||
|
internal static readonly XmlDictionaryString ElementName = XD.XmlEncryptionDictionary.EncryptedKey;
|
||
|
internal static readonly XmlDictionaryString RecipientAttribute = XD.XmlEncryptionDictionary.Recipient;
|
||
|
|
||
|
string carriedKeyName;
|
||
|
string recipient;
|
||
|
ReferenceList referenceList;
|
||
|
byte[] wrappedKey;
|
||
|
|
||
|
public string CarriedKeyName
|
||
|
{
|
||
|
get { return this.carriedKeyName; }
|
||
|
set { this.carriedKeyName = value; }
|
||
|
}
|
||
|
|
||
|
public string Recipient
|
||
|
{
|
||
|
get { return this.recipient; }
|
||
|
set { this.recipient = value; }
|
||
|
}
|
||
|
|
||
|
public ReferenceList ReferenceList
|
||
|
{
|
||
|
get { return this.referenceList; }
|
||
|
set { this.referenceList = value; }
|
||
|
}
|
||
|
|
||
|
protected override XmlDictionaryString OpeningElementName
|
||
|
{
|
||
|
get { return ElementName; }
|
||
|
}
|
||
|
|
||
|
protected override void ForceEncryption()
|
||
|
{
|
||
|
// no work to be done here since, unlike bulk encryption, key wrapping is done eagerly
|
||
|
}
|
||
|
|
||
|
public byte[] GetWrappedKey()
|
||
|
{
|
||
|
if (this.State == EncryptionState.New)
|
||
|
{
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.BadEncryptionState)));
|
||
|
}
|
||
|
return this.wrappedKey;
|
||
|
}
|
||
|
|
||
|
public void SetUpKeyWrap(byte[] wrappedKey)
|
||
|
{
|
||
|
if (this.State != EncryptionState.New)
|
||
|
{
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.BadEncryptionState)));
|
||
|
}
|
||
|
if (wrappedKey == null)
|
||
|
{
|
||
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("wrappedKey");
|
||
|
}
|
||
|
this.wrappedKey = wrappedKey;
|
||
|
this.State = EncryptionState.Encrypted;
|
||
|
}
|
||
|
|
||
|
protected override void ReadAdditionalAttributes(XmlDictionaryReader reader)
|
||
|
{
|
||
|
this.recipient = reader.GetAttribute(RecipientAttribute, null);
|
||
|
}
|
||
|
|
||
|
protected override void ReadAdditionalElements(XmlDictionaryReader reader)
|
||
|
{
|
||
|
if (reader.IsStartElement(ReferenceList.ElementName, EncryptedType.NamespaceUri))
|
||
|
{
|
||
|
this.referenceList = new ReferenceList();
|
||
|
this.referenceList.ReadFrom(reader);
|
||
|
}
|
||
|
if (reader.IsStartElement(CarriedKeyElementName, EncryptedType.NamespaceUri))
|
||
|
{
|
||
|
reader.ReadStartElement(CarriedKeyElementName, EncryptedType.NamespaceUri);
|
||
|
this.carriedKeyName = reader.ReadString();
|
||
|
reader.ReadEndElement();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected override void ReadCipherData(XmlDictionaryReader reader)
|
||
|
{
|
||
|
this.wrappedKey = reader.ReadContentAsBase64();
|
||
|
}
|
||
|
|
||
|
protected override void ReadCipherData(XmlDictionaryReader reader, long maxBufferSize)
|
||
|
{
|
||
|
this.wrappedKey = SecurityUtils.ReadContentAsBase64(reader, maxBufferSize);
|
||
|
}
|
||
|
|
||
|
protected override void WriteAdditionalAttributes(XmlDictionaryWriter writer, DictionaryManager dictionaryManager)
|
||
|
{
|
||
|
if (this.recipient != null)
|
||
|
{
|
||
|
writer.WriteAttributeString(RecipientAttribute, null, this.recipient);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected override void WriteAdditionalElements(XmlDictionaryWriter writer, DictionaryManager dictionaryManager)
|
||
|
{
|
||
|
if (this.carriedKeyName != null)
|
||
|
{
|
||
|
writer.WriteStartElement(CarriedKeyElementName, EncryptedType.NamespaceUri);
|
||
|
writer.WriteString(this.carriedKeyName);
|
||
|
writer.WriteEndElement(); // CarriedKeyName
|
||
|
}
|
||
|
if (this.referenceList != null)
|
||
|
{
|
||
|
this.referenceList.WriteTo(writer, dictionaryManager);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected override void WriteCipherData(XmlDictionaryWriter writer)
|
||
|
{
|
||
|
writer.WriteBase64(this.wrappedKey, 0, this.wrappedKey.Length);
|
||
|
}
|
||
|
}
|
||
|
}
|