summaryrefslogtreecommitdiffstats
path: root/net/quic/crypto/crypto_handshake.h
diff options
context:
space:
mode:
Diffstat (limited to 'net/quic/crypto/crypto_handshake.h')
-rw-r--r--net/quic/crypto/crypto_handshake.h93
1 files changed, 91 insertions, 2 deletions
diff --git a/net/quic/crypto/crypto_handshake.h b/net/quic/crypto/crypto_handshake.h
index aca4aa0..92f8f9b 100644
--- a/net/quic/crypto/crypto_handshake.h
+++ b/net/quic/crypto/crypto_handshake.h
@@ -7,7 +7,10 @@
#include <map>
#include <string>
+#include <vector>
+#include "base/memory/scoped_ptr.h"
+#include "base/string_piece.h"
#include "net/base/net_export.h"
#include "net/quic/crypto/crypto_protocol.h"
#include "net/quic/crypto/crypto_utils.h"
@@ -15,9 +18,84 @@
namespace net {
class KeyExchange;
+class QuicDecrypter;
+class QuicEncrypter;
class QuicRandom;
class QuicClock;
+// An intermediate format of a handshake message that's convenient for a
+// CryptoFramer to serialize from or parse into.
+struct NET_EXPORT_PRIVATE CryptoHandshakeMessage {
+ CryptoHandshakeMessage();
+ CryptoHandshakeMessage(const CryptoHandshakeMessage& other);
+ ~CryptoHandshakeMessage();
+
+ CryptoHandshakeMessage& operator=(const CryptoHandshakeMessage& other);
+
+ // GetSerialized returns the serialized form of this message and caches the
+ // result. Subsequently altering the message does not invalidate the cache.
+ const QuicData& GetSerialized() const;
+
+ // SetValue sets an element with the given tag to the raw, memory contents of
+ // |v|.
+ template<class T> void SetValue(CryptoTag tag, const T& v) {
+ tag_value_map[tag] = std::string(reinterpret_cast<const char*>(&v),
+ sizeof(v));
+ }
+
+ // SetVector sets an element with the given tag to the raw contents of an
+ // array of elements in |v|.
+ template<class T> void SetVector(CryptoTag tag, const std::vector<T>& v) {
+ if (v.empty()) {
+ tag_value_map[tag] = std::string();
+ } else {
+ tag_value_map[tag] = std::string(reinterpret_cast<const char*>(&v[0]),
+ v.size() * sizeof(T));
+ }
+ }
+
+ // SetTaglist sets an element with the given tag to contain a list of tags,
+ // passed as varargs. The argument list must be terminated with a 0 element.
+ void SetTaglist(CryptoTag tag, ...);
+
+ // GetTaglist finds an element with the given tag containing zero or more
+ // tags. If such a tag doesn't exist, it returns false. Otherwise it sets
+ // |out_tags| and |out_len| to point to the array of tags and returns true.
+ // The array points into the CryptoHandshakeMessage and is valid only for as
+ // long as the CryptoHandshakeMessage exists and is not modified.
+ QuicErrorCode GetTaglist(CryptoTag tag, const CryptoTag** out_tags,
+ size_t* out_len) const;
+
+ bool GetStringPiece(CryptoTag tag, base::StringPiece* out) const;
+
+ // GetNthValue16 interprets the value with the given tag to be a series of
+ // 16-bit length prefixed values and it returns the subvalue with the given
+ // index.
+ QuicErrorCode GetNthValue16(CryptoTag tag,
+ unsigned index,
+ base::StringPiece* out) const;
+ bool GetString(CryptoTag tag, std::string* out) const;
+ QuicErrorCode GetUint16(CryptoTag tag, uint16* out) const;
+ QuicErrorCode GetUint32(CryptoTag tag, uint32* out) const;
+
+ CryptoTag tag;
+ CryptoTagValueMap tag_value_map;
+
+ private:
+ // GetPOD is a utility function for extracting a plain-old-data value. If
+ // |tag| exists in the message, and has a value of exactly |len| bytes then
+ // it copies |len| bytes of data into |out|. Otherwise |len| bytes at |out|
+ // are zeroed out.
+ //
+ // If used to copy integers then this assumes that the machine is
+ // little-endian.
+ QuicErrorCode GetPOD(CryptoTag tag, void* out, size_t len) const;
+
+ // The serialized form of the handshake message. This member is constructed
+ // lasily.
+ mutable scoped_ptr<QuicData> serialized_;
+};
+
// TODO(rch): sync with server more rationally
class NET_EXPORT_PRIVATE QuicServerConfigProtobuf {
public:
@@ -81,6 +159,8 @@ struct NET_EXPORT_PRIVATE QuicCryptoNegotiatedParams {
CryptoTag key_exchange;
CryptoTag aead;
std::string premaster_secret;
+ scoped_ptr<QuicEncrypter> encrypter;
+ scoped_ptr<QuicDecrypter> decrypter;
};
// QuicCryptoConfig contains common configuration between clients and servers.
@@ -102,7 +182,7 @@ class NET_EXPORT_PRIVATE QuicCryptoConfig {
// index.
CryptoTagVector kexs;
std::vector<KeyExchange*> key_exchanges;
- // Authenticated encryption with associated data (AEAD) algorithms
+ // Authenticated encryption with associated data (AEAD) algorithms.
CryptoTagVector aead;
private:
@@ -113,6 +193,8 @@ class NET_EXPORT_PRIVATE QuicCryptoConfig {
// client.
class NET_EXPORT_PRIVATE QuicCryptoClientConfig : public QuicCryptoConfig {
public:
+ QuicCryptoClientConfig();
+
// Sets the members to reasonable, default values. |rand| is used in order to
// generate ephemeral ECDH keys.
void SetDefaults(QuicRandom* rand);
@@ -123,13 +205,17 @@ class NET_EXPORT_PRIVATE QuicCryptoClientConfig : public QuicCryptoConfig {
const std::string& server_hostname,
CryptoHandshakeMessage* out);
- // ProcessServerHello processes the tags in |server_hello|, writes the
+ // ProcessServerHello processes the message in |server_hello|, writes the
// negotiated parameters to |out_params| and returns QUIC_NO_ERROR. If
// |server_hello| is unacceptable then it puts an error message in
// |error_details| and returns an error code.
QuicErrorCode ProcessServerHello(const CryptoHandshakeMessage& server_hello,
+ const std::string& nonce,
QuicCryptoNegotiatedParams* out_params,
std::string* error_details);
+
+ // The |info| string for the HKDF function.
+ std::string hkdf_info;
};
// QuicCryptoServerConfig contains the crypto configuration of a QUIC server.
@@ -171,6 +257,9 @@ class NET_EXPORT_PRIVATE QuicCryptoServerConfig {
QuicCryptoNegotiatedParams* out_params,
std::string* error_details);
+ // The |info| string for the HKDF function.
+ std::string hkdf_info;
+
private:
// Config represents a server config: a collection of preferences and
// Diffie-Hellman public values.