end-to-end encrypted exchange (e3x) implemented in pure javascript
JavaScript Makefile
Latest commit 0f96c0e May 16, 2016 @rynomad rynomad bump


e3x: End-to-End Encrypted eXchange (javascript)

Build Status

This module implements all of e3x in javascript as a node and browserify module. It is used by telehash-js which is designed to provide a friendly higher level api, whereas this is low level and expects the application to manage all state tracking.


All packets use lob-enc structure of: {json:{...}, body:Buffer(...)}

var e3x = require('e3x');

var secrets = e3x.generate();

var self = e3x.self(args);
if(!self) //console.log(e3x.err);

var inner = self.decrypt(message);

var exchange = self.exchange(args);
if(!exchange) //console.log(self.err);

exchange.token; // 16 byte buffer
exchange.sending = function(packet){ }

var bool = exchange.verify(message);
var message = exchange.encrypt(inner);

var inner = exchange.receive(cpacket);

var at = exchange.at(at); // set the at, or return the current one if none given, will start to timeout channels until in sync
var bool = exchange.sync(handshake); // processes handshake to do all setup stuff, resends channels if in sync
var handshake = exchange.handshake(); // returns current handshake to be sent

var channel = exchange.channel(open);
if(!channel) //console.log(exchange.err);

var bool = channel.receive(inner); // true if accepted
channel.send(packet); // calls exchange.sending()
channel.receiving = function(err, packet){};

Cipher Sets

These are the current Cipher Sets supported by default:

The API to implement a new CS module is just a simplified crypto wrapper:

var cs = require('e3x-csxx');
cs.id; // 'xx';

cs.generate(cb); // new local keypair, cb(err, pair)

var local = new cs.Local(pair);
var inner = local.decrypt(body);

var remote = new cs.Remote(public_key_endpoint);
var bool = remote.verify(local, body);
var outer = remote.encrypt(local, inner);

var ephemeral = new cs.Ephemeral(remote, body);
var outer = ephemeral.encrypt(inner)
var inner = ephemeral.decrypt(outer)