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