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); }
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); }