/// <summary> /// Passa PIN Code (Senha/Password) para Certificados /// eToken como o A3 do SERASA do Brasil /// </summary> /// <param name="_Certificado">O Certificado que está sendo usado /// para a criptografia</param> /// <param name="_PinPassword">O Pin Code / Senha / Password</param> public static void SetPinPrivateKey(this X509Certificate2 _Certificado, string _PinPassword) { if (_Certificado == null) { throw new ArgumentNullException("_Certificado == null!"); } var key = (RSACryptoServiceProvider)_Certificado.PrivateKey; IntPtr ProviderHandle = IntPtr.Zero; byte[] PinBuffer = Encoding.ASCII.GetBytes(_PinPassword); //Não é necessário descarregar o handle SafeNativeMethods.Execute(() => SafeNativeMethods.CryptAcquireContext( ref ProviderHandle, key.CspKeyContainerInfo.KeyContainerName, key.CspKeyContainerInfo.ProviderName, key.CspKeyContainerInfo.ProviderType, SafeNativeMethods.CryptContextFlags.Silent) ); SafeNativeMethods.Execute(() => SafeNativeMethods.CryptSetProvParam( ProviderHandle, SafeNativeMethods.CryptParameter.KeyExchangePin, PinBuffer, 0) ); SafeNativeMethods.Execute(() => SafeNativeMethods.CertSetCertificateContextProperty( _Certificado.Handle, SafeNativeMethods.CertificateProperty.CryptoProviderHandle, 0, ProviderHandle) ); }