Chromium Code Reviews| Index: net/socket/ssl_client_socket_openssl.h | 
| diff --git a/net/socket/ssl_client_socket_openssl.h b/net/socket/ssl_client_socket_openssl.h | 
| index 228214b42d6e2f5b925050f976a5a8274c0171c2..6bee84cb799987efcb94ff6c730a9a6743b3b04a 100644 | 
| --- a/net/socket/ssl_client_socket_openssl.h | 
| +++ b/net/socket/ssl_client_socket_openssl.h | 
| @@ -6,6 +6,7 @@ | 
| #define NET_SOCKET_SSL_CLIENT_SOCKET_OPENSSL_H_ | 
| #include <openssl/base.h> | 
| +#include <openssl/bytestring.h> | 
| #include <openssl/ssl.h> | 
| #include <string> | 
| @@ -95,10 +96,72 @@ class SSLClientSocketOpenSSL : public SSLClientSocket { | 
| int SetSendBufferSize(int32 size) override; | 
| private: | 
| + // Stores the state and result of the token binding negotiation TLS extension. | 
| + // (draft-ietf-tokbind-negotiation-00). | 
| + class TokenBindingExtension { | 
| + public: | 
| + static const unsigned int kExtNum = 30033; | 
| 
 
davidben
2015/10/01 16:15:17
I believe this is actually an ODR violation for we
 
nharper
2015/10/01 19:12:23
To be clear, you're suggesting removing the TokenB
 
 | 
| + | 
| + // Token Binding ProtocolVersion that this extension supports. | 
| + static const uint8_t kProtocolVersionMajor = 0; | 
| + static const uint8_t kProtocolVersionMinor = 2; | 
| + static const uint8_t kMinProtocolVersionMajor = 0; | 
| + static const uint8_t kMinProtocolVersionMinor = 2; | 
| + | 
| + TokenBindingExtension(); | 
| + ~TokenBindingExtension(); | 
| + | 
| + // Sets the supported key params to use in negotiation. If empty, token | 
| + // binding will not be negotiated. | 
| + void SetParams(const std::vector<TokenBindingParam>& params); | 
| + | 
| + // Returns which TokenBindingParam was negotiated. This value is only valid | 
| + // if WasNegotiated returns true. | 
| + TokenBindingParam NegotiationResult() const; | 
| + | 
| + // Returns whether token binding was negotiated. | 
| + bool WasNegotiated() const; | 
| + | 
| + // Sets the custom extension api callbacks to ClientAddCallback, | 
| + // ClientFreeCallback, and ClientParseCallback. The callbacks are static | 
| + // methods (since the OpenSSL api takes function pointers) and are wrappers | 
| + // to call ClientAdd or ClientParse on the TokenBindingExtension object that | 
| + // is a member of the SSLClientSocketOpenSSL for the corresponding SSL | 
| + // struct passed in to the callback. | 
| + static bool RegisterCallbacks(SSL_CTX* ssl_ctx); | 
| + | 
| + private: | 
| + static int ClientAddCallback(SSL* ssl, | 
| + unsigned int extension_value, | 
| + const uint8_t** out, | 
| + size_t* out_len, | 
| + int* out_alert_value, | 
| + void* add_arg); | 
| + static void ClientFreeCallback(SSL* ssl, | 
| + unsigned int extension_value, | 
| + const uint8_t* out, | 
| + void* add_arg); | 
| + static int ClientParseCallback(SSL* ssl, | 
| + unsigned int extension_value, | 
| + const uint8_t* contents, | 
| + size_t contents_len, | 
| + int* out_alert_value, | 
| + void* parse_arg); | 
| 
 
davidben
2015/10/01 16:15:17
The random static methods thus far have ended up o
 
nharper
2015/10/02 03:31:27
These static methods are calling the private metho
 
 | 
| + | 
| + int ClientAdd(const uint8_t** out, size_t* out_len, int* out_alert_value); | 
| + int ClientParse(const uint8_t* contents, | 
| + size_t contents_len, | 
| + int* out_alert_value); | 
| + | 
| + bool negotiated_; | 
| + TokenBindingParam negotiated_param_; | 
| + std::vector<TokenBindingParam> supported_params_; | 
| + }; | 
| class PeerCertificateChain; | 
| class SSLContext; | 
| friend class SSLClientSocket; | 
| friend class SSLContext; | 
| + friend class TokenBindingExtension; | 
| int Init(); | 
| void DoReadCallback(int result); | 
| @@ -109,6 +172,8 @@ class SSLClientSocketOpenSSL : public SSLClientSocket { | 
| int DoHandshakeComplete(int result); | 
| int DoChannelIDLookup(); | 
| int DoChannelIDLookupComplete(int result); | 
| + int DoTokenBindingLookup(); | 
| + int DoTokenBindingLookupComplete(int result); | 
| int DoVerifyCert(int result); | 
| int DoVerifyCertComplete(int result); | 
| void DoConnectCallback(int result); | 
| @@ -276,6 +341,7 @@ class SSLClientSocketOpenSSL : public SSLClientSocket { | 
| // The service for retrieving Channel ID keys. May be NULL. | 
| ChannelIDService* channel_id_service_; | 
| + TokenBindingExtension token_binding_extension_; | 
| // OpenSSL stuff | 
| SSL* ssl_; | 
| @@ -295,6 +361,8 @@ class SSLClientSocketOpenSSL : public SSLClientSocket { | 
| STATE_HANDSHAKE_COMPLETE, | 
| STATE_CHANNEL_ID_LOOKUP, | 
| STATE_CHANNEL_ID_LOOKUP_COMPLETE, | 
| + STATE_TOKEN_BINDING_LOOKUP, | 
| + STATE_TOKEN_BINDING_LOOKUP_COMPLETE, | 
| STATE_VERIFY_CERT, | 
| STATE_VERIFY_CERT_COMPLETE, | 
| }; |