blob: 3dc64cde904074d721d65e101e671f1dc11fd36c [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
[email protected]be796bb2010-11-18 15:43:437#include <openssl/evp.h>
[email protected]ed31834b2013-07-09 08:32:408#include <openssl/rsa.h>
[email protected]be796bb2010-11-18 15:43:439
[email protected]70372d42010-10-22 13:12:3410#include "base/logging.h"
[email protected]3b63f8f42011-03-28 01:54:1511#include "base/memory/scoped_ptr.h"
[email protected]4b559b4d2011-04-14 17:37:1412#include "crypto/openssl_util.h"
[email protected]5ee44d42012-02-08 00:14:5413#include "crypto/rsa_private_key.h"
[email protected]27410402014-07-14 21:01:5214#include "crypto/scoped_openssl_types.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 }
27 return NULL;
28}
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
[email protected]70372d42010-10-22 13:12:3442// static
dougsteed0cf460ec2014-09-19 18:46:0943SignatureCreator* SignatureCreator::Create(RSAPrivateKey* key,
44 HashAlgorithm hash_alg) {
[email protected]be796bb2010-11-18 15:43:4345 OpenSSLErrStackTracer err_tracer(FROM_HERE);
46 scoped_ptr<SignatureCreator> result(new SignatureCreator);
dougsteed0cf460ec2014-09-19 18:46:0947 const EVP_MD* const digest = ToOpenSSLDigest(hash_alg);
48 DCHECK(digest);
49 if (!digest) {
50 return NULL;
51 }
davidben183ce632015-01-21 14:21:3652 if (!EVP_DigestSignInit(result->sign_context_, NULL, digest, NULL,
53 key->key())) {
[email protected]be796bb2010-11-18 15:43:4354 return NULL;
davidben183ce632015-01-21 14:21:3655 }
[email protected]be796bb2010-11-18 15:43:4356 return result.release();
[email protected]70372d42010-10-22 13:12:3457}
58
[email protected]ed31834b2013-07-09 08:32:4059// static
60bool SignatureCreator::Sign(RSAPrivateKey* key,
dougsteed0cf460ec2014-09-19 18:46:0961 HashAlgorithm hash_alg,
[email protected]ed31834b2013-07-09 08:32:4062 const uint8* data,
63 int data_len,
64 std::vector<uint8>* signature) {
[email protected]27410402014-07-14 21:01:5265 ScopedRSA rsa_key(EVP_PKEY_get1_RSA(key->key()));
[email protected]ed31834b2013-07-09 08:32:4066 if (!rsa_key)
67 return false;
[email protected]27410402014-07-14 21:01:5268 signature->resize(RSA_size(rsa_key.get()));
[email protected]ed31834b2013-07-09 08:32:4069
70 unsigned int len = 0;
davidben50a133b52014-10-02 02:20:4371 if (!RSA_sign(ToOpenSSLDigestType(hash_alg), data, data_len,
davidben4507eaa2015-11-19 19:07:0672 signature->data(), &len, rsa_key.get())) {
[email protected]ed31834b2013-07-09 08:32:4073 signature->clear();
74 return false;
75 }
76 signature->resize(len);
77 return true;
78}
79
[email protected]be796bb2010-11-18 15:43:4380SignatureCreator::SignatureCreator()
81 : sign_context_(EVP_MD_CTX_create()) {
[email protected]70372d42010-10-22 13:12:3482}
83
84SignatureCreator::~SignatureCreator() {
[email protected]be796bb2010-11-18 15:43:4385 EVP_MD_CTX_destroy(sign_context_);
[email protected]70372d42010-10-22 13:12:3486}
87
88bool SignatureCreator::Update(const uint8* data_part, int data_part_len) {
[email protected]be796bb2010-11-18 15:43:4389 OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidben183ce632015-01-21 14:21:3690 return !!EVP_DigestSignUpdate(sign_context_, data_part, data_part_len);
[email protected]70372d42010-10-22 13:12:3491}
92
93bool SignatureCreator::Final(std::vector<uint8>* signature) {
[email protected]be796bb2010-11-18 15:43:4394 OpenSSLErrStackTracer err_tracer(FROM_HERE);
[email protected]be796bb2010-11-18 15:43:4395
davidben183ce632015-01-21 14:21:3696 // Determine the maximum length of the signature.
97 size_t len = 0;
98 if (!EVP_DigestSignFinal(sign_context_, NULL, &len)) {
99 signature->clear();
100 return false;
101 }
102 signature->resize(len);
103
104 // Sign it.
davidben4507eaa2015-11-19 19:07:06105 if (!EVP_DigestSignFinal(sign_context_, signature->data(), &len)) {
[email protected]be796bb2010-11-18 15:43:43106 signature->clear();
107 return false;
108 }
109 signature->resize(len);
110 return true;
[email protected]70372d42010-10-22 13:12:34111}
112
[email protected]4b559b4d2011-04-14 17:37:14113} // namespace crypto