Skip to content

Commit 97dcf6e

Browse files
One single approach to using SHA*. Fixes #3673.
1 parent 2f311c2 commit 97dcf6e

2 files changed

Lines changed: 18 additions & 4 deletions

File tree

ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs

Lines changed: 12 additions & 3 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,15 +261,24 @@ public string FullName {
263261
public Version? Version => entry.Version;
264262
public string Culture => Metadata.GetString(entry.Culture);
265263
byte[]? IAssemblyReference.PublicKeyToken => GetPublicKeyToken();
264+
Lazy<byte[]?> publicKeyToken;
266265

267266
public byte[]? GetPublicKeyToken()
267+
{
268+
return publicKeyToken.Value;
269+
}
270+
271+
private byte[]? ComputePublicKeyToken()
268272
{
269273
if (entry.PublicKeyOrToken.IsNil)
270274
return null;
271275
var bytes = Metadata.GetBlobBytes(entry.PublicKeyOrToken);
272276
if ((entry.Flags & AssemblyFlags.PublicKey) != 0)
273277
{
274-
return sha1.ComputeHash(bytes).Skip(12).ToArray();
278+
using (var hasher = SHA1.Create())
279+
{
280+
return hasher.ComputeHash(bytes).Skip(12).ToArray();
281+
}
275282
}
276283
return bytes;
277284
}
@@ -321,6 +328,7 @@ public AssemblyReference(MetadataReader metadata, AssemblyReferenceHandle handle
321328
Metadata = metadata;
322329
Handle = handle;
323330
entry = metadata.GetAssemblyReference(handle);
331+
publicKeyToken = new(ComputePublicKeyToken);
324332
}
325333

326334
public AssemblyReference(MetadataFile module, AssemblyReferenceHandle handle)
@@ -332,6 +340,7 @@ public AssemblyReference(MetadataFile module, AssemblyReferenceHandle handle)
332340
Metadata = module.Metadata;
333341
Handle = handle;
334342
entry = Metadata.GetAssemblyReference(handle);
343+
publicKeyToken = new(ComputePublicKeyToken);
335344
}
336345

337346
public override string ToString()

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)