The Labs \ Source Viewer \ SSCLI \ System.Security.Policy \ StrongName

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. //
  16. // StrongName.cs
  17. //
  18. // StrongName is an IIdentity representing strong names.
  19. //
  20. namespace System.Security.Policy
  21. {
  22.     using System.IO;
  23.     using System.Security.Util;
  24.     using System.Security.Permissions;
  25.     using CultureInfo = System.Globalization.CultureInfo;
  26.    
  27.     [Serializable()]
  28.     [System.Runtime.InteropServices.ComVisible(true)]
  29.     public sealed class StrongName : IIdentityPermissionFactory, IBuiltInEvidence
  30.     {
  31.         private StrongNamePublicKeyBlob m_publicKeyBlob;
  32.         private string m_name;
  33.         private Version m_version;
  34.        
  35.         internal StrongName()
  36.         {
  37.         }
  38.        
  39.         public StrongName(StrongNamePublicKeyBlob blob, string name, Version version)
  40.         {
  41.             if (name == null)
  42.                 throw new ArgumentNullException("name");
  43.             if (name.Equals(""))
  44.                 throw new ArgumentException(Environment.GetResourceString("Argument_EmptyStrongName"));
  45.            
  46.             if (blob == null)
  47.                 throw new ArgumentNullException("blob");
  48.            
  49.             if (version == null)
  50.                 throw new ArgumentNullException("version");
  51.            
  52.             m_publicKeyBlob = blob;
  53.             m_name = name;
  54.             m_version = version;
  55.         }
  56.        
  57.         internal StrongName(StrongNamePublicKeyBlob blob, string name, Version version, bool trash)
  58.         {
  59.             m_publicKeyBlob = blob;
  60.             m_name = name;
  61.             m_version = version;
  62.         }
  63.        
  64.         public StrongNamePublicKeyBlob PublicKey {
  65.             get { return m_publicKeyBlob; }
  66.         }
  67.        
  68.         public string Name {
  69.             get { return m_name; }
  70.         }
  71.        
  72.         public Version Version {
  73.             get { return m_version; }
  74.         }
  75.        
  76.         static internal bool CompareNames(string asmName, string mcName)
  77.         {
  78.             if (mcName.Length > 0 && mcName[mcName.Length - 1] == '*' && mcName.Length - 1 <= asmName.Length)
  79.                 return String.Compare(mcName, 0, asmName, 0, mcName.Length - 1, StringComparison.OrdinalIgnoreCase) == 0;
  80.             else
  81.                 return String.Compare(mcName, asmName, StringComparison.OrdinalIgnoreCase) == 0;
  82.         }
  83.        
  84.         public IPermission CreateIdentityPermission(Evidence evidence)
  85.         {
  86.             return new StrongNameIdentityPermission(m_publicKeyBlob, m_name, m_version);
  87.         }
  88.        
  89.         public object Copy()
  90.         {
  91.             return new StrongName(m_publicKeyBlob, m_name, m_version);
  92.         }
  93.        
  94.         internal SecurityElement ToXml()
  95.         {
  96.             SecurityElement root = new SecurityElement("StrongName");
  97.             root.AddAttribute("version", "1");
  98.            
  99.             if (m_publicKeyBlob != null)
  100.                 root.AddAttribute("Key", System.Security.Util.Hex.EncodeHexString(m_publicKeyBlob.PublicKey));
  101.            
  102.             if (m_name != null)
  103.                 root.AddAttribute("Name", m_name);
  104.            
  105.             if (m_version != null)
  106.                 root.AddAttribute("Version", m_version.ToString());
  107.            
  108.             return root;
  109.         }
  110.        
  111.         internal void FromXml(SecurityElement element)
  112.         {
  113.             if (element == null)
  114.                 throw new ArgumentNullException("element");
  115.             if (String.Compare(element.Tag, "StrongName", StringComparison.Ordinal) != 0)
  116.                 throw new ArgumentException(Environment.GetResourceString("Argument_InvalidXML"));
  117.            
  118.             m_publicKeyBlob = null;
  119.             m_version = null;
  120.            
  121.             string key = element.Attribute("Key");
  122.             if (key != null)
  123.                 m_publicKeyBlob = new StrongNamePublicKeyBlob(System.Security.Util.Hex.DecodeHexString(key));
  124.            
  125.             m_name = element.Attribute("Name");
  126.            
  127.             string version = element.Attribute("Version");
  128.             if (version != null)
  129.                 m_version = new Version(version);
  130.         }
  131.        
  132.         public override string ToString()
  133.         {
  134.             return ToXml().ToString();
  135.         }
  136.        
  137.         public override bool Equals(object o)
  138.         {
  139.             StrongName that = (o as StrongName);
  140.             return (that != null) && Equals(this.m_publicKeyBlob, that.m_publicKeyBlob) && Equals(this.m_name, that.m_name) && Equals(this.m_version, that.m_version);
  141.         }
  142.        
  143.         public override int GetHashCode()
  144.         {
  145.             if (m_publicKeyBlob != null) {
  146.                 return m_publicKeyBlob.GetHashCode();
  147.             }
  148.             else if (m_name != null || m_version != null) {
  149.                 return (m_name == null ? 0 : m_name.GetHashCode()) + (m_version == null ? 0 : m_version.GetHashCode());
  150.             }
  151.             else {
  152.                 return typeof(StrongName).GetHashCode();
  153.             }
  154.         }
  155.        
  156.         /// <internalonly/>
  157.         int IBuiltInEvidence.OutputToBuffer(char[] buffer, int position, bool verbose)
  158.         {
  159.             // StrongNames have a byte[], a string, and a Version (4 ints).
  160.             // Copy in the id, the byte[], the four ints, and then the string.
  161.            
  162.             buffer[position++] = BuiltInEvidenceHelper.idStrongName;
  163.             int lengthPK = m_publicKeyBlob.PublicKey.Length;
  164.             if (verbose) {
  165.                 BuiltInEvidenceHelper.CopyIntToCharArray(lengthPK, buffer, position);
  166.                 position += 2;
  167.             }
  168.             Buffer.InternalBlockCopy(m_publicKeyBlob.PublicKey, 0, buffer, position * 2, lengthPK);
  169.             position += ((lengthPK - 1) / 2) + 1;
  170.            
  171.             BuiltInEvidenceHelper.CopyIntToCharArray(m_version.Major, buffer, position);
  172.             BuiltInEvidenceHelper.CopyIntToCharArray(m_version.Minor, buffer, position + 2);
  173.             BuiltInEvidenceHelper.CopyIntToCharArray(m_version.Build, buffer, position + 4);
  174.             BuiltInEvidenceHelper.CopyIntToCharArray(m_version.Revision, buffer, position + 6);
  175.            
  176.             position += 8;
  177.             int lengthName = m_name.Length;
  178.             if (verbose) {
  179.                 BuiltInEvidenceHelper.CopyIntToCharArray(lengthName, buffer, position);
  180.                 position += 2;
  181.             }
  182.             m_name.CopyTo(0, buffer, position, lengthName);
  183.            
  184.             return lengthName + position;
  185.         }
  186.        
  187.         /// <internalonly/>
  188.         int IBuiltInEvidence.GetRequiredSize(bool verbose)
  189.         {
  190.             int length = ((m_publicKeyBlob.PublicKey.Length - 1) / 2) + 1;
  191.             // blob
  192.             if (verbose)
  193.                 length += 2;
  194.             // length of blob
  195.             length += 8;
  196.             // version
  197.             length += m_name.Length;
  198.             // Name
  199.             if (verbose)
  200.                 length += 2;
  201.             // length of name
  202.             length += 1;
  203.             // identifier
  204.             return length;
  205.         }
  206.        
  207.         /// <internalonly/>
  208.         int IBuiltInEvidence.InitFromBuffer(char[] buffer, int position)
  209.         {
  210.             int length = BuiltInEvidenceHelper.GetIntFromCharArray(buffer, position);
  211.             position += 2;
  212.             m_publicKeyBlob = new StrongNamePublicKeyBlob();
  213.             m_publicKeyBlob.PublicKey = new byte[length];
  214.            
  215.             int lengthInChars = ((length - 1) / 2) + 1;
  216.             Buffer.InternalBlockCopy(buffer, position * 2, m_publicKeyBlob.PublicKey, 0, length);
  217.             position += lengthInChars;
  218.            
  219.             int major = BuiltInEvidenceHelper.GetIntFromCharArray(buffer, position);
  220.             int minor = BuiltInEvidenceHelper.GetIntFromCharArray(buffer, position + 2);
  221.             int build = BuiltInEvidenceHelper.GetIntFromCharArray(buffer, position + 4);
  222.             int revision = BuiltInEvidenceHelper.GetIntFromCharArray(buffer, position + 6);
  223.             m_version = new Version(major, minor, build, revision);
  224.             position += 8;
  225.            
  226.             length = BuiltInEvidenceHelper.GetIntFromCharArray(buffer, position);
  227.             position += 2;
  228.            
  229.             m_name = new string(buffer, position, length);
  230.            
  231.             return position + length;
  232.         }
  233.        
  234.         // INormalizeForIsolatedStorage is not implemented for startup perf
  235.         // equivalent to INormalizeForIsolatedStorage.Normalize()
  236.         internal object Normalize()
  237.         {
  238.             MemoryStream ms = new MemoryStream();
  239.             BinaryWriter bw = new BinaryWriter(ms);
  240.            
  241.             bw.Write(m_publicKeyBlob.PublicKey);
  242.             bw.Write(m_version.Major);
  243.             bw.Write(m_name);
  244.            
  245.             ms.Position = 0;
  246.             return ms;
  247.         }
  248.     }
  249. }

Developer Fusion