summaryrefslogtreecommitdiff
path: root/src/mscorlib/src/System/Security/Policy/StrongName.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mscorlib/src/System/Security/Policy/StrongName.cs')
-rw-r--r--src/mscorlib/src/System/Security/Policy/StrongName.cs221
1 files changed, 221 insertions, 0 deletions
diff --git a/src/mscorlib/src/System/Security/Policy/StrongName.cs b/src/mscorlib/src/System/Security/Policy/StrongName.cs
new file mode 100644
index 0000000000..6e2d572e32
--- /dev/null
+++ b/src/mscorlib/src/System/Security/Policy/StrongName.cs
@@ -0,0 +1,221 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+//
+
+//
+//
+// StrongName is an IIdentity representing strong names.
+//
+
+namespace System.Security.Policy {
+ using System.IO;
+ using System.Reflection;
+ using System.Security.Util;
+ using System.Security.Permissions;
+ using System.Diagnostics.Contracts;
+ using CultureInfo = System.Globalization.CultureInfo;
+
+ [Serializable]
+ [System.Runtime.InteropServices.ComVisible(true)]
+ public sealed class StrongName : EvidenceBase, IIdentityPermissionFactory, IDelayEvaluatedEvidence
+ {
+ private StrongNamePublicKeyBlob m_publicKeyBlob;
+ private String m_name;
+ private Version m_version;
+
+ // Delay evaluated evidence is for policy resolution only, so it doesn't make sense to save that
+ // state away and then try to evaluate the strong name later.
+ [NonSerialized]
+ private RuntimeAssembly m_assembly = null;
+
+ [NonSerialized]
+ private bool m_wasUsed = false;
+
+ internal StrongName() {}
+
+ public StrongName( StrongNamePublicKeyBlob blob, String name, Version version ) : this(blob, name, version, null)
+ {
+ }
+
+ internal StrongName(StrongNamePublicKeyBlob blob, String name, Version version, Assembly assembly)
+ {
+ if (name == null)
+ throw new ArgumentNullException("name");
+ if (String.IsNullOrEmpty(name))
+ throw new ArgumentException(Environment.GetResourceString("Argument_EmptyStrongName"));
+
+ if (blob == null)
+ throw new ArgumentNullException("blob");
+
+ if (version == null)
+ throw new ArgumentNullException("version");
+ Contract.EndContractBlock();
+
+ RuntimeAssembly rtAssembly = assembly as RuntimeAssembly;
+ if (assembly != null && rtAssembly == null)
+ throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeAssembly"), "assembly");
+
+ m_publicKeyBlob = blob;
+ m_name = name;
+ m_version = version;
+ m_assembly = rtAssembly;
+ }
+
+ public StrongNamePublicKeyBlob PublicKey
+ {
+ get
+ {
+ return m_publicKeyBlob;
+ }
+ }
+
+ public String Name
+ {
+ get
+ {
+ return m_name;
+ }
+ }
+
+ public Version Version
+ {
+ get
+ {
+ return m_version;
+ }
+ }
+
+ bool IDelayEvaluatedEvidence.IsVerified
+ {
+ [System.Security.SecurityCritical] // auto-generated
+ get
+ {
+#if FEATURE_CAS_POLICY
+ return m_assembly != null ? m_assembly.IsStrongNameVerified : true;
+#else // !FEATURE_CAS_POLICY
+ return true;
+#endif // FEATURE_CAS_POLICY
+ }
+ }
+
+ bool IDelayEvaluatedEvidence.WasUsed
+ {
+ get { return m_wasUsed; }
+ }
+
+ void IDelayEvaluatedEvidence.MarkUsed()
+ {
+ m_wasUsed = true;
+ }
+
+ internal static bool CompareNames( String asmName, String mcName )
+ {
+ if (mcName.Length > 0 && mcName[mcName.Length-1] == '*' && mcName.Length - 1 <= asmName.Length)
+ return String.Compare( mcName, 0, asmName, 0, mcName.Length - 1, StringComparison.OrdinalIgnoreCase) == 0;
+ else
+ return String.Compare( mcName, asmName, StringComparison.OrdinalIgnoreCase) == 0;
+ }
+
+ public IPermission CreateIdentityPermission( Evidence evidence )
+ {
+ return new StrongNameIdentityPermission( m_publicKeyBlob, m_name, m_version );
+ }
+
+ public override EvidenceBase Clone()
+ {
+ return new StrongName(m_publicKeyBlob, m_name, m_version);
+ }
+
+ public Object Copy()
+ {
+ return Clone();
+ }
+
+#if FEATURE_CAS_POLICY
+ internal SecurityElement ToXml()
+ {
+ SecurityElement root = new SecurityElement( "StrongName" );
+ root.AddAttribute( "version", "1" );
+
+ if (m_publicKeyBlob != null)
+ root.AddAttribute( "Key", System.Security.Util.Hex.EncodeHexString( m_publicKeyBlob.PublicKey ) );
+
+ if (m_name != null)
+ root.AddAttribute( "Name", m_name );
+
+ if (m_version != null)
+ root.AddAttribute( "Version", m_version.ToString() );
+
+ return root;
+ }
+
+ internal void FromXml (SecurityElement element)
+ {
+ if (element == null)
+ throw new ArgumentNullException("element");
+ if (String.Compare(element.Tag, "StrongName", StringComparison.Ordinal) != 0)
+ throw new ArgumentException(Environment.GetResourceString("Argument_InvalidXML"));
+ Contract.EndContractBlock();
+
+ m_publicKeyBlob = null;
+ m_version = null;
+
+ string key = element.Attribute("Key");
+ if (key != null)
+ m_publicKeyBlob = new StrongNamePublicKeyBlob(System.Security.Util.Hex.DecodeHexString(key));
+
+ m_name = element.Attribute("Name");
+
+ string version = element.Attribute("Version");
+ if (version != null)
+ m_version = new Version(version);
+ }
+
+ public override String ToString()
+ {
+ return ToXml().ToString();
+ }
+#endif // FEATURE_CAS_POLICY
+
+ public override bool Equals( Object o )
+ {
+ StrongName that = (o as StrongName);
+ return (that != null) &&
+ Equals( this.m_publicKeyBlob, that.m_publicKeyBlob ) &&
+ Equals( this.m_name, that.m_name ) &&
+ Equals( this.m_version, that.m_version );
+ }
+
+ public override int GetHashCode()
+ {
+ if (m_publicKeyBlob != null)
+ {
+ return m_publicKeyBlob.GetHashCode();
+ }
+ else if (m_name != null || m_version != null)
+ {
+ return (m_name == null ? 0 : m_name.GetHashCode()) + (m_version == null ? 0 : m_version.GetHashCode());
+ }
+ else
+ {
+ return typeof( StrongName ).GetHashCode();
+ }
+ }
+
+ // INormalizeForIsolatedStorage is not implemented for startup perf
+ // equivalent to INormalizeForIsolatedStorage.Normalize()
+ internal Object Normalize()
+ {
+ MemoryStream ms = new MemoryStream();
+ BinaryWriter bw = new BinaryWriter(ms);
+
+ bw.Write(m_publicKeyBlob.PublicKey);
+ bw.Write(m_version.Major);
+ bw.Write(m_name);
+
+ ms.Position = 0;
+ return ms;
+ }
+ }
+}