blob: c4249017cae6e8db447e00a651bbc44dbe2f6260 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
6
vasilvv872e7a32019-03-12 16:42:44 -07007#include <string>
bnc463f2352019-10-10 04:49:34 -07008#include <utility>
vasilvv872e7a32019-03-12 16:42:44 -07009
QUICHE teama6ef0a62019-03-07 20:34:33 -050010#include "third_party/boringssl/src/include/openssl/tls1.h"
11#include "net/third_party/quiche/src/quic/core/crypto/aes_128_gcm_12_decrypter.h"
12#include "net/third_party/quiche/src/quic/core/crypto/aes_128_gcm_decrypter.h"
13#include "net/third_party/quiche/src/quic/core/crypto/aes_256_gcm_decrypter.h"
14#include "net/third_party/quiche/src/quic/core/crypto/chacha20_poly1305_decrypter.h"
15#include "net/third_party/quiche/src/quic/core/crypto/chacha20_poly1305_tls_decrypter.h"
16#include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h"
17#include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h"
18#include "net/third_party/quiche/src/quic/core/crypto/quic_hkdf.h"
19#include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
20#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
dmcardle904ef182019-12-13 08:34:33 -080021#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050022
23namespace quic {
24
25// static
nharperc1bbfe62019-09-27 16:48:40 -070026std::unique_ptr<QuicDecrypter> QuicDecrypter::Create(
27 const ParsedQuicVersion& version,
28 QuicTag algorithm) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050029 switch (algorithm) {
30 case kAESG:
nharperc1bbfe62019-09-27 16:48:40 -070031 if (version.UsesInitialObfuscators()) {
32 return std::make_unique<Aes128GcmDecrypter>();
33 } else {
34 return std::make_unique<Aes128Gcm12Decrypter>();
35 }
QUICHE teama6ef0a62019-03-07 20:34:33 -050036 case kCC20:
nharperc1bbfe62019-09-27 16:48:40 -070037 if (version.UsesInitialObfuscators()) {
38 return std::make_unique<ChaCha20Poly1305TlsDecrypter>();
39 } else {
40 return std::make_unique<ChaCha20Poly1305Decrypter>();
41 }
QUICHE teama6ef0a62019-03-07 20:34:33 -050042 default:
43 QUIC_LOG(FATAL) << "Unsupported algorithm: " << algorithm;
44 return nullptr;
45 }
46}
47
48// static
49std::unique_ptr<QuicDecrypter> QuicDecrypter::CreateFromCipherSuite(
50 uint32_t cipher_suite) {
51 switch (cipher_suite) {
52 case TLS1_CK_AES_128_GCM_SHA256:
vasilvv0fc587f2019-09-06 13:33:08 -070053 return std::make_unique<Aes128GcmDecrypter>();
QUICHE teama6ef0a62019-03-07 20:34:33 -050054 case TLS1_CK_AES_256_GCM_SHA384:
vasilvv0fc587f2019-09-06 13:33:08 -070055 return std::make_unique<Aes256GcmDecrypter>();
QUICHE teama6ef0a62019-03-07 20:34:33 -050056 case TLS1_CK_CHACHA20_POLY1305_SHA256:
vasilvv0fc587f2019-09-06 13:33:08 -070057 return std::make_unique<ChaCha20Poly1305TlsDecrypter>();
QUICHE teama6ef0a62019-03-07 20:34:33 -050058 default:
59 QUIC_BUG << "TLS cipher suite is unknown to QUIC";
60 return nullptr;
61 }
62}
63
64// static
dmcardle904ef182019-12-13 08:34:33 -080065void QuicDecrypter::DiversifyPreliminaryKey(
66 quiche::QuicheStringPiece preliminary_key,
67 quiche::QuicheStringPiece nonce_prefix,
68 const DiversificationNonce& nonce,
69 size_t key_size,
70 size_t nonce_prefix_size,
71 std::string* out_key,
72 std::string* out_nonce_prefix) {
vasilvvc48c8712019-03-11 13:38:16 -070073 QuicHKDF hkdf((std::string(preliminary_key)) + (std::string(nonce_prefix)),
dmcardle904ef182019-12-13 08:34:33 -080074 quiche::QuicheStringPiece(nonce.data(), nonce.size()),
QUICHE teama6ef0a62019-03-07 20:34:33 -050075 "QUIC key diversification", 0, key_size, 0, nonce_prefix_size,
76 0);
vasilvvc48c8712019-03-11 13:38:16 -070077 *out_key = std::string(hkdf.server_write_key());
78 *out_nonce_prefix = std::string(hkdf.server_write_iv());
QUICHE teama6ef0a62019-03-07 20:34:33 -050079}
80
81} // namespace quic