257 lines
6.9 KiB
JavaScript
257 lines
6.9 KiB
JavaScript
|
var createWssocket = function(wsurl, onopen, handler) {
|
||
|
console.log("[createWS.js] createWssocket : " + wsurl);
|
||
|
var retsocket = {};
|
||
|
retsocket.handlerList = [];
|
||
|
if (handler != undefined)
|
||
|
retsocket.handlerList.push(handler);
|
||
|
var wssocket = new WebSocket(wsurl);
|
||
|
wssocket.onerror = function(error) {
|
||
|
console.log(error);
|
||
|
};
|
||
|
|
||
|
wssocket.onopen = onopen;
|
||
|
var onmessage = function(event) {
|
||
|
var obj = JSON.parse(event.data);
|
||
|
switch (obj.action) {
|
||
|
case 'sendNextSegment':
|
||
|
retsocket.sendNextSegment();
|
||
|
break;
|
||
|
case 'sendSeg':
|
||
|
retsocket.receiveSeg(obj);
|
||
|
break;
|
||
|
default:
|
||
|
for (var i = 0; i < retsocket.handlerList.length; i++) {
|
||
|
var h = retsocket.handlerList[i];
|
||
|
h(event, wssocket);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var reconnect = function(error) {
|
||
|
setTimeout(function() {
|
||
|
console.log("[createWS.js] try to reconnect");
|
||
|
wssocket = new WebSocket(wsurl);
|
||
|
wssocket.onclose = reconnect;
|
||
|
wssocket.onmessage = onmessage;
|
||
|
wssocket.onopen = onopen;
|
||
|
}, 1000);
|
||
|
};
|
||
|
wssocket.onclose = reconnect;
|
||
|
|
||
|
retsocket.receiveSeg = function(obj) {
|
||
|
if (obj.cid == 'start') {
|
||
|
retsocket.toReceive = "";
|
||
|
}
|
||
|
retsocket.toReceive += obj.data;
|
||
|
if (obj.cid == 'done') {
|
||
|
console.log("[receiveSeg] Received AllData:" + retsocket.toReceive);
|
||
|
var event = {};
|
||
|
event.data = retsocket.toReceive;
|
||
|
retsocket.toReceive = "";
|
||
|
handler(event);
|
||
|
}
|
||
|
};
|
||
|
wssocket.onmessage = onmessage;
|
||
|
|
||
|
retsocket.isSending = false;
|
||
|
retsocket.sendList = [];
|
||
|
retsocket.monitor = function() {
|
||
|
if (!retsocket.isSending) {
|
||
|
if (retsocket.sendList.length > 0) {
|
||
|
retsocket.send(retsocket.sendList.pop());
|
||
|
}
|
||
|
}
|
||
|
setTimeout(retsocket.monitor, 1000);
|
||
|
};
|
||
|
// TODO: we don't need monitor at all?
|
||
|
retsocket.monitor();
|
||
|
retsocket.send = function(str) {
|
||
|
if (retsocket.isSending) {
|
||
|
retsocket.sendList.push(str);
|
||
|
return;
|
||
|
}
|
||
|
if (str.length > 1024) {
|
||
|
retsocket.isSending = true;
|
||
|
retsocket.toSend = str.substr(1024);
|
||
|
var obj = {};
|
||
|
obj.isSegment = true;
|
||
|
obj.data = str.substr(0, 1024);
|
||
|
wssocket.send(JSON.stringify(obj));
|
||
|
} else
|
||
|
wssocket.send(str);
|
||
|
};
|
||
|
retsocket.sendNextSegment = function() {
|
||
|
var str = retsocket.toSend;
|
||
|
if (str.length > 1024) {
|
||
|
retsocket.toSend = str.substr(1024);
|
||
|
var obj = {};
|
||
|
obj.isSegment = true;
|
||
|
obj.data = str.substr(0, 1024);
|
||
|
wssocket.send(JSON.stringify(obj));
|
||
|
} else {
|
||
|
retsocket.toSend = "";
|
||
|
var obj = {};
|
||
|
obj.isSegment = false;
|
||
|
obj.data = str;
|
||
|
wssocket.send(JSON.stringify(obj));
|
||
|
retsocket.isSending = false;
|
||
|
if (retsocket.sendList.length > 0) {
|
||
|
retsocket.send(retsocket.sendList.pop());
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
retsocket.isOpen = function() {
|
||
|
return wssocket.readyState;
|
||
|
}
|
||
|
retsocket.addHandler = function(handler) {
|
||
|
retsocket.handlerList.push(handler);
|
||
|
}
|
||
|
return retsocket;
|
||
|
};
|
||
|
|
||
|
var aesDecrypt = function(data) {
|
||
|
data = cryptico.b64to256(data);
|
||
|
var encryptedBlocks = cryptico.string2bytes(data);
|
||
|
var exkey = global.aesKey.slice(0);
|
||
|
aes.ExpandKey(exkey);
|
||
|
aes.Decrypt(encryptedBlocks, exkey);
|
||
|
return cryptico.bytes2string(encryptedBlocks);
|
||
|
|
||
|
};
|
||
|
var aesEncrypt = function(data, aesKey) {
|
||
|
var key = aesKey;
|
||
|
var exkey = key.slice(0);
|
||
|
aes.ExpandKey(exkey);
|
||
|
var blocks = my.string2bytes(data);
|
||
|
blocks = my.pad16(blocks);
|
||
|
aes.Encrypt(blocks, exkey);
|
||
|
ciphertext = cryptico.bytes2string(blocks);
|
||
|
ciphertext = cryptico.b256to64(ciphertext);
|
||
|
return ciphertext;
|
||
|
};
|
||
|
var rsaEncrypt = function(data, rsaKey) {
|
||
|
var rsa = new RSAKey();
|
||
|
rsa.setPublic(rsaKey.n, rsaKey.e1);
|
||
|
var result = rsa.encrypt(data);
|
||
|
return result;
|
||
|
};
|
||
|
var loadRSAKey = function(rsaKey) {
|
||
|
var str = cryptico.b64to256(rsaKey);
|
||
|
str = str.split(",");
|
||
|
var ret = {};
|
||
|
ret.n = str[0];
|
||
|
ret.e1 = str[1];
|
||
|
ret.e2 = str[2];
|
||
|
return ret;
|
||
|
};
|
||
|
var testRSA = function() {
|
||
|
pubKey = loadRSAKey(global.privKey);
|
||
|
reqContent = {};
|
||
|
reqContent.action = "main";
|
||
|
reqContent.arg = "[{\"score\":20},{\"score\":20}]";
|
||
|
reqContent.contractID = "abc";
|
||
|
eReq = encryptReq(reqContent, pubKey);
|
||
|
url = "http://localhost:8080/SCIDE/SCManager?action=executeContractEncrypted&contractRequest="
|
||
|
+ encodeURIComponent(JSON.stringify(eReq));
|
||
|
};
|
||
|
|
||
|
var encryptReq = function(reqContent, pubKey) {
|
||
|
// global.pubKey = loadRSAKey(global.privKey);
|
||
|
var aes = {};
|
||
|
aes.key = cryptico.generateAESKey();
|
||
|
var aesObj = JSON.stringify(aes);
|
||
|
var rsa = new RSAKey();
|
||
|
rsa.setPrivate(pubKey.n, pubKey.e1, pubKey.e2);
|
||
|
var encrypedReq = {};
|
||
|
encrypedReq.action = rsa.decrypt(aesObj);
|
||
|
encrypedReq.contractID = reqContent.contractID;
|
||
|
reqContent.contractID = undefined;
|
||
|
encrypedReq.arg = JSON.stringify(reqContent);
|
||
|
encrypedReq.arg = aesEncrypt(encrypedReq.arg, aes.key);
|
||
|
encrypedReq.requester = pubKey.n + "," + pubKey.e1 + "," + "0";
|
||
|
encrypedReq.requester = cryptico.b256to64(encrypedReq.requester);
|
||
|
return encrypedReq;
|
||
|
};
|
||
|
|
||
|
var onExecuteResultInternal = function(data) {
|
||
|
console.log(data);
|
||
|
global.executeResult = data;
|
||
|
var reqId = data.responseID;
|
||
|
var callback = global.cbs[data.responseID];
|
||
|
if (callback != undefined) {
|
||
|
callback(global.executeResult, data);
|
||
|
}
|
||
|
};
|
||
|
window.executeContract = function(contractID, method, strarg, cb) {
|
||
|
var sm2Key = global.sm2Key;
|
||
|
var request = {};
|
||
|
request.action = "executeContract";
|
||
|
request.requestID = new Date().getTime() + "_"
|
||
|
+ Math.floor(Math.random() * 10000);
|
||
|
|
||
|
global.cbs[request.requestID] = cb;
|
||
|
request.contractID = contractID;
|
||
|
request.operation=method;
|
||
|
request.arg = strarg;
|
||
|
|
||
|
if (sm2Key != undefined) {
|
||
|
request.pubkey = sm2Key.publicKey;
|
||
|
request.signature = sm2.doSignature(request.contractID + "|"
|
||
|
+ method + "|" + strarg + "|" + sm2Key.publicKey,
|
||
|
sm2Key.privateKey,{hash:true,der:true});
|
||
|
}
|
||
|
|
||
|
global.wssocket.send(JSON.stringify(request));
|
||
|
};
|
||
|
|
||
|
window.executeCurrentContract = function(method, strarg, cb) {
|
||
|
console.log("executeCurrentContract");
|
||
|
var contract = global.currentContract;
|
||
|
executeContract(contract.id, method, strarg, cb);
|
||
|
};
|
||
|
|
||
|
|
||
|
window.loadBDWareWebSDK = function(url, onopen, handler) {
|
||
|
if (window.global == undefined) {
|
||
|
window.global = {};
|
||
|
}
|
||
|
if (global.sm2Key == undefined) {
|
||
|
if (sm2 != undefined)
|
||
|
global.sm2Key = sm2.generateKeyPairHex();
|
||
|
}
|
||
|
if (global.cbs == undefined) {
|
||
|
global.cbs = {};
|
||
|
}
|
||
|
if (global.wssocket == undefined) {
|
||
|
global.wssocket = createWssocket(url, onopen, function(event, wss) {
|
||
|
var data = event.data;
|
||
|
var obj = JSON.parse(data);
|
||
|
switch (obj.action) {
|
||
|
case 'onExecuteResult':
|
||
|
onExecuteResultInternal(obj);
|
||
|
default:
|
||
|
}
|
||
|
handler(event, global.wssocket);
|
||
|
});
|
||
|
} else {
|
||
|
if (onopen != undefined)
|
||
|
onopen();
|
||
|
global.wssocket.addHandler(handler);
|
||
|
}
|
||
|
};
|
||
|
// Usage:
|
||
|
// Approach 1:
|
||
|
// var url = "ws://" +
|
||
|
// document.location.host+(document.location.pathname.replace("scide.html",
|
||
|
// "SCExecutor"));
|
||
|
// global.wssocket = createWssocket(url, WSHandler);
|
||
|
|
||
|
// Approach 2:
|
||
|
// loadBDWareWebSDK(url,function(){},WSHandler);
|
||
|
// global.currentContract = {'id':'DataAnalysisSample'};
|
||
|
// executeContract("contractID","methodName","arg",function(data){
|
||
|
// });
|
||
|
// executeCurrentContract("methodName","arg",function(data){
|
||
|
// });
|
||
|
// the bdware client won't call this method
|