protected override void DoDispose() { if (cspHandler == IntPtr.Zero) { return; } CryptoApi.CryptReleaseContext(cspHandler, 0); cspHandler = IntPtr.Zero; }
public void Initialize() { var reOid = new Regex("^[0-9]+([.][0-9]+)+$", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); IntPtr cspHandler = IntPtr.Zero; IntPtr pnt = IntPtr.Zero; try { if (!CryptoApi.CryptAcquireContext(ref cspHandler, null, ProviderName, ProviderType, Constants.CryptVerifycontext)) { throw new Win32Exception(); } int dwDataLen = Marshal.SizeOf(typeof(CryptoApiEx.PROV_ENUMALGS_EX)) * 2; pnt = Marshal.AllocHGlobal(dwDataLen); uint dwFlags = 1; while (CryptoApiEx.CryptGetProvParam(cspHandler, Constants.PP_ENUMALGS_EX, pnt, ref dwDataLen, dwFlags)) { var data = (CryptoApiEx.PROV_ENUMALGS_EX)Marshal.PtrToStructure(pnt, typeof(CryptoApiEx.PROV_ENUMALGS_EX)); IntPtr oidPtr = CryptoApiEx.CertAlgIdToOID(data.aiAlgid); var oid = Marshal.PtrToStringAnsi(oidPtr); if (string.IsNullOrEmpty(oid) || !reOid.IsMatch(oid)) { oid = string.Empty; } this.Add(new ProviderAlgo() { AlgId = data.aiAlgid, Oid = oid, Name = data.szName, LongName = data.szLongName, MinLen = data.dwMinLen, MaxLen = data.dwMaxLen, DefaultLen = data.dwDefaultLen, Protocols = data.dwProtocols }); dwFlags = 2; } } finally { if (pnt != IntPtr.Zero) { Marshal.FreeHGlobal(pnt); } if (cspHandler != IntPtr.Zero) { CryptoApi.CryptReleaseContext(cspHandler, 0); } } }
/// <summary> /// Освобождает ресурсы. /// </summary> public void Dispose() { if (disposed) { return; } if (cspHandler != IntPtr.Zero) { CryptoApi.CryptReleaseContext(cspHandler, 0); cspHandler = IntPtr.Zero; } disposed = true; }