Implement WebSocket*HandshakeStream::GetTokenBindingSignature().

Locally verified that this fixes the linked bug.

Bug: 823643
Change-Id: Icb7048ce60e46babdae278c1d2b913e44df8f7a5
Reviewed-on: https://chromium-review.googlesource.com/980964
Commit-Queue: Bence Béky <[email protected]>
Reviewed-by: Nick Harper <[email protected]>
Reviewed-by: Ryan Hamilton <[email protected]>
Reviewed-by: Adam Rice <[email protected]>
Cr-Commit-Position: refs/heads/master@{#546975}
diff --git a/net/websockets/websocket_basic_handshake_stream.cc b/net/websockets/websocket_basic_handshake_stream.cc
index 8cf6c78..7bc25ed 100644
--- a/net/websockets/websocket_basic_handshake_stream.cc
+++ b/net/websockets/websocket_basic_handshake_stream.cc
@@ -32,6 +32,7 @@
 #include "net/http/http_status_code.h"
 #include "net/http/http_stream_parser.h"
 #include "net/socket/client_socket_handle.h"
+#include "net/socket/ssl_client_socket.h"
 #include "net/socket/websocket_transport_client_socket_pool.h"
 #include "net/websockets/websocket_basic_stream.h"
 #include "net/websockets/websocket_basic_stream_adapters.h"
@@ -334,8 +335,12 @@
     crypto::ECPrivateKey* key,
     TokenBindingType tb_type,
     std::vector<uint8_t>* out) {
-  NOTREACHED();
-  return ERR_NOT_IMPLEMENTED;
+  DCHECK(url_.SchemeIsCryptographic());
+
+  // Encrypted WebSocket must use an SSL socket.
+  StreamSocket* socket = state_.connection()->socket();
+  SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(socket);
+  return ssl_socket->GetTokenBindingSignature(key, tb_type, out);
 }
 
 void WebSocketBasicHandshakeStream::Drain(HttpNetworkSession* session) {