C
C
Verfies an RSA Signature
See more Apple Keychain Examples
Verifies an RSA signature against the original data.Chilkat C Downloads
#include <C_CkBinData.h>
#include <C_CkPublicKey.h>
#include <C_CkRsa.h>
void ChilkatSample(void)
{
BOOL success;
HCkBinData bd;
int i;
HCkBinData bdSig;
HCkPublicKey pubKey;
HCkRsa rsa;
success = FALSE;
// The following data was signed by the following example:
// RSA Sign using a Private Key on a USB Token or Smartcard
bd = CkBinData_Create();
for (i = 0; i <= 100; i++) {
CkBinData_AppendEncoded(bd,"000102030405060708090A0B0C0D0E0F","hex");
}
// Load the signature
bdSig = CkBinData_Create();
success = CkBinData_LoadFile(bdSig,"rsaSignatures/test1.sig");
if (success == FALSE) {
printf("Failed to load the RSA signature\n");
CkBinData_Dispose(bd);
CkBinData_Dispose(bdSig);
return;
}
// Get the public key to be used for signature verification.
pubKey = CkPublicKey_Create();
success = CkPublicKey_LoadFromFile(pubKey,"rsaKeys/chilkat-rsa-2048.pem");
if (success == FALSE) {
printf("%s\n",CkPublicKey_lastErrorText(pubKey));
CkBinData_Dispose(bd);
CkBinData_Dispose(bdSig);
CkPublicKey_Dispose(pubKey);
return;
}
rsa = CkRsa_Create();
success = CkRsa_UsePublicKey(rsa,pubKey);
if (success == FALSE) {
printf("%s\n",CkRsa_lastErrorText(rsa));
CkBinData_Dispose(bd);
CkBinData_Dispose(bdSig);
CkPublicKey_Dispose(pubKey);
CkRsa_Dispose(rsa);
return;
}
// Verify the hash of the data against the signature.
// We pass in the original data. Internally, the hash is generated
// and used to validate the signature.
// Validating the RSA signature means two things:
// (1) the original data is exactly what was signed, and
// (2) it was signed by the owner of the RSA private key.
success = CkRsa_VerifyBd(rsa,bd,"sha256",bdSig);
if (success == FALSE) {
printf("%s\n",CkRsa_lastErrorText(rsa));
printf("Signature invalid.\n");
}
else {
printf("Signature valid.\n");
}
CkBinData_Dispose(bd);
CkBinData_Dispose(bdSig);
CkPublicKey_Dispose(pubKey);
CkRsa_Dispose(rsa);
}