408497cfda1d684491acea8b355e11031b86307e579db7a352d08884f2907a19e4797e274420e2081f01858c0374fe7a988eb6c3e242514e3266082a1e5d3a 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. 'use strict';
  2. var utils = exports;
  3. var BN = require('bn.js');
  4. var minAssert = require('minimalistic-assert');
  5. var minUtils = require('minimalistic-crypto-utils');
  6. utils.assert = minAssert;
  7. utils.toArray = minUtils.toArray;
  8. utils.zero2 = minUtils.zero2;
  9. utils.toHex = minUtils.toHex;
  10. utils.encode = minUtils.encode;
  11. // Represent num in a w-NAF form
  12. function getNAF(num, w, bits) {
  13. var naf = new Array(Math.max(num.bitLength(), bits) + 1);
  14. var i;
  15. for (i = 0; i < naf.length; i += 1) {
  16. naf[i] = 0;
  17. }
  18. var ws = 1 << (w + 1);
  19. var k = num.clone();
  20. for (i = 0; i < naf.length; i++) {
  21. var z;
  22. var mod = k.andln(ws - 1);
  23. if (k.isOdd()) {
  24. if (mod > (ws >> 1) - 1)
  25. z = (ws >> 1) - mod;
  26. else
  27. z = mod;
  28. k.isubn(z);
  29. } else {
  30. z = 0;
  31. }
  32. naf[i] = z;
  33. k.iushrn(1);
  34. }
  35. return naf;
  36. }
  37. utils.getNAF = getNAF;
  38. // Represent k1, k2 in a Joint Sparse Form
  39. function getJSF(k1, k2) {
  40. var jsf = [
  41. [],
  42. [],
  43. ];
  44. k1 = k1.clone();
  45. k2 = k2.clone();
  46. var d1 = 0;
  47. var d2 = 0;
  48. var m8;
  49. while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {
  50. // First phase
  51. var m14 = (k1.andln(3) + d1) & 3;
  52. var m24 = (k2.andln(3) + d2) & 3;
  53. if (m14 === 3)
  54. m14 = -1;
  55. if (m24 === 3)
  56. m24 = -1;
  57. var u1;
  58. if ((m14 & 1) === 0) {
  59. u1 = 0;
  60. } else {
  61. m8 = (k1.andln(7) + d1) & 7;
  62. if ((m8 === 3 || m8 === 5) && m24 === 2)
  63. u1 = -m14;
  64. else
  65. u1 = m14;
  66. }
  67. jsf[0].push(u1);
  68. var u2;
  69. if ((m24 & 1) === 0) {
  70. u2 = 0;
  71. } else {
  72. m8 = (k2.andln(7) + d2) & 7;
  73. if ((m8 === 3 || m8 === 5) && m14 === 2)
  74. u2 = -m24;
  75. else
  76. u2 = m24;
  77. }
  78. jsf[1].push(u2);
  79. // Second phase
  80. if (2 * d1 === u1 + 1)
  81. d1 = 1 - d1;
  82. if (2 * d2 === u2 + 1)
  83. d2 = 1 - d2;
  84. k1.iushrn(1);
  85. k2.iushrn(1);
  86. }
  87. return jsf;
  88. }
  89. utils.getJSF = getJSF;
  90. function cachedProperty(obj, name, computer) {
  91. var key = '_' + name;
  92. obj.prototype[name] = function cachedProperty() {
  93. return this[key] !== undefined ? this[key] :
  94. this[key] = computer.call(this);
  95. };
  96. }
  97. utils.cachedProperty = cachedProperty;
  98. function parseBytes(bytes) {
  99. return typeof bytes === 'string' ? utils.toArray(bytes, 'hex') :
  100. bytes;
  101. }
  102. utils.parseBytes = parseBytes;
  103. function intFromLE(bytes) {
  104. return new BN(bytes, 'hex', 'le');
  105. }
  106. utils.intFromLE = intFromLE;