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

Side by Side Diff: crypto/symmetric_key_win.cc

Issue 1870233002: Convert crypto to std::unique_ptr (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: comment Created 4 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
« no previous file with comments | « crypto/symmetric_key_unittest.cc ('k') | net/android/keystore_openssl.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/symmetric_key.h" 5 #include "crypto/symmetric_key.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <memory>
10 #include <vector> 11 #include <vector>
11 12
12 // TODO(wtc): replace scoped_array by std::vector. 13 // TODO(wtc): replace scoped_array by std::vector.
13 #include "base/memory/scoped_ptr.h"
14 #include "base/sys_byteorder.h" 14 #include "base/sys_byteorder.h"
15 15
16 namespace crypto { 16 namespace crypto {
17 17
18 namespace { 18 namespace {
19 19
20 // The following is a non-public Microsoft header documented in MSDN under 20 // The following is a non-public Microsoft header documented in MSDN under
21 // CryptImportKey / CryptExportKey. Following the header is the byte array of 21 // CryptImportKey / CryptExportKey. Following the header is the byte array of
22 // the actual plaintext key. 22 // the actual plaintext key.
23 struct PlaintextBlobHeader { 23 struct PlaintextBlobHeader {
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 164
165 // Attempts to generate a random, |key_size_in_bits|-long HMAC key, for use 165 // Attempts to generate a random, |key_size_in_bits|-long HMAC key, for use
166 // with the hash function |alg|. 166 // with the hash function |alg|.
167 // |key_size_in_bits| must be >= 1/2 the hash size of |alg| for security. 167 // |key_size_in_bits| must be >= 1/2 the hash size of |alg| for security.
168 // Returns true if generation is successful, storing the generated key in 168 // Returns true if generation is successful, storing the generated key in
169 // |*key| and the key provider (CSP) in |*provider|. 169 // |*key| and the key provider (CSP) in |*provider|.
170 bool GenerateHMACKey(size_t key_size_in_bits, 170 bool GenerateHMACKey(size_t key_size_in_bits,
171 ALG_ID alg, 171 ALG_ID alg,
172 ScopedHCRYPTPROV* provider, 172 ScopedHCRYPTPROV* provider,
173 ScopedHCRYPTKEY* key, 173 ScopedHCRYPTKEY* key,
174 scoped_ptr<BYTE[]>* raw_key) { 174 std::unique_ptr<BYTE[]>* raw_key) {
175 DCHECK(provider); 175 DCHECK(provider);
176 DCHECK(key); 176 DCHECK(key);
177 DCHECK(raw_key); 177 DCHECK(raw_key);
178 178
179 if (!CheckHMACKeySize(key_size_in_bits, alg)) 179 if (!CheckHMACKeySize(key_size_in_bits, alg))
180 return false; 180 return false;
181 181
182 ScopedHCRYPTPROV safe_provider; 182 ScopedHCRYPTPROV safe_provider;
183 // See comment in GenerateAESKey as to why NULL is acceptable for the 183 // See comment in GenerateAESKey as to why NULL is acceptable for the
184 // container name. 184 // container name.
185 BOOL ok = CryptAcquireContext(safe_provider.receive(), NULL, NULL, 185 BOOL ok = CryptAcquireContext(safe_provider.receive(), NULL, NULL,
186 PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); 186 PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
187 if (!ok) 187 if (!ok)
188 return false; 188 return false;
189 189
190 DWORD key_size_in_bytes = static_cast<DWORD>(key_size_in_bits / 8); 190 DWORD key_size_in_bytes = static_cast<DWORD>(key_size_in_bits / 8);
191 scoped_ptr<BYTE[]> random(new BYTE[key_size_in_bytes]); 191 std::unique_ptr<BYTE[]> random(new BYTE[key_size_in_bytes]);
192 ok = CryptGenRandom(safe_provider, key_size_in_bytes, random.get()); 192 ok = CryptGenRandom(safe_provider, key_size_in_bytes, random.get());
193 if (!ok) 193 if (!ok)
194 return false; 194 return false;
195 195
196 ScopedHCRYPTKEY safe_key; 196 ScopedHCRYPTKEY safe_key;
197 bool rv = ImportRawKey(safe_provider, CALG_HMAC, random.get(), 197 bool rv = ImportRawKey(safe_provider, CALG_HMAC, random.get(),
198 key_size_in_bytes, &safe_key); 198 key_size_in_bytes, &safe_key);
199 if (rv) { 199 if (rv) {
200 key->swap(safe_key); 200 key->swap(safe_key);
201 provider->swap(safe_provider); 201 provider->swap(safe_provider);
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 316
317 // static 317 // static
318 SymmetricKey* SymmetricKey::GenerateRandomKey(Algorithm algorithm, 318 SymmetricKey* SymmetricKey::GenerateRandomKey(Algorithm algorithm,
319 size_t key_size_in_bits) { 319 size_t key_size_in_bits) {
320 DCHECK_GE(key_size_in_bits, 8u); 320 DCHECK_GE(key_size_in_bits, 8u);
321 321
322 ScopedHCRYPTPROV provider; 322 ScopedHCRYPTPROV provider;
323 ScopedHCRYPTKEY key; 323 ScopedHCRYPTKEY key;
324 324
325 bool ok = false; 325 bool ok = false;
326 scoped_ptr<BYTE[]> raw_key; 326 std::unique_ptr<BYTE[]> raw_key;
327 327
328 switch (algorithm) { 328 switch (algorithm) {
329 case AES: 329 case AES:
330 ok = GenerateAESKey(key_size_in_bits, &provider, &key); 330 ok = GenerateAESKey(key_size_in_bits, &provider, &key);
331 break; 331 break;
332 case HMAC_SHA1: 332 case HMAC_SHA1:
333 ok = GenerateHMACKey(key_size_in_bits, CALG_SHA1, &provider, 333 ok = GenerateHMACKey(key_size_in_bits, CALG_SHA1, &provider,
334 &key, &raw_key); 334 &key, &raw_key);
335 break; 335 break;
336 } 336 }
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 HCRYPTKEY key, 530 HCRYPTKEY key,
531 const void* key_data, size_t key_size_in_bytes) 531 const void* key_data, size_t key_size_in_bytes)
532 : provider_(provider), key_(key) { 532 : provider_(provider), key_(key) {
533 if (key_data) { 533 if (key_data) {
534 raw_key_.assign(reinterpret_cast<const char*>(key_data), 534 raw_key_.assign(reinterpret_cast<const char*>(key_data),
535 key_size_in_bytes); 535 key_size_in_bytes);
536 } 536 }
537 } 537 }
538 538
539 } // namespace crypto 539 } // namespace crypto
OLDNEW
« no previous file with comments | « crypto/symmetric_key_unittest.cc ('k') | net/android/keystore_openssl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698