Browse Source

One single approach to using SHA*. Fixes #3673. (#3679)

pull/3686/head
Christoph Wille 3 weeks ago committed by GitHub
parent
commit
5eebf1408a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 21
      ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs
  2. 7
      ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

21
ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs

@ -213,8 +213,6 @@ namespace ICSharpCode.Decompiler.Metadata @@ -213,8 +213,6 @@ namespace ICSharpCode.Decompiler.Metadata
#if !VSADDIN
public class AssemblyReference : IAssemblyReference
{
static readonly SHA1 sha1 = SHA1.Create();
readonly System.Reflection.Metadata.AssemblyReference entry;
public MetadataReader Metadata { get; }
@ -263,17 +261,28 @@ namespace ICSharpCode.Decompiler.Metadata @@ -263,17 +261,28 @@ namespace ICSharpCode.Decompiler.Metadata
public Version? Version => entry.Version;
public string Culture => Metadata.GetString(entry.Culture);
byte[]? IAssemblyReference.PublicKeyToken => GetPublicKeyToken();
byte[]? publicKeyToken;
public byte[]? GetPublicKeyToken()
{
if (entry.PublicKeyOrToken.IsNil)
return null;
var bytes = Metadata.GetBlobBytes(entry.PublicKeyOrToken);
if ((entry.Flags & AssemblyFlags.PublicKey) != 0)
if (publicKeyToken == null)
{
return sha1.ComputeHash(bytes).Skip(12).ToArray();
var bytes = Metadata.GetBlobBytes(entry.PublicKeyOrToken);
if ((entry.Flags & AssemblyFlags.PublicKey) != 0)
{
using (var hasher = SHA1.Create())
{
bytes = hasher.ComputeHash(bytes).Skip(12).ToArray();
}
}
publicKeyToken = bytes;
}
return bytes;
return publicKeyToken;
}
ImmutableArray<TypeReferenceMetadata> typeReferences;

7
ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

@ -41,7 +41,12 @@ namespace ICSharpCode.Decompiler.Metadata @@ -41,7 +41,12 @@ namespace ICSharpCode.Decompiler.Metadata
{
// Calculate public key token:
// 1. hash the public key (always use SHA1).
byte[] publicKeyTokenBytes = SHA1.Create().ComputeHash(reader.GetBlobBytes(blob));
byte[] publicKeyTokenBytes;
using (var hasher = SHA1.Create())
{
publicKeyTokenBytes = hasher.ComputeHash(reader.GetBlobBytes(blob));
}
// 2. take the last 8 bytes
// 3. according to Cecil we need to reverse them, other sources did not mention this.
return publicKeyTokenBytes.TakeLast(8).Reverse().ToHexString(8);

Loading…
Cancel
Save