Nikita
Nikita

Reputation: 25

Websockets - Sec-WebSocket-Accept mismatch

I'm writing the websocket server on C++ and having a problem with calculating the Sec-WebSocket-Accept key. I've tested sha1 and it generates the right value (I've taken the string from wikipedia example and got the same hash) and I also found the online base64 converter to test the second part, and it seems working right. But as I can see from other issues, my string is too long.

  std::string secKey =  readHeader(buffer,n,"Sec-WebSocket-Key");
  std::string magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";

  secKey.append(magic);
  unsigned char hash[20];
  char hexstring[41];

  sha1::calc(secKey.c_str(),secKey.length(),hash);
  sha1::toHexString(hash,hexstring);
  std::string encoded = base64_encode(reinterpret_cast<const unsigned char*>(hexstring) ,strlen(hexstring));

For secKey = "4aRdFZG5uYrEUw8dsNLW6g==" I get encoded value "YTYwZWRlMjQ4NWFhNzJiYmRjZTQ5ODI4NjUwMWNjNjE1YTM0MzZkNg=="

Upvotes: 1

Views: 1682

Answers (1)

simonc
simonc

Reputation: 42165

I think you can skip the toHexString line and base64 encode the 20 byte hash instead.

sha1::calc(secKey.c_str(),secKey.length(),hash);
std::string encoded = base64_encode(reinterpret_cast<const unsigned char*>(hash), 20);

That's what my C++ server does and handshakes complete successfully.

Upvotes: 2

Related Questions