IdentityHelper
using System.IO;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
namespace System.Security
{
internal static class IdentityHelper
{
internal static string GetNormalizedUriHash(Uri uri)
{
return GetStrongHashSuitableForObjectName(uri.ToString());
}
internal static string GetNormalizedStrongNameHash(AssemblyName name)
{
byte[] publicKey = name.GetPublicKey();
if (publicKey == null || publicKey.Length == 0)
return null;
using (MemoryStream memoryStream = new MemoryStream())
using (BinaryWriter binaryWriter = new BinaryWriter(memoryStream)) {
binaryWriter.Write(publicKey);
binaryWriter.Write(name.Version.Major);
binaryWriter.Write(name.Name);
memoryStream.Position = 0;
return GetStrongHashSuitableForObjectName(memoryStream);
}
}
internal static string GetStrongHashSuitableForObjectName(string name)
{
using (MemoryStream memoryStream = new MemoryStream())
using (BinaryWriter binaryWriter = new BinaryWriter(memoryStream)) {
binaryWriter.Write(name.ToUpperInvariant());
memoryStream.Position = 0;
return GetStrongHashSuitableForObjectName(memoryStream);
}
}
internal static string GetStrongHashSuitableForObjectName(Stream stream)
{
using (SHA1 sHA = SHA1.Create())
return ToBase32StringSuitableForDirName(sHA.ComputeHash(stream));
}
internal unsafe static string ToBase32StringSuitableForDirName(byte[] buff)
{
StringBuilder stringBuilder = new StringBuilder();
int num = buff.Length;
int num2 = 0;
ReadOnlySpan<byte> readOnlySpan = new ReadOnlySpan<byte>(&global::<PrivateImplementationDetails>.E19EC872C44A1E106B1945D46593E89BE1896CAB43757023BAAD2D1D69DAC8AD, 32);
do {
byte b = (byte)((num2 < num) ? buff[num2++] : 0);
byte b2 = (byte)((num2 < num) ? buff[num2++] : 0);
byte b3 = (byte)((num2 < num) ? buff[num2++] : 0);
byte b4 = (byte)((num2 < num) ? buff[num2++] : 0);
byte b5 = (byte)((num2 < num) ? buff[num2++] : 0);
stringBuilder.Append((char)readOnlySpan[b & 31]);
stringBuilder.Append((char)readOnlySpan[b2 & 31]);
stringBuilder.Append((char)readOnlySpan[b3 & 31]);
stringBuilder.Append((char)readOnlySpan[b4 & 31]);
stringBuilder.Append((char)readOnlySpan[b5 & 31]);
stringBuilder.Append((char)readOnlySpan[((b & 224) >> 5) | ((b4 & 96) >> 2)]);
stringBuilder.Append((char)readOnlySpan[((b2 & 224) >> 5) | ((b5 & 96) >> 2)]);
b3 = (byte)(b3 >> 5);
if ((b4 & 128) != 0)
b3 = (byte)(b3 | 8);
if ((b5 & 128) != 0)
b3 = (byte)(b3 | 16);
stringBuilder.Append((char)readOnlySpan[b3]);
} while (num2 < num);
return stringBuilder.ToString();
}
}
}