internal static extern Boolean CryptGetProvParam( IntPtr hProv, UInt32 dwParam, Wincrypt.PROV_ENUMALGS_EX pbData, ref UInt32 pdwDataLen, UInt32 dwFlags );
static ALG_ID get_algparams(Wincrypt.PROV_ENUMALGS_EX algStructure) { Int16[] options = new Int16[] { 1, 2, 4, 8, 16, 32 }; List <String> szProtocols = new List <string>(); List <Int16> validoptions = options.Where(dwData => (algStructure.dwProtocols & dwData) != 0).ToList(); foreach (Int16 opt in validoptions) { switch (opt) { case 1: szProtocols.Add("Private communications transport (PCT) version 1 protocol"); break; case 2: szProtocols.Add("Secure sockets layer (SSL) version 2 protocol"); break; case 4: szProtocols.Add("SSL version 3 protocol"); break; case 8: szProtocols.Add("Transport layer security (TLS) version 1 protocol"); break; case 16: szProtocols.Add("Internet protocol security (IPsec) protocol"); break; case 32: szProtocols.Add("Signing protocol"); break; } } return(new ALG_ID( algStructure.szName, algStructure.szLongName, szProtocols.ToArray(), algStructure.dwDefaultLen, algStructure.dwMinLen, algStructure.dwMaxLen, algStructure.aiAlgid )); }
static CspCollection m_enumprovs() { Hashtable ProvTypes = get_provtypes(); StringBuilder pszProvName = new StringBuilder(); CspCollection csps = new CspCollection(); UInt32 dwIndex = 0; UInt32 pdwProvType = 0; UInt32 pcbProvName = 0; while (AdvAPI.CryptEnumProviders(dwIndex, 0, 0, ref pdwProvType, null, ref pcbProvName)) { pszProvName.Length = (Int32)pcbProvName; // retrieve CSP if (!AdvAPI.CryptEnumProviders(dwIndex++, 0, 0, ref pdwProvType, pszProvName, ref pcbProvName)) { throw new Win32Exception(Error.InvalidDataException); } String name = pszProvName.ToString(); String pType = (String)ProvTypes[pdwProvType]; IntPtr phProv = IntPtr.Zero; // retrieve CSP context if (!AdvAPI.CryptAcquireContext(ref phProv, null, name, pdwProvType, Wincrypt.CRYPT_VERIFYCONTEXT)) { throw new Win32Exception(Error.InavlidHandleException); } Int32 pdwDataLen = 0; ALG_IDCollection algs = new ALG_IDCollection(); if (AdvAPI.CryptGetProvParam(phProv, 0x16, null, ref pdwDataLen, Wincrypt.CRYPT_FIRST)) { Byte[] pbData = new Byte[Marshal.SizeOf(typeof(Wincrypt.PROV_ENUMALGS_EX))]; while (AdvAPI.CryptGetProvParam(phProv, 0x16, pbData, ref pdwDataLen, Wincrypt.CRYPT_NEXT)) { IntPtr ptr = Marshal.AllocHGlobal(pbData.Length); Marshal.Copy(pbData, 0, ptr, pbData.Length); Wincrypt.PROV_ENUMALGS_EX AlgStructure = (Wincrypt.PROV_ENUMALGS_EX)Marshal.PtrToStructure(ptr, typeof(Wincrypt.PROV_ENUMALGS_EX)); Marshal.FreeHGlobal(ptr); ALG_ID alg = get_algparams(AlgStructure); algs.Add(alg); } csps.Add(new CspLegacy(name, pType, algs)); } else { csps.Add(new CspLegacy(name, pType, algs)); } AdvAPI.CryptReleaseContext(phProv, 0); } return(csps); }