2009-03-17 1 views
1

SzenarioWie kann ich immer einen Dialog aktivieren, der nach einem Smartcard-Pin fragt?

Ich versuche Zertifikate zum Signieren von Dokumenten zu verwenden. Das erste Mal, dass ich unterzeichne, fordert das Betriebssystem einen Dialog auf, damit der Benutzer die PIN einstellen kann, aber das nächste Mal nicht. Aus Sicherheitsgründen brauche ich jedes Mal, wenn ich unterzeichne, das Betriebssystem fragt die PIN für den Benutzer. Wer weiß, wie man das macht?

Dies ist der Code:

''// 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() 

Auf einigen Seiten habe ich gefunden, dass die CryptSetProvParam mit dem Stift reinigen kann, aber bisher nicht funktioniert.

Die Aussage:

<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 

Der Aufruf:

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 

die Fehler:

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

Auch testen Multi-Thread unter Verwendung (unter Verwendung eines anderen Thread nur zum Signieren), und es doesn' t arbeiten.

Vielen Dank!

Antwort

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; 
}