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.

138 lines
3.9 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. console.log("==verification failed on client==", res.data.verification);
  48. printPoint("signerR", signerR);
  49. printPoint("signerQ", signerQ);
  50. console.log("m:", m.toString());
  51. console.log("mBlinded:", mBlinded.toString());
  52. console.log(`userSecretData:\n a: ${userSecretData.a.toString()}\n b: ${userSecretData.b.toString()}`);
  53. printPoint("userSecretData.f", userSecretData.f);
  54. console.log("blinded sig:", blindedSig.toString());
  55. console.log("sig.s:", sig.s.toString());
  56. printPoint("sig.f", sig.f);
  57. console.log("verify", verified);
  58. }
  59. // send to verify by the go server
  60. let data = {
  61. m: m.toString(),
  62. sig: {
  63. S: sig.s.toString(),
  64. F: {
  65. x: sig.f.affineX.toString(),
  66. y: sig.f.affineY.toString()
  67. }
  68. },
  69. q: {
  70. x: signerQ.affineX.toString(),
  71. y: signerQ.affineY.toString()
  72. }
  73. };
  74. try {
  75. let res = await axios.post(apiUrl+'/verify', data);
  76. if (!res.data.verification) {
  77. errCount++;
  78. console.log("==verification failed on server==", res.data.verification);
  79. printPoint("signerR", signerR);
  80. printPoint("signerQ", signerQ);
  81. console.log("m:", m.toString());
  82. console.log("mBlinded:", mBlinded.toString());
  83. console.log(`userSecretData:\n a: ${userSecretData.a.toString()}\n b: ${userSecretData.b.toString()}`);
  84. printPoint("userSecretData.f", userSecretData.f);
  85. console.log("blinded sig:", blindedSig.toString());
  86. console.log("sig.s:", sig.s.toString());
  87. printPoint("sig.f", sig.f);
  88. console.log("verify", verified);
  89. }
  90. } catch (error) {
  91. console.error(error.response.data);
  92. errCount++;
  93. console.log("==verification failed on server==", error.response.data.verification);
  94. printPoint("signerR", signerR);
  95. printPoint("signerQ", signerQ);
  96. console.log("m:", m.toString());
  97. console.log("mBlinded:", mBlinded.toString());
  98. console.log(`userSecretData:\n a: ${userSecretData.a.toString()}\n b: ${userSecretData.b.toString()}`);
  99. printPoint("userSecretData.f", userSecretData.f);
  100. console.log("blinded sig:", blindedSig.toString());
  101. console.log("sig.s:", sig.s.toString());
  102. printPoint("sig.f", sig.f);
  103. console.log("js verify", verified);
  104. }
  105. }
  106. async function iteration() {
  107. await newRequest()
  108. await askBlindSign()
  109. await verify()
  110. }
  111. async function main() {
  112. errCount = 0;
  113. for (let i=0; i<10000; i++) {
  114. m = blindsecp256k1.newKeyPair().sk;
  115. await iteration()
  116. if (i%100 ==0) {
  117. console.log("number of iterations", i);
  118. }
  119. }
  120. console.log("errCount", errCount);
  121. }
  122. main()