File: System\Security\Cryptography\CapiHelper.DSA.Windows.cs
Web Access
Project: src\src\runtime\src\libraries\System.Security.Cryptography\src\System.Security.Cryptography.csproj (System.Security.Cryptography)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

namespace System.Security.Cryptography
{
    internal static partial class CapiHelper
    {
        // Provider type to use by default for DSS operations.
        internal const int DefaultDssProviderType = (int)ProviderType.PROV_DSS_DH;

        /// <summary>
        /// Check to see if a better CSP than the one requested is available
        /// DSS providers are supersets of each other in the following order:
        ///    1. MS_ENH_DSS_DH_PROV
        ///    2. MS_DEF_DSS_DH_PROV
        ///
        /// This will return the best provider which is a superset of wszProvider,
        /// or NULL if there is no upgrade available on the machine.
        /// </summary>
        /// <param name="dwProvType">provider type</param>
        /// <param name="wszProvider">provider name</param>
        /// <returns>Returns upgrade CSP name</returns>
        public static string? UpgradeDSS(int dwProvType, string wszProvider)
        {
            string? wszUpgrade = null;
            if (string.Equals(wszProvider, MS_DEF_DSS_DH_PROV, StringComparison.Ordinal))
            {
                SafeProvHandle safeProvHandle;
                // If this is the base DSS/DH provider, see if we can use the enhanced provider instead.
                if (S_OK == AcquireCryptContext(out safeProvHandle,
                    null,
                    MS_ENH_DSS_DH_PROV,
                    dwProvType,
                    (uint)Interop.Advapi32.CryptAcquireContextFlags.CRYPT_VERIFYCONTEXT))
                {
                    wszUpgrade = MS_ENH_DSS_DH_PROV;
                }
                safeProvHandle.Dispose();
            }
            return wszUpgrade;
        }

        private static void ReverseDsaSignature(byte[] signature, int cbSignature)
        {
            // A DSA signature consists of two 20-byte components, each of which
            // must be reversed in place.
            if (cbSignature != 40)
                throw new CryptographicException(SR.Cryptography_InvalidDSASignatureSize);

            Array.Reverse(signature, 0, 20);
            Array.Reverse(signature, 20, 20);
        }
    }
}