| Index: net/quic/crypto/crypto_server_config.h
|
| diff --git a/net/quic/crypto/crypto_server_config.h b/net/quic/crypto/crypto_server_config.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..49866039890b7699ceb6cec6d484f90a8e2760cf
|
| --- /dev/null
|
| +++ b/net/quic/crypto/crypto_server_config.h
|
| @@ -0,0 +1,164 @@
|
| +// Copyright (c) 2013 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_CRYPTO_CRYPTO_SERVER_CONFIG_H_
|
| +#define NET_QUIC_CRYPTO_CRYPTO_SERVER_CONFIG_H_
|
| +
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/strings/string_piece.h"
|
| +#include "base/synchronization/lock.h"
|
| +#include "net/base/ip_endpoint.h"
|
| +#include "net/base/net_export.h"
|
| +#include "net/quic/crypto/crypto_handshake.h"
|
| +#include "net/quic/crypto/crypto_protocol.h"
|
| +#include "net/quic/quic_time.h"
|
| +
|
| +namespace net {
|
| +
|
| +class KeyExchange;
|
| +class ProofSource;
|
| +class QuicClock;
|
| +class QuicDecrypter;
|
| +class QuicEncrypter;
|
| +class QuicRandom;
|
| +class QuicServerConfigProtobuf;
|
| +class StrikeRegister;
|
| +
|
| +namespace test {
|
| +class QuicCryptoServerConfigPeer;
|
| +} // namespace test
|
| +
|
| +// QuicCryptoServerConfig contains the crypto configuration of a QUIC server.
|
| +// Unlike a client, a QUIC server can have multiple configurations active in
|
| +// order to support clients resuming with a previous configuration.
|
| +// TODO(agl): when adding configurations at runtime is added, this object will
|
| +// need to consider locking.
|
| +class NET_EXPORT_PRIVATE QuicCryptoServerConfig {
|
| + public:
|
| + // |source_address_token_secret|: secret key material used for encrypting and
|
| + // decrypting source address tokens. It can be of any length as it is fed
|
| + // into a KDF before use. In tests, use TESTING.
|
| + explicit QuicCryptoServerConfig(
|
| + base::StringPiece source_address_token_secret);
|
| + ~QuicCryptoServerConfig();
|
| +
|
| + // TESTING is a magic parameter for passing to the constructor in tests.
|
| + static const char TESTING[];
|
| +
|
| + // DefaultConfig generates a QuicServerConfigProtobuf protobuf suitable
|
| + // for using in tests. |extra_tags| contains additional key/value pairs that
|
| + // will be inserted into the config.
|
| + static QuicServerConfigProtobuf* DefaultConfig(
|
| + QuicRandom* rand,
|
| + const QuicClock* clock,
|
| + const CryptoHandshakeMessage& extra_tags);
|
| +
|
| + // AddConfig adds a QuicServerConfigProtobuf to the availible configurations.
|
| + // It returns the SCFG message from the config if successful. The caller
|
| + // takes ownership of the CryptoHandshakeMessage.
|
| + CryptoHandshakeMessage* AddConfig(QuicServerConfigProtobuf* protobuf);
|
| +
|
| + // AddDefaultConfig creates a config and then calls AddConfig to
|
| + // add it. Any tags in |extra_tags| will be copied into the config.
|
| + CryptoHandshakeMessage* AddDefaultConfig(
|
| + QuicRandom* rand,
|
| + const QuicClock* clock,
|
| + const CryptoHandshakeMessage& extra_tags);
|
| +
|
| + // ProcessClientHello processes |client_hello| and decides whether to accept
|
| + // or reject the connection. If the connection is to be accepted, |out| is
|
| + // set to the contents of the ServerHello, |out_params| is completed and
|
| + // QUIC_NO_ERROR is returned. Otherwise |out| is set to be a REJ message and
|
| + // an error code is returned.
|
| + //
|
| + // client_hello: the incoming client hello message.
|
| + // guid: the GUID for the connection, which is used in key derivation.
|
| + // client_ip: the IP address of the client, which is used to generate and
|
| + // validate source-address tokens.
|
| + // now_since_epoch: the current time, as a delta since the unix epoch,
|
| + // which is used to validate client nonces.
|
| + // rand: an entropy source
|
| + // params: the state of the handshake. This may be updated with a server
|
| + // nonce when we send a rejection. After a successful handshake, this will
|
| + // contain the state of the connection.
|
| + // out: the resulting handshake message (either REJ or SHLO)
|
| + // error_details: used to store a string describing any error.
|
| + QuicErrorCode ProcessClientHello(const CryptoHandshakeMessage& client_hello,
|
| + QuicGuid guid,
|
| + const IPEndPoint& client_ip,
|
| + QuicTime::Delta now_since_epoch,
|
| + QuicRandom* rand,
|
| + QuicCryptoNegotiatedParameters* params,
|
| + CryptoHandshakeMessage* out,
|
| + std::string* error_details) const;
|
| +
|
| + // SetProofSource installs |proof_source| as the ProofSource for handshakes.
|
| + // This object takes ownership of |proof_source|.
|
| + void SetProofSource(ProofSource* proof_source);
|
| +
|
| + private:
|
| + friend class test::QuicCryptoServerConfigPeer;
|
| +
|
| + // Config represents a server config: a collection of preferences and
|
| + // Diffie-Hellman public values.
|
| + struct Config : public QuicCryptoConfig {
|
| + Config();
|
| + ~Config();
|
| +
|
| + // serialized contains the bytes of this server config, suitable for sending
|
| + // on the wire.
|
| + std::string serialized;
|
| + // id contains the SCID of this server config.
|
| + std::string id;
|
| + // orbit contains the orbit value for this config: an opaque identifier
|
| + // used to identify clusters of server frontends.
|
| + unsigned char orbit[kOrbitSize];
|
| +
|
| + // key_exchanges contains key exchange objects with the private keys
|
| + // already loaded. The values correspond, one-to-one, with the tags in
|
| + // |kexs| from the parent class.
|
| + std::vector<KeyExchange*> key_exchanges;
|
| +
|
| + // tag_value_map contains the raw key/value pairs for the config.
|
| + CryptoTagValueMap tag_value_map;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(Config);
|
| + };
|
| +
|
| + // NewSourceAddressToken returns a fresh source address token for the given
|
| + // IP address.
|
| + std::string NewSourceAddressToken(const IPEndPoint& ip,
|
| + QuicRandom* rand,
|
| + QuicTime::Delta now_since_epoch) const;
|
| +
|
| + // ValidateSourceAddressToken returns true if the source address token in
|
| + // |token| is a valid and timely token for the IP address |ip| given that the
|
| + // current time is |now|.
|
| + bool ValidateSourceAddressToken(base::StringPiece token,
|
| + const IPEndPoint& ip,
|
| + QuicTime::Delta now_since_epoch) const;
|
| +
|
| + std::map<ServerConfigID, Config*> configs_;
|
| +
|
| + ServerConfigID active_config_;
|
| +
|
| + mutable base::Lock strike_register_lock_;
|
| + // strike_register_ contains a data structure that keeps track of previously
|
| + // observed client nonces in order to prevent replay attacks.
|
| + mutable scoped_ptr<StrikeRegister> strike_register_;
|
| +
|
| + // These members are used to encrypt and decrypt the source address tokens
|
| + // that we receive from and send to clients.
|
| + scoped_ptr<QuicEncrypter> source_address_token_encrypter_;
|
| + scoped_ptr<QuicDecrypter> source_address_token_decrypter_;
|
| +
|
| + // proof_source_ contains an object that can provide certificate chains and
|
| + // signatures.
|
| + scoped_ptr<ProofSource> proof_source_;
|
| +};
|
| +
|
| +} // namespace net
|
| +
|
| +#endif // NET_QUIC_CRYPTO_CRYPTO_SERVER_CONFIG_H_
|
|
|