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

Side by Side Diff: base/crypto/symmetric_key_mac.cc

Issue 1528021: Implement PBKDF2-based key derivation, random key generation,... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Make albertb's suggested changes. Created 10 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « base/crypto/symmetric_key.h ('k') | base/crypto/symmetric_key_nss.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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "base/crypto/symmetric_key.h" 5 #include "base/crypto/symmetric_key.h"
6 6
7 #include <CommonCrypto/CommonCryptor.h> 7 #include <CommonCrypto/CommonCryptor.h>
8 #include <CoreFoundation/CFString.h> 8 #include <CoreFoundation/CFString.h>
9 #include <Security/cssm.h> 9 #include <Security/cssm.h>
10 10
(...skipping 11 matching lines...) Expand all
22 key_size_in_bits == 256) 22 key_size_in_bits == 256)
23 << "Invalid key size " << key_size_in_bits << " bits"; 23 << "Invalid key size " << key_size_in_bits << " bits";
24 return CSSM_ALGID_AES; 24 return CSSM_ALGID_AES;
25 } else { 25 } else {
26 CHECK(algorithm == base::SymmetricKey::HMAC_SHA1); 26 CHECK(algorithm == base::SymmetricKey::HMAC_SHA1);
27 CHECK(key_size_in_bits >= 80 && (key_size_in_bits % 8) == 0) 27 CHECK(key_size_in_bits >= 80 && (key_size_in_bits % 8) == 0)
28 << "Invalid key size " << key_size_in_bits << " bits"; 28 << "Invalid key size " << key_size_in_bits << " bits";
29 return CSSM_ALGID_SHA1HMAC_LEGACY; 29 return CSSM_ALGID_SHA1HMAC_LEGACY;
30 } 30 }
31 } 31 }
32 32
33 void* CreateRandomBytes(size_t size) { 33 void* CreateRandomBytes(size_t size) {
34 CSSM_RETURN err; 34 CSSM_RETURN err;
35 CSSM_CC_HANDLE ctx; 35 CSSM_CC_HANDLE ctx;
36 err = CSSM_CSP_CreateRandomGenContext(base::GetSharedCSPHandle(), 36 err = CSSM_CSP_CreateRandomGenContext(base::GetSharedCSPHandle(),
37 CSSM_ALGID_APPLE_YARROW, 37 CSSM_ALGID_APPLE_YARROW,
38 NULL, 38 NULL,
39 size, &ctx); 39 size, &ctx);
40 if (err) { 40 if (err) {
41 base::LogCSSMError("CSSM_CSP_CreateRandomGenContext", err); 41 base::LogCSSMError("CSSM_CSP_CreateRandomGenContext", err);
42 return NULL; 42 return NULL;
43 } 43 }
44 CSSM_DATA random_data = {}; 44 CSSM_DATA random_data = {};
45 err = CSSM_GenerateRandom(ctx, &random_data); 45 err = CSSM_GenerateRandom(ctx, &random_data);
46 if (err) { 46 if (err) {
47 base::LogCSSMError("CSSM_GenerateRandom", err); 47 base::LogCSSMError("CSSM_GenerateRandom", err);
48 random_data.Data = NULL; 48 random_data.Data = NULL;
49 } 49 }
50 CSSM_DeleteContext(ctx); 50 CSSM_DeleteContext(ctx);
51 return random_data.Data; // Caller responsible for freeing this 51 return random_data.Data; // Caller responsible for freeing this
52 } 52 }
53 53
54 inline CSSM_DATA StringToData(const std::string& str) { 54 inline CSSM_DATA StringToData(const std::string& str) {
55 CSSM_DATA data = { 55 CSSM_DATA data = {
56 str.size(), 56 str.size(),
57 reinterpret_cast<uint8_t*>(const_cast<char*>(str.data())) 57 reinterpret_cast<uint8_t*>(const_cast<char*>(str.data()))
58 }; 58 };
59 return data; 59 return data;
60 } 60 }
61 61
62 } // namespace 62 } // namespace
63 63
64 namespace base { 64 namespace base {
65 65
66 SymmetricKey::~SymmetricKey() {}
67
66 // static 68 // static
67 SymmetricKey* SymmetricKey::GenerateRandomKey(Algorithm algorithm, 69 SymmetricKey* SymmetricKey::GenerateRandomKey(Algorithm algorithm,
68 size_t key_size_in_bits) { 70 size_t key_size_in_bits) {
69 CheckKeyParams(algorithm, key_size_in_bits); 71 CheckKeyParams(algorithm, key_size_in_bits);
70 void* random_bytes = CreateRandomBytes((key_size_in_bits + 7) / 8); 72 void* random_bytes = CreateRandomBytes((key_size_in_bits + 7) / 8);
71 if (!random_bytes) 73 if (!random_bytes)
72 return NULL; 74 return NULL;
73 SymmetricKey *key = new SymmetricKey(random_bytes, key_size_in_bits); 75 SymmetricKey *key = new SymmetricKey(random_bytes, key_size_in_bits);
74 free(random_bytes); 76 free(random_bytes);
75 return key; 77 return key;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 NULL, 118 NULL,
117 &cssm_key); 119 &cssm_key);
118 if (err) { 120 if (err) {
119 LogCSSMError("CSSM_DeriveKey", err); 121 LogCSSMError("CSSM_DeriveKey", err);
120 goto exit; 122 goto exit;
121 } 123 }
122 124
123 DCHECK_EQ(cssm_key.KeyData.Length, key_size_in_bits / 8); 125 DCHECK_EQ(cssm_key.KeyData.Length, key_size_in_bits / 8);
124 derived_key = new SymmetricKey(cssm_key.KeyData.Data, key_size_in_bits); 126 derived_key = new SymmetricKey(cssm_key.KeyData.Data, key_size_in_bits);
125 127
126 exit: 128 exit:
127 CSSM_DeleteContext(ctx); 129 CSSM_DeleteContext(ctx);
128 CSSM_FreeKey(GetSharedCSPHandle(), &credentials, &cssm_key, false); 130 CSSM_FreeKey(GetSharedCSPHandle(), &credentials, &cssm_key, false);
129 return derived_key; 131 return derived_key;
130 } 132 }
131 133
132 SymmetricKey::SymmetricKey(const void *key_data, size_t key_size_in_bits) 134 SymmetricKey::SymmetricKey(const void *key_data, size_t key_size_in_bits)
133 : key_(reinterpret_cast<const char*>(key_data), 135 : key_(reinterpret_cast<const char*>(key_data),
134 key_size_in_bits / 8) {} 136 key_size_in_bits / 8) {}
135 137
136 bool SymmetricKey::GetRawKey(std::string* raw_key) { 138 bool SymmetricKey::GetRawKey(std::string* raw_key) {
137 *raw_key = key_; 139 *raw_key = key_;
138 return true; 140 return true;
139 } 141 }
140 142
141 CSSM_DATA SymmetricKey::cssm_data() const { 143 CSSM_DATA SymmetricKey::cssm_data() const {
142 return StringToData(key_); 144 return StringToData(key_);
143 } 145 }
144 146
145 } // namespace base 147 } // namespace base
OLDNEW
« no previous file with comments | « base/crypto/symmetric_key.h ('k') | base/crypto/symmetric_key_nss.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698