From 047bb9c000dce967be5ac64b84f4d6e1c7f68e70 Mon Sep 17 00:00:00 2001 From: sairajzero Date: Thu, 18 Apr 2019 22:07:34 +0530 Subject: [PATCH] Update v0.8 --- app.js => app/app.js | 344 +++- index.html => app/index.html | 1 - registerID.js => app/registerID.js | 1424 ++++++++++++++++- styles.css => app/styles.css | 0 app/websocket_chat | Bin 0 -> 172264 bytes app2.js | 734 --------- autogen.sh | 37 + setup.sh | 13 - util/websocket_chat.c | 15 +- .../websocket_chatExample}/index.html | 0 .../websocket_chatExample}/mongoose.c | 0 .../websocket_chatExample}/mongoose.h | 0 .../websocket_chatExample}/readme.md | 0 .../websocket_chatExample}/websocket_chat | Bin .../websocket_chatExample}/websocket_chat.c | 0 websocket_chat | Bin 172264 -> 0 bytes 16 files changed, 1722 insertions(+), 846 deletions(-) rename app.js => app/app.js (57%) rename index.html => app/index.html (97%) rename registerID.js => app/registerID.js (74%) rename styles.css => app/styles.css (100%) create mode 100755 app/websocket_chat delete mode 100644 app2.js create mode 100755 autogen.sh delete mode 100755 setup.sh rename {websocket_chatExample => util/websocket_chatExample}/index.html (100%) rename {websocket_chatExample => util/websocket_chatExample}/mongoose.c (100%) rename {websocket_chatExample => util/websocket_chatExample}/mongoose.h (100%) rename {websocket_chatExample => util/websocket_chatExample}/readme.md (100%) rename {websocket_chatExample => util/websocket_chatExample}/websocket_chat (100%) rename {websocket_chatExample => util/websocket_chatExample}/websocket_chat.c (100%) delete mode 100755 websocket_chat diff --git a/app.js b/app/app.js similarity index 57% rename from app.js rename to app/app.js index 77ae63e..c1071ea 100644 --- a/app.js +++ b/app/app.js @@ -9,10 +9,143 @@ if (!window.indexedDB) { var contacts = []; var receiverID,senderID; -var selfwebsocket; -var privKey = prompt("Enter Private Key : ") +var selfwebsocket,receiverWebSocket; +var privKey; + +var encrypt = { + + p: BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 16), + + exponent1: function () { + return encrypt.p.add(BigInteger.ONE).divide(BigInteger("4")) + }, + + calculateY: function (x) { + let p = this.p; + let exp = this.exponent1(); + // x is x value of public key in BigInteger format without 02 or 03 or 04 prefix + return x.modPow(BigInteger("3"), p).add(BigInteger("7")).mod(p).modPow(exp, p) + }, + + // Insert a compressed public key + getUncompressedPublicKey: function (compressedPublicKey) { + + const p = this.p; + + // Fetch x from compressedPublicKey + let pubKeyBytes = Crypto.util.hexToBytes(compressedPublicKey); + const prefix = pubKeyBytes.shift() // remove prefix + let prefix_modulus = prefix % 2; + pubKeyBytes.unshift(0) // add prefix 0 + let x = new BigInteger(pubKeyBytes) + let xDecimalValue = x.toString() + + // Fetch y + let y = this.calculateY(x); + let yDecimalValue = y.toString(); + + // verify y value + let resultBigInt = y.mod(BigInteger("2")); + + let check = resultBigInt.toString() % 2; + + if (prefix_modulus !== check) { + yDecimalValue = y.negate().mod(p).toString(); + } + + return { + x: xDecimalValue, + y: yDecimalValue + }; + }, + + getSenderPublicKeyString: function () { + privateKey = ellipticCurveEncryption.senderRandom(); + senderPublicKeyString = ellipticCurveEncryption.senderPublicString(privateKey); + return { + privateKey: privateKey, + senderPublicKeyString: senderPublicKeyString + } + }, + + deriveSharedKeySender: function (receiverCompressedPublicKey, senderPrivateKey) { + try { + let receiverPublicKeyString = this.getUncompressedPublicKey( + receiverCompressedPublicKey); + var senderDerivedKey = { + XValue: "", + YValue: "" + }; + senderDerivedKey = ellipticCurveEncryption.senderSharedKeyDerivation( + receiverPublicKeyString.x, + receiverPublicKeyString.y, senderPrivateKey); + return senderDerivedKey; + } catch (error) { + return new Error(error); + } + }, + + deriveReceiverSharedKey: function (senderPublicKeyString, receiverPrivateKey) { + return ellipticCurveEncryption.receiverSharedKeyDerivation( + senderPublicKeyString.XValuePublicString, senderPublicKeyString.YValuePublicString, + receiverPrivateKey); + }, + + getReceiverPublicKeyString: function (privateKey) { + return ellipticCurveEncryption.receiverPublicString(privateKey); + }, + + deriveSharedKeyReceiver: function (senderPublicKeyString, receiverPrivateKey) { + try { + return ellipticCurveEncryption.receiverSharedKeyDerivation(senderPublicKeyString.XValuePublicString, + senderPublicKeyString.YValuePublicString, receiverPrivateKey); + + } catch (error) { + return new Error(error); + } + }, + + encryptMessage: function (data, receiverCompressedPublicKey) { + var senderECKeyData = this.getSenderPublicKeyString(); + var senderDerivedKey = { + XValue: "", + YValue: "" + }; + var senderPublicKeyString = {}; + senderDerivedKey = this.deriveSharedKeySender( + receiverCompressedPublicKey, senderECKeyData.privateKey); + console.log("senderDerivedKey", senderDerivedKey); + let senderKey = senderDerivedKey.XValue + senderDerivedKey.YValue; + let secret = Crypto.AES.encrypt(data, senderKey); + return { + secret: secret, + senderPublicKeyString: senderECKeyData.senderPublicKeyString + }; + }, + + decryptMessage: function (secret, senderPublicKeyString) { + var receiverDerivedKey = { + XValue: "", + YValue: "" + }; + var receiverECKeyData = {}; + var myPrivateKey = privKey; + if (typeof myPrivateKey !== "string") throw new Error("No private key found."); + + let privateKey = this.wifToDecimal(myPrivateKey, true); + if (typeof privateKey.privateKeyDecimal !== "string") throw new Error( + "Failed to detremine your private key."); + receiverECKeyData.privateKey = privateKey.privateKeyDecimal; + + receiverDerivedKey = this.deriveReceiverSharedKey(senderPublicKeyString, + receiverECKeyData.privateKey); + console.log("receiverDerivedKey", receiverDerivedKey); + + let receiverKey = receiverDerivedKey.XValue + receiverDerivedKey.YValue; + let decryptMsg = Crypto.AES.decrypt(secret, receiverKey); + return decryptMsg; + }, - var wallets = { ecparams: EllipticCurve.getSECCurveByName("secp256k1"), getPubKeyHex: function(privateKeyHex){ var key = new Bitcoin.ECKey(privateKeyHex); @@ -24,6 +157,11 @@ var privKey = prompt("Enter Private Key : ") var pubkeyHex = key.getPubKeyHex(); return pubkeyHex; }, + getFLOIDfromPubkeyHex: function(pubkeyHex){ + var key = new Bitcoin.ECKey().setPub(pubkeyHex); + var floID = key.getBitcoinAddress(); + return floID; + }, sign: function (msg, privateKeyHex) { var key = new Bitcoin.ECKey(privateKeyHex); key.setCompressed(true); @@ -50,7 +188,21 @@ var privKey = prompt("Enter Private Key : ") var verify = Bitcoin.ECDSA.verifyRaw(messageHashBigInteger, signature.r, signature.s, publicKeyPoint); return verify; - } + }, + wifToDecimal: function(pk_wif, isPubKeyCompressed = false) { + let pk = Bitcoin.Base58.decode(pk_wif) + pk.shift() + pk.splice(-4, 4) + //If the private key corresponded to a compressed public key, also drop the last byte (it should be 0x01). + if (isPubKeyCompressed == true) pk.pop() + pk.unshift(0) + privateKeyDecimal = BigInteger(pk).toString() + privateKeyHex = Crypto.util.bytesToHex(pk) + return { + privateKeyDecimal: privateKeyDecimal, + privateKeyHex: privateKeyHex + } + } } function convertStringToInt(string){ @@ -61,15 +213,18 @@ function userDataStartUp(){ console.log("StartUp"); getDatafromAPI().then(function (result) { console.log(result); - getuserID().then(function(result){ - console.log(result); - getDatafromIDB().then(function(result){ - contacts = arrayToObject(result); - console.log(contacts); - displayContacts(); + getDatafromIDB().then(function(result){ + contacts = arrayToObject(result); + console.log(contacts); + getuserID().then(function(result){ + console.log(result); + senderID = result; + alert(`${senderID}\nWelcome ${contacts[senderID].name}`) readMsgfromIDB().then(function(result){ console.log(result); initselfWebSocket(); + displayContacts(); + const createClock = setInterval(checkStatusInterval, 30000); }).catch(function(error){ console.log(error.message); }); @@ -87,7 +242,7 @@ function userDataStartUp(){ function arrayToObject(array){ obj = {}; array.forEach(element => { - obj[element.floID] = {onionAddr : element.onionAddr, name : element.name}; + obj[element.floID] = {onionAddr : element.onionAddr, name : element.name, pubKey : element.pubKey}; }); return obj; } @@ -126,8 +281,9 @@ function userDataStartUp(){ }; idb.onupgradeneeded = function(event) { var objectStore = event.target.result.createObjectStore("contacts",{ keyPath: 'floID' }); - objectStore.createIndex('onionAddr', 'onionAddr', { unique: true }); + objectStore.createIndex('onionAddr', 'onionAddr', { unique: false }); objectStore.createIndex('name', 'name', { unique: false }); + objectStore.createIndex('pubKey', 'pubKey', { unique: false }); var objectStore2 = event.target.result.createObjectStore("lastTx"); }; idb.onsuccess = function(event) { @@ -162,7 +318,9 @@ function userDataStartUp(){ //return; var data = JSON.parse(tx.floData).FLO_chat; if(data !== undefined){ - data = {floID : tx.vin[0].addr, onionAddr : data.onionAddr, name : data.name}; + if(encrypt.getFLOIDfromPubkeyHex(data.pubKey)!=tx.vin[0].addr) + throw("PublicKey doesnot match with floID") + data = {floID : tx.vin[0].addr, onionAddr : data.onionAddr, name : data.name, pubKey:data.pubKey}; storedata(data).then(function (response) { }).catch(function (error) { console.log(error.message); @@ -190,57 +348,30 @@ function userDataStartUp(){ function getuserID(){ return new Promise( function(resolve,reject){ - var idb = indexedDB.open("FLO_Chat"); - idb.onerror = function(event) { - console.log("Error in opening IndexedDB!"); - }; - idb.onsuccess = function(event) { - var db = event.target.result; - var obs = db.transaction('lastTx', "readwrite").objectStore('lastTx'); - new Promise(function(res,rej){ - var getReq = obs.get('userID'); - getReq.onsuccess = function(event){ - var userID = event.target.result; - if(userID === undefined){ - userID = prompt("Enter A Valid Flo ID!"); - while(!validateAddr(userID)){ - userID = prompt("Retry!Enter A Valid Flo ID!"); - } - - var obs2 = db.transaction('contacts', "readwrite").objectStore('contacts'); - var getReq2 = obs2.get(userID); - getReq2.onsuccess = function(event){ - var data = event.target.result; - console.log(window.location.host); - //console.log(data.onionAddr); - if(data === undefined) - var reg = confirm('FLO ID is not registers to FLO chat!\nRegister FLO ID?'); - else if(data.onionAddr == window.location.host) - res(userID); - else - var reg = confirm('FLO ID is registered to another onion!\nChange FLO ID to this onion?'); - if(reg) - if(registerID(userID,window.location.host)) - res(userID); - rej('Unable to register userID!\nTry again later!'); - } - } - else - res(userID); - } - }).then(function(result){ - console.log(result); - var obs = db.transaction('lastTx', "readwrite").objectStore('lastTx'); - senderID = result; - obs.put(result,'userID'); - db.close(); - resolve('userID Initiated') - }).catch(function(error){ - db.close(); - console.log(error.message); - reject('userID Initiation Failed'); - }); - }; + privKey = prompt("Enter FLO Private Key : ") + var key = new Bitcoin.ECKey(privKey); + while(key.priv == null){ + privKey = prompt("Invalid FLO Private Key! Retry : ") + key = Bitcoin.ECKey(privKey); + } + key.setCompressed(true); + var userID = key.getBitcoinAddress(); + if (contacts[userID] === undefined) + var reg = confirm(`${userID} is not registers to FLO chat!\nRegister FLO ID to this onion?`); + else if (contacts[userID].onionAddr == window.location.host) + resolve(userID) + else + var reg = confirm(`${userID} is registered to another onion!\nChange to this onion?`); + + if(reg){ + var name = prompt("Enter your name :"); + var pubKey = key.getPubKeyHex(); + if(registerID(userID,window.location.host,privKey,pubKey,name)){ + contacts[userID] = {onionAddr : window.location.host, name : name, pubKey : pubKey}; + resolve(userID); + } + } + reject(`Unable to bind ${userID} to this onionAddress!\nTry again later!`); } ); } @@ -333,7 +464,6 @@ function readMsgfromIDB(){ }; db.close(); }; - } ); } @@ -395,7 +525,8 @@ function initselfWebSocket(){ console.log(evt.data); try{ var data = JSON.parse(evt.data); - if(!wallets.verify(data.msg,data.sign,data.pubKey)) + var msg = encrypt.decryptMessage(data.secret,data.pubVal) + if(!encrypt.verify(msg,data.sign,contacts[data.from].pubKey)) return var time = Date.now(); var disp = document.getElementById(data.from); @@ -404,7 +535,7 @@ function initselfWebSocket(){ msgdiv.innerHTML = `
- ${data.msg} + ${msg} ${getTime(time)} @@ -412,7 +543,7 @@ function initselfWebSocket(){
`; disp.appendChild(msgdiv); - storeMsg({time:time,floID:data.from,text:data.msg,type:"R"}); + storeMsg({time:time,floID:data.from,text:msg,type:"R"}); }catch(err){ if(evt.data[0]=='$') alert(evt.data); @@ -425,13 +556,63 @@ function initselfWebSocket(){ }; } +function checkStatusInterval(){ + try{ + if(receiverWebSocket !== undefined && receiverWebSocket.readyState !== WebSocket.OPEN){ + receiverWebSocket.close() + receiverWebSocket = new WebSocket("ws://"+contacts[receiverID].onionAddr+"/ws"); + receiverWebSocket.onopen = function(evt){ receiverWebSocket.send('#') }; + receiverWebSocket.onerror = function(ev) { receiverStatus(false); }; + receiverWebSocket.onclose = function(ev) { receiverStatus(false); }; + receiverWebSocket.onmessage = function(evt){ + console.log(evt.data); + if(evt.data[0]=='#'){ + if (evt.data[1]=='+') + receiverStatus(true); + else if(evt.data[1]=='-') + receiverStatus(false); + } + } + } + }catch(e){ + console.log(e); + } +} + function changeReceiver(param){ if(receiverID !== undefined) document.getElementById(receiverID).style.display = 'none'; console.log(param.getAttribute("name")); receiverID = param.getAttribute("name"); document.getElementById('recipient-floID').innerHTML = receiverID; + receiverStatus(false) document.getElementById(receiverID).style.display = 'block'; + try{ + if(receiverWebSocket !== undefined && receiverWebSocket.readyState === WebSocket.OPEN) + receiverWebSocket.close() + receiverWebSocket = new WebSocket("ws://"+contacts[receiverID].onionAddr+"/ws"); + receiverWebSocket.onopen = function(ev){ receiverWebSocket.send('#'); }; + receiverWebSocket.onerror = function(ev) { receiverStatus(false); }; + receiverWebSocket.onclose = function(ev) { receiverStatus(false); }; + receiverWebSocket.onmessage = function(evt){ + console.log(evt.data); + if(evt.data[0]=='#'){ + if (evt.data[1]=='+') + receiverStatus(true); + else if(evt.data[1]=='-') + receiverStatus(false); + } + } + }catch(e){ + console.log(e); + } +} + +function receiverStatus(status){ + if(status) + document.getElementById('recipient-floID').style.backgroundColor = "#00b300"; + else + document.getElementById('recipient-floID').style.backgroundColor = "#ff4d4d"; } function getTime(time){ @@ -452,15 +633,19 @@ function sendMsg(){ alert("Select a contact and send message"); return; } - var msg = document.getElementById('sendMsgInput').value; + if(receiverWebSocket.readyState !== WebSocket.OPEN){ + alert("Recipient is offline! Try again later") + return + } + var inp = document.getElementById('sendMsgInput') + var msg = inp.value; + inp.value = ""; console.log(msg); - var ws = new WebSocket("ws://"+contacts[receiverID].onionAddr+"/ws"); - ws.onopen = function(evt){ - var sign = wallets.sign(msg,privKey) - var pubkeyHex = wallets.getPubKeyHex(privKey) - var data = JSON.stringify({from:senderID,msg:msg,sign:sign,pubKey:pubkeyHex}); - ws.send(data); - console.log(`sentMsg : ${data}`); + var sign = encrypt.sign(msg,privKey) + var msgEncrypt = encrypt.encryptMessage(msg,contacts[receiverID].pubKey) + var data = JSON.stringify({from:senderID,secret:msgEncrypt.secret,sign:sign,pubVal:msgEncrypt.senderPublicKeyString}); + receiverWebSocket.send(data); + console.log(`sentMsg : ${data}`); time = Date.now(); var disp = document.getElementById(receiverID); var msgdiv = document.createElement('div'); @@ -476,11 +661,4 @@ function sendMsg(){ `; disp.appendChild(msgdiv); storeMsg({time:time,floID:receiverID,text:msg,type:"S"}); - //send_check = 1; - //recursion_called = 0; - //addSentChat(msg.substring(2+msgArray[0].length+msgArray[1].length),timer,msgArray[0]); - //addTick(message); - } - ws.onerror = function(ev) { console.log(ev); }; - ws.onclose = function(ev) { console.log(ev); }; } \ No newline at end of file diff --git a/index.html b/app/index.html similarity index 97% rename from index.html rename to app/index.html index 316e655..6c25824 100644 --- a/index.html +++ b/app/index.html @@ -59,7 +59,6 @@
Select Contact - Unknown
diff --git a/registerID.js b/app/registerID.js similarity index 74% rename from registerID.js rename to app/registerID.js index 891534e..ef1c363 100755 --- a/registerID.js +++ b/app/registerID.js @@ -2572,7 +2572,1271 @@ if (typeof Crypto == "undefined" || !Crypto.util) { return null; }; + /*! + * Crypto-JS 2.5.4 BlockModes.js + * contribution from Simon Greatrix + */ + (function (C) { + + // Create pad namespace + var C_pad = C.pad = {}; + + // Calculate the number of padding bytes required. + function _requiredPadding(cipher, message) { + var blockSizeInBytes = cipher._blocksize * 4; + var reqd = blockSizeInBytes - message.length % blockSizeInBytes; + return reqd; + } + + // Remove padding when the final byte gives the number of padding bytes. + var _unpadLength = function (cipher, message, alg, padding) { + var pad = message.pop(); + if (pad == 0) { + throw new Error("Invalid zero-length padding specified for " + alg + + ". Wrong cipher specification or key used?"); + } + var maxPad = cipher._blocksize * 4; + if (pad > maxPad) { + throw new Error("Invalid padding length of " + pad + + " specified for " + alg + + ". Wrong cipher specification or key used?"); + } + for (var i = 1; i < pad; i++) { + var b = message.pop(); + if (padding != undefined && padding != b) { + throw new Error("Invalid padding byte of 0x" + b.toString(16) + + " specified for " + alg + + ". Wrong cipher specification or key used?"); + } + } + }; + + // No-operation padding, used for stream ciphers + C_pad.NoPadding = { + pad: function (cipher, message) {}, + unpad: function (cipher, message) {} + }; + + // Zero Padding. + // + // If the message is not an exact number of blocks, the final block is + // completed with 0x00 bytes. There is no unpadding. + C_pad.ZeroPadding = { + pad: function (cipher, message) { + var blockSizeInBytes = cipher._blocksize * 4; + var reqd = message.length % blockSizeInBytes; + if (reqd != 0) { + for (reqd = blockSizeInBytes - reqd; reqd > 0; reqd--) { + message.push(0x00); + } + } + }, + + unpad: function (cipher, message) { + while (message[message.length - 1] == 0) { + message.pop(); + } + } + }; + + // ISO/IEC 7816-4 padding. + // + // Pads the plain text with an 0x80 byte followed by as many 0x00 + // bytes are required to complete the block. + C_pad.iso7816 = { + pad: function (cipher, message) { + var reqd = _requiredPadding(cipher, message); + message.push(0x80); + for (; reqd > 1; reqd--) { + message.push(0x00); + } + }, + + unpad: function (cipher, message) { + var padLength; + for (padLength = cipher._blocksize * 4; padLength > 0; padLength--) { + var b = message.pop(); + if (b == 0x80) return; + if (b != 0x00) { + throw new Error("ISO-7816 padding byte must be 0, not 0x" + b.toString(16) + + ". Wrong cipher specification or key used?"); + } + } + throw new Error( + "ISO-7816 padded beyond cipher block size. Wrong cipher specification or key used?" + ); + } + }; + + // ANSI X.923 padding + // + // The final block is padded with zeros except for the last byte of the + // last block which contains the number of padding bytes. + C_pad.ansix923 = { + pad: function (cipher, message) { + var reqd = _requiredPadding(cipher, message); + for (var i = 1; i < reqd; i++) { + message.push(0x00); + } + message.push(reqd); + }, + + unpad: function (cipher, message) { + _unpadLength(cipher, message, "ANSI X.923", 0); + } + }; + + // ISO 10126 + // + // The final block is padded with random bytes except for the last + // byte of the last block which contains the number of padding bytes. + C_pad.iso10126 = { + pad: function (cipher, message) { + var reqd = _requiredPadding(cipher, message); + for (var i = 1; i < reqd; i++) { + message.push(Math.floor(Math.random() * 256)); + } + message.push(reqd); + }, + + unpad: function (cipher, message) { + _unpadLength(cipher, message, "ISO 10126", undefined); + } + }; + + // PKCS7 padding + // + // PKCS7 is described in RFC 5652. Padding is in whole bytes. The + // value of each added byte is the number of bytes that are added, + // i.e. N bytes, each of value N are added. + C_pad.pkcs7 = { + pad: function (cipher, message) { + var reqd = _requiredPadding(cipher, message); + for (var i = 0; i < reqd; i++) { + message.push(reqd); + } + }, + + unpad: function (cipher, message) { + _unpadLength(cipher, message, "PKCS 7", message[message.length - 1]); + } + }; + + // Create mode namespace + var C_mode = C.mode = {}; + + /** + * Mode base "class". + */ + var Mode = C_mode.Mode = function (padding) { + if (padding) { + this._padding = padding; + } + }; + + Mode.prototype = { + encrypt: function (cipher, m, iv) { + this._padding.pad(cipher, m); + this._doEncrypt(cipher, m, iv); + }, + + decrypt: function (cipher, m, iv) { + this._doDecrypt(cipher, m, iv); + this._padding.unpad(cipher, m); + }, + + // Default padding + _padding: C_pad.iso7816 + }; + + + /** + * Electronic Code Book mode. + * + * ECB applies the cipher directly against each block of the input. + * + * ECB does not require an initialization vector. + */ + var ECB = C_mode.ECB = function () { + // Call parent constructor + Mode.apply(this, arguments); + }; + + // Inherit from Mode + var ECB_prototype = ECB.prototype = new Mode; + + // Concrete steps for Mode template + ECB_prototype._doEncrypt = function (cipher, m, iv) { + var blockSizeInBytes = cipher._blocksize * 4; + // Encrypt each block + for (var offset = 0; offset < m.length; offset += blockSizeInBytes) { + cipher._encryptblock(m, offset); + } + }; + ECB_prototype._doDecrypt = function (cipher, c, iv) { + var blockSizeInBytes = cipher._blocksize * 4; + // Decrypt each block + for (var offset = 0; offset < c.length; offset += blockSizeInBytes) { + cipher._decryptblock(c, offset); + } + }; + + // ECB never uses an IV + ECB_prototype.fixOptions = function (options) { + options.iv = []; + }; + + + /** + * Cipher block chaining + * + * The first block is XORed with the IV. Subsequent blocks are XOR with the + * previous cipher output. + */ + var CBC = C_mode.CBC = function () { + // Call parent constructor + Mode.apply(this, arguments); + }; + + // Inherit from Mode + var CBC_prototype = CBC.prototype = new Mode; + + // Concrete steps for Mode template + CBC_prototype._doEncrypt = function (cipher, m, iv) { + var blockSizeInBytes = cipher._blocksize * 4; + + // Encrypt each block + for (var offset = 0; offset < m.length; offset += blockSizeInBytes) { + if (offset == 0) { + // XOR first block using IV + for (var i = 0; i < blockSizeInBytes; i++) + m[i] ^= iv[i]; + } else { + // XOR this block using previous crypted block + for (var i = 0; i < blockSizeInBytes; i++) + m[offset + i] ^= m[offset + i - blockSizeInBytes]; + } + // Encrypt block + cipher._encryptblock(m, offset); + } + }; + CBC_prototype._doDecrypt = function (cipher, c, iv) { + var blockSizeInBytes = cipher._blocksize * 4; + + // At the start, the previously crypted block is the IV + var prevCryptedBlock = iv; + + // Decrypt each block + for (var offset = 0; offset < c.length; offset += blockSizeInBytes) { + // Save this crypted block + var thisCryptedBlock = c.slice(offset, offset + blockSizeInBytes); + // Decrypt block + cipher._decryptblock(c, offset); + // XOR decrypted block using previous crypted block + for (var i = 0; i < blockSizeInBytes; i++) { + c[offset + i] ^= prevCryptedBlock[i]; + } + prevCryptedBlock = thisCryptedBlock; + } + }; + + + /** + * Cipher feed back + * + * The cipher output is XORed with the plain text to produce the cipher output, + * which is then fed back into the cipher to produce a bit pattern to XOR the + * next block with. + * + * This is a stream cipher mode and does not require padding. + */ + var CFB = C_mode.CFB = function () { + // Call parent constructor + Mode.apply(this, arguments); + }; + + // Inherit from Mode + var CFB_prototype = CFB.prototype = new Mode; + + // Override padding + CFB_prototype._padding = C_pad.NoPadding; + + // Concrete steps for Mode template + CFB_prototype._doEncrypt = function (cipher, m, iv) { + var blockSizeInBytes = cipher._blocksize * 4, + keystream = iv.slice(0); + + // Encrypt each byte + for (var i = 0; i < m.length; i++) { + + var j = i % blockSizeInBytes; + if (j == 0) cipher._encryptblock(keystream, 0); + + m[i] ^= keystream[j]; + keystream[j] = m[i]; + } + }; + CFB_prototype._doDecrypt = function (cipher, c, iv) { + var blockSizeInBytes = cipher._blocksize * 4, + keystream = iv.slice(0); + + // Encrypt each byte + for (var i = 0; i < c.length; i++) { + + var j = i % blockSizeInBytes; + if (j == 0) cipher._encryptblock(keystream, 0); + + var b = c[i]; + c[i] ^= keystream[j]; + keystream[j] = b; + } + }; + + + /** + * Output feed back + * + * The cipher repeatedly encrypts its own output. The output is XORed with the + * plain text to produce the cipher text. + * + * This is a stream cipher mode and does not require padding. + */ + var OFB = C_mode.OFB = function () { + // Call parent constructor + Mode.apply(this, arguments); + }; + + // Inherit from Mode + var OFB_prototype = OFB.prototype = new Mode; + + // Override padding + OFB_prototype._padding = C_pad.NoPadding; + + // Concrete steps for Mode template + OFB_prototype._doEncrypt = function (cipher, m, iv) { + + var blockSizeInBytes = cipher._blocksize * 4, + keystream = iv.slice(0); + + // Encrypt each byte + for (var i = 0; i < m.length; i++) { + + // Generate keystream + if (i % blockSizeInBytes == 0) + cipher._encryptblock(keystream, 0); + + // Encrypt byte + m[i] ^= keystream[i % blockSizeInBytes]; + + } + }; + OFB_prototype._doDecrypt = OFB_prototype._doEncrypt; + + /** + * Counter + * @author Gergely Risko + * + * After every block the last 4 bytes of the IV is increased by one + * with carry and that IV is used for the next block. + * + * This is a stream cipher mode and does not require padding. + */ + var CTR = C_mode.CTR = function () { + // Call parent constructor + Mode.apply(this, arguments); + }; + + // Inherit from Mode + var CTR_prototype = CTR.prototype = new Mode; + + // Override padding + CTR_prototype._padding = C_pad.NoPadding; + + CTR_prototype._doEncrypt = function (cipher, m, iv) { + var blockSizeInBytes = cipher._blocksize * 4; + var counter = iv.slice(0); + + for (var i = 0; i < m.length;) { + // do not lose iv + var keystream = counter.slice(0); + + // Generate keystream for next block + cipher._encryptblock(keystream, 0); + + // XOR keystream with block + for (var j = 0; i < m.length && j < blockSizeInBytes; j++, i++) { + m[i] ^= keystream[j]; + } + + // Increase counter + if (++(counter[blockSizeInBytes - 1]) == 256) { + counter[blockSizeInBytes - 1] = 0; + if (++(counter[blockSizeInBytes - 2]) == 256) { + counter[blockSizeInBytes - 2] = 0; + if (++(counter[blockSizeInBytes - 3]) == 256) { + counter[blockSizeInBytes - 3] = 0; + ++(counter[blockSizeInBytes - 4]); + } + } + } + } + }; + CTR_prototype._doDecrypt = CTR_prototype._doEncrypt; + + })(Crypto); + + /*! + * Crypto-JS v2.5.4 PBKDF2.js + * http://code.google.com/p/crypto-js/ + * Copyright (c) 2009-2013, Jeff Mott. All rights reserved. + * http://code.google.com/p/crypto-js/wiki/License + */ + (function () { + + // Shortcuts + var C = Crypto, + util = C.util, + charenc = C.charenc, + UTF8 = charenc.UTF8, + Binary = charenc.Binary; + + C.PBKDF2 = function (password, salt, keylen, options) { + + // Convert to byte arrays + if (password.constructor == String) password = UTF8.stringToBytes(password); + if (salt.constructor == String) salt = UTF8.stringToBytes(salt); + /* else, assume byte arrays already */ + + // Defaults + var hasher = options && options.hasher || C.SHA1, + iterations = options && options.iterations || 1; + + // Pseudo-random function + function PRF(password, salt) { + return C.HMAC(hasher, salt, password, { + asBytes: true + }); + } + + // Generate key + var derivedKeyBytes = [], + blockindex = 1; + while (derivedKeyBytes.length < keylen) { + var block = PRF(password, salt.concat(util.wordsToBytes([blockindex]))); + for (var u = block, i = 1; i < iterations; i++) { + u = PRF(password, u); + for (var j = 0; j < block.length; j++) block[j] ^= u[j]; + } + derivedKeyBytes = derivedKeyBytes.concat(block); + blockindex++; + } + + // Truncate excess bytes + derivedKeyBytes.length = keylen; + + return options && options.asBytes ? derivedKeyBytes : + options && options.asString ? Binary.bytesToString(derivedKeyBytes) : + util.bytesToHex(derivedKeyBytes); + + }; + + })(); + + /* + * Copyright (c) 2010-2011 Intalio Pte, All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + // https://github.com/cheongwy/node-scrypt-js + (function () { + + var MAX_VALUE = 2147483647; + var workerUrl = null; + + //function scrypt(byte[] passwd, byte[] salt, int N, int r, int p, int dkLen) + /* + * N = Cpu cost + * r = Memory cost + * p = parallelization cost + * + */ + window.Crypto_scrypt = function (passwd, salt, N, r, p, dkLen, callback) { + if (N == 0 || (N & (N - 1)) != 0) throw Error("N must be > 0 and a power of 2"); + + if (N > MAX_VALUE / 128 / r) throw Error("Parameter N is too large"); + if (r > MAX_VALUE / 128 / p) throw Error("Parameter r is too large"); + + var PBKDF2_opts = { + iterations: 1, + hasher: Crypto.SHA256, + asBytes: true + }; + + var B = Crypto.PBKDF2(passwd, salt, p * 128 * r, PBKDF2_opts); + + try { + var i = 0; + var worksDone = 0; + var makeWorker = function () { + if (!workerUrl) { + var code = '(' + scryptCore.toString() + ')()'; + var blob; + try { + blob = new Blob([code], { + type: "text/javascript" + }); + } catch (e) { + window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || + window.MozBlobBuilder || + window.MSBlobBuilder; + blob = new BlobBuilder(); + blob.append(code); + blob = blob.getBlob("text/javascript"); + } + workerUrl = URL.createObjectURL(blob); + } + var worker = new Worker(workerUrl); + worker.onmessage = function (event) { + var Bi = event.data[0], + Bslice = event.data[1]; + worksDone++; + + if (i < p) { + worker.postMessage([N, r, p, B, i++]); + } + + var length = Bslice.length, + destPos = Bi * 128 * r, + srcPos = 0; + while (length--) { + B[destPos++] = Bslice[srcPos++]; + } + + if (worksDone == p) { + callback(Crypto.PBKDF2(passwd, B, dkLen, PBKDF2_opts)); + } + }; + return worker; + }; + var workers = [makeWorker(), makeWorker()]; + workers[0].postMessage([N, r, p, B, i++]); + if (p > 1) { + workers[1].postMessage([N, r, p, B, i++]); + } + } catch (e) { + window.setTimeout(function () { + scryptCore(); + callback(Crypto.PBKDF2(passwd, B, dkLen, PBKDF2_opts)); + }, 0); + } + + // using this function to enclose everything needed to create a worker (but also invokable directly for synchronous use) + function scryptCore() { + var XY = [], + V = []; + + if (typeof B === 'undefined') { + onmessage = function (event) { + var data = event.data; + var N = data[0], + r = data[1], + p = data[2], + B = data[3], + i = data[4]; + + var Bslice = []; + arraycopy32(B, i * 128 * r, Bslice, 0, 128 * r); + smix(Bslice, 0, r, N, V, XY); + + postMessage([i, Bslice]); + }; + } else { + for (var i = 0; i < p; i++) { + smix(B, i * 128 * r, r, N, V, XY); + } + } + + function smix(B, Bi, r, N, V, XY) { + var Xi = 0; + var Yi = 128 * r; + var i; + + arraycopy32(B, Bi, XY, Xi, Yi); + + for (i = 0; i < N; i++) { + arraycopy32(XY, Xi, V, i * Yi, Yi); + blockmix_salsa8(XY, Xi, Yi, r); + } + + for (i = 0; i < N; i++) { + var j = integerify(XY, Xi, r) & (N - 1); + blockxor(V, j * Yi, XY, Xi, Yi); + blockmix_salsa8(XY, Xi, Yi, r); + } + + arraycopy32(XY, Xi, B, Bi, Yi); + } + + function blockmix_salsa8(BY, Bi, Yi, r) { + var X = []; + var i; + + arraycopy32(BY, Bi + (2 * r - 1) * 64, X, 0, 64); + + for (i = 0; i < 2 * r; i++) { + blockxor(BY, i * 64, X, 0, 64); + salsa20_8(X); + arraycopy32(X, 0, BY, Yi + (i * 64), 64); + } + + for (i = 0; i < r; i++) { + arraycopy32(BY, Yi + (i * 2) * 64, BY, Bi + (i * 64), 64); + } + + for (i = 0; i < r; i++) { + arraycopy32(BY, Yi + (i * 2 + 1) * 64, BY, Bi + (i + r) * 64, 64); + } + } + + function R(a, b) { + return (a << b) | (a >>> (32 - b)); + } + + function salsa20_8(B) { + var B32 = new Array(32); + var x = new Array(32); + var i; + + for (i = 0; i < 16; i++) { + B32[i] = (B[i * 4 + 0] & 0xff) << 0; + B32[i] |= (B[i * 4 + 1] & 0xff) << 8; + B32[i] |= (B[i * 4 + 2] & 0xff) << 16; + B32[i] |= (B[i * 4 + 3] & 0xff) << 24; + } + + arraycopy(B32, 0, x, 0, 16); + + for (i = 8; i > 0; i -= 2) { + x[4] ^= R(x[0] + x[12], 7); + x[8] ^= R(x[4] + x[0], 9); + x[12] ^= R(x[8] + x[4], 13); + x[0] ^= R(x[12] + x[8], 18); + x[9] ^= R(x[5] + x[1], 7); + x[13] ^= R(x[9] + x[5], 9); + x[1] ^= R(x[13] + x[9], 13); + x[5] ^= R(x[1] + x[13], 18); + x[14] ^= R(x[10] + x[6], 7); + x[2] ^= R(x[14] + x[10], 9); + x[6] ^= R(x[2] + x[14], 13); + x[10] ^= R(x[6] + x[2], 18); + x[3] ^= R(x[15] + x[11], 7); + x[7] ^= R(x[3] + x[15], 9); + x[11] ^= R(x[7] + x[3], 13); + x[15] ^= R(x[11] + x[7], 18); + x[1] ^= R(x[0] + x[3], 7); + x[2] ^= R(x[1] + x[0], 9); + x[3] ^= R(x[2] + x[1], 13); + x[0] ^= R(x[3] + x[2], 18); + x[6] ^= R(x[5] + x[4], 7); + x[7] ^= R(x[6] + x[5], 9); + x[4] ^= R(x[7] + x[6], 13); + x[5] ^= R(x[4] + x[7], 18); + x[11] ^= R(x[10] + x[9], 7); + x[8] ^= R(x[11] + x[10], 9); + x[9] ^= R(x[8] + x[11], 13); + x[10] ^= R(x[9] + x[8], 18); + x[12] ^= R(x[15] + x[14], 7); + x[13] ^= R(x[12] + x[15], 9); + x[14] ^= R(x[13] + x[12], 13); + x[15] ^= R(x[14] + x[13], 18); + } + + for (i = 0; i < 16; ++i) B32[i] = x[i] + B32[i]; + + for (i = 0; i < 16; i++) { + var bi = i * 4; + B[bi + 0] = (B32[i] >> 0 & 0xff); + B[bi + 1] = (B32[i] >> 8 & 0xff); + B[bi + 2] = (B32[i] >> 16 & 0xff); + B[bi + 3] = (B32[i] >> 24 & 0xff); + } + } + + function blockxor(S, Si, D, Di, len) { + var i = len >> 6; + while (i--) { + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + D[Di++] ^= S[Si++]; + } + } + + function integerify(B, bi, r) { + var n; + + bi += (2 * r - 1) * 64; + + n = (B[bi + 0] & 0xff) << 0; + n |= (B[bi + 1] & 0xff) << 8; + n |= (B[bi + 2] & 0xff) << 16; + n |= (B[bi + 3] & 0xff) << 24; + + return n; + } + + function arraycopy(src, srcPos, dest, destPos, length) { + while (length--) { + dest[destPos++] = src[srcPos++]; + } + } + + function arraycopy32(src, srcPos, dest, destPos, length) { + var i = length >> 5; + while (i--) { + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + } + } + } // scryptCore + }; // window.Crypto_scrypt + })(); + + /*! + * Crypto-JS v2.5.4 AES.js + * http://code.google.com/p/crypto-js/ + * Copyright (c) 2009-2013, Jeff Mott. All rights reserved. + * http://code.google.com/p/crypto-js/wiki/License + */ + (function () { + + // Shortcuts + var C = Crypto, + util = C.util, + charenc = C.charenc, + UTF8 = charenc.UTF8; + + // Precomputed SBOX + var SBOX = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, + 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, + 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, + 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, + 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, + 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, + 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, + 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, + 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, + 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, + 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, + 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, + 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, + 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, + 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, + 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, + 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 + ]; + + // Compute inverse SBOX lookup table + for (var INVSBOX = [], i = 0; i < 256; i++) INVSBOX[SBOX[i]] = i; + + // Compute multiplication in GF(2^8) lookup tables + var MULT2 = [], + MULT3 = [], + MULT9 = [], + MULTB = [], + MULTD = [], + MULTE = []; + + function xtime(a, b) { + for (var result = 0, i = 0; i < 8; i++) { + if (b & 1) result ^= a; + var hiBitSet = a & 0x80; + a = (a << 1) & 0xFF; + if (hiBitSet) a ^= 0x1b; + b >>>= 1; + } + return result; + } + + for (var i = 0; i < 256; i++) { + MULT2[i] = xtime(i, 2); + MULT3[i] = xtime(i, 3); + MULT9[i] = xtime(i, 9); + MULTB[i] = xtime(i, 0xB); + MULTD[i] = xtime(i, 0xD); + MULTE[i] = xtime(i, 0xE); + } + + // Precomputed RCon lookup + var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; + + // Inner state + var state = [ + [], + [], + [], + [] + ], + keylength, + nrounds, + keyschedule; + + var AES = C.AES = { + + /** + * Public API + */ + + encrypt: function (message, password, options) { + + options = options || {}; + + // Determine mode + var mode = options.mode || new C.mode.OFB; + + // Allow mode to override options + if (mode.fixOptions) mode.fixOptions(options); + + var + + // Convert to bytes if message is a string + m = ( + message.constructor == String ? + UTF8.stringToBytes(message) : + message + ), + + // Generate random IV + iv = options.iv || util.randomBytes(AES._blocksize * 4), + + // Generate key + k = ( + password.constructor == String ? + // Derive key from pass-phrase + C.PBKDF2(password, iv, 32, { + asBytes: true + }) : + // else, assume byte array representing cryptographic key + password + ); + + // Encrypt + AES._init(k); + mode.encrypt(AES, m, iv); + + // Return ciphertext + m = options.iv ? m : iv.concat(m); + return (options && options.asBytes) ? m : util.bytesToBase64(m); + + }, + + decrypt: function (ciphertext, password, options) { + + options = options || {}; + + // Determine mode + var mode = options.mode || new C.mode.OFB; + + // Allow mode to override options + if (mode.fixOptions) mode.fixOptions(options); + + var + + // Convert to bytes if ciphertext is a string + c = ( + ciphertext.constructor == String ? + util.base64ToBytes(ciphertext) : + ciphertext + ), + + // Separate IV and message + iv = options.iv || c.splice(0, AES._blocksize * 4), + + // Generate key + k = ( + password.constructor == String ? + // Derive key from pass-phrase + C.PBKDF2(password, iv, 32, { + asBytes: true + }) : + // else, assume byte array representing cryptographic key + password + ); + + // Decrypt + AES._init(k); + mode.decrypt(AES, c, iv); + + // Return plaintext + return (options && options.asBytes) ? c : UTF8.bytesToString(c); + + }, + + + /** + * Package private methods and properties + */ + + _blocksize: 4, + + _encryptblock: function (m, offset) { + + // Set input + for (var row = 0; row < AES._blocksize; row++) { + for (var col = 0; col < 4; col++) + state[row][col] = m[offset + col * 4 + row]; + } + + // Add round key + for (var row = 0; row < 4; row++) { + for (var col = 0; col < 4; col++) + state[row][col] ^= keyschedule[col][row]; + } + + for (var round = 1; round < nrounds; round++) { + + // Sub bytes + for (var row = 0; row < 4; row++) { + for (var col = 0; col < 4; col++) + state[row][col] = SBOX[state[row][col]]; + } + + // Shift rows + state[1].push(state[1].shift()); + state[2].push(state[2].shift()); + state[2].push(state[2].shift()); + state[3].unshift(state[3].pop()); + + // Mix columns + for (var col = 0; col < 4; col++) { + + var s0 = state[0][col], + s1 = state[1][col], + s2 = state[2][col], + s3 = state[3][col]; + + state[0][col] = MULT2[s0] ^ MULT3[s1] ^ s2 ^ s3; + state[1][col] = s0 ^ MULT2[s1] ^ MULT3[s2] ^ s3; + state[2][col] = s0 ^ s1 ^ MULT2[s2] ^ MULT3[s3]; + state[3][col] = MULT3[s0] ^ s1 ^ s2 ^ MULT2[s3]; + + } + + // Add round key + for (var row = 0; row < 4; row++) { + for (var col = 0; col < 4; col++) + state[row][col] ^= keyschedule[round * 4 + col][row]; + } + + } + + // Sub bytes + for (var row = 0; row < 4; row++) { + for (var col = 0; col < 4; col++) + state[row][col] = SBOX[state[row][col]]; + } + + // Shift rows + state[1].push(state[1].shift()); + state[2].push(state[2].shift()); + state[2].push(state[2].shift()); + state[3].unshift(state[3].pop()); + + // Add round key + for (var row = 0; row < 4; row++) { + for (var col = 0; col < 4; col++) + state[row][col] ^= keyschedule[nrounds * 4 + col][row]; + } + + // Set output + for (var row = 0; row < AES._blocksize; row++) { + for (var col = 0; col < 4; col++) + m[offset + col * 4 + row] = state[row][col]; + } + + }, + + _decryptblock: function (c, offset) { + + // Set input + for (var row = 0; row < AES._blocksize; row++) { + for (var col = 0; col < 4; col++) + state[row][col] = c[offset + col * 4 + row]; + } + + // Add round key + for (var row = 0; row < 4; row++) { + for (var col = 0; col < 4; col++) + state[row][col] ^= keyschedule[nrounds * 4 + col][row]; + } + + for (var round = 1; round < nrounds; round++) { + + // Inv shift rows + state[1].unshift(state[1].pop()); + state[2].push(state[2].shift()); + state[2].push(state[2].shift()); + state[3].push(state[3].shift()); + + // Inv sub bytes + for (var row = 0; row < 4; row++) { + for (var col = 0; col < 4; col++) + state[row][col] = INVSBOX[state[row][col]]; + } + + // Add round key + for (var row = 0; row < 4; row++) { + for (var col = 0; col < 4; col++) + state[row][col] ^= keyschedule[(nrounds - round) * 4 + col][row]; + } + + // Inv mix columns + for (var col = 0; col < 4; col++) { + + var s0 = state[0][col], + s1 = state[1][col], + s2 = state[2][col], + s3 = state[3][col]; + + state[0][col] = MULTE[s0] ^ MULTB[s1] ^ MULTD[s2] ^ MULT9[s3]; + state[1][col] = MULT9[s0] ^ MULTE[s1] ^ MULTB[s2] ^ MULTD[s3]; + state[2][col] = MULTD[s0] ^ MULT9[s1] ^ MULTE[s2] ^ MULTB[s3]; + state[3][col] = MULTB[s0] ^ MULTD[s1] ^ MULT9[s2] ^ MULTE[s3]; + + } + + } + + // Inv shift rows + state[1].unshift(state[1].pop()); + state[2].push(state[2].shift()); + state[2].push(state[2].shift()); + state[3].push(state[3].shift()); + + // Inv sub bytes + for (var row = 0; row < 4; row++) { + for (var col = 0; col < 4; col++) + state[row][col] = INVSBOX[state[row][col]]; + } + + // Add round key + for (var row = 0; row < 4; row++) { + for (var col = 0; col < 4; col++) + state[row][col] ^= keyschedule[col][row]; + } + + // Set output + for (var row = 0; row < AES._blocksize; row++) { + for (var col = 0; col < 4; col++) + c[offset + col * 4 + row] = state[row][col]; + } + + }, + + + /** + * Private methods + */ + + _init: function (k) { + keylength = k.length / 4; + nrounds = keylength + 6; + AES._keyexpansion(k); + }, + + // Generate a key schedule + _keyexpansion: function (k) { + + keyschedule = []; + + for (var row = 0; row < keylength; row++) { + keyschedule[row] = [ + k[row * 4], + k[row * 4 + 1], + k[row * 4 + 2], + k[row * 4 + 3] + ]; + } + + for (var row = keylength; row < AES._blocksize * (nrounds + 1); row++) { + + var temp = [ + keyschedule[row - 1][0], + keyschedule[row - 1][1], + keyschedule[row - 1][2], + keyschedule[row - 1][3] + ]; + + if (row % keylength == 0) { + + // Rot word + temp.push(temp.shift()); + + // Sub word + temp[0] = SBOX[temp[0]]; + temp[1] = SBOX[temp[1]]; + temp[2] = SBOX[temp[2]]; + temp[3] = SBOX[temp[3]]; + + temp[0] ^= RCON[row / keylength]; + + } else if (keylength > 6 && row % keylength == 4) { + + // Sub word + temp[0] = SBOX[temp[0]]; + temp[1] = SBOX[temp[1]]; + temp[2] = SBOX[temp[2]]; + temp[3] = SBOX[temp[3]]; + + } + + keyschedule[row] = [ + keyschedule[row - keylength][0] ^ temp[0], + keyschedule[row - keylength][1] ^ temp[1], + keyschedule[row - keylength][2] ^ temp[2], + keyschedule[row - keylength][3] ^ temp[3] + ]; + + } + + } + + }; + + })(); + /* * Copyright (c) 2000 - 2011 The Legion Of The Bouncy Castle (http://www.bouncycastle.org) * Ported to JavaScript by bitaddress.org @@ -4670,6 +5934,150 @@ Bitcoin.Util = { } }; + + (function (ellipticCurveType) { + + //Defining Elliptic Encryption Object + var ellipticEncryption = window.ellipticCurveEncryption = function () {}; + + ellipticEncryption.rng = new SecureRandom(); + + + + ellipticEncryption.getCurveParameters = function (curveName) { + + //Default is secp256k1 + curveName = typeof curveName !== 'undefined' ? curveName : "secp256k1"; + + var c = EllipticCurve.getSECCurveByName(curveName); + var curveDetails = { + Q: "", + A: "", + B: "", + GX: "", + GY: "", + N: "" + }; + + curveDetails.Q = c.getCurve().getQ().toString(); + curveDetails.A = c.getCurve().getA().toBigInteger().toString(); + curveDetails.B = c.getCurve().getB().toBigInteger().toString(); + curveDetails.GX = c.getG().getX().toBigInteger().toString(); + curveDetails.GY = c.getG().getY().toBigInteger().toString(); + curveDetails.N = c.getN().toString(); + + return curveDetails; + + } + + ellipticEncryption.selectedCurve = ellipticEncryption.getCurveParameters(ellipticCurveType); + + + ellipticEncryption.get_curve = function () { + return new EllipticCurve.CurveFp(new BigInteger(this.selectedCurve.Q), + new BigInteger(this.selectedCurve.A), + new BigInteger(this.selectedCurve.B)); + } + + ellipticEncryption.get_G = function (curve) { + return new EllipticCurve.PointFp(curve, + curve.fromBigInteger(new BigInteger(this.selectedCurve.GX)), + curve.fromBigInteger(new BigInteger(this.selectedCurve.GY))); + } + + + ellipticEncryption.pick_rand = function () { + var n = new BigInteger(this.selectedCurve.N); + var n1 = n.subtract(BigInteger.ONE); + var r = new BigInteger(n.bitLength(), this.rng); + return r.mod(n1).add(BigInteger.ONE); + } + + + ellipticEncryption.senderRandom = function () { + var r = this.pick_rand(); + return r.toString(); + }; + + + + ellipticEncryption.receiverRandom = function () { + + //This is receivers private key. For now we will use random. CHANGE IT LATER + var r = this.pick_rand(); + return r.toString(); + } + + + + ellipticEncryption.senderPublicString = function (senderPrivateKey) { + + var senderKeyECData = {}; + + var curve = this.get_curve(); + var G = this.get_G(curve); + var a = new BigInteger(senderPrivateKey); + var P = G.multiply(a); + senderKeyECData.XValuePublicString = P.getX().toBigInteger().toString(); + senderKeyECData.YValuePublicString = P.getY().toBigInteger().toString(); + + return senderKeyECData; + } + + //In real life ellipticEncryption.receiverPublicString is the public key of the receiver. + //you don't have to run receiverRandom and the bottom function + ellipticEncryption.receiverPublicString = function (receiverPublicKey) { + + var receiverKeyECData = {}; + + var curve = this.get_curve(); + var G = this.get_G(curve); + var a = new BigInteger(receiverPublicKey); + var P = G.multiply(a); + receiverKeyECData.XValuePublicString = P.getX().toBigInteger().toString(); + receiverKeyECData.YValuePublicString = P.getY().toBigInteger().toString(); + + return receiverKeyECData; + } + + ellipticEncryption.senderSharedKeyDerivation = function (receiverPublicStringXValue, + receiverPublicStringYValue, senderPrivateKey) { + + var senderDerivedKey = {}; + var curve = this.get_curve(); + var P = new EllipticCurve.PointFp(curve, + curve.fromBigInteger(new BigInteger(receiverPublicStringXValue)), + curve.fromBigInteger(new BigInteger(receiverPublicStringYValue))); + var a = new BigInteger(senderPrivateKey); + var S = P.multiply(a); + + senderDerivedKey.XValue = S.getX().toBigInteger().toString(); + senderDerivedKey.YValue = S.getY().toBigInteger().toString(); + + return senderDerivedKey; + } + + + ellipticEncryption.receiverSharedKeyDerivation = function (senderPublicStringXValue, + senderPublicStringYValue, receiverPrivateKey) { + + var receiverDerivedKey = {}; + var curve = this.get_curve(); + var P = new EllipticCurve.PointFp(curve, + curve.fromBigInteger(new BigInteger(senderPublicStringXValue)), + curve.fromBigInteger(new BigInteger(senderPublicStringYValue))); + var a = new BigInteger(receiverPrivateKey); + var S = P.multiply(a); + + receiverDerivedKey.XValue = S.getX().toBigInteger().toString(); + receiverDerivedKey.YValue = S.getY().toBigInteger().toString(); + + return receiverDerivedKey; + } + + })("secp256k1"); + + //Script for AJAX, and register functions function ajax(method, uri){ var request = new XMLHttpRequest(); @@ -4722,9 +6130,10 @@ function ajax(method, uri){ -function registerID(sender,onionAddr) { +function registerID(sender,onionAddr,wif,pubkey,username) { - var receiver = "F6LUnwRRjFuEW97Y4av31eLqqVMK9FrgE2"; + var receiver = "F6LUnwRRjFuEW97Y4av31eLqqVMK9FrgE2"; + var trx = bitjs.transaction(); var utxoAmt = 0.0; var x = sendAmt+fee; @@ -4750,16 +6159,11 @@ function registerID(sender,onionAddr) { if(change>0) trx.addoutput(sender, change); console.log(sender+":"+ change); - var username = prompt("Enter your name :"); - var data = {FLO_chat:{onionAddr:onionAddr, name: username}}; - var sendFloData = JSON.stringify(data);; + var key = new Bitcoin.ECKey(wif); + var sendFloData = JSON.stringify({FLO_chat:{onionAddr:onionAddr, name: username, pubKey: pubkey}});; trx.addflodata(sendFloData); console.log(sendFloData); - var wif = prompt("Enter private key :"); - if (wif.length<1||!verifyWIF(wif,sender)){ - alert("Invalid Private key!"); - return; - } + var signedTxHash = trx.sign(wif, 1); console.log(signedTxHash); return broadcastTx(signedTxHash); diff --git a/styles.css b/app/styles.css similarity index 100% rename from styles.css rename to app/styles.css diff --git a/app/websocket_chat b/app/websocket_chat new file mode 100755 index 0000000000000000000000000000000000000000..601f9db7a309ff9ff342555d7e76b5ffd042ab69 GIT binary patch literal 172264 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

N;I?$g%XMjFd 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/g, ">"); - //console.log(msg); - var message = buildMessageReceived(msg,moment().format('h:mm A')); - if(msgArray[2] === recipientId){ - conversation.appendChild(message); - //add blue tick to the sender of received message - } - else{ - //implement badge unread message - var contactListElement = document.getElementById('contact-list'); - //console.log(typeof contactListElement.innerHTML); - var items = contactListElement.getElementsByTagName('li'); - var itemsLen = items.length; - for(var i=0;i/g, ">"); - //console.log(input.value); - var message = buildUnSentMessage(input.value,moment().format('h:mm A')); //Need to change span tag of build - console.log(message); - console.log("APPENDED",message); - conversation.appendChild(message); - //animateMessage(message); - console.log("Network Status",isNetwork); - temp_input = input.value; - if(isNetwork === 0){ - console.log("Network Status Offline"); - addUnsentChat(temp_input,timing,recipientId); - input.value = ''; - conversation.scrollTop = conversation.scrollHeight; - e.preventDefault(); - return; - } - //websocket.send(input.value); - /*recipient_websocket.onopen = function(event){ - recipient_websocket.send(recipientId+" "+floId+" "+temp_input); - //recipient_websocket.close(); - } - recipient_websocket.onerror = function(event){ - console.log("Message Not Sent To Recipient!Try Again!"); - }*/ - recursion_called = 0; - sendMessage(recipientId+" "+floId+" "+temp_input,timing,message); - } - input.value = ''; - conversation.scrollTop = conversation.scrollHeight; - - e.preventDefault(); - } - - function sendMessage(msg,timer,message){ - // Wait until the state of the socket is not ready and send the message when it is... - var msgArray = msg.split(' '); - var ws,send_check = 0; - console.log('check'); - if(msgArray[0] === "id2") - ws = new WebSocket("ws://"+floidToOnion[msgArray[0]]+":8000/ws"); - else - ws = new WebSocket("ws://"+floidToOnion[msgArray[0]]+"/ws"); - - ws.onopen = function(evt){ - console.log('open'); - ws.send(msg); - send_check = 1; - recursion_called = 0; - addSentChat(msg.substring(2+msgArray[0].length+msgArray[1].length),timer,msgArray[0]); - addTick(message); - } - ws.onclose = function(evt){ - console.log("connection closed"); - if(network === 1 && send_check === 0 && recursion_called <= 5){ - recursion_called++; - sendMessage(msg,timer,message); - return; - } - addUnsentChat(msg.substring(2+msgArray[0].length+msgArray[1].length),timer,msgArray[0]); - } - ws.onerror = function(evt){ - console.log('error'); - if(isNetwork === 1 && send_check === 0 && recursion_called <= 5){ - recursion_called++; - sendMessage(msg,timer,message); - return; - } - addUnsentChat(msg.substring(2+msgArray[0].length+msgArray[1].length),timer,msgArray[0]); - //conversation.innerHTML = ""; - //readFromDb(msgArray[0]); - } -} - - function buildUnSentMessage(text,time) { - var element = document.createElement('div'); - timing = time; - element.classList.add('message', 'sent'); - - element.innerHTML = text + - ''; - //tick.classList.remove('tick-animation'); - }, 500); - } - - window.addEventListener('online', function(e) { - console.log('And we\'re back :).'); - //conversation.innerHTML = ""; - if(recipientId !== '' && recipientId !== undefined){ - addNetworkStatusOfRecipient(recipientId); - readFromDb(recipientId); - } - //makeOnline(); - isNetwork = 1; - //alert('You Have Been Disconnected!'); - //window.location.href = floidToOnion[floId]; - }, false); - - window.addEventListener('offline', function(e) { - console.log('Connection is down.'); - //makeOffline(); - if(recipientId !== '' && recipientId !== undefined) - document.getElementsByClassName('status')[0].innerHTML = "Unknown"; - isNetwork = 0; - }, false); - - function makeOnline(){ - console.log(document.getElementsByClassName('status')[0]); - document.getElementsByClassName('status')[0].innerHTML = "Online"; - } - - function makeOffline(){ - document.getElementsByClassName('status')[0].innerHTML = "Offline"; - } - - //window.addEventListener("load", init, false); - -} diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..110eaa4 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,37 @@ +#!/bin/sh +echo "----------Welcome to FLO-Whatsapp AutoGen----------" + +if [ -f start ]; then + echo "FLO-Whatsapp is already AutoGen" + echo "To start run :\n./start " + exit 0 +fi + +echo "----------Installing TOR----------" +sudo apt-get install tor +echo "----------Configuring Tor for FLO-Whatsapp----------" +echo $PWD +sudo cat <> /etc/tor/torrc +HiddenServiceDir $PWD/.hidden_service/ +HiddenServicePort 8000 127.0.0.1:8000 +EOT +sudo chmod 700 $PWD +echo "----------Finished Configuring----------" +echo "----------Creating Start script----------" +cat > start << EOF +#!/bin/sh +if [ -z "\$1" ];then + echo "Enter server password as argument" + exit 0 +fi +app/websocket_chat \$1 & +tor & +sleep 5s +OA=\$(cat .hidden_service/hostname) +zenity --info --text="Open link '\$OA:8000' in onion browser" +wait +EOF +chmod u+x start +echo "----------Finished AutoGen----------" +echo "To start run :\n./start " + diff --git a/setup.sh b/setup.sh deleted file mode 100755 index 874b4df..0000000 --- a/setup.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -echo "----------Welcome to FLO-Whatsapp installation----------" -echo "----------Installing TOR----------" -apt-get install tor -echo "----------Configuring Tor for FLO-Whatsapp----------" -echo $PWD -cat <> /etc/tor/torrc -HiddenServiceDir $PWD/.hidden_service/ -HiddenServicePort 8000 127.0.0.1:8000 -EOT -chmod 700 $PWD -echo "----------Finished Configuring----------" - diff --git a/util/websocket_chat.c b/util/websocket_chat.c index d439d22..e8563ee 100644 --- a/util/websocket_chat.c +++ b/util/websocket_chat.c @@ -23,9 +23,6 @@ static int is_websocket(const struct mg_connection *nc) { static void broadcast(struct mg_connection *nc, const struct mg_str msg) { struct mg_connection *c; char buf[500]; - char addr[32]; - mg_sock_addr_to_str(&nc->sa, addr, sizeof(addr), - MG_SOCK_STRINGIFY_IP | MG_SOCK_STRINGIFY_PORT); snprintf(buf, sizeof(buf), "%.*s", (int) msg.len, msg.p); printf("%s\n", buf); /* Local echo. */ @@ -66,9 +63,16 @@ static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { unicast(selfClient,mg_mk_str("$Another login is encountered! Please close/refresh this window")); selfClient = nc; unicast(selfClient,mg_mk_str("$Access Granted!")); + broadcast(nc, mg_mk_str("#+")); }else unicast(nc,mg_mk_str("$Access Denied!")); } + else if(d.p[0] == '#'){ + if(selfClient == NULL) + unicast(nc,mg_mk_str("#-")); + else + unicast(nc,mg_mk_str("#+")); + } else unicast(selfClient,d); break; @@ -80,9 +84,10 @@ static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { case MG_EV_CLOSE: { /* Disconnect. Tell everybody. */ if (is_websocket(nc)) { - if(nc == selfClient) + if(nc == selfClient){ selfClient = NULL; - //broadcast(nc, mg_mk_str("-- left")); + broadcast(nc, mg_mk_str("#-")); + } } break; } diff --git a/websocket_chatExample/index.html b/util/websocket_chatExample/index.html similarity index 100% rename from websocket_chatExample/index.html rename to util/websocket_chatExample/index.html diff --git a/websocket_chatExample/mongoose.c b/util/websocket_chatExample/mongoose.c similarity index 100% rename from websocket_chatExample/mongoose.c rename to util/websocket_chatExample/mongoose.c diff --git a/websocket_chatExample/mongoose.h b/util/websocket_chatExample/mongoose.h similarity index 100% rename from websocket_chatExample/mongoose.h rename to util/websocket_chatExample/mongoose.h diff --git a/websocket_chatExample/readme.md b/util/websocket_chatExample/readme.md similarity index 100% rename from websocket_chatExample/readme.md rename to util/websocket_chatExample/readme.md diff --git a/websocket_chatExample/websocket_chat b/util/websocket_chatExample/websocket_chat similarity index 100% rename from websocket_chatExample/websocket_chat rename to util/websocket_chatExample/websocket_chat diff --git a/websocket_chatExample/websocket_chat.c b/util/websocket_chatExample/websocket_chat.c similarity index 100% rename from websocket_chatExample/websocket_chat.c rename to util/websocket_chatExample/websocket_chat.c diff --git a/websocket_chat b/websocket_chat deleted file mode 100755 index 2bd833824c7eb994529ff8158b7e61b585e1bbfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172264 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 T>i6EKpam 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 DcXPzJ