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.

116 lines
3.6 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. /*
  2. Copyright 2018 0kims association.
  3. This file is part of zksnark JavaScript library.
  4. zksnark JavaScript library is a free software: you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License as published by the
  6. Free Software Foundation, either version 3 of the License, or (at your option)
  7. any later version.
  8. zksnark JavaScript library is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  11. more details.
  12. You should have received a copy of the GNU General Public License along with
  13. zksnark JavaScript library. If not, see <https://www.gnu.org/licenses/>.
  14. */
  15. const BN128 = require("./bn128.js");
  16. const PolField = require("./polfield.js");
  17. const ZqField = require("./zqfield.js");
  18. const bn128 = new BN128();
  19. const PolF = new PolField(new ZqField(bn128.r));
  20. const G1 = bn128.G1;
  21. const G2 = bn128.G2;
  22. module.exports = function genProof(vk_proof, witness) {
  23. const proof = {};
  24. proof.pi_a = G1.zero;
  25. proof.pi_ap = G1.zero;
  26. proof.pi_b = G2.zero;
  27. proof.pi_bp = G1.zero;
  28. proof.pi_c = G1.zero;
  29. proof.pi_cp = G1.zero;
  30. proof.pi_kp = G1.zero;
  31. proof.pi_h = G1.zero;
  32. // Skip public entries and the "1" signal that are forced by the verifier
  33. for (let s= vk_proof.nPublic+1; s< vk_proof.nVars; s++) {
  34. // pi_a = pi_a + A[s] * witness[s];
  35. proof.pi_a = G1.add( proof.pi_a, G1.mulScalar( vk_proof.A[s], witness[s]));
  36. // pi_ap = pi_ap + Ap[s] * witness[s];
  37. proof.pi_ap = G1.add( proof.pi_ap, G1.mulScalar( vk_proof.Ap[s], witness[s]));
  38. }
  39. for (let s= 0; s< vk_proof.nVars; s++) {
  40. // pi_a = pi_a + A[s] * witness[s];
  41. proof.pi_b = G2.add( proof.pi_b, G2.mulScalar( vk_proof.B[s], witness[s]));
  42. // pi_ap = pi_ap + Ap[s] * witness[s];
  43. proof.pi_bp = G1.add( proof.pi_bp, G1.mulScalar( vk_proof.Bp[s], witness[s]));
  44. // pi_a = pi_a + A[s] * witness[s];
  45. proof.pi_c = G1.add( proof.pi_c, G1.mulScalar( vk_proof.C[s], witness[s]));
  46. // pi_ap = pi_ap + Ap[s] * witness[s];
  47. proof.pi_cp = G1.add( proof.pi_cp, G1.mulScalar( vk_proof.Cp[s], witness[s]));
  48. // pi_ap = pi_ap + Ap[s] * witness[s];
  49. proof.pi_kp = G1.add( proof.pi_kp, G1.mulScalar( vk_proof.Kp[s], witness[s]));
  50. }
  51. let polA = [];
  52. let polB = [];
  53. let polC = [];
  54. for (let s= 0; s< vk_proof.nVars; s++) {
  55. polA = PolF.add(
  56. polA,
  57. PolF.mul(
  58. vk_proof.polsA[s],
  59. [witness[s]] ));
  60. polB = PolF.add(
  61. polB,
  62. PolF.mul(
  63. vk_proof.polsB[s],
  64. [witness[s]] ));
  65. polC = PolF.add(
  66. polC,
  67. PolF.mul(
  68. vk_proof.polsC[s],
  69. [witness[s]] ));
  70. }
  71. let polFull = PolF.sub(PolF.mul( polA, polB), polC);
  72. const h = PolF.div(polFull, vk_proof.polZ );
  73. // console.log(h.length + "/" + vk_proof.hExps.length);
  74. for (let i = 0; i < h.length; i++) {
  75. proof.pi_h = G1.add( proof.pi_h, G1.mulScalar( vk_proof.hExps[i], h[i]));
  76. }
  77. proof.pi_a = G1.affine(proof.pi_a);
  78. proof.pi_b = G2.affine(proof.pi_b);
  79. proof.pi_c = G1.affine(proof.pi_c);
  80. proof.pi_ap = G1.affine(proof.pi_ap);
  81. proof.pi_bp = G1.affine(proof.pi_bp);
  82. proof.pi_cp = G1.affine(proof.pi_cp);
  83. proof.pi_kp = G1.affine(proof.pi_kp);
  84. proof.pi_h = G1.affine(proof.pi_h);
  85. const publicSignals = witness.slice(1, vk_proof.nPublic+1);
  86. return {proof, publicSignals};
  87. };