From e4aa45f34bd3d18187ad1f7c725982ac0f78d6dc Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Sun, 18 Nov 2018 18:27:06 -0800 Subject: [PATCH] wpiutil: WebSocket: Fix Sec-Websocket-Accept computation It needs to use the raw SHA1 bytes, not the hex-decoded text. --- wpiutil/src/main/native/cpp/WebSocket.cpp | 2 +- wpiutil/src/test/native/cpp/WebSocketClientTest.cpp | 2 +- wpiutil/src/test/native/cpp/WebSocketTest.cpp | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/wpiutil/src/main/native/cpp/WebSocket.cpp b/wpiutil/src/main/native/cpp/WebSocket.cpp index 8d0a65cf14..a38be203fd 100644 --- a/wpiutil/src/main/native/cpp/WebSocket.cpp +++ b/wpiutil/src/main/native/cpp/WebSocket.cpp @@ -71,7 +71,7 @@ static StringRef AcceptHash(StringRef key, SmallVectorImpl& buf) { hash.Update(key); hash.Update("258EAFA5-E914-47DA-95CA-C5AB0DC85B11"); SmallString<64> hashBuf; - return Base64Encode(hash.Final(hashBuf), buf); + return Base64Encode(hash.RawFinal(hashBuf), buf); } WebSocket::WebSocket(uv::Stream& stream, bool server, const private_init&) diff --git a/wpiutil/src/test/native/cpp/WebSocketClientTest.cpp b/wpiutil/src/test/native/cpp/WebSocketClientTest.cpp index 87e698a151..692e2a7dd9 100644 --- a/wpiutil/src/test/native/cpp/WebSocketClientTest.cpp +++ b/wpiutil/src/test/native/cpp/WebSocketClientTest.cpp @@ -40,7 +40,7 @@ class WebSocketClientTest : public WebSocketTest { SmallString<64> hashBuf; SmallString<64> acceptBuf; os << "Sec-WebSocket-Accept: " - << Base64Encode(hash.Final(hashBuf), acceptBuf) << "\r\n"; + << Base64Encode(hash.RawFinal(hashBuf), acceptBuf) << "\r\n"; if (!mockProtocol.empty()) os << "Sec-WebSocket-Protocol: " << mockProtocol << "\r\n"; diff --git a/wpiutil/src/test/native/cpp/WebSocketTest.cpp b/wpiutil/src/test/native/cpp/WebSocketTest.cpp index 1062017b49..c27bac051a 100644 --- a/wpiutil/src/test/native/cpp/WebSocketTest.cpp +++ b/wpiutil/src/test/native/cpp/WebSocketTest.cpp @@ -223,6 +223,7 @@ TEST_F(WebSocketTest, CreateServerBasic) { ASSERT_EQ(value, "Upgrade"); ++gotConnection; } else if (name.equals_lower("sec-websocket-accept")) { + ASSERT_EQ(value, "s3pPLMBiTxaQ9kYGzzhZRbK+xOo="); ++gotAccept; } else { FAIL() << "unexpected header " << name.str(); @@ -232,7 +233,7 @@ TEST_F(WebSocketTest, CreateServerBasic) { serverPipe->Listen([&]() { auto conn = serverPipe->Accept(); - auto ws = WebSocket::CreateServer(*conn, "foo", "13"); + auto ws = WebSocket::CreateServer(*conn, "dGhlIHNhbXBsZSBub25jZQ==", "13"); ws->open.connect([&](StringRef protocol) { ++gotOpen; ASSERT_TRUE(protocol.empty());