123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- /**
- * Checksum operations.
- *
- * @author n1474335 [n1474335@gmail.com]
- * @copyright Crown Copyright 2016
- * @license Apache-2.0
- *
- * @namespace
- */
- var Checksum = {
- /**
- * Fletcher-8 Checksum operation.
- *
- * @param {byteArray} input
- * @param {Object[]} args
- * @returns {string}
- */
- runFletcher8: function(input, args) {
- var a = 0,
- b = 0;
- for (var i = 0; i < input.length; i++) {
- a = (a + input[i]) % 0xf;
- b = (b + a) % 0xf;
- }
- return Utils.hex(((b << 4) | a) >>> 0, 2);
- },
- /**
- * Fletcher-16 Checksum operation.
- *
- * @param {byteArray} input
- * @param {Object[]} args
- * @returns {string}
- */
- runFletcher16: function(input, args) {
- var a = 0,
- b = 0;
- for (var i = 0; i < input.length; i++) {
- a = (a + input[i]) % 0xff;
- b = (b + a) % 0xff;
- }
- return Utils.hex(((b << 8) | a) >>> 0, 4);
- },
- /**
- * Fletcher-32 Checksum operation.
- *
- * @param {byteArray} input
- * @param {Object[]} args
- * @returns {string}
- */
- runFletcher32: function(input, args) {
- var a = 0,
- b = 0;
- for (var i = 0; i < input.length; i++) {
- a = (a + input[i]) % 0xffff;
- b = (b + a) % 0xffff;
- }
- return Utils.hex(((b << 16) | a) >>> 0, 8);
- },
- /**
- * Fletcher-64 Checksum operation.
- *
- * @param {byteArray} input
- * @param {Object[]} args
- * @returns {string}
- */
- runFletcher64: function(input, args) {
- var a = 0,
- b = 0;
- for (var i = 0; i < input.length; i++) {
- a = (a + input[i]) % 0xffffffff;
- b = (b + a) % 0xffffffff;
- }
- return Utils.hex(b >>> 0, 8) + Utils.hex(a >>> 0, 8);
- },
- /**
- * Adler-32 Checksum operation.
- *
- * @param {byteArray} input
- * @param {Object[]} args
- * @returns {string}
- */
- runAdler32: function(input, args) {
- var MOD_ADLER = 65521,
- a = 1,
- b = 0;
- for (var i = 0; i < input.length; i++) {
- a += input[i];
- b += a;
- }
- a %= MOD_ADLER;
- b %= MOD_ADLER;
- return Utils.hex(((b << 16) | a) >>> 0, 8);
- },
- /**
- * CRC-32 Checksum operation.
- *
- * @param {byteArray} input
- * @param {Object[]} args
- * @returns {string}
- */
- runCRC32: function(input, args) {
- var crcTable = window.crcTable || (window.crcTable = Checksum._genCRCTable()),
- crc = 0 ^ (-1);
- for (var i = 0; i < input.length; i++) {
- crc = (crc >>> 8) ^ crcTable[(crc ^ input[i]) & 0xff];
- }
- return Utils.hex((crc ^ (-1)) >>> 0);
- },
- /**
- * TCP/IP Checksum operation.
- *
- * @author GCHQ Contributor [1]
- * @param {byteArray} input
- * @param {Object[]} args
- * @returns {string}
- *
- * @example
- * // returns '3f2c'
- * Checksum.runTcpIp([0x45,0x00,0x00,0x87,0xa3,0x1b,0x40,0x00,0x40,0x06,
- * 0x00,0x00,0xac,0x11,0x00,0x04,0xac,0x11,0x00,0x03])
- *
- * // returns 'a249'
- * Checksum.runTcpIp([0x45,0x00,0x01,0x11,0x3f,0x74,0x40,0x00,0x40,0x06,
- * 0x00,0x00,0xac,0x11,0x00,0x03,0xac,0x11,0x00,0x04])
- */
- runTCPIP: function(input, args) {
- var csum = 0;
- for (var i = 0; i < input.length; i++) {
- if (i % 2 === 0) {
- csum += (input[i] << 8);
- } else {
- csum += input[i];
- }
- }
- csum = (csum >> 16) + (csum & 0xffff);
- return Utils.hex(0xffff - csum);
- },
- /**
- * Generates a CRC table for use with CRC checksums.
- *
- * @private
- * @returns {array}
- */
- _genCRCTable: function() {
- var c,
- crcTable = [];
- for (var n = 0; n < 256; n++) {
- c = n;
- for (var k = 0; k < 8; k++) {
- c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
- }
- crcTable[n] = c;
- }
- return crcTable;
- },
- };
|