Hello, I wrote a simple code to sign and verify using DSA keys, but I am facing some problem with verification and I cannot figure it out. This is the error I get: error:0A071003:dsa routines:DSA_do_verify:BN lib
I know the error comes from EVP_VerifyFinal, but I don't exactly know why. My code for signing and verification looks as follows: do_sign(EVP_PKEY *k, char *data, unsigned int data_len, char *signature, unsigned int *sig_len) { EVP_MD_CTX *ctx = EVP_MD_CTX_create(); if (EVP_SignInit(ctx, EVP_sha256() == 1) && EVP_SignUpdate(ctx, data, data_len) == 1) && EVP_SignFinal(ctx, (unsigned char *)signature, sig_len, k) == 1) { -- cleanup --- return success; } -- print error -- -- cleanup -- return failure; } do_verify(EVP_PKEY *k, char *data, unsigned int data_len, char *signature, unsigned int sig_len) { EVP_MD_CTX *ctx = EVP_MD_CTX_create(); if (EVP_VerifyInit(ctx, EVP_sha256()) == 1 && EVP_VerifyUpdate(ctx, data, data_len) == 1) { int ret = EVP_VerifyFinal(ctx, (unsigned char *)signature, sig_len, k); --- cleanup -- if (ret > 0) return success; else { -- print error -- -- cleanup -- return failure; } } -- cleanup -- return failure; } I generated dsa keypair using ssh-keygen. And to get the DSA public key in PEM format, I used the following command: openssl dsa -in id_dsa -pubout > id_dsa_pem.pub I read in the keys and have a buffer of arbitrary content to be signed and verified. To test I use the following code snippet: int dsa_privkey_len = DSA_size(dsa_priv); char *sig = malloc(dsa_privkey_len); int sig_len = 0; do_sign(dsa_priv, data, strlen(data), sig, &sig_len); char *ver_data = malloc(1024); memset(ver_data, 0, 1024); do_verify(dsa_pub, ver_data, strlen(data), sig, sig_len); Could someone help me debug the issue? I am using openssl-1.0.1e. Please let me know if any other information is required. Thanks and regards, Aastha.