1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
//----------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------
namespace System.ServiceModel.Security
{
using System.Collections.Generic;
using System.ServiceModel.Channels;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Diagnostics;
using System.IO;
using System.IdentityModel.Tokens;
using System.Security.Cryptography;
using System.ServiceModel.Security.Tokens;
using System.Xml;
using System.ServiceModel.Diagnostics;
using ISignatureValueSecurityElement = System.IdentityModel.ISignatureValueSecurityElement;
sealed class WSSecurityOneDotOneSendSecurityHeader : WSSecurityOneDotZeroSendSecurityHeader
{
public WSSecurityOneDotOneSendSecurityHeader(Message message, string actor, bool mustUnderstand, bool relay,
SecurityStandardsManager standardsManager,
SecurityAlgorithmSuite algorithmSuite,
MessageDirection direction)
: base(message, actor, mustUnderstand, relay, standardsManager, algorithmSuite, direction)
{
}
protected override ISignatureValueSecurityElement[] CreateSignatureConfirmationElements(SignatureConfirmations signatureConfirmations)
{
if (signatureConfirmations == null || signatureConfirmations.Count == 0)
{
return null;
}
ISignatureValueSecurityElement[] result = new ISignatureValueSecurityElement[signatureConfirmations.Count];
for (int i = 0; i < signatureConfirmations.Count; ++i)
{
byte[] sigValue;
bool isEncrypted;
signatureConfirmations.GetConfirmation(i, out sigValue, out isEncrypted);
result[i] = new SignatureConfirmationElement(this.GenerateId(), sigValue, this.StandardsManager.SecurityVersion);
}
return result;
}
protected override EncryptedHeader EncryptHeader(MessageHeader plainTextHeader, SymmetricAlgorithm algorithm,
SecurityKeyIdentifier keyIdentifier, MessageVersion version, string id, MemoryStream stream)
{
// We are not reading EncryptedData from the wire here, hence pass false.
EncryptedHeaderXml encryptedHeaderXml = new EncryptedHeaderXml(version, false);
encryptedHeaderXml.SecurityTokenSerializer = this.StandardsManager.SecurityTokenSerializer;
encryptedHeaderXml.EncryptionMethod = this.EncryptionAlgorithm;
encryptedHeaderXml.EncryptionMethodDictionaryString = this.EncryptionAlgorithmDictionaryString;
encryptedHeaderXml.KeyIdentifier = keyIdentifier;
encryptedHeaderXml.Id = id;
// The Encrypted Headers MustUnderstand, Relay and Actor attributes will always match the
// Security Headers value. The values for these on the Encrypted Header and its decrypted
// form can be different.
encryptedHeaderXml.MustUnderstand = this.MustUnderstand;
encryptedHeaderXml.Relay = this.Relay;
encryptedHeaderXml.Actor = this.Actor;
encryptedHeaderXml.SetUpEncryption(algorithm, stream);
return new EncryptedHeader(plainTextHeader, encryptedHeaderXml, EncryptedHeaderXml.ElementName.Value, EncryptedHeaderXml.NamespaceUri.Value, version);
}
}
}
|