OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |