blob: 07a666d0cc7bc08be31f6a3f1806a5b2524c4720 [file] [log] [blame]
// Copyright 2016 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 NET_QUIC_STATELESS_REJECTOR_H_
#define NET_QUIC_STATELESS_REJECTOR_H_
#include "base/strings/string_piece.h"
#include "net/quic/crypto/crypto_framer.h"
#include "net/quic/crypto/quic_crypto_server_config.h"
#include "net/quic/quic_protocol.h"
namespace net {
// The StatelessRejector receives CHLO messages and generates an SREJ
// message in response, if the CHLO can be statelessly rejected.
class StatelessRejector {
public:
enum State {
UNSUPPORTED, // Stateless rejects are not supported
FAILED, // There was an error processing the CHLO.
ACCEPTED, // The CHLO was accepted
REJECTED, // The CHLO was rejected.
};
StatelessRejector(QuicVersion version,
const QuicVersionVector& versions,
const QuicCryptoServerConfig* crypto_config,
QuicCompressedCertsCache* compressed_certs_cache,
const QuicClock* clock,
QuicRandom* random,
const IPEndPoint& client_address,
const IPEndPoint& server_address);
~StatelessRejector();
// Called when |chlo| is received for |connection_id| to determine
// if it should be statelessly rejected.
void OnChlo(QuicVersion version,
QuicConnectionId connection_id,
QuicConnectionId server_designated_connection_id,
const CryptoHandshakeMessage& chlo);
// Returns the state of the rejector after OnChlo() has been called.
State state() const { return state_; }
// Returns the error code when state() returns FAILED.
QuicErrorCode error() const { return error_; }
// Returns the error details when state() returns FAILED.
std::string error_details() const { return error_details_; }
// Returns the SREJ message when state() returns REJECTED.
const CryptoHandshakeMessage& reply() const { return reply_; }
private:
// Helper class which is passed in to
// QuicCryptoServerConfig::ValidateClientHello.
class ValidateCallback;
friend class ValidateCallback;
void ProcessClientHello(
const CryptoHandshakeMessage& client_hello,
const ValidateClientHelloResultCallback::Result& result);
State state_;
QuicErrorCode error_;
std::string error_details_;
QuicVersion version_;
QuicVersionVector versions_;
QuicConnectionId connection_id_;
QuicConnectionId server_designated_connection_id_;
IPEndPoint client_address_;
IPEndPoint server_address_;
const QuicClock* clock_;
QuicRandom* random_;
const QuicCryptoServerConfig* crypto_config_;
QuicCompressedCertsCache* compressed_certs_cache_;
const CryptoHandshakeMessage* chlo_;
CryptoHandshakeMessage reply_;
CryptoFramer crypto_framer_;
QuicCryptoProof proof_;
DISALLOW_COPY_AND_ASSIGN(StatelessRejector);
};
} // namespace net
#endif // NET_QUIC_STATELESS_REJECTOR_H_