From 50d37aa22e670b4d9f8d6068626b28c9ad443304 Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Tue, 29 Apr 2014 19:51:49 -0300 Subject: [PATCH 01/17] implements authenticated encryption --- bower.json | 1 + config.template.js | 12 +++++++++--- index.html | 1 + js/models/network/WebRTC.js | 37 +++++++++++++++++++++++++++++++++++-- package.json | 3 ++- 5 files changed, 48 insertions(+), 6 deletions(-) diff --git a/bower.json b/bower.json index 950d050b1..ef00f8bc7 100644 --- a/bower.json +++ b/bower.json @@ -15,6 +15,7 @@ "mocha": "~1.18.2", "chai": "~1.9.1", "crypto-js": "http://crypto-js.googlecode.com/files/CryptoJS%20v3.1.2.zip", + "sjcl":"1.0.0", "file-saver": "*" } } diff --git a/config.template.js b/config.template.js index ea2f712b9..e614e7aa8 100644 --- a/config.template.js +++ b/config.template.js @@ -10,12 +10,18 @@ var config = { //port: 10009, //path: '/', // - key: 'g23ihfh82h35rf', - host:'162.242.219.26', + key: 'g23ihfh82h35rf', // api key for the peerjs server + host:'162.242.219.26', // peerjs server port:10009, path: '/', maxPeers: 15, - debug: 3 +// debug: 3, + sjclParams: { + salt: 'cc295e13e14edcc0', // choose your own salt (hex string) + iter:500, + mode:'ccm', + ts:parseInt(64), + } }, limits: { totalCopayers: 10, diff --git a/index.html b/index.html index 1673917ab..3c8820c34 100644 --- a/index.html +++ b/index.html @@ -518,6 +518,7 @@ + diff --git a/js/models/network/WebRTC.js b/js/models/network/WebRTC.js index cff75bb48..e2aa0690d 100644 --- a/js/models/network/WebRTC.js +++ b/js/models/network/WebRTC.js @@ -24,6 +24,12 @@ function Network(opts) { this.debug = opts.debug || 3; this.maxPeers = opts.maxPeers || 10; this.opts = { key: opts.key }; + this.sjclParams = opts.sjclParams || { + salt: 'f28bfb49ef70573c', + iter:500, + mode:'ccm', + ts:parseInt(64), + }; // For using your own peerJs server ['port', 'host', 'path', 'debug'].forEach(function(k) { @@ -152,10 +158,11 @@ Network.prototype._addCopayer = function(copayerId, isInbound) { -Network.prototype._onData = function(data, isInbound, peerId) { +Network.prototype._onData = function(encStr, isInbound, peerId) { var sig, payload; try { + var data = this._decrypt(encStr); payload= JSON.parse(data); } catch (e) { console.log('### ERROR IN DATA: "%s" ', data, isInbound, e); @@ -355,13 +362,39 @@ Network.prototype.getPeer = function() { return this.peer; }; +Network.prototype._encryptFor = function(copayerId, payloadStr) { + var cBits= sjcl.codec.hex.toBits(copayerId); + var pass64= sjcl.codec.base64.fromBits(cBits); + var plainText = sjcl.codec.utf8String.toBits(payloadStr); + var p = this.sjclParams; // auth strength + ct = sjcl.encrypt(pass64, plainText, p);//,p, rp); + var c = JSON.parse(ct); + var toSend = { + iv: c.iv, + ct: c.ct, + }; + return JSON.stringify(toSend); +}; + + +Network.prototype._decrypt = function(encStr) { + var i = JSON.parse(encStr); + for (var k in this.sjclParams) { + i[k] = this.sjclParams[k]; + } + var str= JSON.stringify(i); + var cBits= sjcl.codec.hex.toBits(this.copayerId); + var pass64= sjcl.codec.base64.fromBits(cBits); + var pt = sjcl.decrypt(pass64, str); + return pt; +}; Network.prototype._sendToOne = function(copayerId, payloadStr, sig, cb) { var peerId = this.peerFromCopayer(copayerId); if (peerId !== this.peerId) { var dataConn = this.connections[peerId]; if (dataConn) { - dataConn.send(payloadStr); + dataConn.send(this._encryptFor(copayerId, payloadStr)); } else { console.log('[WebRTC.js.255] WARN: NO CONNECTION TO:', peerId); //TODO diff --git a/package.json b/package.json index fdcbedbfb..5de074274 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "url": "https://github.com/bitpay/copay/issues" }, "scripts": { - "test": "mocha" + "test": "mocha", + "postinstall": "cd lib/sjcl;./configure;make;cp sjcl.js ../" }, "homepage": "https://github.com/bitpay/copay", "devDependencies": { From 65698e7e454c4182904b6cf16d9a39fe94ad1bf3 Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Tue, 29 Apr 2014 20:56:28 -0300 Subject: [PATCH 02/17] add cache for keys --- config.template.js | 2 +- js/models/network/WebRTC.js | 24 +++++++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/config.template.js b/config.template.js index e614e7aa8..c065db489 100644 --- a/config.template.js +++ b/config.template.js @@ -17,7 +17,7 @@ var config = { maxPeers: 15, // debug: 3, sjclParams: { - salt: 'cc295e13e14edcc0', // choose your own salt (hex string) + salt: 'mjuBtGybi/4=', // choose your own salt (base64) iter:500, mode:'ccm', ts:parseInt(64), diff --git a/js/models/network/WebRTC.js b/js/models/network/WebRTC.js index e2aa0690d..f45eaa1f4 100644 --- a/js/models/network/WebRTC.js +++ b/js/models/network/WebRTC.js @@ -25,7 +25,7 @@ function Network(opts) { this.maxPeers = opts.maxPeers || 10; this.opts = { key: opts.key }; this.sjclParams = opts.sjclParams || { - salt: 'f28bfb49ef70573c', + salt: 'f28bfb49ef70573c', iter:500, mode:'ccm', ts:parseInt(64), @@ -50,6 +50,7 @@ Network.prototype.cleanUp = function() { this.authenticatedPeers=[]; this.copayerForPeer={}; this.connections={}; + this.keyCache={}; if (this.peer) { console.log('## DESTROYING PEER INSTANCE'); //TODO this.peer.disconnect(); @@ -362,12 +363,22 @@ Network.prototype.getPeer = function() { return this.peer; }; + +Network.prototype._keyForCopayerId = function(copayerId) { + var key=this.keyCache[copayerId]; + if (key) return key; + + var cBuf = new Buffer(copayerId,'hex'); + var key = bitcore.util.sha256(cBuf).toString('base64'); + this.keyCache[copayerId] = key; + return key; +}; + Network.prototype._encryptFor = function(copayerId, payloadStr) { - var cBits= sjcl.codec.hex.toBits(copayerId); - var pass64= sjcl.codec.base64.fromBits(cBits); + var key = this._keyForCopayerId(copayerId); var plainText = sjcl.codec.utf8String.toBits(payloadStr); var p = this.sjclParams; // auth strength - ct = sjcl.encrypt(pass64, plainText, p);//,p, rp); + ct = sjcl.encrypt(key, plainText, p);//,p, rp); var c = JSON.parse(ct); var toSend = { iv: c.iv, @@ -383,9 +394,8 @@ Network.prototype._decrypt = function(encStr) { i[k] = this.sjclParams[k]; } var str= JSON.stringify(i); - var cBits= sjcl.codec.hex.toBits(this.copayerId); - var pass64= sjcl.codec.base64.fromBits(cBits); - var pt = sjcl.decrypt(pass64, str); + var key= this._keyForCopayerId(this.copayerId); + var pt = sjcl.decrypt(key, str); return pt; }; From f4f5209af77b197e6135e0a83d5050fb5f194cae Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Tue, 29 Apr 2014 20:57:30 -0300 Subject: [PATCH 03/17] add cache for keys --- config.template.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.template.js b/config.template.js index c065db489..793c7d940 100644 --- a/config.template.js +++ b/config.template.js @@ -18,7 +18,7 @@ var config = { // debug: 3, sjclParams: { salt: 'mjuBtGybi/4=', // choose your own salt (base64) - iter:500, + iter:1000, mode:'ccm', ts:parseInt(64), } From 7a872956b41e40e65686792a7221894845748029 Mon Sep 17 00:00:00 2001 From: Bechi Date: Tue, 29 Apr 2014 16:34:40 -0300 Subject: [PATCH 04/17] item tx new style --- css/main.css | 11 +++- css/tpl-default.css | 24 ++++++++ index.html | 132 +++++++++++++++++++++++++++----------------- 3 files changed, 116 insertions(+), 51 deletions(-) diff --git a/css/main.css b/css/main.css index 843c6bacc..654de6fa6 100644 --- a/css/main.css +++ b/css/main.css @@ -251,7 +251,7 @@ hr { margin: 2.25rem 0;} .br100 {border-radius: 100%;} .lh {line-height: 0;} .oh {overflow:hidden;} - +.lh {line-height: 0;} .signin input.ng-dirty.ng-invalid { border: 2px red solid; } @@ -275,6 +275,11 @@ hr { margin: 2.25rem 0;} padding: 0.5rem; } +.tx-copayers { + overflow: hidden; + padding: 0.5rem; +} + .box-copayers { padding: 0.5rem 2rem 0.5rem 1rem; float: left; @@ -308,6 +313,7 @@ hr { margin: 2.25rem 0;} padding: 2.7px; } +<<<<<<< HEAD .tx-copayers { background: #F8F8F8; -moz-box-shadow: inset 0px 0px 4px 0px rgba(0,0,0,0.05), inset 0px 1px 1px 0px rgba(0,0,0,0.05); @@ -331,4 +337,7 @@ hr { margin: 2.25rem 0;} color: #fff; background: #C0392B; } +======= + +>>>>>>> item tx new style diff --git a/css/tpl-default.css b/css/tpl-default.css index cab9f35f2..8c31e73d9 100644 --- a/css/tpl-default.css +++ b/css/tpl-default.css @@ -142,6 +142,30 @@ a.box-backup { color:#C0392A; } +.tx-copayers { + background: #F8F8F8; + -moz-box-shadow: inset 0px 0px 4px 0px rgba(0,0,0,0.05), inset 0px 1px 1px 0px rgba(0,0,0,0.05); + box-shadow: inset 0px 0px 4px 0px rgba(0,0,0,0.05), inset 0px 1px 1px 0px rgba(0,0,0,0.05); +} + +.box-copayers .icon-inactive { + color: #4C5B69; +} + +.box-copayers .icon-active { + color: #fff; +} + +.box-copayers .icon-active-check { + color: #fff; + background: #3FBC9C; +} + +.box-copayers .icon-active-x { + color: #fff; + background: #C0392B; +} + small.is-valid { color: #04B404; } diff --git a/index.html b/index.html index 3c8820c34..4acac0961 100644 --- a/index.html +++ b/index.html @@ -19,8 +19,9 @@
@@ -43,7 +44,7 @@
@@ -98,34 +99,13 @@