| Index: crypto/signature_verifier_openssl.cc
|
| diff --git a/crypto/signature_verifier_openssl.cc b/crypto/signature_verifier_openssl.cc
|
| index 2e64a58e94b8096e56bc207bd9f39c7d6751faa7..495abd236391cba357f4fd991f04e92bb0445d85 100644
|
| --- a/crypto/signature_verifier_openssl.cc
|
| +++ b/crypto/signature_verifier_openssl.cc
|
| @@ -5,8 +5,8 @@
|
| #include "crypto/signature_verifier.h"
|
|
|
| #include <openssl/bytestring.h>
|
| +#include <openssl/digest.h>
|
| #include <openssl/evp.h>
|
| -#include <openssl/x509.h>
|
| #include <stdint.h>
|
|
|
| #include <vector>
|
| @@ -44,33 +44,32 @@ SignatureVerifier::~SignatureVerifier() {
|
| Reset();
|
| }
|
|
|
| -bool SignatureVerifier::VerifyInit(const uint8_t* signature_algorithm,
|
| - int signature_algorithm_len,
|
| +bool SignatureVerifier::VerifyInit(SignatureAlgorithm signature_algorithm,
|
| const uint8_t* signature,
|
| int signature_len,
|
| const uint8_t* public_key_info,
|
| int public_key_info_len) {
|
| - OpenSSLErrStackTracer err_tracer(FROM_HERE);
|
| - ScopedOpenSSL<X509_ALGOR, X509_ALGOR_free> algorithm(
|
| - d2i_X509_ALGOR(NULL, &signature_algorithm, signature_algorithm_len));
|
| - if (!algorithm.get())
|
| - return false;
|
| - 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);
|
| + int pkey_type = EVP_PKEY_NONE;
|
| + const EVP_MD* digest = nullptr;
|
| + switch (signature_algorithm) {
|
| + case RSA_PKCS1_SHA1:
|
| + pkey_type = EVP_PKEY_RSA;
|
| + digest = EVP_sha1();
|
| + break;
|
| + case RSA_PKCS1_SHA256:
|
| + pkey_type = EVP_PKEY_RSA;
|
| + digest = EVP_sha256();
|
| + break;
|
| + case ECDSA_SHA256:
|
| + pkey_type = EVP_PKEY_EC;
|
| + digest = EVP_sha256();
|
| + break;
|
| }
|
| - if (!digest)
|
| - return false;
|
| + DCHECK_NE(EVP_PKEY_NONE, pkey_type);
|
| + DCHECK(digest);
|
|
|
| - return CommonInit(digest, signature, signature_len, public_key_info,
|
| - public_key_info_len, NULL);
|
| + return CommonInit(pkey_type, digest, signature, signature_len,
|
| + public_key_info, public_key_info_len, nullptr);
|
| }
|
|
|
| bool SignatureVerifier::VerifyInitRSAPSS(HashAlgorithm hash_alg,
|
| @@ -88,8 +87,8 @@ bool SignatureVerifier::VerifyInitRSAPSS(HashAlgorithm hash_alg,
|
| }
|
|
|
| EVP_PKEY_CTX* pkey_ctx;
|
| - if (!CommonInit(digest, signature, signature_len, public_key_info,
|
| - public_key_info_len, &pkey_ctx)) {
|
| + if (!CommonInit(EVP_PKEY_RSA, digest, signature, signature_len,
|
| + public_key_info, public_key_info_len, &pkey_ctx)) {
|
| return false;
|
| }
|
|
|
| @@ -101,11 +100,8 @@ bool SignatureVerifier::VerifyInitRSAPSS(HashAlgorithm hash_alg,
|
| if (!mgf_digest) {
|
| return false;
|
| }
|
| - rv = EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, mgf_digest);
|
| - if (rv != 1)
|
| - return false;
|
| - rv = EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, salt_len);
|
| - return rv == 1;
|
| + return EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, mgf_digest) &&
|
| + EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, salt_len);
|
| }
|
|
|
| void SignatureVerifier::VerifyUpdate(const uint8_t* data_part,
|
| @@ -127,7 +123,8 @@ bool SignatureVerifier::VerifyFinal() {
|
| return rv == 1;
|
| }
|
|
|
| -bool SignatureVerifier::CommonInit(const EVP_MD* digest,
|
| +bool SignatureVerifier::CommonInit(int pkey_type,
|
| + const EVP_MD* digest,
|
| const uint8_t* signature,
|
| int signature_len,
|
| const uint8_t* public_key_info,
|
| @@ -143,8 +140,10 @@ bool SignatureVerifier::CommonInit(const EVP_MD* digest,
|
| CBS cbs;
|
| CBS_init(&cbs, public_key_info, public_key_info_len);
|
| ScopedEVP_PKEY public_key(EVP_parse_public_key(&cbs));
|
| - if (!public_key || CBS_len(&cbs) != 0)
|
| + if (!public_key || CBS_len(&cbs) != 0 ||
|
| + EVP_PKEY_id(public_key.get()) != pkey_type) {
|
| return false;
|
| + }
|
|
|
| verify_context_->ctx.reset(EVP_MD_CTX_create());
|
| int rv = EVP_DigestVerifyInit(verify_context_->ctx.get(), pkey_ctx,
|
|
|