node.js - Base64 encoding for Sec-WebSocket-Accept value -



node.js - Base64 encoding for Sec-WebSocket-Accept value -

a while ago, started experimenting websockets node.js taking care of backend. working fine, when homecoming protocol has been updated , can't work anymore.

specifically, problem sec-websocket-accept header. seem doing wrong when calculating it, although can't fathom might be. far can tell, i'm next instructions on wikipedia dot.

here's code:

var magicstring = "258eafa5-e914-47da-95ca-c5ab0dc85b11"; var secwskey = req.headers['sec-websocket-key']; var hash = require('crypto') .createhash('sha1') .update(secwskey + magicstring) .digest('hex'); var b64hash = new buffer(hash).tostring('base64'); var handshake = "http/1.1 101 web socket protocol handshake\r\n" + "upgrade: websocket\r\n" + "connection: upgrade\r\n" + "sec-websocket-accept: " + b64hash + "\r\n" + "\r\n"; socket.write(handshake);

an illustration connection:

// incoming headers { upgrade: 'websocket', connection: 'upgrade', host: 'localhost:8888', origin: 'http://localhost:8888', 'sec-websocket-key': '4ardfzg5uyreuw8dsnlw6g==', 'sec-websocket-version': '13' } // outgoing handshake http/1.1 101 switching protocols upgrade: websocket connection: upgrade sec-websocket-accept: ytywzwrlmjq4nwfhnzjiymrjztq5odi4njuwmwnjnje1ytm0mzzkng== // result: error during websocket handshake: sec-websocket-accept mismatch

looking more this, tried replicating calculated hash in wiki , fails.

var hash = require('crypto') .createhash('sha1') .update('x3jjhmbdl1ezlkh9gbhxdw==258eafa5-e914-47da-95ca-c5ab0dc85b11') .digest('hex'); // result : 1d29ab734b0c9585240069a6e4e3e91b61da1969 // expected: 1d29ab734b0c9585240069a6e4e3e91b61da1969 var buf = new buffer(hash).tostring('base64'); // result : mwqyowfinzm0yjbjotu4nti0mda2owe2ztrlm2u5mwi2mwrhmtk2oq== // expected: hsmrc0smlyukagmm5oppg2hagwk=

as can see, sha1 hash correct, base64 encoding not. looking @ this answer, seems doing right. tried same process in php , same result, i'm doing wrong.

i'm running node.js v0.6.8.

getting closer

experimenting farther php, more familiar me, , deriving behaviour of printf in shell, came working snippet:

$hash = sha1('x3jjhmbdl1ezlkh9gbhxdw==258eafa5-e914-47da-95ca-c5ab0dc85b11'); $hashdec = ''; ($i = 0; $i < strlen($hash); $i += 2) { $hashdec .= chr(hexdec(substr($hash, $i, 2))); }; echo base64_encode($hashdec); // result : hsmrc0smlyukagmm5oppg2hagwk= // expected: hsmrc0smlyukagmm5oppg2hagwk=

i tried replicate in javascript, no avail.

var magic = "258eafa5-e914-47da-95ca-c5ab0dc85b11"; var key = "4ardfzg5uyreuw8dsnlw6g=="; var magic_key = magic + key; var hash = require('crypto').createhash('sha1').update(magic_key).digest('hex'); var buf = new buffer(hash.length / 2); (var = 0; < hash.length; += 2) { var token = hash.substr(i, 2); var int = parseint(token.tostring(16), 16); var chr = string.fromcharcode(int); buf.write(chr); } console.log(buf.tostring('base64')); // result : w53daaeaaadbiiafaqaaaggatwa= // expected: hsmrc0smlyukagmm5oppg2hagwk=

sometimes reading manual helps.

hash.digest([encoding])

calculates digest of of passed info hashed. encoding can 'hex', 'binary' or 'base64'.

(emphasis mine.)

so problem solved changing code to:

var magicstring = "258eafa5-e914-47da-95ca-c5ab0dc85b11"; var secwskey = req.headers['sec-websocket-key']; var hash = require('crypto') .createhash('sha1') .update(secwskey + magicstring) .digest('base64'); // <- see that, silly. var handshake = "http/1.1 101 web socket protocol handshake\r\n" + "upgrade: websocket\r\n" + "connection: upgrade\r\n" + "sec-websocket-accept: " + hash + "\r\n" + "\r\n"; socket.write(handshake);

'tis time sense silly. (again.)

node.js base64 websocket

Comments

Popular posts from this blog

How do I check if an insert was successful with MySQLdb in Python? -

delphi - blogger via idHTTP : error 400 bad request -

postgresql - ERROR: operator is not unique: unknown + unknown -