PureBasic Requires Chilkat v10.1.2+
PureBasic
RSA Sign using Private Key of Certificate Type A3 (smart card / token)
See more RSA Examples
Demonstrates RSA signing data using the private key of a certificate type A3 (smart card, token).Note: This is a Windows-only example.
Chilkat PureBasic Downloads
IncludeFile "CkCertStore.pb"
IncludeFile "CkCert.pb"
IncludeFile "CkFileAccess.pb"
IncludeFile "CkJsonObject.pb"
IncludeFile "CkRsa.pb"
Procedure ChilkatExample()
success.i = 0
; First get the A3 certificate that was installed on the Windows system.
certStore.i = CkCertStore::ckCreate()
If certStore.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
thumbprint.s = "12c1dd8015f3f03f7b1fa619dc24e2493ca8b4b2"
; This is specific to Windows because it is opening the Windows Current-User certificate store.
bReadOnly.i = 1
success = CkCertStore::ckOpenCurrentUserStore(certStore,bReadOnly)
If success <> 1
Debug CkCertStore::ckLastErrorText(certStore)
CkCertStore::ckDispose(certStore)
ProcedureReturn
EndIf
; Find the certificate with the desired thumbprint
; (There are many ways to locate a certificate. This example chooses to find by thumbprint.)
json.i = CkJsonObject::ckCreate()
If json.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkJsonObject::ckUpdateString(json,"thumbprint",thumbprint)
cert.i = CkCert::ckCreate()
If cert.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkCertStore::ckFindCert(certStore,json,cert)
If success = 0
Debug "Failed to find the certificate."
CkCertStore::ckDispose(certStore)
CkJsonObject::ckDispose(json)
CkCert::ckDispose(cert)
ProcedureReturn
EndIf
Debug "Found: " + CkCert::ckSubjectCN(cert)
rsa.i = CkRsa::ckCreate()
If rsa.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; Provide the cert's private key
bUsePrivateKey.i = 1
success = CkRsa::ckSetX509Cert(rsa,cert,bUsePrivateKey)
If success <> 1
Debug CkRsa::ckLastErrorText(rsa)
CkCertStore::ckDispose(certStore)
CkJsonObject::ckDispose(json)
CkCert::ckDispose(cert)
CkRsa::ckDispose(rsa)
ProcedureReturn
EndIf
; Now we're ready to sign..
fac.i = CkFileAccess::ckCreate()
If fac.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; Get bytes to be signed..
ERROR - PureBasic is an array language = CkFileAccess::ckReadEntireFile(fac,"in.dat")
ERROR - PureBasic is an array language = CkRsa::ckSignBytes(rsa,inData,"SHA-256")
If CkRsa::ckLastMethodSuccess(rsa) <> 1
Debug CkRsa::ckLastErrorText(rsa)
CkCertStore::ckDispose(certStore)
CkJsonObject::ckDispose(json)
CkCert::ckDispose(cert)
CkRsa::ckDispose(rsa)
CkFileAccess::ckDispose(fac)
ProcedureReturn
EndIf
Debug "Signature created."
CkCertStore::ckDispose(certStore)
CkJsonObject::ckDispose(json)
CkCert::ckDispose(cert)
CkRsa::ckDispose(rsa)
CkFileAccess::ckDispose(fac)
ProcedureReturn
EndProcedure