Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(220)

Side by Side Diff: crypto/signature_creator.cc

Issue 2095523002: Make //crypto factories return std::unique_ptr<>s (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix comment Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "crypto/signature_creator.h" 5 #include "crypto/signature_creator.h"
6 6
7 #include <openssl/evp.h> 7 #include <openssl/evp.h>
8 #include <openssl/rsa.h> 8 #include <openssl/rsa.h>
9 #include <stddef.h> 9 #include <stddef.h>
10 #include <stdint.h> 10 #include <stdint.h>
11 11
12 #include <memory> 12 #include <memory>
davidben 2016/06/23 03:09:36 Nit: in header
13 13
14 #include "base/logging.h" 14 #include "base/logging.h"
15 #include "crypto/openssl_util.h" 15 #include "crypto/openssl_util.h"
16 #include "crypto/rsa_private_key.h" 16 #include "crypto/rsa_private_key.h"
17 #include "crypto/scoped_openssl_types.h" 17 #include "crypto/scoped_openssl_types.h"
18 18
19 namespace crypto { 19 namespace crypto {
20 20
21 namespace { 21 namespace {
22 22
23 const EVP_MD* ToOpenSSLDigest(SignatureCreator::HashAlgorithm hash_alg) { 23 const EVP_MD* ToOpenSSLDigest(SignatureCreator::HashAlgorithm hash_alg) {
24 switch (hash_alg) { 24 switch (hash_alg) {
25 case SignatureCreator::SHA1: 25 case SignatureCreator::SHA1:
26 return EVP_sha1(); 26 return EVP_sha1();
27 case SignatureCreator::SHA256: 27 case SignatureCreator::SHA256:
28 return EVP_sha256(); 28 return EVP_sha256();
29 } 29 }
30 return NULL; 30 return nullptr;
31 } 31 }
32 32
33 int ToOpenSSLDigestType(SignatureCreator::HashAlgorithm hash_alg) { 33 int ToOpenSSLDigestType(SignatureCreator::HashAlgorithm hash_alg) {
34 switch (hash_alg) { 34 switch (hash_alg) {
35 case SignatureCreator::SHA1: 35 case SignatureCreator::SHA1:
36 return NID_sha1; 36 return NID_sha1;
37 case SignatureCreator::SHA256: 37 case SignatureCreator::SHA256:
38 return NID_sha256; 38 return NID_sha256;
39 } 39 }
40 return NID_undef; 40 return NID_undef;
41 } 41 }
42 42
43 } // namespace 43 } // namespace
44 44
45 SignatureCreator::~SignatureCreator() {
46 EVP_MD_CTX_destroy(sign_context_);
47 }
48
45 // static 49 // static
46 SignatureCreator* SignatureCreator::Create(RSAPrivateKey* key, 50 std::unique_ptr<SignatureCreator> SignatureCreator::Create(
47 HashAlgorithm hash_alg) { 51 RSAPrivateKey* key,
52 HashAlgorithm hash_alg) {
48 OpenSSLErrStackTracer err_tracer(FROM_HERE); 53 OpenSSLErrStackTracer err_tracer(FROM_HERE);
49 std::unique_ptr<SignatureCreator> result(new SignatureCreator); 54 std::unique_ptr<SignatureCreator> result(new SignatureCreator);
50 const EVP_MD* const digest = ToOpenSSLDigest(hash_alg); 55 const EVP_MD* const digest = ToOpenSSLDigest(hash_alg);
51 DCHECK(digest); 56 DCHECK(digest);
52 if (!digest) { 57 if (!digest) {
53 return NULL; 58 return nullptr;
54 } 59 }
55 if (!EVP_DigestSignInit(result->sign_context_, NULL, digest, NULL, 60 if (!EVP_DigestSignInit(result->sign_context_, nullptr, digest, nullptr,
56 key->key())) { 61 key->key())) {
57 return NULL; 62 return nullptr;
58 } 63 }
59 return result.release(); 64 return result;
60 } 65 }
61 66
62 // static 67 // static
63 bool SignatureCreator::Sign(RSAPrivateKey* key, 68 bool SignatureCreator::Sign(RSAPrivateKey* key,
64 HashAlgorithm hash_alg, 69 HashAlgorithm hash_alg,
65 const uint8_t* data, 70 const uint8_t* data,
66 int data_len, 71 int data_len,
67 std::vector<uint8_t>* signature) { 72 std::vector<uint8_t>* signature) {
68 ScopedRSA rsa_key(EVP_PKEY_get1_RSA(key->key())); 73 ScopedRSA rsa_key(EVP_PKEY_get1_RSA(key->key()));
69 if (!rsa_key) 74 if (!rsa_key)
70 return false; 75 return false;
71 signature->resize(RSA_size(rsa_key.get())); 76 signature->resize(RSA_size(rsa_key.get()));
72 77
73 unsigned int len = 0; 78 unsigned int len = 0;
74 if (!RSA_sign(ToOpenSSLDigestType(hash_alg), data, data_len, 79 if (!RSA_sign(ToOpenSSLDigestType(hash_alg), data, data_len,
75 signature->data(), &len, rsa_key.get())) { 80 signature->data(), &len, rsa_key.get())) {
76 signature->clear(); 81 signature->clear();
77 return false; 82 return false;
78 } 83 }
79 signature->resize(len); 84 signature->resize(len);
80 return true; 85 return true;
81 } 86 }
82 87
83 SignatureCreator::SignatureCreator()
84 : sign_context_(EVP_MD_CTX_create()) {
85 }
86
87 SignatureCreator::~SignatureCreator() {
88 EVP_MD_CTX_destroy(sign_context_);
89 }
90
91 bool SignatureCreator::Update(const uint8_t* data_part, int data_part_len) { 88 bool SignatureCreator::Update(const uint8_t* data_part, int data_part_len) {
92 OpenSSLErrStackTracer err_tracer(FROM_HERE); 89 OpenSSLErrStackTracer err_tracer(FROM_HERE);
93 return !!EVP_DigestSignUpdate(sign_context_, data_part, data_part_len); 90 return !!EVP_DigestSignUpdate(sign_context_, data_part, data_part_len);
94 } 91 }
95 92
96 bool SignatureCreator::Final(std::vector<uint8_t>* signature) { 93 bool SignatureCreator::Final(std::vector<uint8_t>* signature) {
97 OpenSSLErrStackTracer err_tracer(FROM_HERE); 94 OpenSSLErrStackTracer err_tracer(FROM_HERE);
98 95
99 // Determine the maximum length of the signature. 96 // Determine the maximum length of the signature.
100 size_t len = 0; 97 size_t len = 0;
101 if (!EVP_DigestSignFinal(sign_context_, NULL, &len)) { 98 if (!EVP_DigestSignFinal(sign_context_, nullptr, &len)) {
102 signature->clear(); 99 signature->clear();
103 return false; 100 return false;
104 } 101 }
105 signature->resize(len); 102 signature->resize(len);
106 103
107 // Sign it. 104 // Sign it.
108 if (!EVP_DigestSignFinal(sign_context_, signature->data(), &len)) { 105 if (!EVP_DigestSignFinal(sign_context_, signature->data(), &len)) {
109 signature->clear(); 106 signature->clear();
110 return false; 107 return false;
111 } 108 }
112 signature->resize(len); 109 signature->resize(len);
113 return true; 110 return true;
114 } 111 }
115 112
113 SignatureCreator::SignatureCreator() : sign_context_(EVP_MD_CTX_create()) {}
114
116 } // namespace crypto 115 } // namespace crypto
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698