I have some signed data (separated in signdata and its signature[base64 encoded]) that should be verified by a provided public key for a match. The data is provide by external functions that store the data in a structure like the following.
typedef struct {
char * signature;
char * signedData; // base64 encoded --> decoding required
} data;
I'm in need of converting it to fit into the openssl functions and assume there is a mistake(s) somewhere. It compiles, but crashes (SIGSEGV). It's an Android library and I'm using the NDK. Any ideas/hints? Probably some sort of conversion issue?
// base64 function source: How do I base64 encode (decode) in C?
// check signature based on http://fm4dd.com/openssl/manual-crypto/EVP_PKEY_verify.htm
size_t sdlen, siglen;
char *tmp = malloc(1000);
char *signature = malloc(1000);
char *signData = malloc(1000);
sprintf(tmp, "%s", data.signature);
signature = base64decode(&tmp, strlen(tmp));
siglen = strlen(signature);
sprintf(signData, "%s", data.signedData);
sdlen = strlen(signData);
EVP_PKEY_CTX *ctx = malloc(1000);
unsigned char *md, *sig;
char publickeybase64[] = "MIIBIjANBgkqhk.....";
char *publickey = base64decode(&publickeybase64, strlen(publickeybase64));
EVP_PKEY *verify_key = malloc(1000);
sprintf((char *) verify_key, "%s", publickey);
ctx = EVP_PKEY_CTX_new(verify_key, 0);
if (!ctx) {
printf("E1\n");
}
if (EVP_PKEY_verify_init(ctx) <= 0) {
printf("E2\n");
}
if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) <= 0) {
printf("E3\n");
}
if (EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256() <= 0)) {
printf("E4\n");
}
int ret = EVP_PKEY_verify(ctx, signature, siglen, signData, sdlen);
printf("RESULTVERIFY %d \n", ret);
/* ret == 1 indicates success, 0 verify failure and < 0 for some
* other error.
*/