// Copyright (c) 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef QUICHE_QUIC_CORE_CRYPTO_TRANSPORT_PARAMETERS_H_ #define QUICHE_QUIC_CORE_CRYPTO_TRANSPORT_PARAMETERS_H_ #include <memory> #include <optional> #include <vector> #include "absl/container/flat_hash_map.h" #include "absl/strings/string_view.h" #include "quiche/quic/core/quic_connection_id.h" #include "quiche/quic/core/quic_data_reader.h" #include "quiche/quic/core/quic_data_writer.h" #include "quiche/quic/core/quic_tag.h" #include "quiche/quic/core/quic_types.h" #include "quiche/quic/core/quic_versions.h" #include "quiche/quic/platform/api/quic_socket_address.h" namespace quic { // TransportParameters contains parameters for QUIC's transport layer that are // exchanged during the TLS handshake. This struct is a mirror of the struct in // the "Transport Parameter Encoding" section of draft-ietf-quic-transport. // This struct currently uses the values from draft 29. struct QUICHE_EXPORT TransportParameters { … }; // Serializes a TransportParameters struct into the format for sending it in a // TLS extension. The serialized bytes are written to |*out|. Returns if the // parameters are valid and serialization succeeded. QUICHE_EXPORT bool SerializeTransportParameters(const TransportParameters& in, std::vector<uint8_t>* out); // Parses bytes from the quic_transport_parameters TLS extension and writes the // parsed parameters into |*out|. Input is read from |in| for |in_len| bytes. // |perspective| indicates whether the input came from a client or a server. // This method returns true if the input was successfully parsed. // On failure, this method will write a human-readable error message to // |error_details|. QUICHE_EXPORT bool ParseTransportParameters(ParsedQuicVersion version, Perspective perspective, const uint8_t* in, size_t in_len, TransportParameters* out, std::string* error_details); // Serializes |in| and |application_data| in a deterministic format so that // multiple calls to SerializeTransportParametersForTicket with the same inputs // will generate the same output, and if the inputs differ, then the output will // differ. The output of this function is used by the server in // SSL_set_quic_early_data_context to determine whether early data should be // accepted: Early data will only be accepted if the inputs to this function // match what they were on the connection that issued an early data capable // ticket. QUICHE_EXPORT bool SerializeTransportParametersForTicket( const TransportParameters& in, const std::vector<uint8_t>& application_data, std::vector<uint8_t>* out); // Removes reserved values from custom_parameters and versions. // The resulting value can be reliably compared with an original or other // deserialized value. QUICHE_EXPORT void DegreaseTransportParameters(TransportParameters& parameters); } // namespace quic #endif // QUICHE_QUIC_CORE_CRYPTO_TRANSPORT_PARAMETERS_H_