Update Reference Sources to .NET Framework 4.6.1
[mono.git] / mcs / class / referencesource / mscorlib / system / security / policy / strongname.cs
1 // ==++==
2 // 
3 //   Copyright (c) Microsoft Corporation.  All rights reserved.
4 // 
5 // ==--==
6 // <OWNER>[....]</OWNER>
7 // 
8
9 //
10 // StrongName.cs
11 //
12 // StrongName is an IIdentity representing strong names.
13 //
14
15 namespace System.Security.Policy {
16     using System.IO;
17     using System.Reflection;
18     using System.Security.Util;
19     using System.Security.Permissions;
20     using System.Diagnostics.Contracts;
21     using CultureInfo = System.Globalization.CultureInfo;
22
23     [Serializable]
24     [System.Runtime.InteropServices.ComVisible(true)]
25     public sealed class StrongName : EvidenceBase, IIdentityPermissionFactory, IDelayEvaluatedEvidence
26     {
27         private StrongNamePublicKeyBlob m_publicKeyBlob;
28         private String m_name;
29         private Version m_version;
30
31         // Delay evaluated evidence is for policy resolution only, so it doesn't make sense to save that
32         // state away and then try to evaluate the strong name later.
33         [NonSerialized]
34         private RuntimeAssembly m_assembly = null;
35
36         [NonSerialized]
37         private bool m_wasUsed = false;
38
39         internal StrongName() {}
40
41         public StrongName( StrongNamePublicKeyBlob blob, String name, Version version ) : this(blob, name, version, null)
42         {
43         }
44
45         internal StrongName(StrongNamePublicKeyBlob blob, String name, Version version, Assembly assembly)
46         {
47             if (name == null)
48                 throw new ArgumentNullException("name");
49             if (String.IsNullOrEmpty(name))
50                 throw new ArgumentException(Environment.GetResourceString("Argument_EmptyStrongName"));
51
52             if (blob == null)
53                 throw new ArgumentNullException("blob");
54
55             if (version == null)
56                 throw new ArgumentNullException("version");
57             Contract.EndContractBlock();
58
59             RuntimeAssembly rtAssembly = assembly as RuntimeAssembly;
60             if (assembly != null && rtAssembly == null)
61                 throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeAssembly"), "assembly");
62
63             m_publicKeyBlob = blob;
64             m_name = name;
65             m_version = version;
66             m_assembly = rtAssembly;
67         }
68
69         public StrongNamePublicKeyBlob PublicKey
70         {
71             get
72             {
73                 return m_publicKeyBlob;
74             }
75         }
76
77         public String Name
78         {
79             get
80             {
81                 return m_name;
82             }
83         }
84
85         public Version Version
86         {
87             get
88             {
89                 return m_version;
90             }
91         }
92
93         bool IDelayEvaluatedEvidence.IsVerified
94         {
95             [System.Security.SecurityCritical]  // auto-generated
96             get
97             {
98 #if FEATURE_CAS_POLICY
99                 return m_assembly != null ? m_assembly.IsStrongNameVerified : true;
100 #else // !FEATURE_CAS_POLICY
101                 return true;
102 #endif // FEATURE_CAS_POLICY
103             }
104         }
105
106         bool IDelayEvaluatedEvidence.WasUsed
107         {
108             get { return m_wasUsed; }
109         }
110
111         void IDelayEvaluatedEvidence.MarkUsed()
112         {
113             m_wasUsed = true;
114         }
115
116         internal static bool CompareNames( String asmName, String mcName )
117         {
118             if (mcName.Length > 0 && mcName[mcName.Length-1] == '*' && mcName.Length - 1 <= asmName.Length)
119                 return String.Compare( mcName, 0, asmName, 0, mcName.Length - 1, StringComparison.OrdinalIgnoreCase) == 0;
120             else
121                 return String.Compare( mcName, asmName, StringComparison.OrdinalIgnoreCase) == 0;
122         }
123
124         public IPermission CreateIdentityPermission( Evidence evidence )
125         {
126             return new StrongNameIdentityPermission( m_publicKeyBlob, m_name, m_version );
127         }
128
129         public override EvidenceBase Clone()
130         {
131             return new StrongName(m_publicKeyBlob, m_name, m_version);
132         }
133
134         public Object Copy()
135         {
136             return Clone();
137         }
138
139 #if FEATURE_CAS_POLICY
140         internal SecurityElement ToXml()
141         {
142             SecurityElement root = new SecurityElement( "StrongName" );
143             root.AddAttribute( "version", "1" );
144
145             if (m_publicKeyBlob != null)
146                 root.AddAttribute( "Key", System.Security.Util.Hex.EncodeHexString( m_publicKeyBlob.PublicKey ) );
147
148             if (m_name != null)
149                 root.AddAttribute( "Name", m_name );
150
151             if (m_version != null)
152                 root.AddAttribute( "Version", m_version.ToString() );
153
154             return root;
155         }
156
157         internal void FromXml (SecurityElement element)
158         {
159             if (element == null)
160                 throw new ArgumentNullException("element");
161             if (String.Compare(element.Tag, "StrongName", StringComparison.Ordinal) != 0)
162                 throw new ArgumentException(Environment.GetResourceString("Argument_InvalidXML"));
163             Contract.EndContractBlock();
164
165             m_publicKeyBlob = null;
166             m_version = null;
167
168             string key = element.Attribute("Key");
169             if (key != null)
170                 m_publicKeyBlob = new StrongNamePublicKeyBlob(System.Security.Util.Hex.DecodeHexString(key));
171
172             m_name = element.Attribute("Name");
173
174             string version = element.Attribute("Version");
175             if (version != null)
176                 m_version = new Version(version);
177         }
178
179         public override String ToString()
180         {
181             return ToXml().ToString();
182         }
183 #endif // FEATURE_CAS_POLICY
184
185         public override bool Equals( Object o )
186         {
187             StrongName that = (o as StrongName);
188             return (that != null) &&
189                    Equals( this.m_publicKeyBlob, that.m_publicKeyBlob ) &&
190                    Equals( this.m_name, that.m_name ) &&
191                    Equals( this.m_version, that.m_version );
192         }
193
194         public override int GetHashCode()
195         {
196             if (m_publicKeyBlob != null)
197             {
198                 return m_publicKeyBlob.GetHashCode();
199             }
200             else if (m_name != null || m_version != null)
201             {
202                 return (m_name == null ? 0 : m_name.GetHashCode()) + (m_version == null ? 0 : m_version.GetHashCode());
203             }
204             else
205             {
206                 return typeof( StrongName ).GetHashCode();
207             }
208         }
209
210         // INormalizeForIsolatedStorage is not implemented for startup perf
211         // equivalent to INormalizeForIsolatedStorage.Normalize()
212         internal Object Normalize()
213         {
214             MemoryStream ms = new MemoryStream();
215             BinaryWriter bw = new BinaryWriter(ms);
216
217             bw.Write(m_publicKeyBlob.PublicKey);
218             bw.Write(m_version.Major);
219             bw.Write(m_name);
220
221             ms.Position = 0;
222             return ms;
223         }
224     }
225 }