| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- //------------------------------------------------------------
- // 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<byte> 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<byte>(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<byte> 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);
- }
- }
- }
|