2using System.Collections.Generic;
3using System.Collections.Immutable;
6using System.Reflection.Metadata;
7using System.Security.Cryptography;
19 internal class CryptographicHashProvider
22 internal const int Sha1HashSize = 20;
24 public static HashAlgorithm? TryGetAlgorithm(AssemblyHashAlgorithm algorithmId)
28 case AssemblyHashAlgorithm.None:
29 case AssemblyHashAlgorithm.SHA1:
31 case AssemblyHashAlgorithm.SHA256:
32 return SHA256.Create();
33 case AssemblyHashAlgorithm.SHA384:
34 return SHA384.Create();
35 case AssemblyHashAlgorithm.SHA512:
36 return SHA512.Create();
37 case AssemblyHashAlgorithm.MD5:
44 public static bool IsSupportedAlgorithm(AssemblyHashAlgorithm algorithmId)
48 case AssemblyHashAlgorithm.None:
49 case AssemblyHashAlgorithm.SHA1:
50 case AssemblyHashAlgorithm.SHA256:
51 case AssemblyHashAlgorithm.SHA384:
52 case AssemblyHashAlgorithm.SHA512:
53 case AssemblyHashAlgorithm.MD5:
60 public static ImmutableArray<byte> ComputeSha1(Stream stream)
64 stream.Seek(0, SeekOrigin.Begin);
65 using (var hashProvider = SHA1.Create())
67 return ImmutableArray.Create(hashProvider.ComputeHash(stream));
71 return ImmutableArray<byte>.Empty;
74 public static ImmutableArray<byte> ComputeSha1(ImmutableArray<byte> bytes)
76 return ComputeSha1(bytes.ToArray());
79 public static ImmutableArray<byte> ComputeSha1(
byte[] bytes)
81 using (var hashProvider = SHA1.Create())
83 return ImmutableArray.Create(hashProvider.ComputeHash(bytes));
87 public static ImmutableArray<byte> ComputeHash(HashAlgorithmName algorithmName, IEnumerable<Blob> bytes)
89 using (var incrementalHash = IncrementalHash.CreateHash(algorithmName))
91 incrementalHash.AppendData(bytes);
92 return ImmutableArray.Create(incrementalHash.GetHashAndReset());
96 public static ImmutableArray<byte> ComputeHash(HashAlgorithmName algorithmName, IEnumerable<ArraySegment<byte>> bytes)
98 using (var incrementalHash = IncrementalHash.CreateHash(algorithmName))
100 incrementalHash.AppendData(bytes);
101 return ImmutableArray.Create(incrementalHash.GetHashAndReset());