| Index: net/quic/crypto/crypto_utils.h
|
| diff --git a/net/quic/crypto/crypto_utils.h b/net/quic/crypto/crypto_utils.h
|
| index f51123bb3e7c3ac688f151d838c271f9f61a5a39..ddbff57ea5739661d3b66ed7b3831060240467f6 100644
|
| --- a/net/quic/crypto/crypto_utils.h
|
| +++ b/net/quic/crypto/crypto_utils.h
|
| @@ -29,6 +29,48 @@ struct QuicCryptoNegotiatedParameters;
|
|
|
| class NET_EXPORT_PRIVATE CryptoUtils {
|
| public:
|
| + // Diversification is a utility class that's used to act like a union type.
|
| + // Values can be created by calling the functions like |NoDiversification|,
|
| + // below.
|
| + class Diversification {
|
| + public:
|
| + enum Mode {
|
| + NEVER, // Key diversification will never be used. Forward secure
|
| + // crypters will always use this mode.
|
| +
|
| + PENDING, // Key diversification will happen when a nonce is later
|
| + // received. This should only be used by clients initial
|
| + // decrypters which are waiting on the divesification nonce
|
| + // from the server.
|
| +
|
| + NOW, // Key diversification will happen immediate based on the nonce.
|
| + // This should only be used by servers initial encrypters.
|
| + };
|
| +
|
| + Diversification(const Diversification& diversification) = default;
|
| +
|
| + static Diversification Never() { return Diversification(NEVER, nullptr); }
|
| + static Diversification Pending() {
|
| + return Diversification(PENDING, nullptr);
|
| + }
|
| + static Diversification Now(DiversificationNonce* nonce) {
|
| + return Diversification(NOW, nonce);
|
| + }
|
| +
|
| + Mode mode() const { return mode_; }
|
| + DiversificationNonce* nonce() const {
|
| + DCHECK_EQ(mode_, NOW);
|
| + return nonce_;
|
| + }
|
| +
|
| + private:
|
| + Diversification(Mode mode, DiversificationNonce* nonce)
|
| + : mode_(mode), nonce_(nonce) {}
|
| +
|
| + Mode mode_;
|
| + DiversificationNonce* nonce_;
|
| + };
|
| +
|
| // Generates the connection nonce. The nonce is formed as:
|
| // <4 bytes> current time
|
| // <8 bytes> |orbit| (or random if |orbit| is empty)
|
| @@ -56,12 +98,22 @@ class NET_EXPORT_PRIVATE CryptoUtils {
|
| // server's keys are assigned to |encrypter| or |decrypter|. |server_nonce| is
|
| // optional and, if non-empty, is mixed into the key derivation.
|
| // |subkey_secret| will have the same length as |premaster_secret|.
|
| + //
|
| + // If the mode of |diversification| is NEVER, the the crypters will be
|
| + // configured to never perform key diversification. If the mode is
|
| + // NOW (which is only for servers, then the encrypter will be keyed via a
|
| + // two-step process that uses the nonce from |diversification|.
|
| + // If the mode is PENDING (which is only for servres), then the
|
| + // decrypter will only be keyed to a preliminary state: a call to
|
| + // |SetDiversificationNonce| with a diversification nonce will be needed to
|
| + // complete keying.
|
| static bool DeriveKeys(base::StringPiece premaster_secret,
|
| QuicTag aead,
|
| base::StringPiece client_nonce,
|
| base::StringPiece server_nonce,
|
| const std::string& hkdf_input,
|
| Perspective perspective,
|
| + Diversification diversification,
|
| CrypterPair* crypters,
|
| std::string* subkey_secret);
|
|
|
|
|