remember doing something along the lines of : ecPublicKey = X509_get_pubkey(readCertificate); EC_KEY *ecKey; ecKey = EVP_PKEY_get1_EC_KEY(ecPublicKey); EC_KEY_set_asn1_flag(ecKey, <Put in the curve name>); ecGroup = EC_GROUP_new_by_curve_name(<Put in the curve name>); EC_KEY_set_group(ecKey, ecGroup);
int status = ECDSA_verify(ecPublicKey->type, digest, SHA256_DIGEST_LENGTH, signatureBytes, Signaturelength, ecKey); if(status==1) //signature is valid I will let someone with more experience comment on whether it is right or wrong. On Tue, Jun 10, 2014 at 7:24 AM, Anant Rao <a...@noknok.com> wrote: > Hi, > > Objective in one-line: > ================= > Verify a signature, given an ECDSA public key in X509 format. > > > Details: > ====== > I read an X509 cert stored on disk. The following are some of its contents: > > Public Key Algorithm: id-ecPublicKey > Public-Key: (256 bit) > > ... > ASN1 OID: prime256v1 > Signature Algorithm: ecdsa-with-SHA1 > ... > > > Now, I get some data that is signed by the private key corresponding to > the above public key/cert and I need to verify it. > > Here're some pieces of my code: > > ... > EVP_PKEY *pub_key = X509_get_pubkey(cert); //this is OK > ... > EVP_VerifyFinal(&c, signature, signature_len, pub_key); //this fails; Why > does it fail? > > The following are the errors from the above VerifyFinal: > > 140310811899840:error:0D07207B:asn1 encoding > routines:ASN1_get_object:header too long:asn1_lib.c:150: > 140310811899840:error:0D068066:asn1 encoding routines:ASN1_CHECK_TLEN:bad > object header:tasn_dec.c:1306: > 140310811899840:error:0D07803A:asn1 encoding > routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:381:Type=ECDSA_SIG > > > So, after reading this page ( > http://wiki.openssl.org/index.php/Elliptic_Curve_Cryptography), I > realized I need to extract the EC_POINT out of the above public key. > But, I'm not sure how to do it. Assuming that that's the right approach, I > want to do the following: > > EC_POINT *pub; > > if(1 != EC_KEY_set_public_key(key, pub)) handleErrors(); > > Can you help how I can retrieve the EC_POINT out of the public key? If > this is not the correct approach at all, could you point what I need to do? > > Thanks a lot in advance! > > -- Swair Mehta