utils.js 2.3 KB

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