Sample code for 30+ languages & platforms
Visual FoxPro

PKCS11 Find All Certificates on Smart Card or USB Token

See more PKCS11 Examples

Sample code showing how to examine all the certificates on a smart card or USB token.

Note: This example requires Chilkat v9.5.0.88 or later.

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loPkcs11
LOCAL lnSlotID
LOCAL lnReadWrite
LOCAL lnUserType
LOCAL lcPin
LOCAL lnNumCerts
LOCAL lcPrivateKeyNote
LOCAL loCert
LOCAL i

lnSuccess = 0

* This example requires the Chilkat API to have been previously unlocked.
* See Global Unlock Sample for sample code.

* Note: Chilkat's PKCS11 implementation runs on Windows, Linux, Mac OS X, and other supported operating systems.

loPkcs11 = CreateObject('Chilkat.Pkcs11')

* Set your shared lib path -- either a full path to the DLL, .so, or .dylib,
* or just the filename if the driver is in a location that can be automatically found. (Such as in C:\Windows\System32)
loPkcs11.SharedLibPath = "aetpkss1.dll"

lnSuccess = loPkcs11.Initialize()
IF (lnSuccess = 0) THEN
    ? loPkcs11.LastErrorText
    RELEASE loPkcs11
    CANCEL
ENDIF

* Pass -1 for the slotID to open a session on the first non-empty slot.
lnSlotID = -1

* Open a session.
lnReadWrite = 1
lnSuccess = loPkcs11.OpenSession(lnSlotID,lnReadWrite)
IF (lnSuccess = 0) THEN
    ? loPkcs11.LastErrorText
    RELEASE loPkcs11
    CANCEL
ENDIF

* Make it an authenticated session by calling Login.
* 
* If we don't authenticate, then we won't be able to see the private keys, and thus
* we won't know which certificates have an associated private key stored on the smart card.

* The smart card PIN is passed to the Login method.
* userType 1 indicates a "Normal User".
lnUserType = 1
lcPin = "0000"
lnSuccess = loPkcs11.Login(lnUserType,lcPin)
IF (lnSuccess = 0) THEN
    ? loPkcs11.LastErrorText
    lnSuccess = loPkcs11.CloseSession()
    RELEASE loPkcs11
    CANCEL
ENDIF

* Call FindAllCerts to find all certificates on the smart card or USB token.
lnSuccess = loPkcs11.FindAllCerts()
IF (lnSuccess = 0) THEN
    ? loPkcs11.LastErrorText
    lnSuccess = loPkcs11.CloseSession()
    RELEASE loPkcs11
    CANCEL
ENDIF

* The NumCerts property is set by FindAllCerts.
lnNumCerts = loPkcs11.NumCerts
? "Number of certs: " + STR(lnNumCerts)

loCert = CreateObject('Chilkat.Cert')
i = 0
DO WHILE i < lnNumCerts
    loPkcs11.GetCert(i,loCert)
    lcPrivateKeyNote = ""
    IF (loCert.HasPrivateKey() = 1) THEN
        lcPrivateKeyNote = "(has private key)"
    ENDIF

    ? STR(i) + ": " + lcPrivateKeyNote + " " + loCert.SubjectDN
    ? STR(i) + ": issuer: " + loCert.IssuerDN
    ? "----"
    i = i + 1
ENDDO

* Revert to an unauthenticated session by calling Logout.
lnSuccess = loPkcs11.Logout()
IF (lnSuccess = 0) THEN
    ? loPkcs11.LastErrorText
    lnSuccess = loPkcs11.CloseSession()
    RELEASE loPkcs11
    RELEASE loCert
    CANCEL
ENDIF

* When finished, close the session.
* It is important to close the session (memory leaks will occur if the session is not properly closed).
lnSuccess = loPkcs11.CloseSession()
IF (lnSuccess = 0) THEN
    ? loPkcs11.LastErrorText
    RELEASE loPkcs11
    RELEASE loCert
    CANCEL
ENDIF

? "Success."

RELEASE loPkcs11
RELEASE loCert