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.

147 lines
2.9 KiB

  1. const F1Field = require("ffjavascript").F1Field;
  2. const Scalar = require("ffjavascript").Scalar;
  3. exports.p =
  4. Scalar.fromString("21888242871839275222246405745257275088548364400416034343698204186575808495617");
  5. const Fr = new F1Field(exports.p);
  6. const chai = require("chai");
  7. const assert = chai.assert;
  8. module.exports = {
  9. bytesToU64,
  10. u64ToBytes,
  11. u64ToBits,
  12. bytesToBits,
  13. u64ArrayToBits,
  14. bitsToU64,
  15. bitsToBytes,
  16. bitsToU64Array,
  17. strsToBigInts,
  18. intsToBigInts,
  19. bigIntsToInts,
  20. bufferToBytes
  21. };
  22. function bytesToU64(byteArray) {
  23. // var value = 0;
  24. var value = Fr.e(0);
  25. for ( var i = byteArray.length - 1; i >= 0; i--) {
  26. // value = (value * 256) + byteArray[i];
  27. value = Fr.add(Fr.mul(Fr.e(value), Fr.e(256)), Fr.e(byteArray[i]));
  28. }
  29. return value;
  30. }
  31. function u64ToBytes(a) {
  32. var b = Fr.e(a);
  33. const buff = new Uint8Array(8);
  34. Scalar.toRprLE(buff, 0, b, 8);
  35. return buff;
  36. }
  37. function u64ToBits(a) {
  38. const aBytes = u64ToBytes(a);
  39. return bytesToBits(aBytes);
  40. }
  41. function bytesToBits(b) {
  42. const bits = [];
  43. for (let i = 0; i < b.length; i++) {
  44. for (let j = 0; j < 8; j++) {
  45. if ((Number(b[i])&(1<<j)) > 0) {
  46. // bits.push(Fr.e(1));
  47. bits.push(1);
  48. } else {
  49. // bits.push(Fr.e(0));
  50. bits.push(0);
  51. }
  52. }
  53. }
  54. return bits
  55. }
  56. function u64ArrayToBits(u) {
  57. let r = [];
  58. for (let i = 0; i < u.length; i++) {
  59. r = r.concat(u64ToBits(u[i]));
  60. }
  61. return r
  62. }
  63. function bitsToU64(b) {
  64. if (b.length != 64) {
  65. console.log("b.length = ", b.length, " max=64");
  66. return;
  67. }
  68. const by = bitsToBytes(b)
  69. return bytesToU64(by)
  70. }
  71. function bitsToBytes(a) {
  72. const b = [];
  73. for (let i=0; i<a.length; i++) {
  74. const p = Math.floor(i/8);
  75. if (b[p]==undefined) {
  76. b[p] = 0;
  77. }
  78. if (a[i]==1) {
  79. b[p] |= 1<<(i%8);
  80. }
  81. }
  82. return b;
  83. }
  84. function bitsToU64Array(b) {
  85. const r = [];
  86. for (let i = 0; i < b.length/64; i++) {
  87. r.push(bitsToU64(b.slice(i*64, i*64+64)));
  88. }
  89. return r
  90. }
  91. function strsToBigInts(a) {
  92. let b = [];
  93. for (let i=0; i<a.length; i++) {
  94. b[i] = Fr.e(a[i]);
  95. }
  96. return b;
  97. }
  98. function intsToBigInts(a) {
  99. let b = [];
  100. for (let i=0; i<a.length; i++) {
  101. b[i] = Fr.e(a[i]);
  102. }
  103. return b;
  104. }
  105. function bigIntsToInts(a) {
  106. let b = [];
  107. for (let i=0; i<a.length; i++) {
  108. b[i] = Number(a[i]);
  109. }
  110. return b;
  111. }
  112. function bufferToBytes(buff) {
  113. const bytes = [];
  114. for (let i = 0; i < buff.length; i++) {
  115. bytes.push(buff[i]);
  116. }
  117. return bytes;
  118. }
  119. describe("Utils test", function () {
  120. this.timeout(100000);
  121. it ("utils", async () => {
  122. let a = 3;
  123. let aBits = u64ToBits(a);
  124. let a2 = bitsToU64(aBits);
  125. assert.equal(a2, a);
  126. a = 12345;
  127. aBits = u64ToBits(a);
  128. a2 = bitsToU64(aBits);
  129. assert.equal(a2, a);
  130. a = intsToBigInts([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]);
  131. aBits = u64ArrayToBits(a);
  132. a2 = bitsToU64Array(aBits);
  133. assert.deepEqual(a2, a);
  134. });
  135. });