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 25 matching lines...) Expand all Loading... |
36 #include "webrtc/base/stringutils.h" | 36 #include "webrtc/base/stringutils.h" |
37 #include "webrtc/base/thread.h" | 37 #include "webrtc/base/thread.h" |
38 | 38 |
39 namespace rtc { | 39 namespace rtc { |
40 | 40 |
41 #if (OPENSSL_VERSION_NUMBER >= 0x10001000L) | 41 #if (OPENSSL_VERSION_NUMBER >= 0x10001000L) |
42 #define HAVE_DTLS_SRTP | 42 #define HAVE_DTLS_SRTP |
43 #endif | 43 #endif |
44 | 44 |
45 #ifdef HAVE_DTLS_SRTP | 45 #ifdef HAVE_DTLS_SRTP |
46 // SRTP cipher suite table | 46 // SRTP cipher suite table. |internal_name| is used to construct a |
| 47 // colon-separated profile strings which is needed by |
| 48 // SSL_CTX_set_tlsext_use_srtp(). |
47 struct SrtpCipherMapEntry { | 49 struct SrtpCipherMapEntry { |
48 const char* external_name; | |
49 const char* internal_name; | 50 const char* internal_name; |
| 51 const int id; |
50 }; | 52 }; |
51 | 53 |
52 // This isn't elegant, but it's better than an external reference | 54 // This isn't elegant, but it's better than an external reference |
53 static SrtpCipherMapEntry SrtpCipherMap[] = { | 55 static SrtpCipherMapEntry SrtpCipherMap[] = { |
54 {CS_AES_CM_128_HMAC_SHA1_80, "SRTP_AES128_CM_SHA1_80"}, | 56 {"SRTP_AES128_CM_SHA1_80", SRTP_AES128_CM_SHA1_80}, |
55 {CS_AES_CM_128_HMAC_SHA1_32, "SRTP_AES128_CM_SHA1_32"}, | 57 {"SRTP_AES128_CM_SHA1_32", SRTP_AES128_CM_SHA1_32}, |
56 {NULL, NULL}}; | 58 {nullptr, 0}}; |
57 #endif | 59 #endif |
58 | 60 |
59 #ifndef OPENSSL_IS_BORINGSSL | 61 #ifndef OPENSSL_IS_BORINGSSL |
60 | 62 |
61 // Cipher name table. Maps internal OpenSSL cipher ids to the RFC name. | 63 // Cipher name table. Maps internal OpenSSL cipher ids to the RFC name. |
62 struct SslCipherMapEntry { | 64 struct SslCipherMapEntry { |
63 uint32_t openssl_id; | 65 uint32_t openssl_id; |
64 const char* rfc_name; | 66 const char* rfc_name; |
65 }; | 67 }; |
66 | 68 |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 } | 343 } |
342 if (expected_len != digest_len) | 344 if (expected_len != digest_len) |
343 return false; | 345 return false; |
344 | 346 |
345 peer_certificate_digest_value_.SetData(digest_val, digest_len); | 347 peer_certificate_digest_value_.SetData(digest_val, digest_len); |
346 peer_certificate_digest_algorithm_ = digest_alg; | 348 peer_certificate_digest_algorithm_ = digest_alg; |
347 | 349 |
348 return true; | 350 return true; |
349 } | 351 } |
350 | 352 |
351 std::string OpenSSLStreamAdapter::GetSslCipherSuiteName(int cipher) { | 353 std::string OpenSSLStreamAdapter::SslCipherSuiteToName(int cipher_suite) { |
352 #ifdef OPENSSL_IS_BORINGSSL | 354 #ifdef OPENSSL_IS_BORINGSSL |
353 const SSL_CIPHER* ssl_cipher = SSL_get_cipher_by_value(cipher); | 355 const SSL_CIPHER* ssl_cipher = SSL_get_cipher_by_value(cipher_suite); |
354 if (!ssl_cipher) { | 356 if (!ssl_cipher) { |
355 return std::string(); | 357 return std::string(); |
356 } | 358 } |
357 char* cipher_name = SSL_CIPHER_get_rfc_name(ssl_cipher); | 359 char* cipher_name = SSL_CIPHER_get_rfc_name(ssl_cipher); |
358 std::string rfc_name = std::string(cipher_name); | 360 std::string rfc_name = std::string(cipher_name); |
359 OPENSSL_free(cipher_name); | 361 OPENSSL_free(cipher_name); |
360 return rfc_name; | 362 return rfc_name; |
361 #else | 363 #else |
362 for (const SslCipherMapEntry* entry = kSslCipherMap; entry->rfc_name; | 364 for (const SslCipherMapEntry* entry = kSslCipherMap; entry->rfc_name; |
363 ++entry) { | 365 ++entry) { |
364 if (cipher == entry->openssl_id) { | 366 if (cipher_suite == entry->openssl_id) { |
365 return entry->rfc_name; | 367 return entry->rfc_name; |
366 } | 368 } |
367 } | 369 } |
368 return std::string(); | 370 return std::string(); |
369 #endif | 371 #endif |
370 } | 372 } |
371 | 373 |
372 bool OpenSSLStreamAdapter::GetSslCipherSuite(int* cipher) { | 374 bool OpenSSLStreamAdapter::GetSslCipherSuite(int* cipher_suite) { |
373 if (state_ != SSL_CONNECTED) | 375 if (state_ != SSL_CONNECTED) |
374 return false; | 376 return false; |
375 | 377 |
376 const SSL_CIPHER* current_cipher = SSL_get_current_cipher(ssl_); | 378 const SSL_CIPHER* current_cipher = SSL_get_current_cipher(ssl_); |
377 if (current_cipher == NULL) { | 379 if (current_cipher == NULL) { |
378 return false; | 380 return false; |
379 } | 381 } |
380 | 382 |
381 *cipher = static_cast<uint16_t>(SSL_CIPHER_get_id(current_cipher)); | 383 *cipher_suite = static_cast<uint16_t>(SSL_CIPHER_get_id(current_cipher)); |
382 return true; | 384 return true; |
383 } | 385 } |
384 | 386 |
385 // Key Extractor interface | 387 // Key Extractor interface |
386 bool OpenSSLStreamAdapter::ExportKeyingMaterial(const std::string& label, | 388 bool OpenSSLStreamAdapter::ExportKeyingMaterial(const std::string& label, |
387 const uint8_t* context, | 389 const uint8_t* context, |
388 size_t context_len, | 390 size_t context_len, |
389 bool use_context, | 391 bool use_context, |
390 uint8_t* result, | 392 uint8_t* result, |
391 size_t result_len) { | 393 size_t result_len) { |
392 #ifdef HAVE_DTLS_SRTP | 394 #ifdef HAVE_DTLS_SRTP |
393 int i; | 395 int i; |
394 | 396 |
395 i = SSL_export_keying_material(ssl_, result, result_len, label.c_str(), | 397 i = SSL_export_keying_material(ssl_, result, result_len, label.c_str(), |
396 label.length(), const_cast<uint8_t*>(context), | 398 label.length(), const_cast<uint8_t*>(context), |
397 context_len, use_context); | 399 context_len, use_context); |
398 | 400 |
399 if (i != 1) | 401 if (i != 1) |
400 return false; | 402 return false; |
401 | 403 |
402 return true; | 404 return true; |
403 #else | 405 #else |
404 return false; | 406 return false; |
405 #endif | 407 #endif |
406 } | 408 } |
407 | 409 |
408 bool OpenSSLStreamAdapter::SetDtlsSrtpCiphers( | 410 bool OpenSSLStreamAdapter::SetDtlsSrtpCryptoSuites( |
409 const std::vector<std::string>& ciphers) { | 411 const std::vector<int>& ciphers) { |
410 #ifdef HAVE_DTLS_SRTP | 412 #ifdef HAVE_DTLS_SRTP |
411 std::string internal_ciphers; | 413 std::string internal_ciphers; |
412 | 414 |
413 if (state_ != SSL_NONE) | 415 if (state_ != SSL_NONE) |
414 return false; | 416 return false; |
415 | 417 |
416 for (std::vector<std::string>::const_iterator cipher = ciphers.begin(); | 418 for (std::vector<int>::const_iterator cipher = ciphers.begin(); |
417 cipher != ciphers.end(); ++cipher) { | 419 cipher != ciphers.end(); ++cipher) { |
418 bool found = false; | 420 bool found = false; |
419 for (SrtpCipherMapEntry *entry = SrtpCipherMap; entry->internal_name; | 421 for (SrtpCipherMapEntry* entry = SrtpCipherMap; entry->internal_name; |
420 ++entry) { | 422 ++entry) { |
421 if (*cipher == entry->external_name) { | 423 if (*cipher == entry->id) { |
422 found = true; | 424 found = true; |
423 if (!internal_ciphers.empty()) | 425 if (!internal_ciphers.empty()) |
424 internal_ciphers += ":"; | 426 internal_ciphers += ":"; |
425 internal_ciphers += entry->internal_name; | 427 internal_ciphers += entry->internal_name; |
426 break; | 428 break; |
427 } | 429 } |
428 } | 430 } |
429 | 431 |
430 if (!found) { | 432 if (!found) { |
431 LOG(LS_ERROR) << "Could not find cipher: " << *cipher; | 433 LOG(LS_ERROR) << "Could not find cipher: " << *cipher; |
432 return false; | 434 return false; |
433 } | 435 } |
434 } | 436 } |
435 | 437 |
436 if (internal_ciphers.empty()) | 438 if (internal_ciphers.empty()) |
437 return false; | 439 return false; |
438 | 440 |
439 srtp_ciphers_ = internal_ciphers; | 441 srtp_ciphers_ = internal_ciphers; |
440 return true; | 442 return true; |
441 #else | 443 #else |
442 return false; | 444 return false; |
443 #endif | 445 #endif |
444 } | 446 } |
445 | 447 |
446 bool OpenSSLStreamAdapter::GetDtlsSrtpCipher(std::string* cipher) { | 448 bool OpenSSLStreamAdapter::GetDtlsSrtpCryptoSuite(int* crypto_suite) { |
447 #ifdef HAVE_DTLS_SRTP | 449 #ifdef HAVE_DTLS_SRTP |
448 ASSERT(state_ == SSL_CONNECTED); | 450 ASSERT(state_ == SSL_CONNECTED); |
449 if (state_ != SSL_CONNECTED) | 451 if (state_ != SSL_CONNECTED) |
450 return false; | 452 return false; |
451 | 453 |
452 const SRTP_PROTECTION_PROFILE *srtp_profile = | 454 const SRTP_PROTECTION_PROFILE *srtp_profile = |
453 SSL_get_selected_srtp_profile(ssl_); | 455 SSL_get_selected_srtp_profile(ssl_); |
454 | 456 |
455 if (!srtp_profile) | 457 if (!srtp_profile) |
456 return false; | 458 return false; |
457 | 459 |
458 for (SrtpCipherMapEntry *entry = SrtpCipherMap; | 460 *crypto_suite = srtp_profile->id; |
459 entry->internal_name; ++entry) { | 461 ASSERT(!SrtpCryptoSuiteToName(*crypto_suite).empty()); |
460 if (!strcmp(entry->internal_name, srtp_profile->name)) { | 462 return true; |
461 *cipher = entry->external_name; | |
462 return true; | |
463 } | |
464 } | |
465 | |
466 ASSERT(false); // This should never happen | |
467 | |
468 return false; | |
469 #else | 463 #else |
470 return false; | 464 return false; |
471 #endif | 465 #endif |
472 } | 466 } |
473 | 467 |
474 int OpenSSLStreamAdapter::StartSSLWithServer(const char* server_name) { | 468 int OpenSSLStreamAdapter::StartSSLWithServer(const char* server_name) { |
475 ASSERT(server_name != NULL && server_name[0] != '\0'); | 469 ASSERT(server_name != NULL && server_name[0] != '\0'); |
476 ssl_server_name_ = server_name; | 470 ssl_server_name_ = server_name; |
477 return StartSSL(); | 471 return StartSSL(); |
478 } | 472 } |
(...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1167 } | 1161 } |
1168 } else { | 1162 } else { |
1169 RTC_NOTREACHED(); | 1163 RTC_NOTREACHED(); |
1170 return kDefaultSslEcCipher12; | 1164 return kDefaultSslEcCipher12; |
1171 } | 1165 } |
1172 } | 1166 } |
1173 | 1167 |
1174 } // namespace rtc | 1168 } // namespace rtc |
1175 | 1169 |
1176 #endif // HAVE_OPENSSL_SSL_H | 1170 #endif // HAVE_OPENSSL_SSL_H |
OLD | NEW |