Initial commit of DEMOS2 with the upgraded 'Create Event' UI. However, there is no input validation currently
This commit is contained in:
commit
7084bd1b16
155 changed files with 8102 additions and 0 deletions
232
Node/test/demos2-booth.js
Executable file
232
Node/test/demos2-booth.js
Executable file
|
@ -0,0 +1,232 @@
|
|||
/*
|
||||
|
||||
Cryptography functions written by Bingsheng Zhang
|
||||
|
||||
Uses the milagro-crypto-js library at:
|
||||
https://github.com/milagro-crypto/milagro-crypto-js
|
||||
|
||||
*/
|
||||
|
||||
|
||||
//Group parameter generator: returns rng object and generators g1,g2 for G1,G2 as well as order
|
||||
gpGen = function(){
|
||||
//init, and base generators
|
||||
var ctx = new CTX("BN254CX");
|
||||
|
||||
var n=new ctx.BIG(0); n.rcopy(ctx.ROM_CURVE.CURVE_Order);
|
||||
|
||||
//get generator P for G1
|
||||
P = new ctx.ECP(0);
|
||||
gx = new ctx.BIG(0);
|
||||
gx.rcopy(ctx.ROM_CURVE.CURVE_Gx);
|
||||
if (ctx.ECP.CURVETYPE != ctx.ECP.MONTGOMERY) {
|
||||
gy = new ctx.BIG(0);
|
||||
gy.rcopy(ctx.ROM_CURVE.CURVE_Gy);
|
||||
P.setxy(gx, gy);
|
||||
} else P.setx(gx);
|
||||
|
||||
//get generator Q for G2
|
||||
var A=new ctx.BIG(0);
|
||||
var B=new ctx.BIG(0);
|
||||
A.rcopy(ctx.ROM_CURVE.CURVE_Pxa);
|
||||
B.rcopy(ctx.ROM_CURVE.CURVE_Pxb);
|
||||
var Qx=new ctx.FP2(0); Qx.bset(A,B);
|
||||
A.rcopy(ctx.ROM_CURVE.CURVE_Pya);
|
||||
B.rcopy(ctx.ROM_CURVE.CURVE_Pyb);
|
||||
var Qy=new ctx.FP2(0); Qy.bset(A,B);
|
||||
var Q=new ctx.ECP2();
|
||||
Q.setxy(Qy,Qy);
|
||||
|
||||
return{
|
||||
n:n,
|
||||
g1:P,
|
||||
g2:Q
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//creates ElGamal public and secret key
|
||||
keyGen=function(params){
|
||||
var ctx = new CTX("BN254CX");
|
||||
//set rng
|
||||
var RAW = [];
|
||||
var d = new Date();//time for seed, not secure
|
||||
var rng = new ctx.RAND();
|
||||
rng.clean();
|
||||
RAW[0] = d.getSeconds();
|
||||
RAW[1] = d.getMinutes();
|
||||
RAW[2] = d.getMilliseconds();
|
||||
rng.seed(3, RAW);
|
||||
|
||||
//ElGamal
|
||||
var sk = new ctx.BIG(0);
|
||||
sk = ctx.BIG.randomnum(params.n,rng);
|
||||
var pk = new ctx.ECP(0);
|
||||
pk = ctx.PAIR.G1mul(params.g1,sk);
|
||||
|
||||
|
||||
return{
|
||||
PK:pk,
|
||||
SK:sk
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//combine multiple public key together
|
||||
//the input is an array of PKs
|
||||
combine=function(PKs){
|
||||
var ctx = new CTX("BN254CX");
|
||||
var pk=new ctx.ECP();
|
||||
//copy the first pk
|
||||
pk.copy(PKs[0]);
|
||||
//multiple the rest PKs
|
||||
for(i=1;i<PKs.length;i++){
|
||||
pk.add(PKs[i]);
|
||||
}
|
||||
|
||||
return{
|
||||
PK:pk
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//ElGamal encryption
|
||||
encrypt=function(params,PK, m){
|
||||
var ctx = new CTX("BN254CX");
|
||||
//set rand
|
||||
var RAW = [];
|
||||
var d = new Date();//time for seed, not secure
|
||||
var rng = new ctx.RAND();
|
||||
rng.clean();
|
||||
RAW[0] = d.getSeconds();
|
||||
RAW[1] = d.getMinutes();
|
||||
RAW[2] = d.getMilliseconds();
|
||||
rng.seed(3, RAW);
|
||||
|
||||
var r=new ctx.BIG.randomnum(params.n,rng);
|
||||
var M=new ctx.BIG(m);
|
||||
|
||||
var C1=new ctx.ECP();
|
||||
C1 = ctx.PAIR.G1mul(params.g1,r);
|
||||
|
||||
var gM=new ctx.ECP();
|
||||
gM = ctx.PAIR.G1mul(params.g1,M);
|
||||
|
||||
var C2=new ctx.ECP();
|
||||
C2 = ctx.PAIR.G1mul(PK,r);
|
||||
C2.mul(r);
|
||||
C2.add(gM);
|
||||
|
||||
return{
|
||||
C1:C1,
|
||||
C2:C2
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//add ciphertexts
|
||||
add=function(Ciphers){
|
||||
var ctx = new CTX("BN254CX");
|
||||
var s1=new ctx.ECP();
|
||||
var s2=new ctx.ECP();
|
||||
//copy the first cipher
|
||||
s1.copy(Ciphers[0].C1);
|
||||
s2.copy(Ciphers[0].C2);
|
||||
//multiple the rest ciphertexts
|
||||
for(i=1;i<Ciphers.length;i++){
|
||||
s1.add(Ciphers[i].C1);
|
||||
}
|
||||
//no idea why I need two loops
|
||||
for(j=1;j<Ciphers.length;j++){
|
||||
s2.add(Ciphers[j].C2);
|
||||
}
|
||||
|
||||
return{
|
||||
C1:s1,
|
||||
C2:s2
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//ElGamal decryption
|
||||
decrypt=function(params,SK, C){
|
||||
var ctx = new CTX("BN254CX");
|
||||
var D=new ctx.ECP();
|
||||
D = ctx.PAIR.G1mul(C.C1,SK);
|
||||
|
||||
var gM=new ctx.ECP();
|
||||
gM.copy(C.C2);
|
||||
gM.sub(D);
|
||||
|
||||
//search for message by brute force
|
||||
var B;
|
||||
for (j = 0; j < 1000; j++) {
|
||||
//use D as temp var
|
||||
B = new ctx.BIG(j);
|
||||
D = ctx.PAIR.G1mul(params.g1,B);
|
||||
if (D.equals(gM))
|
||||
return{
|
||||
M:j
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
return{
|
||||
M: "Error"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//ElGamal partial decryption
|
||||
partDec=function(SK, C){
|
||||
var ctx = new CTX("BN254CX");
|
||||
var D=new ctx.ECP();
|
||||
D = ctx.PAIR.G1mul(C.C1,SK);
|
||||
|
||||
return{
|
||||
D: D
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//Tally, combine partial decryption
|
||||
//Ds is the array of partial decryptions; C is the ciphertext.
|
||||
tally=function(params,Ds, C){
|
||||
var ctx = new CTX("BN254CX");
|
||||
var D=new ctx.ECP();
|
||||
D.copy(Ds[0].D);
|
||||
|
||||
//combine D
|
||||
for(i=1;i<Ds.length;i++){
|
||||
D.add(Ds[i].D);
|
||||
}
|
||||
|
||||
|
||||
var gM=new ctx.ECP();
|
||||
gM.copy(C.C2);
|
||||
gM.sub(D);
|
||||
|
||||
//search for message by brute force
|
||||
var B;
|
||||
for (j = 0; j < 1000; j++) {
|
||||
//use D as temp var
|
||||
B = new ctx.BIG(j);
|
||||
D = ctx.PAIR.G1mul(params.g1,B);
|
||||
if (D.equals(gM))
|
||||
return{
|
||||
M:j
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
return{
|
||||
M: "Error"
|
||||
}
|
||||
}
|
||||
|
288
Node/test/test_webserver.html
Executable file
288
Node/test/test_webserver.html
Executable file
|
@ -0,0 +1,288 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
|
||||
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
|
||||
<script src="https://code.jquery.com/jquery.js"></script>
|
||||
<!-- Bootstrap core JavaScript -->
|
||||
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
|
||||
<!-- Crypto JS -->
|
||||
<script type="text/javascript" src=./core/rand.js></script>
|
||||
<script type="text/javascript" src=./core/rom_curve.js></script>
|
||||
<script type="text/javascript" src=./core/rom_field.js></script>
|
||||
<script type="text/javascript" src=./core/uint64.js></script>
|
||||
<script type="text/javascript" src=./core/aes.js></script>
|
||||
<script type="text/javascript" src=./core/big.js></script>
|
||||
<script type="text/javascript" src=./core/gcm.js></script>
|
||||
<script type="text/javascript" src=./core/hash256.js></script>
|
||||
<script type="text/javascript" src=./core/hash384.js></script>
|
||||
<script type="text/javascript" src=./core/hash512.js></script>
|
||||
<script type="text/javascript" src=./core/sha3.js></script>
|
||||
<script type="text/javascript" src=./core/newhope.js></script>
|
||||
<script type="text/javascript" src=./core/nhs.js></script>
|
||||
<script type="text/javascript" src=./core/fp.js></script>
|
||||
<script type="text/javascript" src=./core/fp2.js></script>
|
||||
<script type="text/javascript" src=./core/fp4.js></script>
|
||||
<script type="text/javascript" src=./core/fp12.js></script>
|
||||
<script type="text/javascript" src=./core/ff.js></script>
|
||||
<script type="text/javascript" src=./core/rsa.js></script>
|
||||
<script type="text/javascript" src=./core/ecp.js></script>
|
||||
<script type="text/javascript" src=./core/ecp2.js></script>
|
||||
<script type="text/javascript" src=./core/ecdh.js></script>
|
||||
<script type="text/javascript" src=./core/pair.js></script>
|
||||
<script type="text/javascript" src=./core/mpin.js></script>
|
||||
<script type="text/javascript" src=./core/ctx.js></script>
|
||||
|
||||
<script type="text/javascript" src="demos2-booth.js"></script>
|
||||
|
||||
<h1>DEMOS2 Node.js Server testing page</h1>
|
||||
|
||||
<button type="button" id="gpGen" class="btn">gpGen</button>
|
||||
<p id="gpGenLocal">GPGen Local results</p>
|
||||
<p id="gpGenServer">GPGen Server results</p>
|
||||
|
||||
<button type="button" id="addec" class="btn">addec</button>
|
||||
<p id="addecLocal">addec Local results</p>
|
||||
<p id="addecServer">addec Server results</p>
|
||||
<p id="addecResult">addec comparison results</p>
|
||||
|
||||
|
||||
<button type="button" id="combpk" class="btn">combpk</button>
|
||||
<p id="combpkLocal">combpk Local results</p>
|
||||
<p id="combpkServer">combpk Server results</p>
|
||||
<p id="combpkResult">compk comparison results</p>
|
||||
|
||||
|
||||
<button type="button" id="combpkOne" class="btn">combpk (one key)</button>
|
||||
<p id="combpkLocalOne">combpk Local results</p>
|
||||
<p id="combpkServerOne">combpk Server results</p>
|
||||
<p id="combpkResultOne">compk comparison results</p>
|
||||
|
||||
<button type="button" id="tally" class="btn">tally</button>
|
||||
<p id="tallyLocal">tally Local results</p>
|
||||
<p id="tallyServer">tally Server results</p>
|
||||
<p id="tallyResult">compk comparison results</p>
|
||||
|
||||
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
|
||||
$("#gpGen").click(function(){
|
||||
|
||||
var xhttp = new XMLHttpRequest();
|
||||
xhttp.onreadystatechange = function() {
|
||||
if (this.readyState == 4 && this.status == 200) {
|
||||
document.getElementById("gpGenServer").innerHTML = this.responseText;
|
||||
|
||||
var params = gpGen();
|
||||
document.getElementById("gpGenLocal").innerHTML = JSON.stringify(params);
|
||||
}
|
||||
};
|
||||
xhttp.open("GET", "/param", true);
|
||||
xhttp.send();
|
||||
})
|
||||
|
||||
var params = gpGen();
|
||||
var keys = keyGen(params);
|
||||
|
||||
//encrypt number 5
|
||||
var cipher = encrypt(params,keys.PK, 5);
|
||||
|
||||
//test decrypt
|
||||
var message = decrypt(params, keys.SK, cipher);
|
||||
|
||||
|
||||
$("#addec").click(function(){
|
||||
|
||||
var c1 = encrypt(params,keys.PK, 3);
|
||||
var c2 = encrypt(params,keys.PK, 4);
|
||||
var cArray = new Array(c1,c2);
|
||||
|
||||
var bytes = [];
|
||||
var queryparams = "?number=2"
|
||||
queryparams += "&C1=";
|
||||
c1.C1.toBytes(bytes);
|
||||
queryparams += bytes.toString();
|
||||
|
||||
queryparams += "&C2=";
|
||||
c1.C2.toBytes(bytes);
|
||||
queryparams += bytes.toString();
|
||||
|
||||
queryparams += '&C1=';
|
||||
c2.C1.toBytes(bytes);
|
||||
queryparams += bytes.toString();
|
||||
|
||||
queryparams += '&C2=';
|
||||
c2.C2.toBytes(bytes);
|
||||
queryparams += bytes.toString();
|
||||
|
||||
var xhttp = new XMLHttpRequest();
|
||||
xhttp.onreadystatechange = function() {
|
||||
|
||||
|
||||
if (this.readyState == 4 && this.status == 200) {
|
||||
|
||||
var localAdd = add(cArray);
|
||||
var localM = decrypt(params, keys.SK, localAdd);
|
||||
|
||||
console.log(localM);
|
||||
document.getElementById("addecLocal").innerHTML = JSON.stringify(localAdd);
|
||||
|
||||
|
||||
console.log("Request: /addec"+queryparams);
|
||||
document.getElementById("addecServer").innerHTML = this.responseText;
|
||||
|
||||
//build object from server
|
||||
var temp = JSON.parse(this.responseText);
|
||||
|
||||
//the values need to be copied in otherwise decryption doesn't work
|
||||
var ctx = new CTX("BN254CX");
|
||||
var s1=new ctx.ECP();
|
||||
var s2=new ctx.ECP();
|
||||
//copy the first cipher
|
||||
s1.copy(temp.C1);
|
||||
s2.copy(temp.C2);
|
||||
var serverAdd = {
|
||||
C1:s1,
|
||||
C2:s2
|
||||
}
|
||||
|
||||
var serverM = decrypt(params, keys.SK, serverAdd);
|
||||
console.log(serverM);
|
||||
|
||||
document.getElementById("addecResult").innerHTML = "Local results: " + localM.M + ", Server results: " + serverM.M + "\n JSON string match: " + (JSON.stringify(localAdd) == this.responseText);
|
||||
|
||||
}
|
||||
};
|
||||
xhttp.open("GET", "/addec"+queryparams, true);
|
||||
xhttp.send();
|
||||
})
|
||||
|
||||
$("#combpk").click(function(){
|
||||
|
||||
var k1 = keyGen(params);
|
||||
var k2 = keyGen(params);
|
||||
|
||||
var bytes = [];
|
||||
var queryparams = "?number=2";
|
||||
queryparams += "&PK=";
|
||||
k1.PK.toBytes(bytes);
|
||||
queryparams += bytes.toString();
|
||||
|
||||
queryparams += "&PK=";
|
||||
k2.PK.toBytes(bytes);
|
||||
queryparams += bytes.toString();
|
||||
|
||||
console.log(queryparams);
|
||||
var xhttp = new XMLHttpRequest();
|
||||
xhttp.onreadystatechange = function() {
|
||||
if (this.readyState == 4 && this.status == 200) {
|
||||
//test combine key
|
||||
|
||||
|
||||
var PKs = new Array(k1.PK,k2.PK);
|
||||
var pk = combine(PKs);
|
||||
|
||||
document.getElementById("combpkServer").innerHTML = this.responseText;
|
||||
|
||||
document.getElementById("combpkLocal").innerHTML = JSON.stringify(pk);
|
||||
|
||||
var match = (this.responseText == JSON.stringify(pk));
|
||||
document.getElementById("combpkResult").innerHTML = "Matching strings: " + match;
|
||||
}
|
||||
};
|
||||
xhttp.open("GET", "/cmpkstring"+queryparams, true);
|
||||
xhttp.send();
|
||||
})
|
||||
|
||||
$("#combpkOne").click(function(){
|
||||
|
||||
var k1 = keyGen(params);
|
||||
|
||||
var bytes = [];
|
||||
var queryparams = "?number=1";
|
||||
queryparams += "&PK=";
|
||||
k1.PK.toBytes(bytes);
|
||||
queryparams += bytes.toString();
|
||||
|
||||
console.log(queryparams);
|
||||
var xhttp = new XMLHttpRequest();
|
||||
xhttp.onreadystatechange = function() {
|
||||
if (this.readyState == 4 && this.status == 200) {
|
||||
//test combine key
|
||||
|
||||
|
||||
var PKs = new Array(k1.PK);
|
||||
var pk = combine(PKs);
|
||||
|
||||
document.getElementById("combpkServerOne").innerHTML = this.responseText;
|
||||
|
||||
document.getElementById("combpkLocalOne").innerHTML = JSON.stringify(pk);
|
||||
|
||||
var match = (this.responseText == JSON.stringify(pk));
|
||||
document.getElementById("combpkResultOne").innerHTML = "Matching strings: " + match;
|
||||
}
|
||||
};
|
||||
xhttp.open("GET", "/cmpkstring"+queryparams, true);
|
||||
xhttp.send();
|
||||
})
|
||||
|
||||
$("#tally").click(function(){
|
||||
|
||||
//combine some keys first to test tally
|
||||
var k1 = keyGen(params);
|
||||
var k2 = keyGen(params);
|
||||
var PKs = new Array(k1.PK,k2.PK);
|
||||
var pk = combine(PKs);
|
||||
|
||||
var Tc = encrypt(params,pk.PK, 3);
|
||||
var D1 = partDec(k1.SK, Tc);
|
||||
var D2 = partDec(k2.SK, Tc);
|
||||
var Ds = new Array(D1,D2);
|
||||
|
||||
var queryparams = "?number=2";
|
||||
queryparams += "¶m=";//JSON format
|
||||
queryparams += JSON.stringify(params);
|
||||
|
||||
queryparams +="&decs=";//will be in byte array format
|
||||
var bytes = [];
|
||||
D1.D.toBytes(bytes);
|
||||
queryparams += bytes.toString();
|
||||
queryparams +="&decs=";
|
||||
D2.D.toBytes(bytes);
|
||||
queryparams += bytes.toString();
|
||||
|
||||
queryparams +="&cipher=";//JSON, since it came from the server before
|
||||
queryparams += JSON.stringify(Tc);
|
||||
|
||||
console.log(queryparams);
|
||||
var xhttp = new XMLHttpRequest();
|
||||
xhttp.onreadystatechange = function() {
|
||||
if (this.readyState == 4 && this.status == 200) {
|
||||
//test tally results
|
||||
|
||||
var tar = tally(params, Ds, Tc);
|
||||
|
||||
document.getElementById("tallyServer").innerHTML = this.responseText;
|
||||
|
||||
document.getElementById("tallyLocal").innerHTML = JSON.stringify(tar);
|
||||
|
||||
var match = (this.responseText == JSON.stringify(tar));
|
||||
document.getElementById("tallyResult").innerHTML = "Matching strings: " + match;
|
||||
}
|
||||
};
|
||||
xhttp.open("GET", "/tally"+queryparams, true);
|
||||
xhttp.send();
|
||||
})
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
Reference in a new issue