|
| 1 | +/** |
| 2 | + * @author r4mos [[email protected]] |
| 3 | + * @copyright Crown Copyright 2025 |
| 4 | + * @license Apache-2.0 |
| 5 | + */ |
| 6 | + |
| 7 | +import Operation from "../Operation.mjs"; |
| 8 | +import Adler32Checksum from "./Adler32Checksum.mjs"; |
| 9 | +import CRCChecksum from "./CRCChecksum.mjs"; |
| 10 | +import Fletcher8Checksum from "./Fletcher8Checksum.mjs"; |
| 11 | +import Fletcher16Checksum from "./Fletcher16Checksum.mjs"; |
| 12 | +import Fletcher32Checksum from "./Fletcher32Checksum.mjs"; |
| 13 | +import Fletcher64Checksum from "./Fletcher64Checksum.mjs"; |
| 14 | + |
| 15 | +/** |
| 16 | + * Generate all checksums operation |
| 17 | + */ |
| 18 | +class GenerateAllChecksums extends Operation { |
| 19 | + |
| 20 | + /** |
| 21 | + * GenerateAllChecksums constructor |
| 22 | + */ |
| 23 | + constructor() { |
| 24 | + super(); |
| 25 | + |
| 26 | + this.name = "Generate all checksums"; |
| 27 | + this.module = "Crypto"; |
| 28 | + this.description = "Generates all available checksums for the input."; |
| 29 | + this.infoURL = "https://wikipedia.org/wiki/Cyclic_redundancy_check"; |
| 30 | + this.inputType = "ArrayBuffer"; |
| 31 | + this.outputType = "string"; |
| 32 | + this.args = [ |
| 33 | + { |
| 34 | + name: "Length (bits)", |
| 35 | + type: "option", |
| 36 | + value: [ |
| 37 | + "All", "3", "4", "5", "6", "7", "8", "10", "11", "12", "13", "14", "15", "16", "17", "21", "24", "30", "31", "32", "40", "64", "82" |
| 38 | + ] |
| 39 | + }, |
| 40 | + { |
| 41 | + name: "Include names", |
| 42 | + type: "boolean", |
| 43 | + value: true |
| 44 | + }, |
| 45 | + ]; |
| 46 | + |
| 47 | + const adler32 = new Adler32Checksum; |
| 48 | + const crc = new CRCChecksum; |
| 49 | + const fletcher8 = new Fletcher8Checksum; |
| 50 | + const fletcher16 = new Fletcher16Checksum; |
| 51 | + const fletcher32 = new Fletcher32Checksum; |
| 52 | + const fletcher64 = new Fletcher64Checksum; |
| 53 | + this.checksums = [ |
| 54 | + {name: "CRC-3/GSM", algo: crc, params: ["CRC-3/GSM"]}, |
| 55 | + {name: "CRC-3/ROHC", algo: crc, params: ["CRC-3/ROHC"]}, |
| 56 | + {name: "CRC-4/G-704", algo: crc, params: ["CRC-4/G-704"]}, |
| 57 | + {name: "CRC-4/INTERLAKEN", algo: crc, params: ["CRC-4/INTERLAKEN"]}, |
| 58 | + {name: "CRC-4/ITU", algo: crc, params: ["CRC-4/ITU"]}, |
| 59 | + {name: "CRC-5/EPC", algo: crc, params: ["CRC-5/EPC"]}, |
| 60 | + {name: "CRC-5/EPC-C1G2", algo: crc, params: ["CRC-5/EPC-C1G2"]}, |
| 61 | + {name: "CRC-5/G-704", algo: crc, params: ["CRC-5/G-704"]}, |
| 62 | + {name: "CRC-5/ITU", algo: crc, params: ["CRC-5/ITU"]}, |
| 63 | + {name: "CRC-5/USB", algo: crc, params: ["CRC-5/USB"]}, |
| 64 | + {name: "CRC-6/CDMA2000-A", algo: crc, params: ["CRC-6/CDMA2000-A"]}, |
| 65 | + {name: "CRC-6/CDMA2000-B", algo: crc, params: ["CRC-6/CDMA2000-B"]}, |
| 66 | + {name: "CRC-6/DARC", algo: crc, params: ["CRC-6/DARC"]}, |
| 67 | + {name: "CRC-6/G-704", algo: crc, params: ["CRC-6/G-704"]}, |
| 68 | + {name: "CRC-6/GSM", algo: crc, params: ["CRC-6/GSM"]}, |
| 69 | + {name: "CRC-6/ITU", algo: crc, params: ["CRC-6/ITU"]}, |
| 70 | + {name: "CRC-7/MMC", algo: crc, params: ["CRC-7/MMC"]}, |
| 71 | + {name: "CRC-7/ROHC", algo: crc, params: ["CRC-7/ROHC"]}, |
| 72 | + {name: "CRC-7/UMTS", algo: crc, params: ["CRC-7/UMTS"]}, |
| 73 | + {name: "CRC-8", algo: crc, params: ["CRC-8"]}, |
| 74 | + {name: "CRC-8/8H2F", algo: crc, params: ["CRC-8/8H2F"]}, |
| 75 | + {name: "CRC-8/AES", algo: crc, params: ["CRC-8/AES"]}, |
| 76 | + {name: "CRC-8/AUTOSAR", algo: crc, params: ["CRC-8/AUTOSAR"]}, |
| 77 | + {name: "CRC-8/BLUETOOTH", algo: crc, params: ["CRC-8/BLUETOOTH"]}, |
| 78 | + {name: "CRC-8/CDMA2000", algo: crc, params: ["CRC-8/CDMA2000"]}, |
| 79 | + {name: "CRC-8/DARC", algo: crc, params: ["CRC-8/DARC"]}, |
| 80 | + {name: "CRC-8/DVB-S2", algo: crc, params: ["CRC-8/DVB-S2"]}, |
| 81 | + {name: "CRC-8/EBU", algo: crc, params: ["CRC-8/EBU"]}, |
| 82 | + {name: "CRC-8/GSM-A", algo: crc, params: ["CRC-8/GSM-A"]}, |
| 83 | + {name: "CRC-8/GSM-B", algo: crc, params: ["CRC-8/GSM-B"]}, |
| 84 | + {name: "CRC-8/HITAG", algo: crc, params: ["CRC-8/HITAG"]}, |
| 85 | + {name: "CRC-8/I-432-1", algo: crc, params: ["CRC-8/I-432-1"]}, |
| 86 | + {name: "CRC-8/I-CODE", algo: crc, params: ["CRC-8/I-CODE"]}, |
| 87 | + {name: "CRC-8/ITU", algo: crc, params: ["CRC-8/ITU"]}, |
| 88 | + {name: "CRC-8/LTE", algo: crc, params: ["CRC-8/LTE"]}, |
| 89 | + {name: "CRC-8/MAXIM", algo: crc, params: ["CRC-8/MAXIM"]}, |
| 90 | + {name: "CRC-8/MAXIM-DOW", algo: crc, params: ["CRC-8/MAXIM-DOW"]}, |
| 91 | + {name: "CRC-8/MIFARE-MAD", algo: crc, params: ["CRC-8/MIFARE-MAD"]}, |
| 92 | + {name: "CRC-8/NRSC-5", algo: crc, params: ["CRC-8/NRSC-5"]}, |
| 93 | + {name: "CRC-8/OPENSAFETY", algo: crc, params: ["CRC-8/OPENSAFETY"]}, |
| 94 | + {name: "CRC-8/ROHC", algo: crc, params: ["CRC-8/ROHC"]}, |
| 95 | + {name: "CRC-8/SAE-J1850", algo: crc, params: ["CRC-8/SAE-J1850"]}, |
| 96 | + {name: "CRC-8/SAE-J1850-ZERO", algo: crc, params: ["CRC-8/SAE-J1850-ZERO"]}, |
| 97 | + {name: "CRC-8/SMBUS", algo: crc, params: ["CRC-8/SMBUS"]}, |
| 98 | + {name: "CRC-8/TECH-3250", algo: crc, params: ["CRC-8/TECH-3250"]}, |
| 99 | + {name: "CRC-8/WCDMA", algo: crc, params: ["CRC-8/WCDMA"]}, |
| 100 | + {name: "Fletcher-8", algo: fletcher8, params: []}, |
| 101 | + {name: "CRC-10/ATM", algo: crc, params: ["CRC-10/ATM"]}, |
| 102 | + {name: "CRC-10/CDMA2000", algo: crc, params: ["CRC-10/CDMA2000"]}, |
| 103 | + {name: "CRC-10/GSM", algo: crc, params: ["CRC-10/GSM"]}, |
| 104 | + {name: "CRC-10/I-610", algo: crc, params: ["CRC-10/I-610"]}, |
| 105 | + {name: "CRC-11/FLEXRAY", algo: crc, params: ["CRC-11/FLEXRAY"]}, |
| 106 | + {name: "CRC-11/UMTS", algo: crc, params: ["CRC-11/UMTS"]}, |
| 107 | + {name: "CRC-12/3GPP", algo: crc, params: ["CRC-12/3GPP"]}, |
| 108 | + {name: "CRC-12/CDMA2000", algo: crc, params: ["CRC-12/CDMA2000"]}, |
| 109 | + {name: "CRC-12/DECT", algo: crc, params: ["CRC-12/DECT"]}, |
| 110 | + {name: "CRC-12/GSM", algo: crc, params: ["CRC-12/GSM"]}, |
| 111 | + {name: "CRC-12/UMTS", algo: crc, params: ["CRC-12/UMTS"]}, |
| 112 | + {name: "CRC-13/BBC", algo: crc, params: ["CRC-13/BBC"]}, |
| 113 | + {name: "CRC-14/DARC", algo: crc, params: ["CRC-14/DARC"]}, |
| 114 | + {name: "CRC-14/GSM", algo: crc, params: ["CRC-14/GSM"]}, |
| 115 | + {name: "CRC-15/CAN", algo: crc, params: ["CRC-15/CAN"]}, |
| 116 | + {name: "CRC-15/MPT1327", algo: crc, params: ["CRC-15/MPT1327"]}, |
| 117 | + {name: "CRC-16", algo: crc, params: ["CRC-16"]}, |
| 118 | + {name: "CRC-16/A", algo: crc, params: ["CRC-16/A"]}, |
| 119 | + {name: "CRC-16/ACORN", algo: crc, params: ["CRC-16/ACORN"]}, |
| 120 | + {name: "CRC-16/ARC", algo: crc, params: ["CRC-16/ARC"]}, |
| 121 | + {name: "CRC-16/AUG-CCITT", algo: crc, params: ["CRC-16/AUG-CCITT"]}, |
| 122 | + {name: "CRC-16/AUTOSAR", algo: crc, params: ["CRC-16/AUTOSAR"]}, |
| 123 | + {name: "CRC-16/B", algo: crc, params: ["CRC-16/B"]}, |
| 124 | + {name: "CRC-16/BLUETOOTH", algo: crc, params: ["CRC-16/BLUETOOTH"]}, |
| 125 | + {name: "CRC-16/BUYPASS", algo: crc, params: ["CRC-16/BUYPASS"]}, |
| 126 | + {name: "CRC-16/CCITT", algo: crc, params: ["CRC-16/CCITT"]}, |
| 127 | + {name: "CRC-16/CCITT-FALSE", algo: crc, params: ["CRC-16/CCITT-FALSE"]}, |
| 128 | + {name: "CRC-16/CCITT-TRUE", algo: crc, params: ["CRC-16/CCITT-TRUE"]}, |
| 129 | + {name: "CRC-16/CCITT-ZERO", algo: crc, params: ["CRC-16/CCITT-ZERO"]}, |
| 130 | + {name: "CRC-16/CDMA2000", algo: crc, params: ["CRC-16/CDMA2000"]}, |
| 131 | + {name: "CRC-16/CMS", algo: crc, params: ["CRC-16/CMS"]}, |
| 132 | + {name: "CRC-16/DARC", algo: crc, params: ["CRC-16/DARC"]}, |
| 133 | + {name: "CRC-16/DDS-110", algo: crc, params: ["CRC-16/DDS-110"]}, |
| 134 | + {name: "CRC-16/DECT-R", algo: crc, params: ["CRC-16/DECT-R"]}, |
| 135 | + {name: "CRC-16/DECT-X", algo: crc, params: ["CRC-16/DECT-X"]}, |
| 136 | + {name: "CRC-16/DNP", algo: crc, params: ["CRC-16/DNP"]}, |
| 137 | + {name: "CRC-16/EN-13757", algo: crc, params: ["CRC-16/EN-13757"]}, |
| 138 | + {name: "CRC-16/EPC", algo: crc, params: ["CRC-16/EPC"]}, |
| 139 | + {name: "CRC-16/EPC-C1G2", algo: crc, params: ["CRC-16/EPC-C1G2"]}, |
| 140 | + {name: "CRC-16/GENIBUS", algo: crc, params: ["CRC-16/GENIBUS"]}, |
| 141 | + {name: "CRC-16/GSM", algo: crc, params: ["CRC-16/GSM"]}, |
| 142 | + {name: "CRC-16/I-CODE", algo: crc, params: ["CRC-16/I-CODE"]}, |
| 143 | + {name: "CRC-16/IBM", algo: crc, params: ["CRC-16/IBM"]}, |
| 144 | + {name: "CRC-16/IBM-3740", algo: crc, params: ["CRC-16/IBM-3740"]}, |
| 145 | + {name: "CRC-16/IBM-SDLC", algo: crc, params: ["CRC-16/IBM-SDLC"]}, |
| 146 | + {name: "CRC-16/IEC-61158-2", algo: crc, params: ["CRC-16/IEC-61158-2"]}, |
| 147 | + {name: "CRC-16/ISO-HDLC", algo: crc, params: ["CRC-16/ISO-HDLC"]}, |
| 148 | + {name: "CRC-16/ISO-IEC-14443-3-A", algo: crc, params: ["CRC-16/ISO-IEC-14443-3-A"]}, |
| 149 | + {name: "CRC-16/ISO-IEC-14443-3-B", algo: crc, params: ["CRC-16/ISO-IEC-14443-3-B"]}, |
| 150 | + {name: "CRC-16/KERMIT", algo: crc, params: ["CRC-16/KERMIT"]}, |
| 151 | + {name: "CRC-16/LHA", algo: crc, params: ["CRC-16/LHA"]}, |
| 152 | + {name: "CRC-16/LJ1200", algo: crc, params: ["CRC-16/LJ1200"]}, |
| 153 | + {name: "CRC-16/LTE", algo: crc, params: ["CRC-16/LTE"]}, |
| 154 | + {name: "CRC-16/M17", algo: crc, params: ["CRC-16/M17"]}, |
| 155 | + {name: "CRC-16/MAXIM", algo: crc, params: ["CRC-16/MAXIM"]}, |
| 156 | + {name: "CRC-16/MAXIM-DOW", algo: crc, params: ["CRC-16/MAXIM-DOW"]}, |
| 157 | + {name: "CRC-16/MCRF4XX", algo: crc, params: ["CRC-16/MCRF4XX"]}, |
| 158 | + {name: "CRC-16/MODBUS", algo: crc, params: ["CRC-16/MODBUS"]}, |
| 159 | + {name: "CRC-16/NRSC-5", algo: crc, params: ["CRC-16/NRSC-5"]}, |
| 160 | + {name: "CRC-16/OPENSAFETY-A", algo: crc, params: ["CRC-16/OPENSAFETY-A"]}, |
| 161 | + {name: "CRC-16/OPENSAFETY-B", algo: crc, params: ["CRC-16/OPENSAFETY-B"]}, |
| 162 | + {name: "CRC-16/PROFIBUS", algo: crc, params: ["CRC-16/PROFIBUS"]}, |
| 163 | + {name: "CRC-16/RIELLO", algo: crc, params: ["CRC-16/RIELLO"]}, |
| 164 | + {name: "CRC-16/SPI-FUJITSU", algo: crc, params: ["CRC-16/SPI-FUJITSU"]}, |
| 165 | + {name: "CRC-16/T10-DIF", algo: crc, params: ["CRC-16/T10-DIF"]}, |
| 166 | + {name: "CRC-16/TELEDISK", algo: crc, params: ["CRC-16/TELEDISK"]}, |
| 167 | + {name: "CRC-16/TMS37157", algo: crc, params: ["CRC-16/TMS37157"]}, |
| 168 | + {name: "CRC-16/UMTS", algo: crc, params: ["CRC-16/UMTS"]}, |
| 169 | + {name: "CRC-16/USB", algo: crc, params: ["CRC-16/USB"]}, |
| 170 | + {name: "CRC-16/V-41-LSB", algo: crc, params: ["CRC-16/V-41-LSB"]}, |
| 171 | + {name: "CRC-16/V-41-MSB", algo: crc, params: ["CRC-16/V-41-MSB"]}, |
| 172 | + {name: "CRC-16/VERIFONE", algo: crc, params: ["CRC-16/VERIFONE"]}, |
| 173 | + {name: "CRC-16/X-25", algo: crc, params: ["CRC-16/X-25"]}, |
| 174 | + {name: "CRC-16/XMODEM", algo: crc, params: ["CRC-16/XMODEM"]}, |
| 175 | + {name: "CRC-16/ZMODEM", algo: crc, params: ["CRC-16/ZMODEM"]}, |
| 176 | + {name: "Fletcher-16", algo: fletcher16, params: []}, |
| 177 | + {name: "CRC-17/CAN-FD", algo: crc, params: ["CRC-17/CAN-FD"]}, |
| 178 | + {name: "CRC-21/CAN-FD", algo: crc, params: ["CRC-21/CAN-FD"]}, |
| 179 | + {name: "CRC-24/BLE", algo: crc, params: ["CRC-24/BLE"]}, |
| 180 | + {name: "CRC-24/FLEXRAY-A", algo: crc, params: ["CRC-24/FLEXRAY-A"]}, |
| 181 | + {name: "CRC-24/FLEXRAY-B", algo: crc, params: ["CRC-24/FLEXRAY-B"]}, |
| 182 | + {name: "CRC-24/INTERLAKEN", algo: crc, params: ["CRC-24/INTERLAKEN"]}, |
| 183 | + {name: "CRC-24/LTE-A", algo: crc, params: ["CRC-24/LTE-A"]}, |
| 184 | + {name: "CRC-24/LTE-B", algo: crc, params: ["CRC-24/LTE-B"]}, |
| 185 | + {name: "CRC-24/OPENPGP", algo: crc, params: ["CRC-24/OPENPGP"]}, |
| 186 | + {name: "CRC-24/OS-9", algo: crc, params: ["CRC-24/OS-9"]}, |
| 187 | + {name: "CRC-30/CDMA", algo: crc, params: ["CRC-30/CDMA"]}, |
| 188 | + {name: "CRC-31/PHILIPS", algo: crc, params: ["CRC-31/PHILIPS"]}, |
| 189 | + {name: "Adler-32", algo: adler32, params: []}, |
| 190 | + {name: "CRC-32", algo: crc, params: ["CRC-32"]}, |
| 191 | + {name: "CRC-32/AAL5", algo: crc, params: ["CRC-32/AAL5"]}, |
| 192 | + {name: "CRC-32/ADCCP", algo: crc, params: ["CRC-32/ADCCP"]}, |
| 193 | + {name: "CRC-32/AIXM", algo: crc, params: ["CRC-32/AIXM"]}, |
| 194 | + {name: "CRC-32/AUTOSAR", algo: crc, params: ["CRC-32/AUTOSAR"]}, |
| 195 | + {name: "CRC-32/BASE91-C", algo: crc, params: ["CRC-32/BASE91-C"]}, |
| 196 | + {name: "CRC-32/BASE91-D", algo: crc, params: ["CRC-32/BASE91-D"]}, |
| 197 | + {name: "CRC-32/BZIP2", algo: crc, params: ["CRC-32/BZIP2"]}, |
| 198 | + {name: "CRC-32/C", algo: crc, params: ["CRC-32/C"]}, |
| 199 | + {name: "CRC-32/CASTAGNOLI", algo: crc, params: ["CRC-32/CASTAGNOLI"]}, |
| 200 | + {name: "CRC-32/CD-ROM-EDC", algo: crc, params: ["CRC-32/CD-ROM-EDC"]}, |
| 201 | + {name: "CRC-32/CKSUM", algo: crc, params: ["CRC-32/CKSUM"]}, |
| 202 | + {name: "CRC-32/D", algo: crc, params: ["CRC-32/D"]}, |
| 203 | + {name: "CRC-32/DECT-B", algo: crc, params: ["CRC-32/DECT-B"]}, |
| 204 | + {name: "CRC-32/INTERLAKEN", algo: crc, params: ["CRC-32/INTERLAKEN"]}, |
| 205 | + {name: "CRC-32/ISCSI", algo: crc, params: ["CRC-32/ISCSI"]}, |
| 206 | + {name: "CRC-32/ISO-HDLC", algo: crc, params: ["CRC-32/ISO-HDLC"]}, |
| 207 | + {name: "CRC-32/JAMCRC", algo: crc, params: ["CRC-32/JAMCRC"]}, |
| 208 | + {name: "CRC-32/MEF", algo: crc, params: ["CRC-32/MEF"]}, |
| 209 | + {name: "CRC-32/MPEG-2", algo: crc, params: ["CRC-32/MPEG-2"]}, |
| 210 | + {name: "CRC-32/NVME", algo: crc, params: ["CRC-32/NVME"]}, |
| 211 | + {name: "CRC-32/PKZIP", algo: crc, params: ["CRC-32/PKZIP"]}, |
| 212 | + {name: "CRC-32/POSIX", algo: crc, params: ["CRC-32/POSIX"]}, |
| 213 | + {name: "CRC-32/Q", algo: crc, params: ["CRC-32/Q"]}, |
| 214 | + {name: "CRC-32/SATA", algo: crc, params: ["CRC-32/SATA"]}, |
| 215 | + {name: "CRC-32/V-42", algo: crc, params: ["CRC-32/V-42"]}, |
| 216 | + {name: "CRC-32/XFER", algo: crc, params: ["CRC-32/XFER"]}, |
| 217 | + {name: "CRC-32/XZ", algo: crc, params: ["CRC-32/XZ"]}, |
| 218 | + {name: "Fletcher-32", algo: fletcher32, params: []}, |
| 219 | + {name: "CRC-40/GSM", algo: crc, params: ["CRC-40/GSM"]}, |
| 220 | + {name: "CRC-64/ECMA-182", algo: crc, params: ["CRC-64/ECMA-182"]}, |
| 221 | + {name: "CRC-64/GO-ECMA", algo: crc, params: ["CRC-64/GO-ECMA"]}, |
| 222 | + {name: "CRC-64/GO-ISO", algo: crc, params: ["CRC-64/GO-ISO"]}, |
| 223 | + {name: "CRC-64/MS", algo: crc, params: ["CRC-64/MS"]}, |
| 224 | + {name: "CRC-64/NVME", algo: crc, params: ["CRC-64/NVME"]}, |
| 225 | + {name: "CRC-64/REDIS", algo: crc, params: ["CRC-64/REDIS"]}, |
| 226 | + {name: "CRC-64/WE", algo: crc, params: ["CRC-64/WE"]}, |
| 227 | + {name: "CRC-64/XZ", algo: crc, params: ["CRC-64/XZ"]}, |
| 228 | + {name: "Fletcher-64", algo: fletcher64, params: []}, |
| 229 | + {name: "CRC-82/DARC", algo: crc, params: ["CRC-82/DARC"]} |
| 230 | + ]; |
| 231 | + } |
| 232 | + |
| 233 | + /** |
| 234 | + * @param {ArrayBuffer} input |
| 235 | + * @param {Object[]} args |
| 236 | + * @returns {string} |
| 237 | + */ |
| 238 | + run(input, args) { |
| 239 | + const [length, includeNames] = args; |
| 240 | + let output = ""; |
| 241 | + this.checksums.forEach(checksum => { |
| 242 | + const checksumLength = checksum.name.match(new RegExp("-(\\d{1,2})(\\/|$)"))[1]; |
| 243 | + if (length === "All" || length === checksumLength) { |
| 244 | + const value = checksum.algo.run(new Uint8Array(input), checksum.params || []); |
| 245 | + output += includeNames ? |
| 246 | + `${checksum.name}:${" ".repeat(25-checksum.name.length)}${value}\n`: |
| 247 | + `${value}\n`; |
| 248 | + } |
| 249 | + }); |
| 250 | + return output; |
| 251 | + } |
| 252 | +} |
| 253 | + |
| 254 | +export default GenerateAllChecksums; |
0 commit comments