utils.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. 'use strict';
  2. var assert = require('minimalistic-assert');
  3. var inherits = require('inherits');
  4. exports.inherits = inherits;
  5. function toArray(msg, enc) {
  6. if (Array.isArray(msg))
  7. return msg.slice();
  8. if (!msg)
  9. return [];
  10. var res = [];
  11. if (typeof msg === 'string') {
  12. if (!enc) {
  13. for (var i = 0; i < msg.length; i++) {
  14. var c = msg.charCodeAt(i);
  15. var hi = c >> 8;
  16. var lo = c & 0xff;
  17. if (hi)
  18. res.push(hi, lo);
  19. else
  20. res.push(lo);
  21. }
  22. } else if (enc === 'hex') {
  23. msg = msg.replace(/[^a-z0-9]+/ig, '');
  24. if (msg.length % 2 !== 0)
  25. msg = '0' + msg;
  26. for (i = 0; i < msg.length; i += 2)
  27. res.push(parseInt(msg[i] + msg[i + 1], 16));
  28. }
  29. } else {
  30. for (i = 0; i < msg.length; i++)
  31. res[i] = msg[i] | 0;
  32. }
  33. return res;
  34. }
  35. exports.toArray = toArray;
  36. function toHex(msg) {
  37. var res = '';
  38. for (var i = 0; i < msg.length; i++)
  39. res += zero2(msg[i].toString(16));
  40. return res;
  41. }
  42. exports.toHex = toHex;
  43. function htonl(w) {
  44. var res = (w >>> 24) |
  45. ((w >>> 8) & 0xff00) |
  46. ((w << 8) & 0xff0000) |
  47. ((w & 0xff) << 24);
  48. return res >>> 0;
  49. }
  50. exports.htonl = htonl;
  51. function toHex32(msg, endian) {
  52. var res = '';
  53. for (var i = 0; i < msg.length; i++) {
  54. var w = msg[i];
  55. if (endian === 'little')
  56. w = htonl(w);
  57. res += zero8(w.toString(16));
  58. }
  59. return res;
  60. }
  61. exports.toHex32 = toHex32;
  62. function zero2(word) {
  63. if (word.length === 1)
  64. return '0' + word;
  65. else
  66. return word;
  67. }
  68. exports.zero2 = zero2;
  69. function zero8(word) {
  70. if (word.length === 7)
  71. return '0' + word;
  72. else if (word.length === 6)
  73. return '00' + word;
  74. else if (word.length === 5)
  75. return '000' + word;
  76. else if (word.length === 4)
  77. return '0000' + word;
  78. else if (word.length === 3)
  79. return '00000' + word;
  80. else if (word.length === 2)
  81. return '000000' + word;
  82. else if (word.length === 1)
  83. return '0000000' + word;
  84. else
  85. return word;
  86. }
  87. exports.zero8 = zero8;
  88. function join32(msg, start, end, endian) {
  89. var len = end - start;
  90. assert(len % 4 === 0);
  91. var res = new Array(len / 4);
  92. for (var i = 0, k = start; i < res.length; i++, k += 4) {
  93. var w;
  94. if (endian === 'big')
  95. w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3];
  96. else
  97. w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k];
  98. res[i] = w >>> 0;
  99. }
  100. return res;
  101. }
  102. exports.join32 = join32;
  103. function split32(msg, endian) {
  104. var res = new Array(msg.length * 4);
  105. for (var i = 0, k = 0; i < msg.length; i++, k += 4) {
  106. var m = msg[i];
  107. if (endian === 'big') {
  108. res[k] = m >>> 24;
  109. res[k + 1] = (m >>> 16) & 0xff;
  110. res[k + 2] = (m >>> 8) & 0xff;
  111. res[k + 3] = m & 0xff;
  112. } else {
  113. res[k + 3] = m >>> 24;
  114. res[k + 2] = (m >>> 16) & 0xff;
  115. res[k + 1] = (m >>> 8) & 0xff;
  116. res[k] = m & 0xff;
  117. }
  118. }
  119. return res;
  120. }
  121. exports.split32 = split32;
  122. function rotr32(w, b) {
  123. return (w >>> b) | (w << (32 - b));
  124. }
  125. exports.rotr32 = rotr32;
  126. function rotl32(w, b) {
  127. return (w << b) | (w >>> (32 - b));
  128. }
  129. exports.rotl32 = rotl32;
  130. function sum32(a, b) {
  131. return (a + b) >>> 0;
  132. }
  133. exports.sum32 = sum32;
  134. function sum32_3(a, b, c) {
  135. return (a + b + c) >>> 0;
  136. }
  137. exports.sum32_3 = sum32_3;
  138. function sum32_4(a, b, c, d) {
  139. return (a + b + c + d) >>> 0;
  140. }
  141. exports.sum32_4 = sum32_4;
  142. function sum32_5(a, b, c, d, e) {
  143. return (a + b + c + d + e) >>> 0;
  144. }
  145. exports.sum32_5 = sum32_5;
  146. function sum64(buf, pos, ah, al) {
  147. var bh = buf[pos];
  148. var bl = buf[pos + 1];
  149. var lo = (al + bl) >>> 0;
  150. var hi = (lo < al ? 1 : 0) + ah + bh;
  151. buf[pos] = hi >>> 0;
  152. buf[pos + 1] = lo;
  153. }
  154. exports.sum64 = sum64;
  155. function sum64_hi(ah, al, bh, bl) {
  156. var lo = (al + bl) >>> 0;
  157. var hi = (lo < al ? 1 : 0) + ah + bh;
  158. return hi >>> 0;
  159. }
  160. exports.sum64_hi = sum64_hi;
  161. function sum64_lo(ah, al, bh, bl) {
  162. var lo = al + bl;
  163. return lo >>> 0;
  164. }
  165. exports.sum64_lo = sum64_lo;
  166. function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {
  167. var carry = 0;
  168. var lo = al;
  169. lo = (lo + bl) >>> 0;
  170. carry += lo < al ? 1 : 0;
  171. lo = (lo + cl) >>> 0;
  172. carry += lo < cl ? 1 : 0;
  173. lo = (lo + dl) >>> 0;
  174. carry += lo < dl ? 1 : 0;
  175. var hi = ah + bh + ch + dh + carry;
  176. return hi >>> 0;
  177. }
  178. exports.sum64_4_hi = sum64_4_hi;
  179. function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {
  180. var lo = al + bl + cl + dl;
  181. return lo >>> 0;
  182. }
  183. exports.sum64_4_lo = sum64_4_lo;
  184. function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
  185. var carry = 0;
  186. var lo = al;
  187. lo = (lo + bl) >>> 0;
  188. carry += lo < al ? 1 : 0;
  189. lo = (lo + cl) >>> 0;
  190. carry += lo < cl ? 1 : 0;
  191. lo = (lo + dl) >>> 0;
  192. carry += lo < dl ? 1 : 0;
  193. lo = (lo + el) >>> 0;
  194. carry += lo < el ? 1 : 0;
  195. var hi = ah + bh + ch + dh + eh + carry;
  196. return hi >>> 0;
  197. }
  198. exports.sum64_5_hi = sum64_5_hi;
  199. function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {
  200. var lo = al + bl + cl + dl + el;
  201. return lo >>> 0;
  202. }
  203. exports.sum64_5_lo = sum64_5_lo;
  204. function rotr64_hi(ah, al, num) {
  205. var r = (al << (32 - num)) | (ah >>> num);
  206. return r >>> 0;
  207. }
  208. exports.rotr64_hi = rotr64_hi;
  209. function rotr64_lo(ah, al, num) {
  210. var r = (ah << (32 - num)) | (al >>> num);
  211. return r >>> 0;
  212. }
  213. exports.rotr64_lo = rotr64_lo;
  214. function shr64_hi(ah, al, num) {
  215. return ah >>> num;
  216. }
  217. exports.shr64_hi = shr64_hi;
  218. function shr64_lo(ah, al, num) {
  219. var r = (ah << (32 - num)) | (al >>> num);
  220. return r >>> 0;
  221. }
  222. exports.shr64_lo = shr64_lo;