Skip to content

Commit 5eebf14

Browse files
One single approach to using SHA*. Fixes #3673. (#3679)
1 parent 1594a57 commit 5eebf14

2 files changed

Lines changed: 21 additions & 7 deletions

File tree

ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,6 @@ public override string ToString()
213213
#if !VSADDIN
214214
public class AssemblyReference : IAssemblyReference
215215
{
216-
static readonly SHA1 sha1 = SHA1.Create();
217-
218216
readonly System.Reflection.Metadata.AssemblyReference entry;
219217

220218
public MetadataReader Metadata { get; }
@@ -263,17 +261,28 @@ public string FullName {
263261
public Version? Version => entry.Version;
264262
public string Culture => Metadata.GetString(entry.Culture);
265263
byte[]? IAssemblyReference.PublicKeyToken => GetPublicKeyToken();
264+
byte[]? publicKeyToken;
266265

267266
public byte[]? GetPublicKeyToken()
268267
{
269268
if (entry.PublicKeyOrToken.IsNil)
270269
return null;
271-
var bytes = Metadata.GetBlobBytes(entry.PublicKeyOrToken);
272-
if ((entry.Flags & AssemblyFlags.PublicKey) != 0)
270+
271+
if (publicKeyToken == null)
273272
{
274-
return sha1.ComputeHash(bytes).Skip(12).ToArray();
273+
var bytes = Metadata.GetBlobBytes(entry.PublicKeyOrToken);
274+
if ((entry.Flags & AssemblyFlags.PublicKey) != 0)
275+
{
276+
using (var hasher = SHA1.Create())
277+
{
278+
bytes = hasher.ComputeHash(bytes).Skip(12).ToArray();
279+
}
280+
}
281+
282+
publicKeyToken = bytes;
275283
}
276-
return bytes;
284+
285+
return publicKeyToken;
277286
}
278287

279288
ImmutableArray<TypeReferenceMetadata> typeReferences;

ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,12 @@ static string CalculatePublicKeyToken(BlobHandle blob, MetadataReader reader)
4141
{
4242
// Calculate public key token:
4343
// 1. hash the public key (always use SHA1).
44-
byte[] publicKeyTokenBytes = SHA1.Create().ComputeHash(reader.GetBlobBytes(blob));
44+
byte[] publicKeyTokenBytes;
45+
using (var hasher = SHA1.Create())
46+
{
47+
publicKeyTokenBytes = hasher.ComputeHash(reader.GetBlobBytes(blob));
48+
}
49+
4550
// 2. take the last 8 bytes
4651
// 3. according to Cecil we need to reverse them, other sources did not mention this.
4752
return publicKeyTokenBytes.TakeLast(8).Reverse().ToHexString(8);

0 commit comments

Comments
 (0)