Unicode C Requires Chilkat v10.1.2+
Unicode C
RSA Sign using Private Key of Certificate Type A3 (smart card / token)
Demonstrates RSA signing data using the private key of a certificate type A3 (smart card, token).Note: This is a Windows-only example.
Chilkat Unicode C Downloads
#include <C_CkCertStoreW.h>
#include <C_CkJsonObjectW.h>
#include <C_CkCertW.h>
#include <C_CkRsaW.h>
#include <C_CkByteData.h>
#include <C_CkFileAccessW.h>
void ChilkatSample(void)
{
BOOL success;
HCkCertStoreW certStore;
const wchar_t *thumbprint;
BOOL bReadOnly;
HCkJsonObjectW json;
HCkCertW cert;
HCkRsaW rsa;
BOOL bUsePrivateKey;
HCkByteData dataToSign;
HCkByteData sigData;
HCkFileAccessW fac;
success = FALSE;
// First get the A3 certificate that was installed on the Windows system.
certStore = CkCertStoreW_Create();
thumbprint = L"12c1dd8015f3f03f7b1fa619dc24e2493ca8b4b2";
// This is specific to Windows because it is opening the Windows Current-User certificate store.
bReadOnly = TRUE;
success = CkCertStoreW_OpenCurrentUserStore(certStore,bReadOnly);
if (success != TRUE) {
wprintf(L"%s\n",CkCertStoreW_lastErrorText(certStore));
CkCertStoreW_Dispose(certStore);
return;
}
// Find the certificate with the desired thumbprint
// (There are many ways to locate a certificate. This example chooses to find by thumbprint.)
json = CkJsonObjectW_Create();
CkJsonObjectW_UpdateString(json,L"thumbprint",thumbprint);
cert = CkCertW_Create();
success = CkCertStoreW_FindCert(certStore,json,cert);
if (success == FALSE) {
wprintf(L"Failed to find the certificate.\n");
CkCertStoreW_Dispose(certStore);
CkJsonObjectW_Dispose(json);
CkCertW_Dispose(cert);
return;
}
wprintf(L"Found: %s\n",CkCertW_subjectCN(cert));
rsa = CkRsaW_Create();
// Provide the cert's private key
bUsePrivateKey = TRUE;
success = CkRsaW_SetX509Cert(rsa,cert,bUsePrivateKey);
if (success != TRUE) {
wprintf(L"%s\n",CkRsaW_lastErrorText(rsa));
CkCertStoreW_Dispose(certStore);
CkJsonObjectW_Dispose(json);
CkCertW_Dispose(cert);
CkRsaW_Dispose(rsa);
return;
}
// Now we're ready to sign..
dataToSign = CkByteData_Create();
sigData = CkByteData_Create();
// Get bytes to be signed..
fac = CkFileAccessW_Create();
success = CkFileAccessW_ReadEntireFile(fac,L"in.dat",dataToSign);
success = CkRsaW_SignBytes(rsa,dataToSign,L"SHA-256",sigData);
if (success != TRUE) {
wprintf(L"%s\n",CkRsaW_lastErrorText(rsa));
CkCertStoreW_Dispose(certStore);
CkJsonObjectW_Dispose(json);
CkCertW_Dispose(cert);
CkRsaW_Dispose(rsa);
CkByteData_Dispose(dataToSign);
CkByteData_Dispose(sigData);
CkFileAccessW_Dispose(fac);
return;
}
wprintf(L"Signature created.\n");
CkCertStoreW_Dispose(certStore);
CkJsonObjectW_Dispose(json);
CkCertW_Dispose(cert);
CkRsaW_Dispose(rsa);
CkByteData_Dispose(dataToSign);
CkByteData_Dispose(sigData);
CkFileAccessW_Dispose(fac);
}