private static IntPtr GetProviderInfo(X509Certificate2 cert)
        {
            if (cert == null || !cert.HasPrivateKey)
            {
                return(IntPtr.Zero);
            }

            ICspAsymmetricAlgorithm key     = (ICspAsymmetricAlgorithm)cert.PrivateKey;
            const int PVK_TYPE_KEYCONTAINER = 2;

            if (key == null)
            {
                return(IntPtr.Zero);
            }

            SIGNER_PROVIDER_INFO providerInfo = new SIGNER_PROVIDER_INFO
            {
                cbSize           = (uint)Marshal.SizeOf(typeof(SIGNER_PROVIDER_INFO)),
                pwszProviderName = Marshal.StringToHGlobalUni(key.CspKeyContainerInfo.ProviderName),
                dwProviderType   = (uint)key.CspKeyContainerInfo.ProviderType,
                dwPvkChoice      = PVK_TYPE_KEYCONTAINER,
                Union1           = new SIGNER_PROVIDER_INFO.SignerProviderUnion
                {
                    pwszKeyContainer = Marshal.StringToHGlobalUni(key.CspKeyContainerInfo.KeyContainerName)
                },
            };

            IntPtr pProviderInfo = Marshal.AllocHGlobal(Marshal.SizeOf(providerInfo));

            Marshal.StructureToPtr(providerInfo, pProviderInfo, false);

            return(pProviderInfo);
        }
Beispiel #2
0
        private static IntPtr GetProviderPointer(string containerName)
        {
            var providerInfo = new SIGNER_PROVIDER_INFO
            {
                cbSize           = (uint)Marshal.SizeOf <SIGNER_PROVIDER_INFO>(),
                pwszProviderName = Marshal.StringToHGlobalUni(Constants.CryptoProviderName),
                dwProviderType   = Constants.PROV_RSA_FULL,
                dwPvkChoice      = Constants.PVK_TYPE_KEYCONTAINER,
                PvkChoice        = new SIGNER_PROVIDER_INFO.PvkChoiceUnion
                {
                    pwszKeyContainer = Marshal.StringToHGlobalUni(containerName)
                }
            };

            var providerHandle = Marshal.AllocHGlobal(Marshal.SizeOf <SIGNER_PROVIDER_INFO>());

            Marshal.StructureToPtr(providerInfo, providerHandle, false);

            return(providerHandle);
        }