hello world! welcome back to war! another week, monday, 09.35 am! Spoofing GPS L1 encryped channel...and stuff you can remember .
A node.js proxy for decrypting encrypted files on the fly by first requesting authorization and then using the retrieved decryption key to decode a remote file while serving it to the client...
/* | |
* | |
* Streaming server to decrypt recorded calls on the fly. | |
* | |
* To start a user sends an HTTPS encrypted request with their decryption password | |
* | |
* We send a init request to the rails application asking it to send us the decryption keys for the specific requested call | |
* | |
*/ | |
var http = require('http'), | |
querystring = require('querystring'), | |
crypto = require('crypto'), | |
base64 = require('base64'), | |
URL = require('url'), | |
config = require(__dirname + '/config')[(process.env.NODE_ENV || 'development')]; | |
// setup the forward request options | |
var AccessOptions = { | |
host: config.host, | |
port: config.port, | |
path: function(callid, passtoken) { return '/calls/secure_access' } | |
} | |
var app = http.createServer(function (req, res) { | |
var params = querystring.parse(req.url.split('?')[1]); | |
var format = params.format == 'wav' ? 'audio/wav' : 'audio/mp3'; | |
// send access request | |
var opts = {host: AccessOptions.host, port: AccessOptions.port, path: AccessOptions.path(params.cid, params.token)}; | |
http.get(opts, function(response) { | |
var messageBuffer = new Buffer(128); // smallish for testing | |
var bufferSize = 0; | |
response.on('data', function(chunk) { | |
if ((bufferSize + chunk.length) > messageBuffer.length) { | |
var biggerBuffer = new Buffer( (bufferSize+chunk.length) * 2 ); | |
messageBuffer.copy(biggerBuffer); | |
delete messageBuffer; | |
messageBuffer = biggerBuffer; | |
} | |
chunk.copy(messageBuffer, bufferSize); | |
bufferSize += chunk.length; | |
}); | |
response.on('end', function() { | |
//console.log(messageBuffer.toString('utf8', 0, bufferSize)); | |
var message = JSON.parse(messageBuffer.toString('utf8', 0, bufferSize)); | |
var decipher = crypto.createDecipheriv('aes-256-cbc', base64.decode(message.key), base64.decode(message.iv)); | |
var uri = URL.parse(message.audio_url); | |
var opts = {host: uri.hostname, port: uri.port, path: uri.pathname}; | |
var request = http.get(opts, function(response) { | |
res.writeHead(200, {'Content-Type': format}); | |
response.on('data', function(chunk) { | |
res.write(decipher.update(chunk, 'binary', 'binary'), 'binary'); | |
}); | |
response.on('end', function() { | |
res.end(decipher.final('binary'), 'binary'); | |
}); | |
}); | |
}); | |
}); | |
}); | |
module.exports = exports = app; | |
if (!module.parent) { | |
app.listen(1337, "127.0.0.1"); | |
process.on('SIGINT', process.exit.bind(process)); | |
console.log('Server running at http://127.0.0.1:1337/'); | |
} |
Press h to open a hovercard with more details.
taf2 commented on 12 Jul 2011