File: Algorithm.cs
Web Access
Project: Microsoft.DotNet.StrongName.csproj (Microsoft.DotNet.StrongName)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

namespace Microsoft.DotNet.StrongName;

internal static class Algorithm
{
    /// <summary>
    /// Adapted from roslyn's CryptoBlobParser
    /// </summary>
    internal enum AlgorithmClass
    {
        Signature = 1,
        Hash = 4,
    }

    /// <summary>
    /// Adapted from roslyn's CryptoBlobParser
    /// </summary>
    internal enum AlgorithmSubId
    {
        Sha1Hash = 4,
        // Other possible values ommitted
    }

    /// <summary>
    /// Adapted from roslyn's CryptoBlobParser
    /// </summary>
    internal struct AlgorithmId
    {
        // From wincrypt.h
        private const int AlgorithmClassOffset = 13;
        private const int AlgorithmClassMask = 0x7;
        private const int AlgorithmSubIdOffset = 0;
        private const int AlgorithmSubIdMask = 0x1ff;

        private readonly uint _flags;

        internal const int RsaSign = 0x00002400;
        internal const int Sha = 0x00008004;

        internal bool IsSet
        {
            get { return _flags != 0; }
        }

        internal AlgorithmClass Class
        {
            get { return (AlgorithmClass)((_flags >> AlgorithmClassOffset) & AlgorithmClassMask); }
        }

        internal AlgorithmSubId SubId
        {
            get { return (AlgorithmSubId)((_flags >> AlgorithmSubIdOffset) & AlgorithmSubIdMask); }
        }

        internal AlgorithmId(uint flags)
        {
            _flags = flags;
        }
    }
}