Merge pull request #196 from matiu/feature/encryption

Feature/encryption
This commit is contained in:
Mario Colque 2014-04-28 09:22:32 -03:00
commit 380014a280
5 changed files with 58 additions and 31 deletions

View File

@ -217,14 +217,10 @@
</script> </script>
<script type="text/ng-template" id="peer.html"> <script type="text/ng-template" id="peer.html">
<div class="row"> <div class="row" ng-if="$root.wallet.requiredCopayers > $root.wallet.network.connectedCopayers().length">
<div class="large-12 columns p70l"> <div class="large-12 columns p70l">
<p class="text-info" ng-show="$root.wallet.publicKeyRing.requiredCopayers >$root.wallet.network.connectedCopayers()"> <i class="fi-alert size-28"></i> <p class="text-info"> <i class="fi-alert size-28"></i>
</div> {{$root.wallet.requiredCopayers}} copayers needed for signing transactions
</div>
<div class="row">
<div class="large-12 columns p70l">
{{$root.wallet.publicKeyRing.requiredCopayers}} copayers needed for signing transactions
</div> </div>
</div> </div>
<div class="row"> <div class="row">

View File

@ -6,6 +6,9 @@ angular.module('copay.transactions').controller('TransactionsController',
$scope.title = 'Transactions'; $scope.title = 'Transactions';
$scope.loading = false; $scope.loading = false;
var _updateTxs = function() { var _updateTxs = function() {
var w =$rootScope.wallet; var w =$rootScope.wallet;
if (!w) return; if (!w) return;
@ -99,4 +102,13 @@ angular.module('copay.transactions').controller('TransactionsController',
}; };
_updateTxs(); _updateTxs();
var w = $rootScope.wallet;
if (w) {
w.on('txProposalsUpdated', function() {
console.log('[transactions.js.108: txProposalsUpdated:]'); //TODO
_updateTxs();
$rootScope.$digest();
});
}
}); });

View File

@ -60,6 +60,7 @@ Wallet.prototype._handlePublicKeyRing = function(senderId, data, isInbound) {
this._lockIncomming(); this._lockIncomming();
} }
} }
this.emit('publicKeyRingUpdated', this.publicKeyRing);
this.store(); this.store();
}; };
@ -76,6 +77,7 @@ Wallet.prototype._handleTxProposals = function(senderId, data, isInbound) {
recipients = null; recipients = null;
this.sendTxProposals(recipients); this.sendTxProposals(recipients);
} }
this.emit('txProposalsUpdated', this.txProposals);
this.store(); this.store();
}; };
@ -107,7 +109,7 @@ Wallet.prototype._handleData = function(senderId, data, isInbound) {
Wallet.prototype._handleNetworkChange = function(newCopayerId) { Wallet.prototype._handleNetworkChange = function(newCopayerId) {
if (newCopayerId) { if (newCopayerId) {
this.log('#### Setting new PEER:', newCopayerId); this.log('#### Setting new COPAYER:', newCopayerId);
this.sendWalletId(newCopayerId); this.sendWalletId(newCopayerId);
this.emit('peer', this.network.peerFromCopayer(newCopayerId)); this.emit('peer', this.network.peerFromCopayer(newCopayerId));
} }
@ -242,7 +244,6 @@ Wallet.prototype.sendTxProposals = function(recipients) {
txProposals: this.txProposals.toObj(), txProposals: this.txProposals.toObj(),
walletId: this.id, walletId: this.id,
}); });
this.emit('txProposalsUpdated', this.txProposals);
}; };
Wallet.prototype.sendWalletReady = function(recipients) { Wallet.prototype.sendWalletReady = function(recipients) {
@ -256,7 +257,7 @@ Wallet.prototype.sendWalletReady = function(recipients) {
}; };
Wallet.prototype.sendWalletId = function(recipients) { Wallet.prototype.sendWalletId = function(recipients) {
this.log('### SENDING walletId TO:', recipients || 'All', this.walletId); this.log('### SENDING walletId TO:', recipients || 'All', this.id);
this.network.send(recipients, { this.network.send(recipients, {
type: 'walletId', type: 'walletId',
@ -274,7 +275,6 @@ Wallet.prototype.sendPublicKeyRing = function(recipients) {
publicKeyRing: this.publicKeyRing.toObj(), publicKeyRing: this.publicKeyRing.toObj(),
walletId: this.id, walletId: this.id,
}); });
this.emit('publicKeyRingUpdated', this.publicKeyRing);
}; };

View File

@ -154,23 +154,25 @@ Network.prototype._addCopayer = function(copayerId, isInbound) {
Network.prototype._onData = function(data, isInbound, peerId) { Network.prototype._onData = function(data, isInbound, peerId) {
var sig, payload; var sig, payload;
try { try {
var dataObj = JSON.parse(data); var dataObj = JSON.parse(data);
sig = dataObj.sig; sig = dataObj.sig;
payload= dataObj.payload; payload= JSON.parse(this._decPayload(dataObj.encPayloadStr));
console.log('[WebRTC.js.161:payload:]',payload); //TODO
} catch (e) { } catch (e) {
console.log('### ERROR IN DATA: "%s" ', data, isInbound, e); console.log('### ERROR IN DATA: "%s" ', data, isInbound, e);
this._deletePeer(peerId); this._deletePeer(peerId);
return; return;
}; }
console.log('### RECEIVED INBOUND?:%s TYPE: %s FROM %s', console.log('### RECEIVED INBOUND?:%s TYPE: %s FROM %s',
isInbound, payload.type, peerId, payload); isInbound, payload.type, peerId, payload);
// TODO _func if(payload.type === 'hello' && !this.authenticatedPeers[peerId]) {
if(payload.type === 'hello') { var payloadStr = JSON.stringify(payload);
var thisSig = this._signHMAC(payload, this.copayerId); var thisSig = this._signHMAC(payloadStr, this.copayerId);
if (thisSig !== sig) { if (thisSig !== sig) {
console.log('#### Peer sent WRONG hello signature. Closing connection.'); console.log('#### Peer sent WRONG hello signature. Closing connection.');
this._deletePeer(peerId); this._deletePeer(peerId);
@ -199,6 +201,8 @@ Network.prototype._onData = function(data, isInbound, peerId) {
} }
var copayerIdBuf = new Buffer(this.copayerForPeer[peerId],'hex'); var copayerIdBuf = new Buffer(this.copayerForPeer[peerId],'hex');
console.log('[WebRTC.js.204] sig:', sig); //TODO
if (!bitcore.Message.verifyWithPubKey( copayerIdBuf, JSON.stringify(payload), if (!bitcore.Message.verifyWithPubKey( copayerIdBuf, JSON.stringify(payload),
new Buffer(sig,'hex'))) { new Buffer(sig,'hex'))) {
console.log('[WebRTC.js.152] SIGNATURE VERIFICATION FAILED!!'); //TODO console.log('[WebRTC.js.152] SIGNATURE VERIFICATION FAILED!!'); //TODO
@ -375,24 +379,22 @@ Network.prototype.start = function(opts, openCallback) {
}; };
Network.prototype._signHMAC = function(payload, copayerId) { Network.prototype._signHMAC = function(payloadStr, copayerId) {
var str = JSON.stringify(payload);
if (payload.type !=='hello') console.log('[WebRTC.js.382] SIG HMAC', payloadStr, copayerId); //TODO
throw new Error ('HMAC only for hello messages')
return util.sha512hmac( return util.sha512hmac(
new Buffer(str), new Buffer(payloadStr),
new Buffer(copayerId,'hex') new Buffer(copayerId,'hex')
).toString('hex'); ).toString('hex');
}; };
Network.prototype._signECDSA = function(payload) { Network.prototype._signECDSA = function(payloadStr) {
var ret=''; var ret='';
var str = JSON.stringify(payload);
if (!this.signingKey) if (!this.signingKey)
throw new Error ('no key to sign messages :('); throw new Error ('no key to sign messages :(');
return bitcore.Message.sign( return bitcore.Message.sign(
str, payloadStr,
this.signingKey this.signingKey
).toString('hex'); ).toString('hex');
}; };
@ -405,14 +407,31 @@ Network.prototype.getPeer = function() {
return this.peer; return this.peer;
}; };
Network.prototype._sendToOne = function(copayerId, payload, sig, cb) {
Network.prototype._encPayload = function(payloadStr, copayerId) {
if (!copayerId || !payloadStr)
throw new Error('incomplete parameters to _encPayload'+':'+ payloadStr +':'+copayerId);
//console.log('[WebRTC.js.413] ENC:',payloadStr, copayerId); //TODO
// TODO replace with asymmetric encryption (copayerId is the pub key)
return CryptoJS.AES.encrypt(payloadStr, copayerId).toString();
};
Network.prototype._decPayload = function(payloadStr) {
// TODO replace with asymmetric encryption (decrypt using this.signingKey);
//console.log('[WebRTC.js.413] DEC:',payloadStr, this.copayerId); //TODO
return CryptoJS.AES.decrypt(payloadStr, this.copayerId).toString(CryptoJS.enc.Utf8);
};
Network.prototype._sendToOne = function(copayerId, payloadStr, sig, cb) {
var peerId = this.peerFromCopayer(copayerId); var peerId = this.peerFromCopayer(copayerId);
if (peerId !== this.peerId) { if (peerId !== this.peerId) {
var dataConn = this.connections[peerId]; var dataConn = this.connections[peerId];
var encPayloadStr = this._encPayload(payloadStr, copayerId);
if (dataConn) { if (dataConn) {
var str = JSON.stringify({ var str = JSON.stringify({
sig: sig, sig: sig,
payload: payload encPayloadStr: encPayloadStr,
}); });
dataConn.send(str); dataConn.send(str);
} }
@ -431,25 +450,26 @@ Network.prototype.send = function(copayerIds, payload, cb) {
} }
var sig; var sig;
var payloadStr = JSON.stringify(payload);
if (payload.type === 'hello') { if (payload.type === 'hello') {
var hisId = copayerIds; var hisId = copayerIds;
sig=this._signHMAC(payload,hisId); sig=this._signHMAC(payloadStr ,hisId);
} }
else { else {
sig=this._signECDSA(payload); sig=this._signECDSA(payloadStr);
} }
if (Array.isArray(copayerIds)) { if (Array.isArray(copayerIds)) {
var l = copayerIds.length; var l = copayerIds.length;
var i = 0; var i = 0;
copayerIds.forEach(function(copayerId) { copayerIds.forEach(function(copayerId) {
self._sendToOne(copayerId, payload, sig, function () { self._sendToOne(copayerId, payloadStr, sig, function () {
if (++i === l && typeof cb === 'function') cb(); if (++i === l && typeof cb === 'function') cb();
}); });
}); });
} }
else if (typeof copayerIds === 'string') else if (typeof copayerIds === 'string')
self._sendToOne(copayerIds, payload, sig, cb); self._sendToOne(copayerIds, payloadStr, sig, cb);
}; };
Network.prototype.connectTo = function(copayerId) { Network.prototype.connectTo = function(copayerId) {

View File

@ -91,7 +91,6 @@ angular.module('copay.controllerUtils')
console.log('### SUBSCRIBE TO', addrs[i]); console.log('### SUBSCRIBE TO', addrs[i]);
Socket.emit('subscribe', addrs[i]); Socket.emit('subscribe', addrs[i]);
} }
console.log('[controllerUtils.js.64]'); //TODO
addrs.forEach(function(addr) { addrs.forEach(function(addr) {
Socket.on(addr, function(txid) { Socket.on(addr, function(txid) {
console.log('Received!', txid); console.log('Received!', txid);