blob: f47e844596d93d9cfc880e2fb681e164fa7aab96 [file] [log] [blame]
Benjamin Wrighta54daf12018-10-11 15:33:17 -07001/*
2 * Copyright 2018 The WebRTC Project Authors. All rights reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Steve Anton10542f22019-01-11 09:11:00 -080011#include "api/crypto/crypto_options.h"
Jonas Olssona4d87372019-07-05 19:08:33 +020012
Steve Anton10542f22019-01-11 09:11:00 -080013#include "rtc_base/ssl_stream_adapter.h"
Benjamin Wrighta54daf12018-10-11 15:33:17 -070014
15namespace webrtc {
16
17CryptoOptions::CryptoOptions() {}
18
19CryptoOptions::CryptoOptions(const CryptoOptions& other) {
Benjamin Wrighta54daf12018-10-11 15:33:17 -070020 srtp = other.srtp;
Benjamin Wrightbfb444c2018-10-15 10:20:24 -070021 sframe = other.sframe;
Benjamin Wrighta54daf12018-10-11 15:33:17 -070022}
23
24CryptoOptions::~CryptoOptions() {}
25
26// static
27CryptoOptions CryptoOptions::NoGcm() {
28 CryptoOptions options;
29 options.srtp.enable_gcm_crypto_suites = false;
30 return options;
31}
32
33std::vector<int> CryptoOptions::GetSupportedDtlsSrtpCryptoSuites() const {
34 std::vector<int> crypto_suites;
Benjamin Wrighta54daf12018-10-11 15:33:17 -070035 // Note: SRTP_AES128_CM_SHA1_80 is what is required to be supported (by
36 // draft-ietf-rtcweb-security-arch), but SRTP_AES128_CM_SHA1_32 is allowed as
37 // well, and saves a few bytes per packet if it ends up selected.
38 // As the cipher suite is potentially insecure, it will only be used if
39 // enabled by both peers.
40 if (srtp.enable_aes128_sha1_32_crypto_cipher) {
41 crypto_suites.push_back(rtc::SRTP_AES128_CM_SHA1_32);
42 }
Philipp Hancke2ebbff82019-10-26 06:12:55 +020043 if (srtp.enable_aes128_sha1_80_crypto_cipher) {
44 crypto_suites.push_back(rtc::SRTP_AES128_CM_SHA1_80);
45 }
46
47 // Note: GCM cipher suites are not the top choice since they increase the
48 // packet size. In order to negotiate them the other side must not support
49 // SRTP_AES128_CM_SHA1_80.
50 if (srtp.enable_gcm_crypto_suites) {
51 crypto_suites.push_back(rtc::SRTP_AEAD_AES_256_GCM);
52 crypto_suites.push_back(rtc::SRTP_AEAD_AES_128_GCM);
53 }
54 RTC_CHECK(!crypto_suites.empty());
Benjamin Wrighta54daf12018-10-11 15:33:17 -070055 return crypto_suites;
56}
57
Benjamin Wrightbfb444c2018-10-15 10:20:24 -070058bool CryptoOptions::operator==(const CryptoOptions& other) const {
59 struct data_being_tested_for_equality {
60 struct Srtp {
61 bool enable_gcm_crypto_suites;
62 bool enable_aes128_sha1_32_crypto_cipher;
Philipp Hancke2ebbff82019-10-26 06:12:55 +020063 bool enable_aes128_sha1_80_crypto_cipher;
Benjamin Wrightbfb444c2018-10-15 10:20:24 -070064 bool enable_encrypted_rtp_header_extensions;
65 } srtp;
66 struct SFrame {
67 bool require_frame_encryption;
68 } sframe;
69 };
70 static_assert(sizeof(data_being_tested_for_equality) == sizeof(*this),
71 "Did you add something to CryptoOptions and forget to "
72 "update operator==?");
73
74 return srtp.enable_gcm_crypto_suites == other.srtp.enable_gcm_crypto_suites &&
75 srtp.enable_aes128_sha1_32_crypto_cipher ==
76 other.srtp.enable_aes128_sha1_32_crypto_cipher &&
Philipp Hancke2ebbff82019-10-26 06:12:55 +020077 srtp.enable_aes128_sha1_80_crypto_cipher ==
78 other.srtp.enable_aes128_sha1_80_crypto_cipher &&
Benjamin Wrightbfb444c2018-10-15 10:20:24 -070079 srtp.enable_encrypted_rtp_header_extensions ==
80 other.srtp.enable_encrypted_rtp_header_extensions &&
81 sframe.require_frame_encryption ==
82 other.sframe.require_frame_encryption;
83}
84
85bool CryptoOptions::operator!=(const CryptoOptions& other) const {
86 return !(*this == other);
87}
88
Benjamin Wrighta54daf12018-10-11 15:33:17 -070089} // namespace webrtc