arnaucube
arnaucube/blindsig-client-server-examplePublic Self-hosted repository
blindsig-client-server-example/client/loop.js
client/loop.jsRaw
  1// This version uses https://github.com/arnaucube/blindsecp256k1-js
  2
  3// const blindsecp256k1 = require('blindsecp256k1');
  4// const axios = require('axios');
  5
  6let signerR, signerQ, m, mBlinded, userSecretData, blindedSig, sig, errCount, verified;
  7
  8const apiUrl = "http://127.0.0.1:3000";
  9
 10function printPoint(name, p) {
 11	console.log(`${name}:\n	x: ${p.affineX.toString()}\n	y: ${p.affineY.toString()}`);
 12}
 13
 14async function newRequest() {
 15	try {
 16		const res = await axios.get(apiUrl+'/request');
 17		signerR = blindsecp256k1.Point.fromAffine(blindsecp256k1.ecparams,
 18			blindsecp256k1.newBigFromString(res.data.signerR.x),
 19			blindsecp256k1.newBigFromString(res.data.signerR.y));
 20		signerQ = blindsecp256k1.Point.fromAffine(blindsecp256k1.ecparams,
 21			blindsecp256k1.newBigFromString(res.data.signerQ.x),
 22			blindsecp256k1.newBigFromString(res.data.signerQ.y));
 23
 24		let blindRes = blindsecp256k1.blind(m, signerR);
 25		mBlinded = blindRes.mBlinded;
 26		userSecretData = blindRes.userSecretData;
 27	} catch (error) {
 28		console.error(error);
 29	}
 30}
 31
 32async function askBlindSign() {
 33	try {
 34		let data = {
 35			m: mBlinded.toString(),
 36			r: {
 37				x: signerR.affineX.toString(),
 38				y: signerR.affineY.toString()
 39			}
 40		};
 41		let res = await axios.post(apiUrl+'/blindsign', data);
 42		blindedSig = blindsecp256k1.newBigFromString(res.data.sBlind);
 43		sig = blindsecp256k1.unblind(
 44			blindedSig,
 45			userSecretData);
 46	} catch (error) {
 47		console.error(error);
 48	}
 49}
 50
 51async function verify() {
 52	verified = blindsecp256k1.verify(m, sig, signerQ);
 53	if (!verified) {
 54		errCount++;
 55		printPoint("signerR", signerR);
 56		printPoint("signerQ", signerQ);
 57		console.log("m:", m.toString());
 58		console.log("mBlinded:", mBlinded.toString());
 59		console.log(`userSecretData:\n	a: ${userSecretData.a.toString()}\n	b: ${userSecretData.b.toString()}`);
 60		printPoint("userSecretData.f", userSecretData.f);
 61		console.log("blinded sig:", blindedSig.toString());
 62		console.log("sig.s:", sig.s.toString());
 63		printPoint("sig.f", sig.f);
 64		console.log("verify", verified);
 65		alert("ERROR")
 66	}
 67	// send to verify by the go server
 68	let data = {
 69		m: mBlinded.toString(),
 70		sig: {
 71			s: sig.s.toString(),
 72			f: {
 73				x: sig.f.affineX.toString(),
 74				y: sig.f.affineY.toString()
 75			}
 76		}
 77	};
 78	let res = await axios.post(apiUrl+'/blindsign', data);
 79	console.log("res", res.data);
 80	console.log("ver by server", res.data.verification);
 81}
 82
 83async function iteration() {
 84	await newRequest()
 85	await askBlindSign()
 86	await verify()
 87}
 88
 89async function start() {
 90	errCount = 0;
 91	for (let i=0; i<10000; i++) {
 92		m = blindsecp256k1.newKeyPair().sk;
 93
 94		await iteration()
 95		if (i%100 ==0) {
 96			console.log("number of iterations", i);
 97		}
 98	}
 99	console.log("errCount", errCount);
100}
101