private void AcquireContext() { if (_providerHandle != null && !_providerHandle.IsInvalid) { return; } var dwFlags = Constants.CRYPT_SILENT; if (_providerParameters.KeyContainerName == null) { dwFlags |= Constants.CRYPT_VERIFYCONTEXT; //dwFlags |= Constants.CRYPT_MACHINE_KEYSET; } else { _keyHandleFunc = PrivateKey; } _providerHandle = SafeProvHandleImpl.InvalidHandle; if (!CryptoApi.CryptAcquireContext(ref _providerHandle, _providerParameters.KeyContainerName, _providerParameters.ProviderName, (uint)_providerParameters.ProviderType, dwFlags)) { throw new Win32Exception(); } }
/// <summary> /// The acquire context. /// </summary> /// <param name="keyContainerName"> /// The key container name. /// </param> /// <param name="providerName"> /// The provider name. /// </param> /// <param name="providerType"> /// The provider type. /// </param> /// <param name="flags"> /// The flags. /// </param> /// <exception cref="Win32Exception"> /// </exception> private void AcquireContext(string keyContainerName, string providerName, int providerType, int flags) { Dispose(); if (!CryptoApi.CryptAcquireContext(ref cspHandler, keyContainerName, providerName, providerType, flags)) { throw new Win32Exception(); } }
///// <summary> ///// Освобождает ресурсы. ///// </summary> //public void Dispose() //{ // if (disposed) // { // return; // } // if (cspHandler != IntPtr.Zero) // { // CryptoApi.CryptReleaseContext(cspHandler, 0); // cspHandler = IntPtr.Zero; // } // disposed = true; //} internal void AcquireContext(string keyContainerName, int flags) { Dispose(); if (!CryptoApi.CryptAcquireContext(ref cspHandler, keyContainerName, ProviderParams.GetProviderName(), ProviderParams.GetProviderType(), flags)) { throw new Win32Exception(); } }
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); } } }