You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.3 KiB

  1. // This version uses https://github.com/arnaucube/blindsecp256k1-js
  2. const blindsecp256k1 = require('blindsecp256k1');
  3. const axios = require('axios');
  4. let signerR, signerQ, m, mBlinded, userSecretData, blindedSig, sig, errCount, verified;
  5. const apiUrl = "http://127.0.0.1:3000";
  6. function printPoint(name, p) {
  7. console.log(`${name}:\n x: ${p.affineX.toString()}\n y: ${p.affineY.toString()}`);
  8. }
  9. async function newRequest() {
  10. try {
  11. const res = await axios.get(apiUrl+'/request');
  12. signerR = blindsecp256k1.Point.fromAffine(blindsecp256k1.ecparams,
  13. blindsecp256k1.newBigFromString(res.data.signerR.x),
  14. blindsecp256k1.newBigFromString(res.data.signerR.y));
  15. signerQ = blindsecp256k1.Point.fromAffine(blindsecp256k1.ecparams,
  16. blindsecp256k1.newBigFromString(res.data.signerQ.x),
  17. blindsecp256k1.newBigFromString(res.data.signerQ.y));
  18. let blindRes = blindsecp256k1.blind(m, signerR);
  19. mBlinded = blindRes.mBlinded;
  20. userSecretData = blindRes.userSecretData;
  21. } catch (error) {
  22. console.error(error);
  23. }
  24. }
  25. async function askBlindSign() {
  26. try {
  27. let data = {
  28. m: mBlinded.toString(),
  29. r: {
  30. x: signerR.affineX.toString(),
  31. y: signerR.affineY.toString()
  32. }
  33. };
  34. let res = await axios.post(apiUrl+'/blindsign', data);
  35. blindedSig = blindsecp256k1.newBigFromString(res.data.sBlind);
  36. sig = blindsecp256k1.unblind(
  37. blindedSig,
  38. userSecretData);
  39. } catch (error) {
  40. console.error(error);
  41. }
  42. }
  43. async function verify() {
  44. verified = blindsecp256k1.verify(m, sig, signerQ);
  45. if (!verified) {
  46. errCount++;
  47. printPoint("signerR", signerR);
  48. printPoint("signerQ", signerQ);
  49. console.log("m:", m);
  50. console.log("mBlinded:", mBlinded.toString());
  51. console.log(`userSecretData:\n a: ${userSecretData.a.toString()}\n b: ${userSecretData.b.toString()}`);
  52. printPoint("userSecretData.f", userSecretData.f);
  53. console.log("blinded sig:", blindedSig.toString());
  54. console.log("sig.s:", sig.s.toString());
  55. printPoint("sig.f", sig.f);
  56. console.log("verify", verified);
  57. }
  58. }
  59. async function iteration() {
  60. await newRequest()
  61. await askBlindSign()
  62. await verify()
  63. }
  64. async function main() {
  65. errCount = 0;
  66. for (let i=0; i<10000; i++) {
  67. m = blindsecp256k1.newKeyPair().sk;
  68. await iteration()
  69. if (i%100 ==0) {
  70. console.log("number of iterations", i);
  71. }
  72. }
  73. console.log("errCount", errCount);
  74. }
  75. main()