2009-03-17 4 views
1

СценарийКак я могу всегда активировать диалоговое окно с запросом на вывод смарт-карты?

Я пытаюсь использовать сертификаты для подписи документов. В первый раз, когда я подписываюсь, операционная система запрашивает диалоговое окно для пользователя для установки PIN-кода, но в следующий раз это не так. По соображениям безопасности мне нужно, чтобы каждый раз, когда я подписываюсь, ОС запрашивает ПИН-код для пользователя. Кто-нибудь знает, как это сделать?

Это код:

''// create ContentInfo 
Dim content As New ContentInfo(bytesContenido) 

''// create a signer 
Dim signer As New CmsSigner(certificado) 

''// SignedCms represents signed data 
Dim signedMessage As New SignedCms(content) 

''// sign the data 
signedMessage.ComputeSignature(signer, False) 

''// create and return PKCS #7 byte array 
Return signedMessage.Encode() 

На некоторых страницах я обнаружил, что с помощью CryptSetProvParam может очистить булавку, но до сих пор не работает.

Оператор:

<DllImport("advapi32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _ 
Public Shared Function CryptSetProvParam(ByVal hProv As IntPtr, ByVal dwParam As Int32, ByVal pbData As Byte(), ByVal dwFlags As Int32) As Boolean 

End Function 

Заклятие:

Public punteroContexto As New System.IntPtr  ''// Obtenido usando CryptAcquireContext 
Public Const PP_SIGNATURE_PIN As UInt32 = 33 

If (Not CryptSetProvParam(punteroContexto, PP_SIGNATURE_PIN, Nothing, 0)) Then 
    Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error) 
End If 

Ошибка:

Invalid type specified. (Exception from HRESULT: 0x8009000A)

Также проверить с помощью многопоточного (с использованием другого потока только для подписи) и doesn' т работы.

спасибо!

ответ

2
[DllImport("Advapi32.dll", SetLastError = true)] 
public static extern bool CryptSetProvParam(IntPtr hProv, uint dwParam, IntPtr pvData, uint dwFlags); 

[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", CharSet = CharSet.Auto, SetLastError = true)] 
public static extern void CryptReleaseContext(IntPtr hProv, uint dwFlags); 

static public bool ClearPINCache2(RSACryptoServiceProvider key) 
{ 
    const uint PP_KEYEXCHANGE_PIN = 32; 
    const uint PP_SIGNATURE_PIN = 33; 
    bool bretval = false; 

    IntPtr hProv = IntPtr.Zero; 

    if (CryptAcquireContext(ref hProv, key.CspKeyContainerInfo.KeyContainerName, 
     key.CspKeyContainerInfo.ProviderName, (uint)key.CspKeyContainerInfo.ProviderType, 0)) 
    { 
     if ((CryptSetProvParam(hProv, PP_KEYEXCHANGE_PIN, IntPtr.Zero, 0) == true) && 
      (CryptSetProvParam(hProv, PP_SIGNATURE_PIN, IntPtr.Zero, 0) == true)) 
     { 
      bretval = true; 
     } 
    } 

    if (hProv != IntPtr.Zero) 
    { 
     CryptReleaseContext(hProv, 0); 
     hProv = IntPtr.Zero; 
    } 

    return bretval; 
}