2009-06-26 15 views
1

Ich habe Gemalto.NET Smart Card.
Ich importierte 2 Zertifikate mit Gemalto Tools, die sconnect verwenden (die, wie ich vermute, Crypto API verwenden, um es zu tun, wenn in IE verwendet).CryptGetProvParam PP_ENUMCONTAINERS zeigt mir nur Standardzertifikat auf Smartcard

Wenn ich laufen

certutil -key -csp "Microsoft Base Smart Card Crypto Provider" 

Ich habe folgendes Ergebnis

Microsoft Base Smart Card Crypto Anbieter:
7c168bc3-dc1d-A627-C218-cd45729b42cb [Default Container] AT_KEYEXCHANGE

badd537a-a377-431b-cbc9-8699dbe15e0e AT_KEYEXCHANGE

LoadKeys zurückgegeben Schlüssel existiert nicht. 0x8009000d (-2146893811) CertUtil: -Schlüsselbefehl erfolgreich abgeschlossen.

Jetzt möchte ich diese Schlüssel in meinem C# -Programm finden. Um dies zu tun, schrieb ich folgende Methode, die alle Schlüssel auf bestimmten Smartcard zurückgeben sollte.

static List<string> EnumerateContainers(string card) 
{ 
    var list = new List<string>(); 
    var provider = IntPtr.Zero; 
    if (!CryptAcquireContext(ref provider, @"\\.\" + card + @"\", "Microsoft Base Smart Card Crypto Provider", 1, CspProviderFlags.UseMachineKeyStore)) 
     Debug.WriteLine("no context for " + card); 

    uint bufferSize = 4096; 
    var container = new StringBuilder((int)bufferSize); 
    uint flags = CRYPT_FIRST; 
    while(CryptGetProvParam(provider, PP_ENUMCONTAINERS, container, ref bufferSize, flags)) 
    { 
     list.Add(container.ToString()); 
     flags = 0; 
    } 
    return list; 
} 

Aber meine Methode nur den Schlüssel 7c168bc3-dc1d-A627-C218-cd45729b42cb die Standardeinstellung ist finden. Was soll ich tun, um alle auf der Smartcard gespeicherten Schlüssel/Container zu finden?

später

Wie kann ich die Schlüssel löschen und neue mit dem C# importieren?

Antwort

1

Ich bin auf das gleiche Problem gestoßen und habe ähnliche Beiträge im Web gesehen, aber endlich habe ich die Antwort gefunden ... indem ich den Fehlercode überprüfe!

Der Grund ist, dass der Wert von pcbData von der aufgerufenen Implementierung geändert wird (um die Länge der zurückgegebenen Daten widerzuspiegeln) und vor jedem Aufruf auf die Puffergröße gesetzt werden muss.

Überprüfung GetLastError nach dem Fehler zeigt Fehler 234, die genau das ist!

Tatsächlich scheint es sich um eine Ausbreitung eines Fehlers in Codebeispiel werden von „Erweitern .NET Cryptography mit CAPICOM und P/Invoke“ (http://msdn.microsoft.com/en-us/library/ms867087.aspx)

dwFlags=CRYPT_FIRST; //required initalization 
StringBuilder sb = new StringBuilder(BUFFSIZE); 
while (Win32.CryptGetProvParam(hProv, enumflags, sb, ref pcbData, dwFlags)) 
{ 
    dwFlags=0;   //required to continue entire enumeration 
    containernames.Add(sb.ToString()); 
} 

wo pcbData = BUFFSIZE; innerhalb der Schleife fehlt.