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

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: I'm blind Created 4 years, 5 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
« no previous file with comments | « crypto/signature_creator.h ('k') | crypto/signature_verifier.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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>
13
14 #include "base/logging.h" 12 #include "base/logging.h"
15 #include "crypto/openssl_util.h" 13 #include "crypto/openssl_util.h"
16 #include "crypto/rsa_private_key.h" 14 #include "crypto/rsa_private_key.h"
17 #include "crypto/scoped_openssl_types.h" 15 #include "crypto/scoped_openssl_types.h"
18 16
19 namespace crypto { 17 namespace crypto {
20 18
21 namespace { 19 namespace {
22 20
23 const EVP_MD* ToOpenSSLDigest(SignatureCreator::HashAlgorithm hash_alg) { 21 const EVP_MD* ToOpenSSLDigest(SignatureCreator::HashAlgorithm hash_alg) {
24 switch (hash_alg) { 22 switch (hash_alg) {
25 case SignatureCreator::SHA1: 23 case SignatureCreator::SHA1:
26 return EVP_sha1(); 24 return EVP_sha1();
27 case SignatureCreator::SHA256: 25 case SignatureCreator::SHA256:
28 return EVP_sha256(); 26 return EVP_sha256();
29 } 27 }
30 return NULL; 28 return nullptr;
31 } 29 }
32 30
33 int ToOpenSSLDigestType(SignatureCreator::HashAlgorithm hash_alg) { 31 int ToOpenSSLDigestType(SignatureCreator::HashAlgorithm hash_alg) {
34 switch (hash_alg) { 32 switch (hash_alg) {
35 case SignatureCreator::SHA1: 33 case SignatureCreator::SHA1:
36 return NID_sha1; 34 return NID_sha1;
37 case SignatureCreator::SHA256: 35 case SignatureCreator::SHA256:
38 return NID_sha256; 36 return NID_sha256;
39 } 37 }
40 return NID_undef; 38 return NID_undef;
41 } 39 }
42 40
43 } // namespace 41 } // namespace
44 42
43 SignatureCreator::~SignatureCreator() {
44 EVP_MD_CTX_destroy(sign_context_);
45 }
46
45 // static 47 // static
46 SignatureCreator* SignatureCreator::Create(RSAPrivateKey* key, 48 std::unique_ptr<SignatureCreator> SignatureCreator::Create(
47 HashAlgorithm hash_alg) { 49 RSAPrivateKey* key,
50 HashAlgorithm hash_alg) {
48 OpenSSLErrStackTracer err_tracer(FROM_HERE); 51 OpenSSLErrStackTracer err_tracer(FROM_HERE);
49 std::unique_ptr<SignatureCreator> result(new SignatureCreator); 52 std::unique_ptr<SignatureCreator> result(new SignatureCreator);
50 const EVP_MD* const digest = ToOpenSSLDigest(hash_alg); 53 const EVP_MD* const digest = ToOpenSSLDigest(hash_alg);
51 DCHECK(digest); 54 DCHECK(digest);
52 if (!digest) { 55 if (!digest) {
53 return NULL; 56 return nullptr;
54 } 57 }
55 if (!EVP_DigestSignInit(result->sign_context_, NULL, digest, NULL, 58 if (!EVP_DigestSignInit(result->sign_context_, nullptr, digest, nullptr,
56 key->key())) { 59 key->key())) {
57 return NULL; 60 return nullptr;
58 } 61 }
59 return result.release(); 62 return result;
60 } 63 }
61 64
62 // static 65 // static
63 bool SignatureCreator::Sign(RSAPrivateKey* key, 66 bool SignatureCreator::Sign(RSAPrivateKey* key,
64 HashAlgorithm hash_alg, 67 HashAlgorithm hash_alg,
65 const uint8_t* data, 68 const uint8_t* data,
66 int data_len, 69 int data_len,
67 std::vector<uint8_t>* signature) { 70 std::vector<uint8_t>* signature) {
68 ScopedRSA rsa_key(EVP_PKEY_get1_RSA(key->key())); 71 ScopedRSA rsa_key(EVP_PKEY_get1_RSA(key->key()));
69 if (!rsa_key) 72 if (!rsa_key)
70 return false; 73 return false;
71 signature->resize(RSA_size(rsa_key.get())); 74 signature->resize(RSA_size(rsa_key.get()));
72 75
73 unsigned int len = 0; 76 unsigned int len = 0;
74 if (!RSA_sign(ToOpenSSLDigestType(hash_alg), data, data_len, 77 if (!RSA_sign(ToOpenSSLDigestType(hash_alg), data, data_len,
75 signature->data(), &len, rsa_key.get())) { 78 signature->data(), &len, rsa_key.get())) {
76 signature->clear(); 79 signature->clear();
77 return false; 80 return false;
78 } 81 }
79 signature->resize(len); 82 signature->resize(len);
80 return true; 83 return true;
81 } 84 }
82 85
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) { 86 bool SignatureCreator::Update(const uint8_t* data_part, int data_part_len) {
92 OpenSSLErrStackTracer err_tracer(FROM_HERE); 87 OpenSSLErrStackTracer err_tracer(FROM_HERE);
93 return !!EVP_DigestSignUpdate(sign_context_, data_part, data_part_len); 88 return !!EVP_DigestSignUpdate(sign_context_, data_part, data_part_len);
94 } 89 }
95 90
96 bool SignatureCreator::Final(std::vector<uint8_t>* signature) { 91 bool SignatureCreator::Final(std::vector<uint8_t>* signature) {
97 OpenSSLErrStackTracer err_tracer(FROM_HERE); 92 OpenSSLErrStackTracer err_tracer(FROM_HERE);
98 93
99 // Determine the maximum length of the signature. 94 // Determine the maximum length of the signature.
100 size_t len = 0; 95 size_t len = 0;
101 if (!EVP_DigestSignFinal(sign_context_, NULL, &len)) { 96 if (!EVP_DigestSignFinal(sign_context_, nullptr, &len)) {
102 signature->clear(); 97 signature->clear();
103 return false; 98 return false;
104 } 99 }
105 signature->resize(len); 100 signature->resize(len);
106 101
107 // Sign it. 102 // Sign it.
108 if (!EVP_DigestSignFinal(sign_context_, signature->data(), &len)) { 103 if (!EVP_DigestSignFinal(sign_context_, signature->data(), &len)) {
109 signature->clear(); 104 signature->clear();
110 return false; 105 return false;
111 } 106 }
112 signature->resize(len); 107 signature->resize(len);
113 return true; 108 return true;
114 } 109 }
115 110
111 SignatureCreator::SignatureCreator() : sign_context_(EVP_MD_CTX_create()) {}
112
116 } // namespace crypto 113 } // namespace crypto
OLDNEW
« no previous file with comments | « crypto/signature_creator.h ('k') | crypto/signature_verifier.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698