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

Side by Side Diff: webrtc/base/opensslidentity.cc

Issue 1329493005: Provide RSA2048 as per RFC (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Rebase. Created 5 years, 2 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 | « webrtc/base/opensslidentity.h ('k') | webrtc/base/ssladapter_unittest.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 /* 1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 15 matching lines...) Expand all
26 #include "webrtc/base/helpers.h" 26 #include "webrtc/base/helpers.h"
27 #include "webrtc/base/logging.h" 27 #include "webrtc/base/logging.h"
28 #include "webrtc/base/openssl.h" 28 #include "webrtc/base/openssl.h"
29 #include "webrtc/base/openssldigest.h" 29 #include "webrtc/base/openssldigest.h"
30 30
31 namespace rtc { 31 namespace rtc {
32 32
33 // We could have exposed a myriad of parameters for the crypto stuff, 33 // We could have exposed a myriad of parameters for the crypto stuff,
34 // but keeping it simple seems best. 34 // but keeping it simple seems best.
35 35
36 // Strength of generated keys. Those are RSA.
37 static const int KEY_LENGTH = 1024;
38
39 // Random bits for certificate serial number 36 // Random bits for certificate serial number
40 static const int SERIAL_RAND_BITS = 64; 37 static const int SERIAL_RAND_BITS = 64;
41 38
42 // Certificate validity lifetime 39 // Certificate validity lifetime
43 static const int CERTIFICATE_LIFETIME = 60*60*24*30; // 30 days, arbitrarily 40 static const int CERTIFICATE_LIFETIME = 60*60*24*30; // 30 days, arbitrarily
44 // Certificate validity window. 41 // Certificate validity window.
45 // This is to compensate for slightly incorrect system clocks. 42 // This is to compensate for slightly incorrect system clocks.
46 static const int CERTIFICATE_WINDOW = -60*60*24; 43 static const int CERTIFICATE_WINDOW = -60*60*24;
47 44
48 // Generate a key pair. Caller is responsible for freeing the returned object. 45 // Generate a key pair. Caller is responsible for freeing the returned object.
49 static EVP_PKEY* MakeKey(KeyType key_type) { 46 static EVP_PKEY* MakeKey(const KeyParams& key_params) {
50 LOG(LS_INFO) << "Making key pair"; 47 LOG(LS_INFO) << "Making key pair";
51 EVP_PKEY* pkey = EVP_PKEY_new(); 48 EVP_PKEY* pkey = EVP_PKEY_new();
52 if (key_type == KT_RSA) { 49 if (key_params.type() == KT_RSA) {
50 int key_length = key_params.rsa_params().mod_size;
53 BIGNUM* exponent = BN_new(); 51 BIGNUM* exponent = BN_new();
54 RSA* rsa = RSA_new(); 52 RSA* rsa = RSA_new();
55 if (!pkey || !exponent || !rsa || 53 if (!pkey || !exponent || !rsa ||
56 !BN_set_word(exponent, 0x10001) || // 65537 RSA exponent 54 !BN_set_word(exponent, key_params.rsa_params().pub_exp) ||
57 !RSA_generate_key_ex(rsa, KEY_LENGTH, exponent, NULL) || 55 !RSA_generate_key_ex(rsa, key_length, exponent, NULL) ||
58 !EVP_PKEY_assign_RSA(pkey, rsa)) { 56 !EVP_PKEY_assign_RSA(pkey, rsa)) {
59 EVP_PKEY_free(pkey); 57 EVP_PKEY_free(pkey);
60 BN_free(exponent); 58 BN_free(exponent);
61 RSA_free(rsa); 59 RSA_free(rsa);
62 LOG(LS_ERROR) << "Failed to make RSA key pair"; 60 LOG(LS_ERROR) << "Failed to make RSA key pair";
63 return NULL; 61 return NULL;
64 } 62 }
65 // ownership of rsa struct was assigned, don't free it. 63 // ownership of rsa struct was assigned, don't free it.
66 BN_free(exponent); 64 BN_free(exponent);
67 } else if (key_type == KT_ECDSA) { 65 } else if (key_params.type() == KT_ECDSA) {
68 EC_KEY* ec_key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); 66 if (key_params.ec_curve() == EC_NIST_P256) {
69 if (!pkey || !ec_key || !EC_KEY_generate_key(ec_key) || 67 EC_KEY* ec_key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
70 !EVP_PKEY_assign_EC_KEY(pkey, ec_key)) { 68 if (!pkey || !ec_key || !EC_KEY_generate_key(ec_key) ||
69 !EVP_PKEY_assign_EC_KEY(pkey, ec_key)) {
70 EVP_PKEY_free(pkey);
71 EC_KEY_free(ec_key);
72 LOG(LS_ERROR) << "Failed to make EC key pair";
73 return NULL;
74 }
75 // ownership of ec_key struct was assigned, don't free it.
76 } else {
77 // Add generation of any other curves here.
71 EVP_PKEY_free(pkey); 78 EVP_PKEY_free(pkey);
72 EC_KEY_free(ec_key); 79 LOG(LS_ERROR) << "ECDSA key requested for unknown curve";
73 LOG(LS_ERROR) << "Failed to make EC key pair";
74 return NULL; 80 return NULL;
75 } 81 }
76 // ownership of ec_key struct was assigned, don't free it.
77 } else { 82 } else {
78 EVP_PKEY_free(pkey); 83 EVP_PKEY_free(pkey);
79 LOG(LS_ERROR) << "Key type requested not understood"; 84 LOG(LS_ERROR) << "Key type requested not understood";
80 return NULL; 85 return NULL;
81 } 86 }
82 87
83 LOG(LS_INFO) << "Returning key pair"; 88 LOG(LS_INFO) << "Returning key pair";
84 return pkey; 89 return pkey;
85 } 90 }
86 91
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 static void LogSSLErrors(const std::string& prefix) { 153 static void LogSSLErrors(const std::string& prefix) {
149 char error_buf[200]; 154 char error_buf[200];
150 unsigned long err; 155 unsigned long err;
151 156
152 while ((err = ERR_get_error()) != 0) { 157 while ((err = ERR_get_error()) != 0) {
153 ERR_error_string_n(err, error_buf, sizeof(error_buf)); 158 ERR_error_string_n(err, error_buf, sizeof(error_buf));
154 LOG(LS_ERROR) << prefix << ": " << error_buf << "\n"; 159 LOG(LS_ERROR) << prefix << ": " << error_buf << "\n";
155 } 160 }
156 } 161 }
157 162
158 OpenSSLKeyPair* OpenSSLKeyPair::Generate(KeyType key_type) { 163 OpenSSLKeyPair* OpenSSLKeyPair::Generate(const KeyParams& key_params) {
159 EVP_PKEY* pkey = MakeKey(key_type); 164 EVP_PKEY* pkey = MakeKey(key_params);
160 if (!pkey) { 165 if (!pkey) {
161 LogSSLErrors("Generating key pair"); 166 LogSSLErrors("Generating key pair");
162 return NULL; 167 return NULL;
163 } 168 }
164 return new OpenSSLKeyPair(pkey); 169 return new OpenSSLKeyPair(pkey);
165 } 170 }
166 171
167 OpenSSLKeyPair::~OpenSSLKeyPair() { 172 OpenSSLKeyPair::~OpenSSLKeyPair() {
168 EVP_PKEY_free(pkey_); 173 EVP_PKEY_free(pkey_);
169 } 174 }
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 OpenSSLCertificate* certificate) 377 OpenSSLCertificate* certificate)
373 : key_pair_(key_pair), certificate_(certificate) { 378 : key_pair_(key_pair), certificate_(certificate) {
374 ASSERT(key_pair != NULL); 379 ASSERT(key_pair != NULL);
375 ASSERT(certificate != NULL); 380 ASSERT(certificate != NULL);
376 } 381 }
377 382
378 OpenSSLIdentity::~OpenSSLIdentity() = default; 383 OpenSSLIdentity::~OpenSSLIdentity() = default;
379 384
380 OpenSSLIdentity* OpenSSLIdentity::GenerateInternal( 385 OpenSSLIdentity* OpenSSLIdentity::GenerateInternal(
381 const SSLIdentityParams& params) { 386 const SSLIdentityParams& params) {
382 OpenSSLKeyPair* key_pair = OpenSSLKeyPair::Generate(params.key_type); 387 OpenSSLKeyPair* key_pair = OpenSSLKeyPair::Generate(params.key_params);
383 if (key_pair) { 388 if (key_pair) {
384 OpenSSLCertificate* certificate = 389 OpenSSLCertificate* certificate =
385 OpenSSLCertificate::Generate(key_pair, params); 390 OpenSSLCertificate::Generate(key_pair, params);
386 if (certificate) 391 if (certificate)
387 return new OpenSSLIdentity(key_pair, certificate); 392 return new OpenSSLIdentity(key_pair, certificate);
388 delete key_pair; 393 delete key_pair;
389 } 394 }
390 LOG(LS_INFO) << "Identity generation failed"; 395 LOG(LS_INFO) << "Identity generation failed";
391 return NULL; 396 return NULL;
392 } 397 }
393 398
394 OpenSSLIdentity* OpenSSLIdentity::Generate(const std::string& common_name, 399 OpenSSLIdentity* OpenSSLIdentity::Generate(const std::string& common_name,
395 KeyType key_type) { 400 const KeyParams& key_params) {
396 SSLIdentityParams params; 401 SSLIdentityParams params;
402 params.key_params = key_params;
397 params.common_name = common_name; 403 params.common_name = common_name;
398 params.not_before = CERTIFICATE_WINDOW; 404 params.not_before = CERTIFICATE_WINDOW;
399 params.not_after = CERTIFICATE_LIFETIME; 405 params.not_after = CERTIFICATE_LIFETIME;
400 params.key_type = key_type;
401 return GenerateInternal(params); 406 return GenerateInternal(params);
402 } 407 }
403 408
404 OpenSSLIdentity* OpenSSLIdentity::GenerateForTest( 409 OpenSSLIdentity* OpenSSLIdentity::GenerateForTest(
405 const SSLIdentityParams& params) { 410 const SSLIdentityParams& params) {
406 return GenerateInternal(params); 411 return GenerateInternal(params);
407 } 412 }
408 413
409 SSLIdentity* OpenSSLIdentity::FromPEMStrings( 414 SSLIdentity* OpenSSLIdentity::FromPEMStrings(
410 const std::string& private_key, 415 const std::string& private_key,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
450 SSL_CTX_use_PrivateKey(ctx, key_pair_->pkey()) != 1) { 455 SSL_CTX_use_PrivateKey(ctx, key_pair_->pkey()) != 1) {
451 LogSSLErrors("Configuring key and certificate"); 456 LogSSLErrors("Configuring key and certificate");
452 return false; 457 return false;
453 } 458 }
454 return true; 459 return true;
455 } 460 }
456 461
457 } // namespace rtc 462 } // namespace rtc
458 463
459 #endif // HAVE_OPENSSL_SSL_H 464 #endif // HAVE_OPENSSL_SSL_H
OLDNEW
« no previous file with comments | « webrtc/base/opensslidentity.h ('k') | webrtc/base/ssladapter_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698