blob: c34fc90bf5a054c6eda13a105514b4f4abc0fdd7 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2004 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
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000011#include "webrtc/base/sslstreamadapter.h"
12#include "webrtc/base/sslconfig.h"
13
torbjorng172f0092015-10-07 04:57:55 -070014#if SSL_USE_OPENSSL
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000015
16#include "webrtc/base/opensslstreamadapter.h"
17
torbjorng172f0092015-10-07 04:57:55 -070018#endif // SSL_USE_OPENSSL
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000019
20///////////////////////////////////////////////////////////////////////////////
21
22namespace rtc {
23
Guo-wei Shieh456696a2015-09-30 21:48:54 -070024// TODO(guoweis): Move this to SDP layer and use int form internally.
25// webrtc:5043.
26const char CS_AES_CM_128_HMAC_SHA1_80[] = "AES_CM_128_HMAC_SHA1_80";
27const char CS_AES_CM_128_HMAC_SHA1_32[] = "AES_CM_128_HMAC_SHA1_32";
jbauchcb560652016-08-04 05:20:32 -070028const char CS_AEAD_AES_128_GCM[] = "AEAD_AES_128_GCM";
29const char CS_AEAD_AES_256_GCM[] = "AEAD_AES_256_GCM";
Guo-wei Shieh456696a2015-09-30 21:48:54 -070030
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -080031std::string SrtpCryptoSuiteToName(int crypto_suite) {
jbauchcb560652016-08-04 05:20:32 -070032 switch (crypto_suite) {
33 case SRTP_AES128_CM_SHA1_32:
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -080034 return CS_AES_CM_128_HMAC_SHA1_32;
jbauchcb560652016-08-04 05:20:32 -070035 case SRTP_AES128_CM_SHA1_80:
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -080036 return CS_AES_CM_128_HMAC_SHA1_80;
jbauchcb560652016-08-04 05:20:32 -070037 case SRTP_AEAD_AES_128_GCM:
38 return CS_AEAD_AES_128_GCM;
39 case SRTP_AEAD_AES_256_GCM:
40 return CS_AEAD_AES_256_GCM;
41 default:
42 return std::string();
43 }
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -080044}
45
46int SrtpCryptoSuiteFromName(const std::string& crypto_suite) {
47 if (crypto_suite == CS_AES_CM_128_HMAC_SHA1_32)
Guo-wei Shieh456696a2015-09-30 21:48:54 -070048 return SRTP_AES128_CM_SHA1_32;
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -080049 if (crypto_suite == CS_AES_CM_128_HMAC_SHA1_80)
Guo-wei Shieh456696a2015-09-30 21:48:54 -070050 return SRTP_AES128_CM_SHA1_80;
jbauchcb560652016-08-04 05:20:32 -070051 if (crypto_suite == CS_AEAD_AES_128_GCM)
52 return SRTP_AEAD_AES_128_GCM;
53 if (crypto_suite == CS_AEAD_AES_256_GCM)
54 return SRTP_AEAD_AES_256_GCM;
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -080055 return SRTP_INVALID_CRYPTO_SUITE;
Guo-wei Shieh456696a2015-09-30 21:48:54 -070056}
57
jbauchcb560652016-08-04 05:20:32 -070058bool GetSrtpKeyAndSaltLengths(int crypto_suite, int *key_length,
59 int *salt_length) {
60 switch (crypto_suite) {
61 case SRTP_AES128_CM_SHA1_32:
62 case SRTP_AES128_CM_SHA1_80:
63 // SRTP_AES128_CM_HMAC_SHA1_32 and SRTP_AES128_CM_HMAC_SHA1_80 are defined
64 // in RFC 5764 to use a 128 bits key and 112 bits salt for the cipher.
65 *key_length = 16;
66 *salt_length = 14;
67 break;
68 case SRTP_AEAD_AES_128_GCM:
69 // SRTP_AEAD_AES_128_GCM is defined in RFC 7714 to use a 128 bits key and
70 // a 96 bits salt for the cipher.
71 *key_length = 16;
72 *salt_length = 12;
73 break;
74 case SRTP_AEAD_AES_256_GCM:
75 // SRTP_AEAD_AES_256_GCM is defined in RFC 7714 to use a 256 bits key and
76 // a 96 bits salt for the cipher.
77 *key_length = 32;
78 *salt_length = 12;
79 break;
80 default:
81 return false;
82 }
83 return true;
84}
85
86bool IsGcmCryptoSuite(int crypto_suite) {
87 return (crypto_suite == SRTP_AEAD_AES_256_GCM ||
88 crypto_suite == SRTP_AEAD_AES_128_GCM);
89}
90
91bool IsGcmCryptoSuiteName(const std::string& crypto_suite) {
92 return (crypto_suite == CS_AEAD_AES_256_GCM ||
93 crypto_suite == CS_AEAD_AES_128_GCM);
94}
95
96// static
97CryptoOptions CryptoOptions::NoGcm() {
98 CryptoOptions options;
99 options.enable_gcm_crypto_suites = false;
100 return options;
101}
102
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000103SSLStreamAdapter* SSLStreamAdapter::Create(StreamInterface* stream) {
torbjorng172f0092015-10-07 04:57:55 -0700104#if SSL_USE_OPENSSL
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000105 return new OpenSSLStreamAdapter(stream);
torbjorng172f0092015-10-07 04:57:55 -0700106#else // !SSL_USE_OPENSSL
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000107 return NULL;
torbjorng172f0092015-10-07 04:57:55 -0700108#endif // SSL_USE_OPENSSL
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000109}
110
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800111bool SSLStreamAdapter::GetSslCipherSuite(int* cipher_suite) {
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000112 return false;
113}
114
115bool SSLStreamAdapter::ExportKeyingMaterial(const std::string& label,
Peter Boström0c4e06b2015-10-07 12:23:21 +0200116 const uint8_t* context,
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000117 size_t context_len,
118 bool use_context,
Peter Boström0c4e06b2015-10-07 12:23:21 +0200119 uint8_t* result,
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000120 size_t result_len) {
121 return false; // Default is unsupported
122}
123
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800124bool SSLStreamAdapter::SetDtlsSrtpCryptoSuites(
125 const std::vector<int>& crypto_suites) {
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000126 return false;
127}
128
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800129bool SSLStreamAdapter::GetDtlsSrtpCryptoSuite(int* crypto_suite) {
kwiberg@webrtc.org67186fe2015-03-09 22:21:53 +0000130 return false;
131}
132
torbjorng172f0092015-10-07 04:57:55 -0700133#if SSL_USE_OPENSSL
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000134bool SSLStreamAdapter::HaveDtls() {
135 return OpenSSLStreamAdapter::HaveDtls();
136}
137bool SSLStreamAdapter::HaveDtlsSrtp() {
138 return OpenSSLStreamAdapter::HaveDtlsSrtp();
139}
140bool SSLStreamAdapter::HaveExporter() {
141 return OpenSSLStreamAdapter::HaveExporter();
142}
Taylor Brandstetter4f0dfbd2016-06-15 17:15:23 -0700143bool SSLStreamAdapter::IsBoringSsl() {
144 return OpenSSLStreamAdapter::IsBoringSsl();
145}
torbjorng43166b82016-03-11 00:06:47 -0800146bool SSLStreamAdapter::IsAcceptableCipher(int cipher, KeyType key_type) {
147 return OpenSSLStreamAdapter::IsAcceptableCipher(cipher, key_type);
Guo-wei Shieh456696a2015-09-30 21:48:54 -0700148}
torbjorng43166b82016-03-11 00:06:47 -0800149bool SSLStreamAdapter::IsAcceptableCipher(const std::string& cipher,
150 KeyType key_type) {
151 return OpenSSLStreamAdapter::IsAcceptableCipher(cipher, key_type);
152}
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800153std::string SSLStreamAdapter::SslCipherSuiteToName(int cipher_suite) {
154 return OpenSSLStreamAdapter::SslCipherSuiteToName(cipher_suite);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36 +0000155}
torbjorng172f0092015-10-07 04:57:55 -0700156#endif // SSL_USE_OPENSSL
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000157
158///////////////////////////////////////////////////////////////////////////////
159
160} // namespace rtc