| Index: crypto/signature_verifier_openssl.cc
|
| diff --git a/crypto/signature_verifier_openssl.cc b/crypto/signature_verifier_openssl.cc
|
| index 1e71339d0fdfc7730b30f0eda40be806db931daa..a85f00b491ed8e479883f49e09227a28470c53c5 100644
|
| --- a/crypto/signature_verifier_openssl.cc
|
| +++ b/crypto/signature_verifier_openssl.cc
|
| @@ -53,7 +53,17 @@ bool SignatureVerifier::VerifyInit(const uint8* signature_algorithm,
|
| d2i_X509_ALGOR(NULL, &signature_algorithm, signature_algorithm_len));
|
| if (!algorithm.get())
|
| return false;
|
| - const EVP_MD* digest = EVP_get_digestbyobj(algorithm.get()->algorithm);
|
| + int nid = OBJ_obj2nid(algorithm.get()->algorithm);
|
| + const EVP_MD* digest;
|
| + if (nid == NID_ecdsa_with_SHA1) {
|
| + digest = EVP_sha1();
|
| + } else if (nid == NID_ecdsa_with_SHA256) {
|
| + digest = EVP_sha256();
|
| + } else {
|
| + // This works for PKCS #1 v1.5 RSA signatures, but not for ECDSA
|
| + // signatures.
|
| + digest = EVP_get_digestbyobj(algorithm.get()->algorithm);
|
| + }
|
| if (!digest)
|
| return false;
|
|
|
| @@ -104,7 +114,8 @@ bool SignatureVerifier::VerifyFinal() {
|
| int rv = EVP_DigestVerifyFinal(verify_context_->ctx.get(),
|
| vector_as_array(&signature_),
|
| signature_.size());
|
| - DCHECK_GE(rv, 0);
|
| + // rv is -1 if a DER-encoded ECDSA signature cannot be decoded correctly.
|
| + DCHECK_GE(rv, -1);
|
| Reset();
|
| return rv == 1;
|
| }
|
|
|