Unicode C
Unicode C
RSA Sign String using Private Key of Certificate Type A3 (smart card / token)
See more RSA Examples
Demonstrates RSA signing a string 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>
void ChilkatSample(void)
{
BOOL success;
HCkCertStoreW certStore;
const wchar_t *thumbprint;
BOOL bReadOnly;
HCkJsonObjectW json;
HCkCertW cert;
HCkRsaW rsa;
BOOL bUsePrivateKey;
const wchar_t *sigBase64;
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;
}
// Return the RSA signature in base64 encoded form.
CkRsaW_putEncodingMode(rsa,L"base64");
// Sign the utf-8 byte representation of the string.
CkRsaW_putCharset(rsa,L"utf-8");
// You can also choose other hash algorithms, such as SHA-1.
sigBase64 = CkRsaW_signStringENC(rsa,L"text to sign",L"SHA-256");
if (CkRsaW_getLastMethodSuccess(rsa) != TRUE) {
wprintf(L"%s\n",CkRsaW_lastErrorText(rsa));
CkCertStoreW_Dispose(certStore);
CkJsonObjectW_Dispose(json);
CkCertW_Dispose(cert);
CkRsaW_Dispose(rsa);
return;
}
wprintf(L"Base64 signature: %s\n",sigBase64);
CkCertStoreW_Dispose(certStore);
CkJsonObjectW_Dispose(json);
CkCertW_Dispose(cert);
CkRsaW_Dispose(rsa);
}