public class Win32 { [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool CryptAcquireContext( ref IntPtr hProv, string pszContainer, string pszProvider, uint dwProvType, uint dwFlags); [DllImport("advapi32.dll", SetLastError = true)] public static extern bool CryptGetProvParam( IntPtr hProv, uint dwParam, [In, Out] byte[] pbData, ref uint dwDataLen, uint dwFlags); [DllImport("advapi32.dll", SetLastError = true)] public static extern bool CryptGetProvParam( IntPtr hProv, uint dwParam, [MarshalAs(UnmanagedType.LPStr)] StringBuilder pbData, ref uint dwDataLen, uint dwFlags); [DllImport("advapi32.dll")] public static extern bool CryptReleaseContext( IntPtr hProv, uint dwFlags); }
using System; using System.Runtime.InteropServices; using System.ComponentModel; using System.Collections; using System.Text; namespace CryptoHelper { public static class CryptoHelper { public static string[] GetContainerNames() { int BUFFSIZE = 512; ArrayList containernames = new ArrayList(); uint pcbData = 0; //String provider = null; //can use null, for default provider String provider = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider"; String container = null; //required for crypt_verifycontext uint type = PROV_RSA_FULL; uint cspflags = CRYPT_VERIFYCONTEXT | CSPKEYTYPE; //no private key access required. uint enumflags = PP_ENUMCONTAINERS; //specify container enumeration functdionality IntPtr hProv = IntPtr.Zero; uint dwFlags = CRYPT_FIRST; bool gotcsp = Win32.CryptAcquireContext(ref hProv, container, provider, type, cspflags); if (!gotcsp) { showWin32Error(Marshal.GetLastWin32Error()); return null; } StringBuilder sb = null; Win32.CryptGetProvParam(hProv, enumflags, sb, ref pcbData, dwFlags); BUFFSIZE = (int)(2 * pcbData); sb = new StringBuilder(BUFFSIZE); /* ---------- Get KeyContainer Names ------------- */ dwFlags = CRYPT_FIRST; //required initalization while (Win32.CryptGetProvParam(hProv, enumflags, sb, ref pcbData, dwFlags)) { dwFlags = 0; //required to continue entire enumeration containernames.Add(sb.ToString()); } if (hProv != IntPtr.Zero) Win32.CryptReleaseContext(hProv, 0); if (containernames.Count == 0) return null; else return (string[])containernames.ToArray(Type.GetType("System.String")); } const uint PROV_RSA_FULL = 0x00000001; const uint CRYPT_VERIFYCONTEXT = 0xF0000000; static uint CSPKEYTYPE = 0; const uint PP_ENUMCONTAINERS = 0x00000002; const uint CRYPT_FIRST = 0x00000001; private static void showWin32Error(int errorcode) { Win32Exception myEx = new Win32Exception(errorcode); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Error code:\t 0x{0:X}", myEx.ErrorCode); Console.WriteLine("Error message:\t {0}\n", myEx.Message); Console.ForegroundColor = ConsoleColor.White; } } }