my $ecdsa = Crypt::OpenSSL::ECDSA::ECDSA_SIG->new(); $ecdsa->set_r( $sig->{r} ); $ecdsa->set_s( $sig->{s} ); my $nid = ???( '1.2.3.4' ); # Extracted from CSR my $key = Crypt::OpenSSL::EC::EC_KEY::new_by_curve_name( $nid); my $asn1PublicKey = "....I have this"; ???$asn1PublicKey = asn1_to_EC_POINT( $asn1PublicKey ); # How? Crypt::OpenSSL::EC::EC_KEY::set_public_key( $key,$asn1PublicKey ) or croak( "Failed to create key" ); my $verify = Crypt::OpenSSL::ECDSA::ECDSA_do_verify( sha256( $certificationRequest ), $ecdsa, $key ); # The equivalent for RSA is trivial: my $key = Crypt::OpenSSL::RSA->new_public_key( $asn1PublicKey ); $key->use_sha256_hash; $key->use_pkcs1_padding; $verify = $key->verify( $certificationRequest, $signature ); # DSA is similar