blob: c440fda031ce149adfba5fae8b15a6ebd17a1cd5 [file] [log] [blame]
[email protected]5ee44d42012-02-08 00:14:541// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]70372d42010-10-22 13:12:342// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]4b559b4d2011-04-14 17:37:145#include "crypto/signature_creator.h"
[email protected]70372d42010-10-22 13:12:346
avidd373b8b2015-12-21 21:34:437#include <stddef.h>
8#include <stdint.h>
[email protected]be796bb2010-11-18 15:43:439
[email protected]70372d42010-10-22 13:12:3410#include "base/logging.h"
[email protected]4b559b4d2011-04-14 17:37:1411#include "crypto/openssl_util.h"
[email protected]5ee44d42012-02-08 00:14:5412#include "crypto/rsa_private_key.h"
tfarina29a3a1742016-10-28 18:47:3313#include "third_party/boringssl/src/include/openssl/evp.h"
14#include "third_party/boringssl/src/include/openssl/rsa.h"
[email protected]70372d42010-10-22 13:12:3415
[email protected]4b559b4d2011-04-14 17:37:1416namespace crypto {
[email protected]70372d42010-10-22 13:12:3417
dougsteed0cf460ec2014-09-19 18:46:0918namespace {
19
20const EVP_MD* ToOpenSSLDigest(SignatureCreator::HashAlgorithm hash_alg) {
21 switch (hash_alg) {
22 case SignatureCreator::SHA1:
23 return EVP_sha1();
24 case SignatureCreator::SHA256:
25 return EVP_sha256();
26 }
rsleeviffe5a132016-06-28 01:51:5227 return nullptr;
dougsteed0cf460ec2014-09-19 18:46:0928}
29
30int ToOpenSSLDigestType(SignatureCreator::HashAlgorithm hash_alg) {
31 switch (hash_alg) {
32 case SignatureCreator::SHA1:
33 return NID_sha1;
34 case SignatureCreator::SHA256:
35 return NID_sha256;
36 }
37 return NID_undef;
38}
39
40} // namespace
41
rsleeviffe5a132016-06-28 01:51:5242SignatureCreator::~SignatureCreator() {
43 EVP_MD_CTX_destroy(sign_context_);
44}
45
[email protected]70372d42010-10-22 13:12:3446// static
rsleeviffe5a132016-06-28 01:51:5247std::unique_ptr<SignatureCreator> SignatureCreator::Create(
48 RSAPrivateKey* key,
49 HashAlgorithm hash_alg) {
[email protected]be796bb2010-11-18 15:43:4350 OpenSSLErrStackTracer err_tracer(FROM_HERE);
thakisd1a18472016-04-08 22:30:4151 std::unique_ptr<SignatureCreator> result(new SignatureCreator);
dougsteed0cf460ec2014-09-19 18:46:0952 const EVP_MD* const digest = ToOpenSSLDigest(hash_alg);
53 DCHECK(digest);
54 if (!digest) {
rsleeviffe5a132016-06-28 01:51:5255 return nullptr;
dougsteed0cf460ec2014-09-19 18:46:0956 }
rsleeviffe5a132016-06-28 01:51:5257 if (!EVP_DigestSignInit(result->sign_context_, nullptr, digest, nullptr,
davidben183ce632015-01-21 14:21:3658 key->key())) {
rsleeviffe5a132016-06-28 01:51:5259 return nullptr;
davidben183ce632015-01-21 14:21:3660 }
rsleeviffe5a132016-06-28 01:51:5261 return result;
[email protected]70372d42010-10-22 13:12:3462}
63
[email protected]ed31834b2013-07-09 08:32:4064// static
65bool SignatureCreator::Sign(RSAPrivateKey* key,
dougsteed0cf460ec2014-09-19 18:46:0966 HashAlgorithm hash_alg,
avidd373b8b2015-12-21 21:34:4367 const uint8_t* data,
[email protected]ed31834b2013-07-09 08:32:4068 int data_len,
avidd373b8b2015-12-21 21:34:4369 std::vector<uint8_t>* signature) {
davidben74f67442016-10-01 01:45:2270 bssl::UniquePtr<RSA> rsa_key(EVP_PKEY_get1_RSA(key->key()));
[email protected]ed31834b2013-07-09 08:32:4071 if (!rsa_key)
72 return false;
[email protected]27410402014-07-14 21:01:5273 signature->resize(RSA_size(rsa_key.get()));
[email protected]ed31834b2013-07-09 08:32:4074
75 unsigned int len = 0;
davidben50a133b52014-10-02 02:20:4376 if (!RSA_sign(ToOpenSSLDigestType(hash_alg), data, data_len,
davidben4507eaa2015-11-19 19:07:0677 signature->data(), &len, rsa_key.get())) {
[email protected]ed31834b2013-07-09 08:32:4078 signature->clear();
79 return false;
80 }
81 signature->resize(len);
82 return true;
83}
84
avidd373b8b2015-12-21 21:34:4385bool SignatureCreator::Update(const uint8_t* data_part, int data_part_len) {
[email protected]be796bb2010-11-18 15:43:4386 OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidben183ce632015-01-21 14:21:3687 return !!EVP_DigestSignUpdate(sign_context_, data_part, data_part_len);
[email protected]70372d42010-10-22 13:12:3488}
89
avidd373b8b2015-12-21 21:34:4390bool SignatureCreator::Final(std::vector<uint8_t>* signature) {
[email protected]be796bb2010-11-18 15:43:4391 OpenSSLErrStackTracer err_tracer(FROM_HERE);
[email protected]be796bb2010-11-18 15:43:4392
davidben183ce632015-01-21 14:21:3693 // Determine the maximum length of the signature.
94 size_t len = 0;
rsleeviffe5a132016-06-28 01:51:5295 if (!EVP_DigestSignFinal(sign_context_, nullptr, &len)) {
davidben183ce632015-01-21 14:21:3696 signature->clear();
97 return false;
98 }
99 signature->resize(len);
100
101 // Sign it.
davidben4507eaa2015-11-19 19:07:06102 if (!EVP_DigestSignFinal(sign_context_, signature->data(), &len)) {
[email protected]be796bb2010-11-18 15:43:43103 signature->clear();
104 return false;
105 }
106 signature->resize(len);
107 return true;
[email protected]70372d42010-10-22 13:12:34108}
109
rsleeviffe5a132016-06-28 01:51:52110SignatureCreator::SignatureCreator() : sign_context_(EVP_MD_CTX_create()) {}
111
[email protected]4b559b4d2011-04-14 17:37:14112} // namespace crypto