Checksum.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /**
  2. * Checksum operations.
  3. *
  4. * @author n1474335 [n1474335@gmail.com]
  5. * @copyright Crown Copyright 2016
  6. * @license Apache-2.0
  7. *
  8. * @namespace
  9. */
  10. var Checksum = {
  11. /**
  12. * Fletcher-8 Checksum operation.
  13. *
  14. * @param {byteArray} input
  15. * @param {Object[]} args
  16. * @returns {string}
  17. */
  18. runFletcher8: function(input, args) {
  19. var a = 0,
  20. b = 0;
  21. for (var i = 0; i < input.length; i++) {
  22. a = (a + input[i]) % 0xf;
  23. b = (b + a) % 0xf;
  24. }
  25. return Utils.hex(((b << 4) | a) >>> 0, 2);
  26. },
  27. /**
  28. * Fletcher-16 Checksum operation.
  29. *
  30. * @param {byteArray} input
  31. * @param {Object[]} args
  32. * @returns {string}
  33. */
  34. runFletcher16: function(input, args) {
  35. var a = 0,
  36. b = 0;
  37. for (var i = 0; i < input.length; i++) {
  38. a = (a + input[i]) % 0xff;
  39. b = (b + a) % 0xff;
  40. }
  41. return Utils.hex(((b << 8) | a) >>> 0, 4);
  42. },
  43. /**
  44. * Fletcher-32 Checksum operation.
  45. *
  46. * @param {byteArray} input
  47. * @param {Object[]} args
  48. * @returns {string}
  49. */
  50. runFletcher32: function(input, args) {
  51. var a = 0,
  52. b = 0;
  53. for (var i = 0; i < input.length; i++) {
  54. a = (a + input[i]) % 0xffff;
  55. b = (b + a) % 0xffff;
  56. }
  57. return Utils.hex(((b << 16) | a) >>> 0, 8);
  58. },
  59. /**
  60. * Fletcher-64 Checksum operation.
  61. *
  62. * @param {byteArray} input
  63. * @param {Object[]} args
  64. * @returns {string}
  65. */
  66. runFletcher64: function(input, args) {
  67. var a = 0,
  68. b = 0;
  69. for (var i = 0; i < input.length; i++) {
  70. a = (a + input[i]) % 0xffffffff;
  71. b = (b + a) % 0xffffffff;
  72. }
  73. return Utils.hex(b >>> 0, 8) + Utils.hex(a >>> 0, 8);
  74. },
  75. /**
  76. * Adler-32 Checksum operation.
  77. *
  78. * @param {byteArray} input
  79. * @param {Object[]} args
  80. * @returns {string}
  81. */
  82. runAdler32: function(input, args) {
  83. var MOD_ADLER = 65521,
  84. a = 1,
  85. b = 0;
  86. for (var i = 0; i < input.length; i++) {
  87. a += input[i];
  88. b += a;
  89. }
  90. a %= MOD_ADLER;
  91. b %= MOD_ADLER;
  92. return Utils.hex(((b << 16) | a) >>> 0, 8);
  93. },
  94. /**
  95. * CRC-32 Checksum operation.
  96. *
  97. * @param {byteArray} input
  98. * @param {Object[]} args
  99. * @returns {string}
  100. */
  101. runCRC32: function(input, args) {
  102. var crcTable = window.crcTable || (window.crcTable = Checksum._genCRCTable()),
  103. crc = 0 ^ (-1);
  104. for (var i = 0; i < input.length; i++) {
  105. crc = (crc >>> 8) ^ crcTable[(crc ^ input[i]) & 0xff];
  106. }
  107. return Utils.hex((crc ^ (-1)) >>> 0);
  108. },
  109. /**
  110. * TCP/IP Checksum operation.
  111. *
  112. * @author GCHQ Contributor [1]
  113. * @param {byteArray} input
  114. * @param {Object[]} args
  115. * @returns {string}
  116. *
  117. * @example
  118. * // returns '3f2c'
  119. * Checksum.runTcpIp([0x45,0x00,0x00,0x87,0xa3,0x1b,0x40,0x00,0x40,0x06,
  120. * 0x00,0x00,0xac,0x11,0x00,0x04,0xac,0x11,0x00,0x03])
  121. *
  122. * // returns 'a249'
  123. * Checksum.runTcpIp([0x45,0x00,0x01,0x11,0x3f,0x74,0x40,0x00,0x40,0x06,
  124. * 0x00,0x00,0xac,0x11,0x00,0x03,0xac,0x11,0x00,0x04])
  125. */
  126. runTCPIP: function(input, args) {
  127. var csum = 0;
  128. for (var i = 0; i < input.length; i++) {
  129. if (i % 2 === 0) {
  130. csum += (input[i] << 8);
  131. } else {
  132. csum += input[i];
  133. }
  134. }
  135. csum = (csum >> 16) + (csum & 0xffff);
  136. return Utils.hex(0xffff - csum);
  137. },
  138. /**
  139. * Generates a CRC table for use with CRC checksums.
  140. *
  141. * @private
  142. * @returns {array}
  143. */
  144. _genCRCTable: function() {
  145. var c,
  146. crcTable = [];
  147. for (var n = 0; n < 256; n++) {
  148. c = n;
  149. for (var k = 0; k < 8; k++) {
  150. c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
  151. }
  152. crcTable[n] = c;
  153. }
  154. return crcTable;
  155. },
  156. };