//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------ namespace System.ServiceModel.Security { using System.Security.Cryptography; using System.ServiceModel.Channels; using System.Xml; class EncryptedData : EncryptedType { internal static readonly XmlDictionaryString ElementName = XD.XmlEncryptionDictionary.EncryptedData; internal static readonly string ElementType = XmlEncryptionStrings.ElementType; internal static readonly string ContentType = XmlEncryptionStrings.ContentType; SymmetricAlgorithm algorithm; byte[] decryptedBuffer; ArraySegment buffer; byte[] iv; byte[] cipherText; protected override XmlDictionaryString OpeningElementName { get { return ElementName; } } void EnsureDecryptionSet() { if (this.State == EncryptionState.DecryptionSetup) { SetPlainText(); } else if (this.State != EncryptionState.Decrypted) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.BadEncryptionState))); } } protected override void ForceEncryption() { CryptoHelper.GenerateIVAndEncrypt(this.algorithm, this.buffer, out this.iv, out this.cipherText); this.State = EncryptionState.Encrypted; this.buffer = new ArraySegment(CryptoHelper.EmptyBuffer); } public byte[] GetDecryptedBuffer() { EnsureDecryptionSet(); return this.decryptedBuffer; } protected override void ReadCipherData(XmlDictionaryReader reader) { this.cipherText = reader.ReadContentAsBase64(); } protected override void ReadCipherData(XmlDictionaryReader reader, long maxBufferSize) { this.cipherText = SecurityUtils.ReadContentAsBase64(reader, maxBufferSize); } void SetPlainText() { this.decryptedBuffer = CryptoHelper.ExtractIVAndDecrypt(this.algorithm, this.cipherText, 0, this.cipherText.Length); this.State = EncryptionState.Decrypted; } public void SetUpDecryption(SymmetricAlgorithm algorithm) { if (this.State != EncryptionState.Read) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.BadEncryptionState))); } if (algorithm == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("algorithm"); } this.algorithm = algorithm; this.State = EncryptionState.DecryptionSetup; } public void SetUpEncryption(SymmetricAlgorithm algorithm, ArraySegment buffer) { if (this.State != EncryptionState.New) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.BadEncryptionState))); } if (algorithm == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("algorithm"); } this.algorithm = algorithm; this.buffer = buffer; this.State = EncryptionState.EncryptionSetup; } protected override void WriteCipherData(XmlDictionaryWriter writer) { writer.WriteBase64(this.iv, 0, this.iv.Length); writer.WriteBase64(this.cipherText, 0, this.cipherText.Length); } } }