Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / clr / src / BCL / System / Security / Policy / HashMembershipCondition.cs / 1 / HashMembershipCondition.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
//
// HashMembershipCondition.cs
//
// Implementation of membership condition for hashes of assemblies.
//
namespace System.Security.Policy {
using System.Collections;
using System.Runtime.Serialization;
using System.Security;
using System.Security.Cryptography;
using System.Security.Util;
using System.Threading;
using System.Globalization;
[Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class HashMembershipCondition : ISerializable, IDeserializationCallback, IMembershipCondition {
private byte[] m_value = null;
private HashAlgorithm m_hashAlg = null;
private SecurityElement m_element = null;
private object s_InternalSyncObject = null;
private object InternalSyncObject {
get {
if (s_InternalSyncObject == null) {
Object o = new Object();
Interlocked.CompareExchange(ref s_InternalSyncObject, o, null);
}
return s_InternalSyncObject;
}
}
internal HashMembershipCondition() {}
private HashMembershipCondition (SerializationInfo info, StreamingContext context) {
m_value = (byte[]) info.GetValue("HashValue", typeof(byte[]));
string hashAlgorithm = (string) info.GetValue("HashAlgorithm", typeof(string));
if (hashAlgorithm != null)
m_hashAlg = HashAlgorithm.Create(hashAlgorithm);
else
m_hashAlg = new SHA1Managed();
}
public HashMembershipCondition(HashAlgorithm hashAlg, byte[] value) {
if (value == null)
throw new ArgumentNullException("value");
if (hashAlg == null)
throw new ArgumentNullException("hashAlg");
m_value = new byte[value.Length];
Array.Copy(value, m_value, value.Length);
m_hashAlg = hashAlg;
}
///
void ISerializable.GetObjectData (SerializationInfo info, StreamingContext context) {
info.AddValue("HashValue", this.HashValue);
info.AddValue("HashAlgorithm", this.HashAlgorithm.ToString());
}
///
void IDeserializationCallback.OnDeserialization (Object sender) {}
public HashAlgorithm HashAlgorithm {
set {
if (value == null)
throw new ArgumentNullException("HashAlgorithm");
m_hashAlg = value;
}
get {
if (m_hashAlg == null && m_element != null)
ParseHashAlgorithm();
return m_hashAlg;
}
}
public byte[] HashValue {
set {
if (value == null)
throw new ArgumentNullException("value");
m_value = new byte[value.Length];
Array.Copy(value, m_value, value.Length);
}
get {
if (m_value == null && m_element != null)
ParseHashValue();
if (m_value == null)
return null;
byte[] value = new byte[m_value.Length];
Array.Copy(m_value, value, m_value.Length);
return value;
}
}
public bool Check(Evidence evidence) {
if (evidence == null)
return false;
IEnumerator enumerator = evidence.GetHostEnumerator();
while (enumerator.MoveNext()) {
Object obj = enumerator.Current;
if (obj is Hash) {
if (m_value == null && m_element != null)
ParseHashValue();
if (m_hashAlg == null && m_element != null)
ParseHashAlgorithm();
byte[] asmHash = null;
lock (InternalSyncObject) {
asmHash = ((Hash)obj).GenerateHash(m_hashAlg);
}
if (asmHash != null && CompareArrays(asmHash, m_value))
return true;
}
}
return false;
}
public IMembershipCondition Copy() {
if (m_value == null && m_element != null)
ParseHashValue();
if (m_hashAlg == null && m_element != null)
ParseHashAlgorithm();
return new HashMembershipCondition(m_hashAlg, m_value);
}
public SecurityElement ToXml() {
return ToXml(null);
}
public void FromXml(SecurityElement e) {
FromXml(e, null);
}
public SecurityElement ToXml(PolicyLevel level) {
if (m_value == null && m_element != null)
ParseHashValue();
if (m_hashAlg == null && m_element != null)
ParseHashAlgorithm();
SecurityElement root = new SecurityElement("IMembershipCondition");
XMLUtil.AddClassAttribute(root, this.GetType(), "System.Security.Policy.HashMembershipCondition");
// If you hit this assert then most likely you are trying to change the name of this class.
// This is ok as long as you change the hard coded string above and change the assert below.
BCLDebug.Assert(this.GetType().FullName.Equals("System.Security.Policy.HashMembershipCondition"), "Class name changed!");
root.AddAttribute("version", "1");
if (m_value != null)
root.AddAttribute(s_tagHashValue, Hex.EncodeHexString(HashValue));
if (m_hashAlg != null)
root.AddAttribute(s_tagHashAlgorithm, HashAlgorithm.GetType().FullName);
return root;
}
public void FromXml(SecurityElement e, PolicyLevel level) {
if (e == null)
throw new ArgumentNullException("e");
if (!e.Tag.Equals("IMembershipCondition"))
throw new ArgumentException(Environment.GetResourceString("Argument_MembershipConditionElement"));
lock (InternalSyncObject) {
m_element = e;
m_value = null;
m_hashAlg = null;
}
}
public override bool Equals(Object o) {
HashMembershipCondition that = (o as HashMembershipCondition);
if (that != null) {
if (this.m_hashAlg == null && this.m_element != null)
this.ParseHashAlgorithm();
if (that.m_hashAlg == null && that.m_element != null)
that.ParseHashAlgorithm();
if (this.m_hashAlg != null && that.m_hashAlg != null &&
this.m_hashAlg.GetType() == that.m_hashAlg.GetType()) {
if (this.m_value == null && this.m_element != null)
this.ParseHashValue();
if (that.m_value == null && that.m_element != null)
that.ParseHashValue();
if (this.m_value.Length != that.m_value.Length)
return false;
for (int i = 0; i < m_value.Length; i++) {
if (this.m_value[i] != that.m_value[i])
return false;
}
return true;
}
}
return false;
}
public override int GetHashCode() {
if (this.m_hashAlg == null && this.m_element != null)
this.ParseHashAlgorithm();
int accumulator = this.m_hashAlg != null ? this.m_hashAlg.GetType().GetHashCode() : 0;
if (this.m_value == null && this.m_element != null)
this.ParseHashValue();
accumulator = accumulator ^ GetByteArrayHashCode(this.m_value);
return accumulator;
}
public override string ToString() {
if (m_hashAlg == null)
ParseHashAlgorithm();
return String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Hash_ToString"), m_hashAlg.GetType().AssemblyQualifiedName, Hex.EncodeHexString(HashValue));
}
private const string s_tagHashValue = "HashValue";
private const string s_tagHashAlgorithm = "HashAlgorithm";
private void ParseHashValue() {
lock (InternalSyncObject) {
if (m_element == null)
return;
string elHash = m_element.Attribute(s_tagHashValue);
if (elHash != null)
m_value = Hex.DecodeHexString(elHash);
else
throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_InvalidXMLElement"), s_tagHashValue, this.GetType().FullName));
if (m_value != null && m_hashAlg != null) {
m_element = null;
}
}
}
private void ParseHashAlgorithm() {
lock (InternalSyncObject) {
if (m_element == null)
return;
string elHashAlg = m_element.Attribute(s_tagHashAlgorithm);
if (elHashAlg != null)
m_hashAlg = HashAlgorithm.Create(elHashAlg);
else
m_hashAlg = new SHA1Managed();
if (m_value != null && m_hashAlg != null)
m_element = null;
}
}
private static bool CompareArrays(byte[] first, byte[] second) {
if (first.Length != second.Length)
return false;
int count = first.Length;
for (int i = 0; i < count; ++i) {
if (first[i] != second[i])
return false;
}
return true;
}
private static int GetByteArrayHashCode(byte[] baData) {
if (baData == null)
return 0;
int accumulator = 0;
for (int i = 0; i < baData.Length; ++i) {
accumulator = (accumulator << 8) ^ (int)baData[i] ^ (accumulator >> 24);
}
return accumulator;
}
}
}
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ProtocolsSection.cs
- SR.cs
- ObjectQuery.cs
- ApplicationFileCodeDomTreeGenerator.cs
- ScrollEvent.cs
- StorageMappingItemLoader.cs
- SdlChannelSink.cs
- OnOperation.cs
- BinaryObjectReader.cs
- Math.cs
- SerializableAttribute.cs
- TemplateControlParser.cs
- HttpCachePolicyElement.cs
- GPPOINTF.cs
- ItemList.cs
- XhtmlBasicPageAdapter.cs
- BulletedListEventArgs.cs
- Binding.cs
- Transform.cs
- JsonServiceDocumentSerializer.cs
- UnsafeNativeMethods.cs
- MemberJoinTreeNode.cs
- HttpCapabilitiesBase.cs
- DataGrid.cs
- EncryptedData.cs
- XmlNamespaceMapping.cs
- DataBoundLiteralControl.cs
- HttpModulesSection.cs
- CodeBinaryOperatorExpression.cs
- TableRowCollection.cs
- Claim.cs
- EntityDataSourceColumn.cs
- diagnosticsswitches.cs
- ContentPosition.cs
- ContextMenuStrip.cs
- SolidColorBrush.cs
- BufferModesCollection.cs
- SqlConnectionManager.cs
- XmlComment.cs
- BulletedList.cs
- SettingsBase.cs
- PostBackOptions.cs
- CodeStatement.cs
- CollectionContainer.cs
- XmlConverter.cs
- OdbcConnectionPoolProviderInfo.cs
- EntityDataSourceDataSelection.cs
- GridSplitter.cs
- MediaPlayer.cs
- StyleCollection.cs
- AttributeUsageAttribute.cs
- NegotiationTokenProvider.cs
- XmlJsonReader.cs
- LockRecursionException.cs
- DbConnectionPoolGroup.cs
- TextDecoration.cs
- SmtpClient.cs
- JavaScriptString.cs
- OutKeywords.cs
- PropertySegmentSerializer.cs
- StateMachineWorkflowDesigner.cs
- MetadataArtifactLoaderFile.cs
- CommonXSendMessage.cs
- FileLoadException.cs
- KeyEventArgs.cs
- DesignerDataStoredProcedure.cs
- MaskedTextBox.cs
- WebControl.cs
- StorageTypeMapping.cs
- SqlResolver.cs
- ListItem.cs
- LazyTextWriterCreator.cs
- SoapCommonClasses.cs
- FlatButtonAppearance.cs
- CAGDesigner.cs
- Rules.cs
- ModuleBuilderData.cs
- DispatcherExceptionFilterEventArgs.cs
- CharConverter.cs
- StringAnimationBase.cs
- GifBitmapDecoder.cs
- ConnectionPointCookie.cs
- WebScriptEnablingBehavior.cs
- XmlQueryTypeFactory.cs
- CodeTypeOfExpression.cs
- TableRowCollection.cs
- BinarySerializer.cs
- XmlNamespaceMapping.cs
- DataObjectSettingDataEventArgs.cs
- Hash.cs
- StateWorkerRequest.cs
- IChannel.cs
- ResourceCodeDomSerializer.cs
- TemplateBamlTreeBuilder.cs
- SwitchElementsCollection.cs
- DataRelationCollection.cs
- PropertyGridView.cs
- login.cs
- TemplateBindingExtension.cs
- StorageEntitySetMapping.cs