Showing preview only (6,286K chars total). Download the full file or copy to clipboard to get everything.
Repository: gchq/CyberChef
Branch: master
Commit: 607acbd24e64
Files: 871
Total size: 5.9 MB
Directory structure:
gitextract_priqvjog/
├── .cspell.json
├── .devcontainer/
│ └── devcontainer.json
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.md
│ │ ├── feature-request.md
│ │ └── operation-request.md
│ ├── ISSUE_TEMPLATE.md
│ ├── dependabot.yml
│ └── workflows/
│ ├── master.yml
│ ├── pull_requests.yml
│ └── releases.yml
├── .gitignore
├── .npmignore
├── .nvmrc
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── Dockerfile
├── Gruntfile.js
├── LICENSE
├── README.md
├── SECURITY.md
├── babel.config.js
├── eslint.config.mjs
├── nightwatch.json
├── package.json
├── postcss.config.js
├── src/
│ ├── core/
│ │ ├── Chef.mjs
│ │ ├── ChefWorker.js
│ │ ├── Dish.mjs
│ │ ├── Ingredient.mjs
│ │ ├── Operation.mjs
│ │ ├── Recipe.mjs
│ │ ├── Utils.mjs
│ │ ├── config/
│ │ │ ├── Categories.json
│ │ │ └── scripts/
│ │ │ ├── generateConfig.mjs
│ │ │ ├── generateOpsIndex.mjs
│ │ │ ├── newMinorVersion.mjs
│ │ │ └── newOperation.mjs
│ │ ├── dishTypes/
│ │ │ ├── DishBigNumber.mjs
│ │ │ ├── DishByteArray.mjs
│ │ │ ├── DishFile.mjs
│ │ │ ├── DishHTML.mjs
│ │ │ ├── DishJSON.mjs
│ │ │ ├── DishListFile.mjs
│ │ │ ├── DishNumber.mjs
│ │ │ ├── DishString.mjs
│ │ │ ├── DishType.mjs
│ │ │ └── index.mjs
│ │ ├── errors/
│ │ │ ├── DishError.mjs
│ │ │ ├── ExcludedOperationError.mjs
│ │ │ ├── OperationError.mjs
│ │ │ └── index.mjs
│ │ ├── lib/
│ │ │ ├── Arithmetic.mjs
│ │ │ ├── AudioBytes.mjs
│ │ │ ├── AudioMetaSchema.mjs
│ │ │ ├── AudioParsers.mjs
│ │ │ ├── BCD.mjs
│ │ │ ├── Bacon.mjs
│ │ │ ├── Base32.mjs
│ │ │ ├── Base45.mjs
│ │ │ ├── Base58.mjs
│ │ │ ├── Base64.mjs
│ │ │ ├── Base85.mjs
│ │ │ ├── Base92.mjs
│ │ │ ├── Bech32.mjs
│ │ │ ├── BigIntUtils.mjs
│ │ │ ├── Binary.mjs
│ │ │ ├── BitwiseOp.mjs
│ │ │ ├── Blowfish.mjs
│ │ │ ├── Bombe.mjs
│ │ │ ├── Braille.mjs
│ │ │ ├── CanvasComponents.mjs
│ │ │ ├── Charts.mjs
│ │ │ ├── ChrEnc.mjs
│ │ │ ├── CipherSaber2.mjs
│ │ │ ├── Ciphers.mjs
│ │ │ ├── Code.mjs
│ │ │ ├── Colossus.mjs
│ │ │ ├── ConvertCoordinates.mjs
│ │ │ ├── Crypt.mjs
│ │ │ ├── DateTime.mjs
│ │ │ ├── Decimal.mjs
│ │ │ ├── Delim.mjs
│ │ │ ├── Enigma.mjs
│ │ │ ├── Extract.mjs
│ │ │ ├── FileSignatures.mjs
│ │ │ ├── FileType.mjs
│ │ │ ├── FlowControl.mjs
│ │ │ ├── FuzzyMatch.mjs
│ │ │ ├── Hash.mjs
│ │ │ ├── Hex.mjs
│ │ │ ├── IP.mjs
│ │ │ ├── JA4.mjs
│ │ │ ├── JWT.mjs
│ │ │ ├── LS47.mjs
│ │ │ ├── LZNT1.mjs
│ │ │ ├── LZString.mjs
│ │ │ ├── LoremIpsum.mjs
│ │ │ ├── Lorenz.mjs
│ │ │ ├── Magic.mjs
│ │ │ ├── Modhex.mjs
│ │ │ ├── PGP.mjs
│ │ │ ├── Protobuf.mjs
│ │ │ ├── Protocol.mjs
│ │ │ ├── PublicKey.mjs
│ │ │ ├── QRCode.mjs
│ │ │ ├── RC6.mjs
│ │ │ ├── RSA.mjs
│ │ │ ├── Rotate.mjs
│ │ │ ├── SIGABA.mjs
│ │ │ ├── SM2.mjs
│ │ │ ├── SM4.mjs
│ │ │ ├── Salsa20.mjs
│ │ │ ├── Sort.mjs
│ │ │ ├── Stream.mjs
│ │ │ ├── TLS.mjs
│ │ │ ├── TLVParser.mjs
│ │ │ ├── Typex.mjs
│ │ │ ├── XXTEA.mjs
│ │ │ └── Zlib.mjs
│ │ ├── operations/
│ │ │ ├── A1Z26CipherDecode.mjs
│ │ │ ├── A1Z26CipherEncode.mjs
│ │ │ ├── ADD.mjs
│ │ │ ├── AESDecrypt.mjs
│ │ │ ├── AESEncrypt.mjs
│ │ │ ├── AESKeyUnwrap.mjs
│ │ │ ├── AESKeyWrap.mjs
│ │ │ ├── AMFDecode.mjs
│ │ │ ├── AMFEncode.mjs
│ │ │ ├── AND.mjs
│ │ │ ├── AddLineNumbers.mjs
│ │ │ ├── AddTextToImage.mjs
│ │ │ ├── Adler32Checksum.mjs
│ │ │ ├── AffineCipherDecode.mjs
│ │ │ ├── AffineCipherEncode.mjs
│ │ │ ├── AlternatingCaps.mjs
│ │ │ ├── AnalyseHash.mjs
│ │ │ ├── AnalyseUUID.mjs
│ │ │ ├── Argon2.mjs
│ │ │ ├── Argon2Compare.mjs
│ │ │ ├── AtbashCipher.mjs
│ │ │ ├── AvroToJSON.mjs
│ │ │ ├── BLAKE2b.mjs
│ │ │ ├── BLAKE2s.mjs
│ │ │ ├── BLAKE3.mjs
│ │ │ ├── BSONDeserialise.mjs
│ │ │ ├── BSONSerialise.mjs
│ │ │ ├── BaconCipherDecode.mjs
│ │ │ ├── BaconCipherEncode.mjs
│ │ │ ├── Bcrypt.mjs
│ │ │ ├── BcryptCompare.mjs
│ │ │ ├── BcryptParse.mjs
│ │ │ ├── BifidCipherDecode.mjs
│ │ │ ├── BifidCipherEncode.mjs
│ │ │ ├── BitShiftLeft.mjs
│ │ │ ├── BitShiftRight.mjs
│ │ │ ├── BlowfishDecrypt.mjs
│ │ │ ├── BlowfishEncrypt.mjs
│ │ │ ├── BlurImage.mjs
│ │ │ ├── Bombe.mjs
│ │ │ ├── Bzip2Compress.mjs
│ │ │ ├── Bzip2Decompress.mjs
│ │ │ ├── CBORDecode.mjs
│ │ │ ├── CBOREncode.mjs
│ │ │ ├── CMAC.mjs
│ │ │ ├── CRCChecksum.mjs
│ │ │ ├── CSSBeautify.mjs
│ │ │ ├── CSSMinify.mjs
│ │ │ ├── CSSSelector.mjs
│ │ │ ├── CSVToJSON.mjs
│ │ │ ├── CTPH.mjs
│ │ │ ├── CaesarBoxCipher.mjs
│ │ │ ├── CaretMdecode.mjs
│ │ │ ├── CartesianProduct.mjs
│ │ │ ├── CetaceanCipherDecode.mjs
│ │ │ ├── CetaceanCipherEncode.mjs
│ │ │ ├── ChaCha.mjs
│ │ │ ├── ChangeIPFormat.mjs
│ │ │ ├── ChiSquare.mjs
│ │ │ ├── CipherSaber2Decrypt.mjs
│ │ │ ├── CipherSaber2Encrypt.mjs
│ │ │ ├── CitrixCTX1Decode.mjs
│ │ │ ├── CitrixCTX1Encode.mjs
│ │ │ ├── Colossus.mjs
│ │ │ ├── Comment.mjs
│ │ │ ├── CompareCTPHHashes.mjs
│ │ │ ├── CompareSSDEEPHashes.mjs
│ │ │ ├── ConditionalJump.mjs
│ │ │ ├── ContainImage.mjs
│ │ │ ├── ConvertArea.mjs
│ │ │ ├── ConvertCoordinateFormat.mjs
│ │ │ ├── ConvertDataUnits.mjs
│ │ │ ├── ConvertDistance.mjs
│ │ │ ├── ConvertImageFormat.mjs
│ │ │ ├── ConvertLeetSpeak.mjs
│ │ │ ├── ConvertMass.mjs
│ │ │ ├── ConvertSpeed.mjs
│ │ │ ├── ConvertToNATOAlphabet.mjs
│ │ │ ├── CountOccurrences.mjs
│ │ │ ├── CoverImage.mjs
│ │ │ ├── CropImage.mjs
│ │ │ ├── DESDecrypt.mjs
│ │ │ ├── DESEncrypt.mjs
│ │ │ ├── DNSOverHTTPS.mjs
│ │ │ ├── DateTimeDelta.mjs
│ │ │ ├── DechunkHTTPResponse.mjs
│ │ │ ├── DecodeNetBIOSName.mjs
│ │ │ ├── DecodeText.mjs
│ │ │ ├── DefangIPAddresses.mjs
│ │ │ ├── DefangURL.mjs
│ │ │ ├── DeriveEVPKey.mjs
│ │ │ ├── DeriveHKDFKey.mjs
│ │ │ ├── DerivePBKDF2Key.mjs
│ │ │ ├── DetectFileType.mjs
│ │ │ ├── Diff.mjs
│ │ │ ├── DisassembleARM.mjs
│ │ │ ├── DisassembleX86.mjs
│ │ │ ├── DitherImage.mjs
│ │ │ ├── Divide.mjs
│ │ │ ├── DropBytes.mjs
│ │ │ ├── DropNthBytes.mjs
│ │ │ ├── ECDSASign.mjs
│ │ │ ├── ECDSASignatureConversion.mjs
│ │ │ ├── ECDSAVerify.mjs
│ │ │ ├── ELFInfo.mjs
│ │ │ ├── EncodeNetBIOSName.mjs
│ │ │ ├── EncodeText.mjs
│ │ │ ├── Enigma.mjs
│ │ │ ├── Entropy.mjs
│ │ │ ├── EscapeString.mjs
│ │ │ ├── EscapeUnicodeCharacters.mjs
│ │ │ ├── ExpandAlphabetRange.mjs
│ │ │ ├── ExtractAudioMetadata.mjs
│ │ │ ├── ExtractDates.mjs
│ │ │ ├── ExtractDomains.mjs
│ │ │ ├── ExtractEXIF.mjs
│ │ │ ├── ExtractEmailAddresses.mjs
│ │ │ ├── ExtractFilePaths.mjs
│ │ │ ├── ExtractFiles.mjs
│ │ │ ├── ExtractHashes.mjs
│ │ │ ├── ExtractID3.mjs
│ │ │ ├── ExtractIPAddresses.mjs
│ │ │ ├── ExtractLSB.mjs
│ │ │ ├── ExtractMACAddresses.mjs
│ │ │ ├── ExtractRGBA.mjs
│ │ │ ├── ExtractURLs.mjs
│ │ │ ├── FangURL.mjs
│ │ │ ├── FernetDecrypt.mjs
│ │ │ ├── FernetEncrypt.mjs
│ │ │ ├── FileTree.mjs
│ │ │ ├── Filter.mjs
│ │ │ ├── FindReplace.mjs
│ │ │ ├── FlaskSessionDecode.mjs
│ │ │ ├── FlaskSessionSign.mjs
│ │ │ ├── FlaskSessionVerify.mjs
│ │ │ ├── Fletcher16Checksum.mjs
│ │ │ ├── Fletcher32Checksum.mjs
│ │ │ ├── Fletcher64Checksum.mjs
│ │ │ ├── Fletcher8Checksum.mjs
│ │ │ ├── FlipImage.mjs
│ │ │ ├── Fork.mjs
│ │ │ ├── FormatMACAddresses.mjs
│ │ │ ├── FrequencyDistribution.mjs
│ │ │ ├── FromBCD.mjs
│ │ │ ├── FromBase.mjs
│ │ │ ├── FromBase32.mjs
│ │ │ ├── FromBase45.mjs
│ │ │ ├── FromBase58.mjs
│ │ │ ├── FromBase62.mjs
│ │ │ ├── FromBase64.mjs
│ │ │ ├── FromBase85.mjs
│ │ │ ├── FromBase92.mjs
│ │ │ ├── FromBech32.mjs
│ │ │ ├── FromBinary.mjs
│ │ │ ├── FromBraille.mjs
│ │ │ ├── FromCaseInsensitiveRegex.mjs
│ │ │ ├── FromCharcode.mjs
│ │ │ ├── FromDecimal.mjs
│ │ │ ├── FromFloat.mjs
│ │ │ ├── FromHTMLEntity.mjs
│ │ │ ├── FromHex.mjs
│ │ │ ├── FromHexContent.mjs
│ │ │ ├── FromHexdump.mjs
│ │ │ ├── FromMessagePack.mjs
│ │ │ ├── FromModhex.mjs
│ │ │ ├── FromMorseCode.mjs
│ │ │ ├── FromOctal.mjs
│ │ │ ├── FromPunycode.mjs
│ │ │ ├── FromQuotedPrintable.mjs
│ │ │ ├── FromUNIXTimestamp.mjs
│ │ │ ├── FuzzyMatch.mjs
│ │ │ ├── GOSTDecrypt.mjs
│ │ │ ├── GOSTEncrypt.mjs
│ │ │ ├── GOSTHash.mjs
│ │ │ ├── GOSTKeyUnwrap.mjs
│ │ │ ├── GOSTKeyWrap.mjs
│ │ │ ├── GOSTSign.mjs
│ │ │ ├── GOSTVerify.mjs
│ │ │ ├── GenerateAllChecksums.mjs
│ │ │ ├── GenerateAllHashes.mjs
│ │ │ ├── GenerateDeBruijnSequence.mjs
│ │ │ ├── GenerateECDSAKeyPair.mjs
│ │ │ ├── GenerateHOTP.mjs
│ │ │ ├── GenerateImage.mjs
│ │ │ ├── GenerateLoremIpsum.mjs
│ │ │ ├── GeneratePGPKeyPair.mjs
│ │ │ ├── GenerateQRCode.mjs
│ │ │ ├── GenerateRSAKeyPair.mjs
│ │ │ ├── GenerateTOTP.mjs
│ │ │ ├── GenerateUUID.mjs
│ │ │ ├── GenericCodeBeautify.mjs
│ │ │ ├── GetAllCasings.mjs
│ │ │ ├── GetTime.mjs
│ │ │ ├── GroupIPAddresses.mjs
│ │ │ ├── Gunzip.mjs
│ │ │ ├── Gzip.mjs
│ │ │ ├── HAS160.mjs
│ │ │ ├── HASSHClientFingerprint.mjs
│ │ │ ├── HASSHServerFingerprint.mjs
│ │ │ ├── HMAC.mjs
│ │ │ ├── HTMLToText.mjs
│ │ │ ├── HTTPRequest.mjs
│ │ │ ├── HammingDistance.mjs
│ │ │ ├── HaversineDistance.mjs
│ │ │ ├── Head.mjs
│ │ │ ├── HeatmapChart.mjs
│ │ │ ├── HexDensityChart.mjs
│ │ │ ├── HexToObjectIdentifier.mjs
│ │ │ ├── HexToPEM.mjs
│ │ │ ├── IPv6TransitionAddresses.mjs
│ │ │ ├── ImageBrightnessContrast.mjs
│ │ │ ├── ImageFilter.mjs
│ │ │ ├── ImageHueSaturationLightness.mjs
│ │ │ ├── ImageOpacity.mjs
│ │ │ ├── IndexOfCoincidence.mjs
│ │ │ ├── InvertImage.mjs
│ │ │ ├── JA3Fingerprint.mjs
│ │ │ ├── JA3SFingerprint.mjs
│ │ │ ├── JA4Fingerprint.mjs
│ │ │ ├── JA4ServerFingerprint.mjs
│ │ │ ├── JPathExpression.mjs
│ │ │ ├── JSONBeautify.mjs
│ │ │ ├── JSONMinify.mjs
│ │ │ ├── JSONToCSV.mjs
│ │ │ ├── JSONtoYAML.mjs
│ │ │ ├── JWKToPem.mjs
│ │ │ ├── JWTDecode.mjs
│ │ │ ├── JWTSign.mjs
│ │ │ ├── JWTVerify.mjs
│ │ │ ├── JavaScriptBeautify.mjs
│ │ │ ├── JavaScriptMinify.mjs
│ │ │ ├── JavaScriptParser.mjs
│ │ │ ├── Jq.mjs
│ │ │ ├── Jsonata.mjs
│ │ │ ├── Jump.mjs
│ │ │ ├── Keccak.mjs
│ │ │ ├── LMHash.mjs
│ │ │ ├── LS47Decrypt.mjs
│ │ │ ├── LS47Encrypt.mjs
│ │ │ ├── LZ4Compress.mjs
│ │ │ ├── LZ4Decompress.mjs
│ │ │ ├── LZMACompress.mjs
│ │ │ ├── LZMADecompress.mjs
│ │ │ ├── LZNT1Decompress.mjs
│ │ │ ├── LZStringCompress.mjs
│ │ │ ├── LZStringDecompress.mjs
│ │ │ ├── Label.mjs
│ │ │ ├── LevenshteinDistance.mjs
│ │ │ ├── Lorenz.mjs
│ │ │ ├── LuhnChecksum.mjs
│ │ │ ├── MD2.mjs
│ │ │ ├── MD4.mjs
│ │ │ ├── MD5.mjs
│ │ │ ├── MD6.mjs
│ │ │ ├── MIMEDecoding.mjs
│ │ │ ├── Magic.mjs
│ │ │ ├── Mean.mjs
│ │ │ ├── Median.mjs
│ │ │ ├── Merge.mjs
│ │ │ ├── MicrosoftScriptDecoder.mjs
│ │ │ ├── MultipleBombe.mjs
│ │ │ ├── Multiply.mjs
│ │ │ ├── MurmurHash3.mjs
│ │ │ ├── NOT.mjs
│ │ │ ├── NTHash.mjs
│ │ │ ├── NormaliseImage.mjs
│ │ │ ├── NormaliseUnicode.mjs
│ │ │ ├── Numberwang.mjs
│ │ │ ├── OR.mjs
│ │ │ ├── ObjectIdentifierToHex.mjs
│ │ │ ├── OffsetChecker.mjs
│ │ │ ├── OpticalCharacterRecognition.mjs
│ │ │ ├── PEMToHex.mjs
│ │ │ ├── PEMToJWK.mjs
│ │ │ ├── PGPDecrypt.mjs
│ │ │ ├── PGPDecryptAndVerify.mjs
│ │ │ ├── PGPEncrypt.mjs
│ │ │ ├── PGPEncryptAndSign.mjs
│ │ │ ├── PGPVerify.mjs
│ │ │ ├── PHPDeserialize.mjs
│ │ │ ├── PHPSerialize.mjs
│ │ │ ├── PLISTViewer.mjs
│ │ │ ├── PadLines.mjs
│ │ │ ├── ParseASN1HexString.mjs
│ │ │ ├── ParseCSR.mjs
│ │ │ ├── ParseColourCode.mjs
│ │ │ ├── ParseDateTime.mjs
│ │ │ ├── ParseIPRange.mjs
│ │ │ ├── ParseIPv4Header.mjs
│ │ │ ├── ParseIPv6Address.mjs
│ │ │ ├── ParseObjectIDTimestamp.mjs
│ │ │ ├── ParseQRCode.mjs
│ │ │ ├── ParseSSHHostKey.mjs
│ │ │ ├── ParseTCP.mjs
│ │ │ ├── ParseTLSRecord.mjs
│ │ │ ├── ParseTLV.mjs
│ │ │ ├── ParseUDP.mjs
│ │ │ ├── ParseUNIXFilePermissions.mjs
│ │ │ ├── ParseURI.mjs
│ │ │ ├── ParseUserAgent.mjs
│ │ │ ├── ParseX509CRL.mjs
│ │ │ ├── ParseX509Certificate.mjs
│ │ │ ├── PlayMedia.mjs
│ │ │ ├── PowerSet.mjs
│ │ │ ├── ProtobufDecode.mjs
│ │ │ ├── ProtobufEncode.mjs
│ │ │ ├── PseudoRandomIntegerGenerator.mjs
│ │ │ ├── PseudoRandomNumberGenerator.mjs
│ │ │ ├── PubKeyFromCert.mjs
│ │ │ ├── PubKeyFromPrivKey.mjs
│ │ │ ├── RAKE.mjs
│ │ │ ├── RC2Decrypt.mjs
│ │ │ ├── RC2Encrypt.mjs
│ │ │ ├── RC4.mjs
│ │ │ ├── RC4Drop.mjs
│ │ │ ├── RC6Decrypt.mjs
│ │ │ ├── RC6Encrypt.mjs
│ │ │ ├── RIPEMD.mjs
│ │ │ ├── ROT13.mjs
│ │ │ ├── ROT13BruteForce.mjs
│ │ │ ├── ROT47.mjs
│ │ │ ├── ROT47BruteForce.mjs
│ │ │ ├── ROT8000.mjs
│ │ │ ├── RSADecrypt.mjs
│ │ │ ├── RSAEncrypt.mjs
│ │ │ ├── RSASign.mjs
│ │ │ ├── RSAVerify.mjs
│ │ │ ├── Rabbit.mjs
│ │ │ ├── RailFenceCipherDecode.mjs
│ │ │ ├── RailFenceCipherEncode.mjs
│ │ │ ├── RandomizeColourPalette.mjs
│ │ │ ├── RawDeflate.mjs
│ │ │ ├── RawInflate.mjs
│ │ │ ├── Register.mjs
│ │ │ ├── RegularExpression.mjs
│ │ │ ├── RemoveDiacritics.mjs
│ │ │ ├── RemoveEXIF.mjs
│ │ │ ├── RemoveLineNumbers.mjs
│ │ │ ├── RemoveNullBytes.mjs
│ │ │ ├── RemoveWhitespace.mjs
│ │ │ ├── RenderImage.mjs
│ │ │ ├── RenderMarkdown.mjs
│ │ │ ├── ResizeImage.mjs
│ │ │ ├── Return.mjs
│ │ │ ├── Reverse.mjs
│ │ │ ├── RisonDecode.mjs
│ │ │ ├── RisonEncode.mjs
│ │ │ ├── RotateImage.mjs
│ │ │ ├── RotateLeft.mjs
│ │ │ ├── RotateRight.mjs
│ │ │ ├── SHA0.mjs
│ │ │ ├── SHA1.mjs
│ │ │ ├── SHA2.mjs
│ │ │ ├── SHA3.mjs
│ │ │ ├── SIGABA.mjs
│ │ │ ├── SM2Decrypt.mjs
│ │ │ ├── SM2Encrypt.mjs
│ │ │ ├── SM3.mjs
│ │ │ ├── SM4Decrypt.mjs
│ │ │ ├── SM4Encrypt.mjs
│ │ │ ├── SQLBeautify.mjs
│ │ │ ├── SQLMinify.mjs
│ │ │ ├── SSDEEP.mjs
│ │ │ ├── SUB.mjs
│ │ │ ├── Salsa20.mjs
│ │ │ ├── ScanForEmbeddedFiles.mjs
│ │ │ ├── ScatterChart.mjs
│ │ │ ├── Scrypt.mjs
│ │ │ ├── SeriesChart.mjs
│ │ │ ├── SetDifference.mjs
│ │ │ ├── SetIntersection.mjs
│ │ │ ├── SetUnion.mjs
│ │ │ ├── Shake.mjs
│ │ │ ├── SharpenImage.mjs
│ │ │ ├── ShowBase64Offsets.mjs
│ │ │ ├── ShowOnMap.mjs
│ │ │ ├── Shuffle.mjs
│ │ │ ├── Sleep.mjs
│ │ │ ├── Snefru.mjs
│ │ │ ├── Sort.mjs
│ │ │ ├── Split.mjs
│ │ │ ├── SplitColourChannels.mjs
│ │ │ ├── StandardDeviation.mjs
│ │ │ ├── Streebog.mjs
│ │ │ ├── Strings.mjs
│ │ │ ├── StripHTMLTags.mjs
│ │ │ ├── StripHTTPHeaders.mjs
│ │ │ ├── StripIPv4Header.mjs
│ │ │ ├── StripTCPHeader.mjs
│ │ │ ├── StripUDPHeader.mjs
│ │ │ ├── Subsection.mjs
│ │ │ ├── Substitute.mjs
│ │ │ ├── Subtract.mjs
│ │ │ ├── Sum.mjs
│ │ │ ├── SwapCase.mjs
│ │ │ ├── SwapEndianness.mjs
│ │ │ ├── SymmetricDifference.mjs
│ │ │ ├── SyntaxHighlighter.mjs
│ │ │ ├── TCPIPChecksum.mjs
│ │ │ ├── Tail.mjs
│ │ │ ├── TakeBytes.mjs
│ │ │ ├── TakeNthBytes.mjs
│ │ │ ├── Tar.mjs
│ │ │ ├── Template.mjs
│ │ │ ├── TextEncodingBruteForce.mjs
│ │ │ ├── TextIntegerConverter.mjs
│ │ │ ├── ToBCD.mjs
│ │ │ ├── ToBase.mjs
│ │ │ ├── ToBase32.mjs
│ │ │ ├── ToBase45.mjs
│ │ │ ├── ToBase58.mjs
│ │ │ ├── ToBase62.mjs
│ │ │ ├── ToBase64.mjs
│ │ │ ├── ToBase85.mjs
│ │ │ ├── ToBase92.mjs
│ │ │ ├── ToBech32.mjs
│ │ │ ├── ToBinary.mjs
│ │ │ ├── ToBraille.mjs
│ │ │ ├── ToCamelCase.mjs
│ │ │ ├── ToCaseInsensitiveRegex.mjs
│ │ │ ├── ToCharcode.mjs
│ │ │ ├── ToDecimal.mjs
│ │ │ ├── ToFloat.mjs
│ │ │ ├── ToHTMLEntity.mjs
│ │ │ ├── ToHex.mjs
│ │ │ ├── ToHexContent.mjs
│ │ │ ├── ToHexdump.mjs
│ │ │ ├── ToKebabCase.mjs
│ │ │ ├── ToLowerCase.mjs
│ │ │ ├── ToMessagePack.mjs
│ │ │ ├── ToModhex.mjs
│ │ │ ├── ToMorseCode.mjs
│ │ │ ├── ToOctal.mjs
│ │ │ ├── ToPunycode.mjs
│ │ │ ├── ToQuotedPrintable.mjs
│ │ │ ├── ToSnakeCase.mjs
│ │ │ ├── ToTable.mjs
│ │ │ ├── ToUNIXTimestamp.mjs
│ │ │ ├── ToUpperCase.mjs
│ │ │ ├── TranslateDateTimeFormat.mjs
│ │ │ ├── TripleDESDecrypt.mjs
│ │ │ ├── TripleDESEncrypt.mjs
│ │ │ ├── Typex.mjs
│ │ │ ├── UNIXTimestampToWindowsFiletime.mjs
│ │ │ ├── URLDecode.mjs
│ │ │ ├── URLEncode.mjs
│ │ │ ├── UnescapeString.mjs
│ │ │ ├── UnescapeUnicodeCharacters.mjs
│ │ │ ├── UnicodeTextFormat.mjs
│ │ │ ├── Unique.mjs
│ │ │ ├── Untar.mjs
│ │ │ ├── Unzip.mjs
│ │ │ ├── VarIntDecode.mjs
│ │ │ ├── VarIntEncode.mjs
│ │ │ ├── ViewBitPlane.mjs
│ │ │ ├── VigenèreDecode.mjs
│ │ │ ├── VigenèreEncode.mjs
│ │ │ ├── Whirlpool.mjs
│ │ │ ├── WindowsFiletimeToUNIXTimestamp.mjs
│ │ │ ├── XKCDRandomNumber.mjs
│ │ │ ├── XMLBeautify.mjs
│ │ │ ├── XMLMinify.mjs
│ │ │ ├── XOR.mjs
│ │ │ ├── XORBruteForce.mjs
│ │ │ ├── XORChecksum.mjs
│ │ │ ├── XPathExpression.mjs
│ │ │ ├── XSalsa20.mjs
│ │ │ ├── XXTEADecrypt.mjs
│ │ │ ├── XXTEAEncrypt.mjs
│ │ │ ├── YAMLToJSON.mjs
│ │ │ ├── YARARules.mjs
│ │ │ ├── Zip.mjs
│ │ │ ├── ZlibDeflate.mjs
│ │ │ └── ZlibInflate.mjs
│ │ └── vendor/
│ │ ├── DisassembleX86-64.mjs
│ │ ├── gost/
│ │ │ ├── gostCipher.mjs
│ │ │ ├── gostCoding.mjs
│ │ │ ├── gostCrypto.mjs
│ │ │ ├── gostDigest.mjs
│ │ │ ├── gostEngine.mjs
│ │ │ ├── gostRandom.mjs
│ │ │ └── gostSign.mjs
│ │ └── remove-exif.mjs
│ ├── node/
│ │ ├── File.mjs
│ │ ├── NodeDish.mjs
│ │ ├── NodeRecipe.mjs
│ │ ├── api.mjs
│ │ ├── apiUtils.mjs
│ │ ├── config/
│ │ │ ├── excludedOperations.mjs
│ │ │ └── scripts/
│ │ │ └── generateNodeIndex.mjs
│ │ ├── repl.mjs
│ │ └── wrapper.js
│ └── web/
│ ├── App.mjs
│ ├── HTMLCategory.mjs
│ ├── HTMLIngredient.mjs
│ ├── HTMLOperation.mjs
│ ├── Manager.mjs
│ ├── html/
│ │ └── index.html
│ ├── index.js
│ ├── static/
│ │ ├── fonts/
│ │ │ └── bmfonts/
│ │ │ ├── Roboto72White.fnt
│ │ │ ├── RobotoBlack72White.fnt
│ │ │ ├── RobotoMono72White.fnt
│ │ │ └── RobotoSlab72White.fnt
│ │ ├── ga.html
│ │ ├── images/
│ │ │ └── IMAGE_LICENCES.md
│ │ ├── sitemap.mjs
│ │ └── structuredData.json
│ ├── stylesheets/
│ │ ├── components/
│ │ │ ├── _button.css
│ │ │ ├── _list.css
│ │ │ ├── _operation.css
│ │ │ └── _pane.css
│ │ ├── index.css
│ │ ├── index.js
│ │ ├── layout/
│ │ │ ├── _banner.css
│ │ │ ├── _controls.css
│ │ │ ├── _io.css
│ │ │ ├── _modals.css
│ │ │ ├── _operations.css
│ │ │ ├── _recipe.css
│ │ │ └── _structure.css
│ │ ├── operations/
│ │ │ ├── diff.css
│ │ │ └── json.css
│ │ ├── preloader.css
│ │ ├── themes/
│ │ │ ├── _classic.css
│ │ │ ├── _dark.css
│ │ │ ├── _geocities.css
│ │ │ ├── _solarizedDark.css
│ │ │ └── _solarizedLight.css
│ │ └── utils/
│ │ ├── _general.css
│ │ └── _overrides.css
│ ├── utils/
│ │ ├── copyOverride.mjs
│ │ ├── editorUtils.mjs
│ │ ├── fileDetails.mjs
│ │ ├── htmlWidget.mjs
│ │ ├── sidePanel.mjs
│ │ └── statusBar.mjs
│ ├── waiters/
│ │ ├── BackgroundWorkerWaiter.mjs
│ │ ├── BindingsWaiter.mjs
│ │ ├── ControlsWaiter.mjs
│ │ ├── HighlighterWaiter.mjs
│ │ ├── InputWaiter.mjs
│ │ ├── OperationsWaiter.mjs
│ │ ├── OptionsWaiter.mjs
│ │ ├── OutputWaiter.mjs
│ │ ├── RecipeWaiter.mjs
│ │ ├── SeasonalWaiter.mjs
│ │ ├── TabWaiter.mjs
│ │ ├── TimingWaiter.mjs
│ │ ├── WindowWaiter.mjs
│ │ └── WorkerWaiter.mjs
│ └── workers/
│ ├── DishWorker.mjs
│ ├── InputWorker.mjs
│ ├── LoaderWorker.js
│ └── ZipWorker.mjs
├── tests/
│ ├── browser/
│ │ ├── 00_nightwatch.js
│ │ ├── 01_io.js
│ │ ├── 02_ops.js
│ │ └── browserUtils.js
│ ├── lib/
│ │ ├── TestRegister.mjs
│ │ └── utils.mjs
│ ├── node/
│ │ ├── assertionHandler.mjs
│ │ ├── consumers/
│ │ │ ├── cjs-consumer.js
│ │ │ └── esm-consumer.mjs
│ │ ├── index.mjs
│ │ └── tests/
│ │ ├── Categories.mjs
│ │ ├── Dish.mjs
│ │ ├── File.mjs
│ │ ├── NodeDish.mjs
│ │ ├── Utils.mjs
│ │ ├── lib/
│ │ │ └── BigIntUtils.mjs
│ │ ├── nodeApi.mjs
│ │ └── operations.mjs
│ ├── operations/
│ │ ├── index.mjs
│ │ └── tests/
│ │ ├── A1Z26CipherDecode.mjs
│ │ ├── AESKeyWrap.mjs
│ │ ├── AlternatingCaps.mjs
│ │ ├── AvroToJSON.mjs
│ │ ├── BCD.mjs
│ │ ├── BLAKE2b.mjs
│ │ ├── BLAKE2s.mjs
│ │ ├── BLAKE3.mjs
│ │ ├── BSON.mjs
│ │ ├── BaconCipher.mjs
│ │ ├── Base32.mjs
│ │ ├── Base45.mjs
│ │ ├── Base58.mjs
│ │ ├── Base62.mjs
│ │ ├── Base64.mjs
│ │ ├── Base85.mjs
│ │ ├── Base92.mjs
│ │ ├── Bech32.mjs
│ │ ├── BitwiseOp.mjs
│ │ ├── Bombe.mjs
│ │ ├── ByteRepr.mjs
│ │ ├── CBORDecode.mjs
│ │ ├── CBOREncode.mjs
│ │ ├── CMAC.mjs
│ │ ├── CRCChecksum.mjs
│ │ ├── CSV.mjs
│ │ ├── CaesarBoxCipher.mjs
│ │ ├── CaretMdecode.mjs
│ │ ├── CartesianProduct.mjs
│ │ ├── CetaceanCipherDecode.mjs
│ │ ├── CetaceanCipherEncode.mjs
│ │ ├── ChaCha.mjs
│ │ ├── ChangeIPFormat.mjs
│ │ ├── CharEnc.mjs
│ │ ├── Charts.mjs
│ │ ├── CipherSaber2.mjs
│ │ ├── Ciphers.mjs
│ │ ├── Code.mjs
│ │ ├── Colossus.mjs
│ │ ├── Comment.mjs
│ │ ├── Compress.mjs
│ │ ├── ConditionalJump.mjs
│ │ ├── ConvertCoordinateFormat.mjs
│ │ ├── ConvertLeetSpeak.mjs
│ │ ├── ConvertToNATOAlphabet.mjs
│ │ ├── Crypt.mjs
│ │ ├── DateTime.mjs
│ │ ├── DefangIP.mjs
│ │ ├── DisassembleARM.mjs
│ │ ├── DropNthBytes.mjs
│ │ ├── ECDSA.mjs
│ │ ├── ELFInfo.mjs
│ │ ├── Enigma.mjs
│ │ ├── ExtractAudioMetadata.mjs
│ │ ├── ExtractEmailAddresses.mjs
│ │ ├── ExtractHashes.mjs
│ │ ├── ExtractIPAddresses.mjs
│ │ ├── Fernet.mjs
│ │ ├── FileTree.mjs
│ │ ├── FlaskSession.mjs
│ │ ├── FletcherChecksum.mjs
│ │ ├── Float.mjs
│ │ ├── Fork.mjs
│ │ ├── FromDecimal.mjs
│ │ ├── GOST.mjs
│ │ ├── GenerateAllChecksums.mjs
│ │ ├── GenerateAllHashes.mjs
│ │ ├── GenerateDeBruijnSequence.mjs
│ │ ├── GenerateQRCode.mjs
│ │ ├── GetAllCasings.mjs
│ │ ├── Gunzip.mjs
│ │ ├── Gzip.mjs
│ │ ├── HASSH.mjs
│ │ ├── HKDF.mjs
│ │ ├── Hash.mjs
│ │ ├── HaversineDistance.mjs
│ │ ├── Hex.mjs
│ │ ├── Hexdump.mjs
│ │ ├── IPv6Transition.mjs
│ │ ├── Image.mjs
│ │ ├── IndexOfCoincidence.mjs
│ │ ├── JA3Fingerprint.mjs
│ │ ├── JA3SFingerprint.mjs
│ │ ├── JA4.mjs
│ │ ├── JSONBeautify.mjs
│ │ ├── JSONMinify.mjs
│ │ ├── JSONtoCSV.mjs
│ │ ├── JSONtoYAML.mjs
│ │ ├── JWK.mjs
│ │ ├── JWTDecode.mjs
│ │ ├── JWTSign.mjs
│ │ ├── JWTVerify.mjs
│ │ ├── Jsonata.mjs
│ │ ├── Jump.mjs
│ │ ├── LS47.mjs
│ │ ├── LZNT1Decompress.mjs
│ │ ├── LZString.mjs
│ │ ├── LevenshteinDistance.mjs
│ │ ├── Lorenz.mjs
│ │ ├── LuhnChecksum.mjs
│ │ ├── MIMEDecoding.mjs
│ │ ├── MS.mjs
│ │ ├── Magic.mjs
│ │ ├── Media.mjs
│ │ ├── Modhex.mjs
│ │ ├── MorseCode.mjs
│ │ ├── MultipleBombe.mjs
│ │ ├── MurmurHash3.mjs
│ │ ├── NTLM.mjs
│ │ ├── NetBIOS.mjs
│ │ ├── NormaliseUnicode.mjs
│ │ ├── OTP.mjs
│ │ ├── PEMtoHex.mjs
│ │ ├── PGP.mjs
│ │ ├── PHP.mjs
│ │ ├── PHPSerialize.mjs
│ │ ├── ParseCSR.mjs
│ │ ├── ParseIPRange.mjs
│ │ ├── ParseObjectIDTimestamp.mjs
│ │ ├── ParseQRCode.mjs
│ │ ├── ParseSSHHostKey.mjs
│ │ ├── ParseTCP.mjs
│ │ ├── ParseTLSRecord.mjs
│ │ ├── ParseTLV.mjs
│ │ ├── ParseUDP.mjs
│ │ ├── ParseX509CRL.mjs
│ │ ├── PowerSet.mjs
│ │ ├── Protobuf.mjs
│ │ ├── PubKeyFromCert.mjs
│ │ ├── PubKeyFromPrivKey.mjs
│ │ ├── RAKE.mjs
│ │ ├── RC6.mjs
│ │ ├── RSA.mjs
│ │ ├── Rabbit.mjs
│ │ ├── Regex.mjs
│ │ ├── Register.mjs
│ │ ├── RisonEncodeDecode.mjs
│ │ ├── Rotate.mjs
│ │ ├── SIGABA.mjs
│ │ ├── SM2.mjs
│ │ ├── SM4.mjs
│ │ ├── SQLBeautify.mjs
│ │ ├── Salsa20.mjs
│ │ ├── SeqUtils.mjs
│ │ ├── SetDifference.mjs
│ │ ├── SetIntersection.mjs
│ │ ├── SetUnion.mjs
│ │ ├── Shuffle.mjs
│ │ ├── SplitColourChannels.mjs
│ │ ├── StrUtils.mjs
│ │ ├── StripIPv4Header.mjs
│ │ ├── StripTCPHeader.mjs
│ │ ├── StripUDPHeader.mjs
│ │ ├── Subsection.mjs
│ │ ├── SwapCase.mjs
│ │ ├── SymmetricDifference.mjs
│ │ ├── TakeNthBytes.mjs
│ │ ├── Template.mjs
│ │ ├── TextEncodingBruteForce.mjs
│ │ ├── TextIntegerConverter.mjs
│ │ ├── ToFromInsensitiveRegex.mjs
│ │ ├── TranslateDateTimeFormat.mjs
│ │ ├── Typex.mjs
│ │ ├── URLEncodeDecode.mjs
│ │ ├── UnescapeString.mjs
│ │ ├── Unicode.mjs
│ │ ├── XORChecksum.mjs
│ │ ├── XSalsa20.mjs
│ │ ├── XXTEA.mjs
│ │ └── YARA.mjs
│ └── samples/
│ ├── Audio.mjs
│ ├── Ciphers.mjs
│ ├── Executables.mjs
│ └── Images.mjs
└── webpack.config.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .cspell.json
================================================
{
"version": "0.2",
"language": "en,en-gb",
"words": [],
"dictionaries": [
"npm",
"softwareTerms",
"node",
"html",
"css",
"bash",
"en-gb",
"misc"
],
"ignorePaths": ["package.json", "package-lock.json", "node_modules"]
}
================================================
FILE: .devcontainer/devcontainer.json
================================================
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/javascript-node
{
"name": "CyberChef",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/devcontainers/javascript-node:1-18-bookworm",
// Features to add to the dev container. More info: https://containers.dev/features.
"features": {
"ghcr.io/devcontainers/features/github-cli": "latest"
},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
"forwardPorts": [8080],
// Use 'postCreateCommand' to run commands after the container is created.
"postCreateCommand": {
"npm": "bash -c \"sudo chown node node_modules && npm install\""
},
"containerEnv": {
"DISPLAY": ":99"
},
"mounts": [
"source=${localWorkspaceFolderBasename}-node_modules,target=${containerWorkspaceFolder}/node_modules,type=volume"
],
// Configure tool-specific properties.
"customizations": {
"vscode": {
"extensions": [
"dbaeumer.vscode-eslint",
"GitHub.vscode-github-actions"
]
}
}
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}
================================================
FILE: .dockerignore
================================================
node_modules
build
================================================
FILE: .editorconfig
================================================
# top-most EditorConfig file
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 4
[{package.json,.travis.yml,nightwatch.json}]
indent_style = space
indent_size = 2
[.github/**.yml]
indent_style = space
indent_size = 2
================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
================================================
FILE: .github/CONTRIBUTING.md
================================================
# Contributing
Take a look through the [Wiki pages](https://github.com/gchq/CyberChef/wiki) for guides on [compiling CyberChef](https://github.com/gchq/CyberChef/wiki/Getting-started) and [adding new operations](https://github.com/gchq/CyberChef/wiki/Adding-a-new-operation).
There are lots of opportunities to contribute to CyberChef. If you want ideas, take a look at any [Issues](https://github.com/gchq/CyberChef/issues) tagged with '[help wanted](https://github.com/gchq/CyberChef/labels/help%20wanted)'.
Before your contributions can be accepted, you must:
- Sign the [GCHQ Contributor Licence Agreement](https://cla-assistant.io/gchq/CyberChef)
- Push your changes to your fork.
- Submit a pull request.
## Coding conventions
* Indentation: Each block should consist of 4 spaces
* Object/namespace identifiers: CamelCase
* Function/variable names: camelCase
* Constants: UNDERSCORE_UPPER_CASE
* Source code encoding: UTF-8 (without BOM)
* All source files must end with a newline
* Line endings: UNIX style (\n)
## Design Principles
1. If at all possible, all operations and features should be client-side and not rely on connections to an external server. This increases the utility of CyberChef on closed networks and in virtual machines that are not connected to the Internet. Calls to external APIs may be accepted if there is no other option, but not for critical components.
2. Latency should be kept to a minimum to enhance the user experience. This means that operation code should sit on the client and be executed there. However, as a trade-off between latency and bandwidth, operation code with large dependencies can be loaded in discrete modules in order to reduce the size of the initial download. The downloading of additional modules must remain entirely transparent so that the user is not inconvenienced.
3. Large libraries should be kept in separate modules so that they are not downloaded by everyone who uses the app, just those who specifically require the relevant operations.
4. Use Vanilla JS if at all possible to reduce the number of libraries required and relied upon. Frameworks like jQuery, although included, should not be used unless absolutely necessary.
With these principles in mind, any changes or additions to CyberChef should keep it:
- Standalone
- Efficient
- As small as possible
================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: 'Bug report: <Insert title here>'
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behaviour or a link to the recipe / input used to cause the bug:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behaviour**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (if relevant, please complete the following information):**
- OS: [e.g. Windows]
- Browser: [e.g. chrome 72, firefox 60]
- CyberChef version: [e.g. 9.7.14]
**Additional context**
Add any other context about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature-request.md
================================================
---
name: Feature request
about: Suggest an idea for the project
title: 'Feature request: <Insert title here>'
labels: feature
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. E.g. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/ISSUE_TEMPLATE/operation-request.md
================================================
---
name: Operation request
about: Suggest a new operation
title: 'Operation request: <Insert title here>'
labels: operation
assignees: ''
---
## Summary
### Example Input
### Example Output
================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
<!-- Prefix the title above with 'Misc:' -->
================================================
FILE: .github/dependabot.yml
================================================
# See the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
version: 2
updates:
#
# Check for minor/patch versions only on a weekly basis - we are likely to be able to
# merge these routinely. Major versions we'll check for and update manually.
#
- package-ecosystem: 'npm'
directory: '/'
versioning-strategy: increase
schedule:
interval: 'weekly'
day: 'friday'
time: '03:00'
timezone: Europe/London
commit-message:
prefix: 'chore (deps): '
ignore:
# we'll do any major version updates manually
- dependency-name: '*'
update-types: ['version-update:semver-major']
# packages we can't currently update
# see issue #2214 for rationale for each of these
- dependency-name: '@xmldom/xmldom'
versions: [ '>=0.9.0' ]
- dependency-name: 'bcryptjs'
versions: [ '>=3.0.0' ]
- dependency-name: 'bootstrap'
versions: [ '>=5.0.0' ]
- dependency-name: 'bson'
versions: [ '>=5.0.0' ]
- dependency-name: 'cbor'
versions: [ '>=10.0.0' ]
- dependency-name: 'cspell'
versions: [ '>=9.0.0' ]
- dependency-name: 'eslint'
versions: [ '>=10.0.0' ]
- dependency-name: 'eslint-plugin-jsdoc'
versions: [ '>=51.0.0' ]
- dependency-name: 'fernet'
versions: [ '>=0.4.0' ]
- dependency-name: 'geodesy'
versions: [ '>=2.0.0' ]
- dependency-name: 'otpauth'
versions: [ '>=9.4.0' ]
- dependency-name: 'webpack-dev-server'
versions: [ '>=5.1.0' ]
groups:
#
# Grouping so we don't get a seperate PR for every patch version.
#
patch-updates:
applies-to: version-updates
patterns:
- '*'
update-types:
- 'patch'
# Can't enable this until we are using Node 24 as the latest actions all require this version
# - package-ecosystem: "github-actions"
# # Workflow files stored in the default location of `.github/workflows`; no need to
# # specify `/.github/workflows` for `directory`
# directory: '/'
# schedule:
# interval: 'weekly'
# day: 'friday'
# time: '03:00'
# timezone: Europe/London
# commit-message:
# prefix: 'chore (deps): '
================================================
FILE: .github/workflows/master.yml
================================================
name: "Master Build, Test & Deploy"
on:
workflow_dispatch:
push:
branches:
- master
permissions:
contents: read
jobs:
main:
permissions:
contents: write
pages: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set node version
uses: actions/setup-node@v6
with:
node-version: 18
registry-url: "https://registry.npmjs.org"
- name: Install
run: |
export DETECT_CHROMEDRIVER_VERSION=true
npm install
npm run setheapsize
- name: Lint
run: npx grunt lint
- name: Unit Tests
run: |
npm test
npm run testnodeconsumer
- name: Production Build
if: success()
run: npx grunt prod --msg=""
- name: Generate sitemap
run: npx grunt exec:sitemap
- name: UI Tests
if: success()
run: |
sudo apt-get install xvfb
xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui
- name: Prepare for GitHub Pages
if: success()
run: npx grunt copy:ghPages
- name: Deploy to GitHub Pages
if: success() && github.ref == 'refs/heads/master'
uses: crazy-max/ghaction-github-pages@v3
with:
target_branch: gh-pages
build_dir: ./build/prod
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .github/workflows/pull_requests.yml
================================================
name: "Pull Requests"
permissions:
contents: read
on:
workflow_dispatch:
pull_request:
types: [synchronize, opened, reopened]
jobs:
main:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set node version
uses: actions/setup-node@v6
with:
node-version: 18
registry-url: "https://registry.npmjs.org"
- name: Install
run: |
export DETECT_CHROMEDRIVER_VERSION=true
npm install
npm run setheapsize
- name: Lint
run: npx grunt lint
- name: Unit Tests
run: |
npm test
npm run testnodeconsumer
- name: Production Build
if: success()
run: npx grunt prod
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Production Image Build
if: success()
id: build-image
uses: docker/build-push-action@v6
with:
platforms: linux/amd64,linux/arm64
- name: UI Tests
if: success()
run: |
sudo apt-get install xvfb
xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui
================================================
FILE: .github/workflows/releases.yml
================================================
name: "Releases"
on:
workflow_dispatch:
push:
tags:
- "v*"
permissions:
contents: read
env:
REGISTRY: ghcr.io
REGISTRY_USER: ${{ github.actor }}
REGISTRY_PASSWORD: ${{ github.token }}
IMAGE_NAME: ${{ github.repository }}
jobs:
main:
permissions:
packages: write
contents: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set node version
uses: actions/setup-node@v6
with:
node-version: 18
registry-url: "https://registry.npmjs.org"
- name: Install
run: |
export DETECT_CHROMEDRIVER_VERSION=true
npm ci
npm run setheapsize
- name: Lint
run: npx grunt lint
- name: Unit Tests
run: |
npm test
npm run testnodeconsumer
- name: Production Build
run: npx grunt prod
- name: UI Tests
run: |
sudo apt-get install xvfb
xvfb-run --server-args="-screen 0 1200x800x24" npx grunt testui
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Image Metadata
id: image-metadata
uses: docker/metadata-action@v4
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=semver,pattern={{major}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{version}}
- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ env.REGISTRY_USER }}
password: ${{ env.REGISTRY_PASSWORD }}
- name: Publish to GHCR
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ steps.image-metadata.outputs.tags }}
labels: ${{ steps.image-metadata.outputs.labels }}
platforms: linux/amd64,linux/arm64
- name: Upload Release Assets
id: upload-release-assets
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: build/prod/*.zip
tag: ${{ github.ref }}
overwrite: true
file_glob: true
body: "See the [CHANGELOG](https://github.com/gchq/CyberChef/blob/master/CHANGELOG.md) and [commit messages](https://github.com/gchq/CyberChef/commits/master) for details."
npm-publish:
permissions:
id-token: write
contents: read
needs: main
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set node version
uses: actions/setup-node@v6
with:
node-version: 18
registry-url: "https://registry.npmjs.org"
- name: Install
run: npm ci
- name: Create machine generated files
run: npm run node
- name: Reset node version ready for publish
uses: actions/setup-node@v6
with:
node-version: ^24.5
registry-url: "https://registry.npmjs.org"
- name: Publish to NPM
run: npm publish
================================================
FILE: .gitignore
================================================
node_modules
npm-debug.log
travis.log
build
.vscode
.idea
.*.swp
src/core/config/modules/*
src/core/config/OperationConfig.json
src/core/operations/index.mjs
src/node/config/OperationConfig.json
src/node/index.mjs
**/*.DS_Store
tests/browser/output/*
.node-version
================================================
FILE: .npmignore
================================================
node_modules
npm-debug.log
travis.log
build/*
!build/node
.vscode
.github
================================================
FILE: .nvmrc
================================================
18
================================================
FILE: CHANGELOG.md
================================================
# Changelog
## Versioning
CyberChef uses the [semver](https://semver.org/) system to manage versioning: `<MAJOR>.<MINOR>.<PATCH>`.
- MAJOR version changes represent a significant change to the fundamental architecture of CyberChef and may (but don't always) make breaking changes that are not backwards compatible.
- MINOR version changes usually mean the addition of new operations or reasonably significant new features.
- PATCH versions are used for bug fixes and any other small tweaks that modify or improve existing capabilities.
All major and minor version changes will be documented in this file. Details of patch-level version changes can be found in [commit messages](https://github.com/gchq/CyberChef/commits/master).
## Details
### [10.22.0] - 2026-02-11
- Separate npm publish out into separate job and run with Node 24.5 [@GCHQDeveloper581] | [#2188]
- Fixed Percent delimiter for hex encoding [@beneri] [@C85297] | [#2137]
- Added the ability to paste one or more Images from the Clipboard [@t-martine] [@a3957273] [@C85297] | [#1876]
- Quoted Printable - consistent reference to 'email' [@wesinator] | [#2186]
- Fix freeze when output text decoding fails [@Raka-loah] | [#1573]
- Update Browserslist DB [@C85297] | [#2183]
- Add contents write permission to releases workflow [@C85297] | [#2182]
- Fix release workflow permissions [@C85297] | [#2181]
### [10.21.0] - 2026-02-05
- Fix import operations with special chars in them [@d98762625] [@jg42526] | [#1040]
- Remove custom CodeQL workflow [@C85297] | [#2176]
- Fix code scanning warnings in workflows [@GCHQDeveloper581] | [#2177]
- Use NPM trusted publishing [@C85297] [@GCHQDeveloper581] | [#2174]
- Fix: Correctly parse xxd odd byte hexdumps [@ThomasNotTom] [@GCHQDeveloper581] | [#2058]
- Update Sitemap URLs to Use Valid Paths in sitemap.mjs [@rbpi] [@C85297] | [#1861]
- Use recommended GitHub Actions to build image [@AlexGustafsson] [@C85297] | [#2055]
- Remove version 10 message from banner [@C85297] | [#2169]
- Bump form-data from 4.0.1 to 4.0.5 | [#2175]
- Bump node-forge from 1.3.1 to 1.3.3 | [#2173]
- Update crypto browserify [@C85297] | [#2172]
- Update kbpgp package (resolves #2135) [@GCHQDeveloper581] | [#2136]
- Fix the processing of ALPNs for JA4 to align with new specification update [@tuliperis] | [#2165]
- Add Bech32 and Bech32m encoding/decoding operations [@thomasxm] | [#2159]
- Exclude Delete character from hex dump output [@mikecat] [@C85297] | [#2086]
- Tiny typo fix in "To Base85" operation [@twostraws] | [#2118]
- Bump jsonpath-plus [@C85297] | [#2166]
### [10.20.0] - 2026-01-28
- Fixed Optical Character Recognition and added tests [@n1474335] | [ab37c1e]
- Fixed JA4 version fallback value [@n1474335] | [7a5225c]
- Updated chromedriver [@n1474335] | [0e82e4b]
- Fixed RSA Sign and Verify character encodings [@n1474335] | [895a929]
- Updated chromedriver [@n1474335] | [d3adfc7]
- Added message format arg to RSA Verify operation [@n1474335] | [47c85a1]
- Add operation for parsing X.509 CRLs [@robinsandhu] | [#1887]
- Fix typo in description of JWT Sign recipe [@GuilhermoReadonly] | [#1961]
- Corrected path to generateNodeIndex.mjs [@simonarnell] | [#1959]
- Add 'header' ingredient to JWT Sign operation [@RandomByte] | [#1957]
- Add Parse TLS record operation [@c65722] | [#1936]
- Automatically detect chrome driver version [@gchq] | [#1972]
- Add Strip UDP header operation [@c65722] | [#1900]
- Add Strip TCP header operation [@c65722] | [#1898]
- Webpack compress with gzip and brotli [@max0x53] | [#1955]
- add offset field to 'Add Line Numbers' operation [@Adamkadaban] | [#1866]
- Disable flakey URL test [@a3957273] | [#1973]
- Add Strip IPv4 header operation [@c65722] | [#1899]
- IPv6 Transition Operation [@jb30795] | [#1780]
- fix: Blowfish - ignore IV length in ECB mode [@FranciscoPombal] | [#1902]
- Add 'Drop nth bytes' operation [@Oshawk] | [#1914]
- Add 'Take nth bytes' operation [@Oshawk] | [#1915]
- Add Leet Speak [@bartblaze] | [#1971]
- Fix Generate TOTP & HOPT [@exactlyaron] | [#1966]
- Updated luhn checksum operation to work with different bases [@k3ach] | [#1933]
- automatically theme mode based on user preference [@vs4vijay] | [#1921]
- fix: DES/Triple DES - misleading error messages [@FranciscoPombal] | [#1904]
- fix: ROT13 - shifting numbers by negative amounts [@FranciscoPombal] | [#1903]
- Introduce Yubico's Modhex for Conversion [@linuxgemini] | [#1105]
- Feature: MIME RFC2047 Decoding [@MShwed] | [#630]
- CC-1889 add _ option [@depperm] | [#1977]
- chore(root): add cspell [@evenstensberg] | [#1976]
- Preserve uppercase for Leet Speak [@bartblaze] | [#1981]
- Load the user's preferred color scheme if the URL contains an invalid theme [@0xh3xa] | [#2007]
- Add SM2 Encrypt and Decrypt Operations [@flakjacket95] | [#1909]
- Support jq as an operation. [@zhzy0077] | [#1604]
- Add fingerprints to the 'Parse X.509 certificate' operation [@JSCU-CNI] | [#1863]
- Added a JSON to YAML and a YAML to JSON operation [@ccarpo] | [#1286]
- Add CRC Operation [@r4mos] | [#1993]
- Bug Fix: selected theme not loading when refreshing [@0xh3xa] | [#2006]
- Fix(RecipeWaiter): sanitize user input in addOperation to prevent XSS [@0xh3xa] | [#2014]
- Docker multiplatform build support [@PathToLife] | [#1974]
- Add Base32 Hex Extended Alphabet and Base32 Tests. [@peterc-s] | [#1991]
- Add ECB/NoPadding and CBC/NoPadding support to AES encryption [@plvie] | [#2013]
- Add new operation: PHP Serialize [@brun0ne] | [#1548]
- Push input through postmessage [@kenduguay1] | [#1992]
- Add jsonata query operation [@jonking-ajar] | [#1587]
- Re-enable Npm Release in github workflows [@PathToLife] | [#2031]
- Add to ECDSA Verify the message format [@r4mos] | [#2027]
- Added alternating caps functionality [@sw5678] | [#1897]
- XOR Checksum operation added [@jg42526] | [#2035]
- Add GenerateAllChecksums operation * Remove checksums from GenerateAllHashes operation [@es45411] | [66d445c]
- Update GenerateAllChecksums infoURL [@es45411] | [#2037]
- Add toggle "+" character to URLDecode operation [@es45411] | [#2040]
- Workaround for Safari load bug [@GCHQDeveloper94872] | [#2038]
- Updated Dockerfile to correctly build on ARM64 platforms [@Sma-Das] | [#2042]
- Addresses bug report #2008 Added explicit support for octal IP addresses. Changed approach to IPv4 regex to be string manipulation generated. Added some unit tests for IP address parsing - probably not full coverage. Added lookahead and lookbehind tricks to resolve warned issue that 1.2.3.256 would still be extracted as 1.2.3.25. Now only accepts valid IP addresses. Warning replaced with clause about infinite length dotted decimal forms. [@gchqdev364] | [#2041]
- Remove trim from rail fence [@Odyhibit] | [#1986]
- Fix email regex [@ericli-splunk] | [#2025]
- Add Blake3 hashing [@xumptex] | [#2023]
- Use defaultIndex instead of 0 in transformArgs [@bartvanandel] | [#2015]
- Add "Generate UUID" and "Analyse UUID" operations [@bartvanandel] | [#2011]
- Add new operation: Template [@kendallgoto] | [#2021]
- Add more clear build instructions [@remingtr] | [#1873]
- Show On Map updated to use leaflet over WikiMedia [@0xff1ce] | [#1884]
- Fixed ToDecimal signed logic [@starplanet] | [#1545]
- Use BigInt for encoding/decoding VarInt [@mikecat] | [#1978]
### [10.19.0] - 2024-06-21
- Add support for ECDSA and DSA in 'Parse CSR' [@robinsandhu] | [#1828]
- Fix typos in SIGABA.mjs [@eltociear] | [#1834]
### [10.18.0] - 2024-04-24
- Added 'XXTEA Encrypt' and 'XXTEA Decrypt' operations [@n1474335] | [0a353ee]
### [10.17.0] - 2024-04-13
- Fix unit test 'expectOutput' implementation [@zb3] | [#1783]
- Add accessibility labels for icons [@e218736] | [#1743]
- Add focus styling for keyboard navigation [@e218736] | [#1739]
- Add support for operation option hiding [@TheZ3ro] | [#541]
- Improve efficiency of RAKE implementation [@sw5678] | [#1751]
- Require (a, 26) to be coprime in 'Affine Encode' [@EvieHarv] | [#1788]
- Added 'JWK to PEM' operation [@cplussharp] | [#1277]
- Added 'PEM to JWK' operation [@cplussharp] | [#1277]
- Added 'Public Key from Certificate' operation [@cplussharp] | [#1642]
- Added 'Public Key from Private Key' operation [@cplussharp] | [#1642]
### [10.16.0] - 2024-04-12
- Added 'JA4Server Fingerprint' operation [@n1474335] | [#1789]
### [10.15.0] - 2024-04-02
- Fix Ciphersaber2 key concatenation [@zb3] | [#1765]
- Fix DeriveEVPKey's array parsing [@zb3] | [#1767]
- Fix JWT operations [@a3957273] | [#1769]
- Added 'Parse Certificate Signing Request' operation [@jkataja] | [#1504]
- Added 'Extract Hash Values' operation [@MShwed] | [#512]
- Added 'DateTime Delta' operation [@tomgond] | [#1732]
### [10.14.0] - 2024-03-31
- Added 'To Float' and 'From Float' operations [@tcode2k16] | [#1762]
- Fix ChaCha raw export option [@joostrijneveld] | [#1606]
- Update x86 disassembler vendor library [@evanreichard] | [#1197]
- Allow variable Blowfish key sizes [@cbeuw] | [#933]
- Added 'XXTEA' operation [@devcydo] | [#1361]
### [10.13.0] - 2024-03-30
- Added 'FangURL' operation [@breakersall] [@arnydo] | [#1591] [#654]
### [10.12.0] - 2024-03-29
- Added 'Salsa20' and 'XSalsa20' operation [@joostrijneveld] | [#1750]
### [10.11.0] - 2024-03-29
- Add HEIC/HEIF file signatures [@simonw] | [#1757]
- Update xmldom to fix medium security vulnerability [@chriswhite199] | [#1752]
- Update JSONWebToken to fix medium security vulnerability [@chriswhite199] | [#1753]
### [10.10.0] - 2024-03-27
- Added 'JA4 Fingerprint' operation [@n1474335] | [#1759]
### [10.9.0] - 2024-03-26
- Line ending sequences and UTF-8 character encoding are now detected automatically [@n1474335] | [65ffd8d]
### [10.8.0] - 2024-02-13
- Add official Docker images [@AshCorr] | [#1699]
### [10.7.0] - 2024-02-09
- Added 'File Tree' operation [@sw5678] | [#1667]
- Added 'RISON' operation [@sg5506844] | [#1555]
- Added 'MurmurHash3' operation [@AliceGrey] | [#1694]
### [10.6.0] - 2024-02-03
- Updated 'Forensics Wiki' URLs to new domain [@a3957273] | [#1703]
- Added 'LZNT1 Decompress' operation [@0xThiebaut] | [#1675]
- Updated 'Regex Expression' UUID matcher [@cnotin] | [#1678]
- Removed duplicate 'hover' message within baking info [@KevinSJ] | [#1541]
### [10.5.0] - 2023-07-14
- Added GOST Encrypt, Decrypt, Sign, Verify, Key Wrap, and Key Unwrap operations [@n1474335] | [#592]
### [10.4.0] - 2023-03-24
- Added 'Generate De Bruijn Sequence' operation [@gchq77703] | [#493]
### [10.3.0] - 2023-03-24
- Added 'Argon2' and 'Argon2 compare' operations [@Xenonym] | [#661]
### [10.2.0] - 2023-03-23
- Added 'Derive HKDF key' operation [@mikecat] | [#1528]
### [10.1.0] - 2023-03-23
- Added 'Levenshtein Distance' operation [@mikecat] | [#1498]
- Added 'Swap case' operation [@mikecat] | [#1499]
## [10.0.0] - 2023-03-22
- [Full details explained here](https://github.com/gchq/CyberChef/wiki/Character-encoding,-EOL-separators,-and-editor-features)
- Status bars added to the Input and Output [@n1474335] | [#1405]
- Character encoding selection added to the Input and Output [@n1474335] | [#1405]
- End of line separator selection added to the Input and Output [@n1474335] | [#1405]
- Non-printable characters are rendered as control character pictures [@n1474335] | [#1405]
- Loaded files can now be edited in the Input [@n1474335] | [#1405]
- Various editor features added such as multiple selections and bracket matching [@n1474335] | [#1405]
- Contextual help added, activated by pressing F1 while hovering over features [@n1474335] | [#1405]
- Many, many UI tests added for I/O features and operations [@n1474335] | [#1405]
<details>
<summary>Click to expand v9 minor versions</summary>
### [9.55.0] - 2022-12-09
- Added 'AMF Encode' and 'AMF Decode' operations [@n1474335] | [760eff4]
### [9.54.0] - 2022-11-25
- Added 'Rabbit' operation [@mikecat] | [#1450]
### [9.53.0] - 2022-11-25
- Added 'AES Key Wrap' and 'AES Key Unwrap' operations [@mikecat] | [#1456]
### [9.52.0] - 2022-11-25
- Added 'ChaCha' operation [@joostrijneveld] | [#1466]
### [9.51.0] - 2022-11-25
- Added 'CMAC' operation [@mikecat] | [#1457]
### [9.50.0] - 2022-11-25
- Added 'Shuffle' operation [@mikecat] | [#1472]
### [9.49.0] - 2022-11-11
- Added 'LZ4 Compress' and 'LZ4 Decompress' operations [@n1474335] | [31a7f83]
### [9.48.0] - 2022-10-14
- Added 'LM Hash' and 'NT Hash' operations [@n1474335] [@brun0ne] | [#1427]
### [9.47.0] - 2022-10-14
- Added 'LZMA Decompress' and 'LZMA Compress' operations [@mattnotmitt] | [#1421]
### [9.46.0] - 2022-07-08
- Added 'Cetacean Cipher Encode' and 'Cetacean Cipher Decode' operations [@valdelaseras] | [#1308]
### [9.45.0] - 2022-07-08
- Added 'ROT8000' operation [@thomasleplus] | [#1250]
### [9.44.0] - 2022-07-08
- Added 'LZString Compress' and 'LZString Decompress' operations [@crespyl] | [#1266]
### [9.43.0] - 2022-07-08
- Added 'ROT13 Brute Force' and 'ROT47 Brute Force' operations [@mikecat] | [#1264]
### [9.42.0] - 2022-07-08
- Added 'LS47 Encrypt' and 'LS47 Decrypt' operations [@n1073645] | [#951]
### [9.41.0] - 2022-07-08
- Added 'Caesar Box Cipher' operation [@n1073645] | [#1066]
### [9.40.0] - 2022-07-08
- Added 'P-list Viewer' operation [@n1073645] | [#906]
### [9.39.0] - 2022-06-09
- Added 'ELF Info' operation [@n1073645] | [#1364]
### [9.38.0] - 2022-05-30
- Added 'Parse TCP' operation [@n1474335] | [a895d1d]
### [9.37.0] - 2022-03-29
- 'SM4 Encrypt' and 'SM4 Decrypt' operations added [@swesven] | [#1189]
- NoPadding options added for CBC and ECB modes in AES, DES and Triple DES Decrypt operations [@swesven] | [#1189]
### [9.36.0] - 2022-03-29
- 'SIGABA' operation added [@hettysymes] | [#934]
### [9.35.0] - 2022-03-28
- 'To Base45' and 'From Base45' operations added [@t-8ch] | [#1242]
### [9.34.0] - 2022-03-28
- 'Get All Casings' operation added [@n1073645] | [#1065]
### [9.33.0] - 2022-03-25
- Updated to support Node 17 [@n1474335] [@john19696] [@t-8ch] | [[#1326] [#1313] [#1244]
- Improved CJS and ESM module support [@d98762625] | [#1037]
### [9.32.0] - 2021-08-18
- 'Protobuf Encode' operation added and decode operation modified to allow decoding with full and partial schemas [@n1474335] | [dd18e52]
### [9.31.0] - 2021-08-10
- 'HASSH Client Fingerprint' and 'HASSH Server Fingerprint' operations added [@n1474335] | [e9ca4dc]
### [9.30.0] - 2021-08-10
- 'JA3S Fingerprint' operation added [@n1474335] | [289a417]
### [9.29.0] - 2021-07-28
- 'JA3 Fingerprint' operation added [@n1474335] | [9a33498]
### [9.28.0] - 2021-03-26
- 'CBOR Encode' and 'CBOR Decode' operations added [@Danh4] | [#999]
### [9.27.0] - 2021-02-12
- 'Fuzzy Match' operation added [@n1474335] | [8ad18b]
### [9.26.0] - 2021-02-11
- 'Get Time' operation added [@n1073645] [@n1474335] | [#1045]
### [9.25.0] - 2021-02-11
- 'Extract ID3' operation added [@n1073645] [@n1474335] | [#1006]
### [9.24.0] - 2021-02-02
- 'SM3' hashing function added along with more configuration options for other hashing operations [@n1073645] [@n1474335] | [#1022]
### [9.23.0] - 2021-02-01
- Various RSA operations added to encrypt, decrypt, sign, verify and generate keys [@mattnotmitt] [@GCHQ77703] | [#652]
### [9.22.0] - 2021-02-01
- 'Unicode Text Format' operation added [@mattnotmitt] | [#1083]
### [9.21.0] - 2020-06-12
- Node API now exports `magic` operation [@d98762625] | [#1049]
### [9.20.0] - 2020-03-27
- 'Parse ObjectID Timestamp' operation added [@dmfj] | [#987]
### [9.19.0] - 2020-03-24
- Improvements to the 'Magic' operation, allowing it to recognise more data formats and provide more accurate results [@n1073645] [@n1474335] | [#966] [b765534b](https://github.com/gchq/CyberChef/commit/b765534b8b2a0454a5132a0a52d1d8844bcbdaaa)
### [9.18.0] - 2020-03-13
- 'Convert to NATO alphabet' operation added [@MarvinJWendt] | [#674]
### [9.17.0] - 2020-03-13
- 'Generate Image' operation added [@pointhi] | [#683]
### [9.16.0] - 2020-03-06
- 'Colossus' operation added [@VirtualColossus] | [#917]
### [9.15.0] - 2020-03-05
- 'CipherSaber2 Encrypt' and 'CipherSaber2 Decrypt' operations added [@n1073645] | [#952]
### [9.14.0] - 2020-03-05
- 'Luhn Checksum' operation added [@n1073645] | [#965]
### [9.13.0] - 2020-02-13
- 'Rail Fence Cipher Encode' and 'Rail Fence Cipher Decode' operations added [@Flavsditz] | [#948]
### [9.12.0] - 2019-12-20
- 'Normalise Unicode' operation added [@matthieuxyz] | [#912]
### [9.11.0] - 2019-11-06
- Implemented CFB, OFB, and CTR modes for Blowfish operations [@cbeuw] | [#653]
### [9.10.0] - 2019-11-06
- 'Lorenz' operation added [@VirtualColossus] | [#528]
### [9.9.0] - 2019-11-01
- Added support for 109 more character encodings [@n1474335]
### [9.8.0] - 2019-10-31
- 'Avro to JSON' operation added [@jarrodconnolly] | [#865]
### [9.7.0] - 2019-09-13
- 'Optical Character Recognition' operation added [@MShwed] [@n1474335] | [#632]
### [9.6.0] - 2019-09-04
- 'Bacon Cipher Encode' and 'Bacon Cipher Decode' operations added [@kassi] | [#500]
### [9.5.0] - 2019-09-04
- Various Steganography operations added: 'Extract LSB', 'Extract RGBA', 'Randomize Colour Palette', and 'View Bit Plane' [@Ge0rg3] | [#625]
### [9.4.0] - 2019-08-30
- 'Render Markdown' operation added [@j433866] | [#627]
### [9.3.0] - 2019-08-30
- 'Show on map' operation added [@j433866] | [#477]
### [9.2.0] - 2019-08-23
- 'Parse UDP' operation added [@h345983745] | [#614]
### [9.1.0] - 2019-08-22
- 'Parse SSH Host Key' operation added [@j433866] | [#595]
- 'Defang IP Addresses' operation added [@h345983745] | [#556]
</details>
## [9.0.0] - 2019-07-09
- [Multiple inputs](https://github.com/gchq/CyberChef/wiki/Multiple-Inputs) are now supported in the main web UI, allowing you to upload and process multiple files at once [@j433866] | [#566]
- A [Node.js API](https://github.com/gchq/CyberChef/wiki/Node-API) has been implemented, meaning that CyberChef can now be used as a library, either to provide specific operations, or an entire baking environment [@d98762625] | [#291]
- A [read-eval-print loop (REPL)](https://github.com/gchq/CyberChef/wiki/Node-API#repl) is also included to enable prototyping and experimentation with the API [@d98762625] | [#291]
- Light and dark Solarized themes added [@j433866] | [#566]
<details>
<summary>Click to expand v8 minor versions</summary>
### [8.38.0] - 2019-07-03
- 'Streebog' and 'GOST hash' operations added [@MShwed] [@n1474335] | [#530]
### [8.37.0] - 2019-07-03
- 'CRC-8 Checksum' operation added [@MShwed] | [#591]
### [8.36.0] - 2019-07-03
- 'PGP Verify' operation added [@artemisbot] | [#585]
### [8.35.0] - 2019-07-03
- 'Sharpen Image', 'Convert Image Format' and 'Add Text To Image' operations added [@j433866] | [#515]
### [8.34.0] - 2019-06-28
- Various new visualisations added to the 'Entropy' operation [@MShwed] | [#535]
- Efficiency improvements made to the 'Entropy' operation for large file support [@n1474335]
### [8.33.0] - 2019-06-27
- 'Bzip2 Compress' operation added and 'Bzip2 Decompress' operation greatly improved [@artemisbot] | [#531]
### [8.32.0] - 2019-06-27
- 'Index of Coincidence' operation added [@Ge0rg3] | [#571]
### [8.31.0] - 2019-04-12
- The downloadable version of CyberChef is now a .zip file containing separate modules rather than a single .htm file. It is still completely standalone and will not make any external network requests. This change reduces the complexity of the build process significantly. [@n1474335]
### [8.30.0] - 2019-04-12
- 'Decode Protobuf' operation added [@n1474335] | [#533]
### [8.29.0] - 2019-03-31
- 'BLAKE2s' and 'BLAKE2b' hashing operations added [@h345983745] | [#525]
### [8.28.0] - 2019-03-31
- 'Heatmap Chart', 'Hex Density Chart', 'Scatter Chart' and 'Series Chart' operation added [@artemisbot] [@tlwr] | [#496] [#143]
### [8.27.0] - 2019-03-14
- 'Enigma', 'Typex', 'Bombe' and 'Multiple Bombe' operations added [@s2224834] | [#516]
- See [this wiki article](https://github.com/gchq/CyberChef/wiki/Enigma,-the-Bombe,-and-Typex) for a full explanation of these operations.
- New Bombe-style loading animation added for long-running operations [@n1474335]
- New operation argument types added: `populateMultiOption` and `argSelector` [@n1474335]
### [8.26.0] - 2019-03-09
- Various image manipulation operations added [@j433866] | [#506]
### [8.25.0] - 2019-03-09
- 'Extract Files' operation added and more file formats supported [@n1474335] | [#440]
### [8.24.0] - 2019-02-08
- 'DNS over HTTPS' operation added [@h345983745] | [#489]
### [8.23.1] - 2019-01-18
- 'Convert co-ordinate format' operation added [@j433866] | [#476]
### [8.23.0] - 2019-01-18
- 'YARA Rules' operation added [@artemisbot] | [#468]
### [8.22.0] - 2019-01-10
- 'Subsection' operation added [@j433866] | [#467]
### [8.21.0] - 2019-01-10
- 'To Case Insensitive Regex' and 'From Case Insensitive Regex' operations added [@masq] | [#461]
### [8.20.0] - 2019-01-09
- 'Generate Lorem Ipsum' operation added [@klaxon1] | [#455]
### [8.19.0] - 2018-12-30
- UI test suite added to confirm that the app loads correctly in a reasonable time and that various operations from each module can be run [@n1474335] | [#458]
### [8.18.0] - 2018-12-26
- 'Split Colour Channels' operation added [@artemisbot] | [#449]
### [8.17.0] - 2018-12-25
- 'Generate QR Code' and 'Parse QR Code' operations added [@j433866] | [#448]
### [8.16.0] - 2018-12-19
- 'Play Media' operation added [@anthony-arnold] | [#446]
### [8.15.0] - 2018-12-18
- 'Text Encoding Brute Force' operation added [@Cynser] | [#439]
### [8.14.0] - 2018-12-18
- 'To Base62' and 'From Base62' operations added [@tcode2k16] | [#443]
### [8.13.0] - 2018-12-15
- 'A1Z26 Cipher Encode' and 'A1Z26 Cipher Decode' operations added [@jarmovanlenthe] | [#441]
### [8.12.0] - 2018-11-21
- 'Citrix CTX1 Encode' and 'Citrix CTX1 Decode' operations added [@bwhitn] | [#428]
### [8.11.0] - 2018-11-13
- 'CSV to JSON' and 'JSON to CSV' operations added [@n1474335] | [#277]
### [8.10.0] - 2018-11-07
- 'Remove Diacritics' operation added [@klaxon1] | [#387]
### [8.9.0] - 2018-11-07
- 'Defang URL' operation added [@arnydo] | [#394]
### [8.8.0] - 2018-10-10
- 'Parse TLV' operation added [@GCHQ77703] | [#351]
### [8.7.0] - 2018-08-31
- 'JWT Sign', 'JWT Verify' and 'JWT Decode' operations added [@GCHQ77703] | [#348]
### [8.6.0] - 2018-08-29
- 'To Geohash' and 'From Geohash' operations added [@GCHQ77703] | [#344]
### [8.5.0] - 2018-08-23
- 'To Braille' and 'From Braille' operations added [@n1474335] | [#255]
### [8.4.0] - 2018-08-23
- 'To Base85' and 'From Base85' operations added [@PenguinGeorge] | [#340]
### [8.3.0] - 2018-08-21
- 'To MessagePack' and 'From MessagePack' operations added [@artemisbot] | [#338]
### [8.2.0] - 2018-08-21
- Information links added to most operations, accessible in the description popover [@PenguinGeorge] | [#298]
### [8.1.0] - 2018-08-19
- 'Dechunk HTTP response' operation added [@sevzero] | [#311]
</details>
## [8.0.0] - 2018-08-05
- Codebase rewritten using [ES modules](https://hacks.mozilla.org/2018/03/es-modules-a-cartoon-deep-dive/) and [classes](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes) [@n1474335] [@d98762625] [@artemisbot] [@picapi] | [#284]
- Operation architecture restructured to make adding new operations a lot simpler [@n1474335] | [#284]
- A script has been added to aid in the creation of new operations by running `npm run newop` [@n1474335] | [#284]
- 'Magic' operation added - [automated detection of encoded data](https://github.com/gchq/CyberChef/wiki/Automatic-detection-of-encoded-data-using-CyberChef-Magic) [@n1474335] | [#239]
- UI updated to use [Bootstrap Material Design](https://fezvrasta.github.io/bootstrap-material-design/) [@n1474335] | [#248]
- `JSON`, `File` and `List<File>` Dish types added [@n1474335] | [#284]
- `OperationError` type added for better handling of errors thrown by operations [@d98762625] | [#296]
- A `present()` method has been added, allowing operations to pass machine-friendly data to subsequent operations whilst presenting human-friendly data to the user [@n1474335] | [#284]
- Set operations added [@d98762625] | [#281]
- 'To Table' operation added [@JustAnotherMark] | [#294]
- 'Haversine distance' operation added [@Dachande663] | [#325]
- Started keeping a changelog [@n1474335]
## [7.0.0] - 2017-12-28
- Added support for loading, processing and downloading files up to 500MB [@n1474335] | [#224]
## [6.0.0] - 2017-09-19
- Threading support added. All recipe processing moved into a [Web Worker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers) to increase performance and to allow long-running operations to be cancelled [@n1474335] | [#173]
- Module system created so that operations relying on large libraries can be downloaded separately as required, reducing the initial loading time for the app [@n1474335] | [#173]
## [5.0.0] - 2017-03-30
- Webpack build process configured with Babel transpilation and ES6 imports and exports [@n1474335] | [#95]
## [4.0.0] - 2016-11-28
- Initial open source commit [@n1474335] | [b1d73a72](https://github.com/gchq/CyberChef/commit/b1d73a725dc7ab9fb7eb789296efd2b7e4b08306)
[10.22.0]: https://github.com/gchq/CyberChef/releases/tag/v10.22.0
[10.21.0]: https://github.com/gchq/CyberChef/releases/tag/v10.21.0
[10.20.0]: https://github.com/gchq/CyberChef/releases/tag/v10.20.0
[10.19.0]: https://github.com/gchq/CyberChef/releases/tag/v10.19.0
[10.18.0]: https://github.com/gchq/CyberChef/releases/tag/v10.18.0
[10.17.0]: https://github.com/gchq/CyberChef/releases/tag/v10.17.0
[10.16.0]: https://github.com/gchq/CyberChef/releases/tag/v10.16.0
[10.15.0]: https://github.com/gchq/CyberChef/releases/tag/v10.15.0
[10.14.0]: https://github.com/gchq/CyberChef/releases/tag/v10.14.0
[10.13.0]: https://github.com/gchq/CyberChef/releases/tag/v10.13.0
[10.12.0]: https://github.com/gchq/CyberChef/releases/tag/v10.12.0
[10.11.0]: https://github.com/gchq/CyberChef/releases/tag/v10.11.0
[10.10.0]: https://github.com/gchq/CyberChef/releases/tag/v10.10.0
[10.9.0]: https://github.com/gchq/CyberChef/releases/tag/v10.9.0
[10.8.0]: https://github.com/gchq/CyberChef/releases/tag/v10.7.0
[10.7.0]: https://github.com/gchq/CyberChef/releases/tag/v10.7.0
[10.6.0]: https://github.com/gchq/CyberChef/releases/tag/v10.6.0
[10.5.0]: https://github.com/gchq/CyberChef/releases/tag/v10.5.0
[10.4.0]: https://github.com/gchq/CyberChef/releases/tag/v10.4.0
[10.3.0]: https://github.com/gchq/CyberChef/releases/tag/v10.3.0
[10.2.0]: https://github.com/gchq/CyberChef/releases/tag/v10.2.0
[10.1.0]: https://github.com/gchq/CyberChef/releases/tag/v10.1.0
[10.0.0]: https://github.com/gchq/CyberChef/releases/tag/v10.0.0
[9.55.0]: https://github.com/gchq/CyberChef/releases/tag/v9.55.0
[9.54.0]: https://github.com/gchq/CyberChef/releases/tag/v9.54.0
[9.53.0]: https://github.com/gchq/CyberChef/releases/tag/v9.53.0
[9.52.0]: https://github.com/gchq/CyberChef/releases/tag/v9.52.0
[9.51.0]: https://github.com/gchq/CyberChef/releases/tag/v9.51.0
[9.50.0]: https://github.com/gchq/CyberChef/releases/tag/v9.50.0
[9.49.0]: https://github.com/gchq/CyberChef/releases/tag/v9.49.0
[9.48.0]: https://github.com/gchq/CyberChef/releases/tag/v9.48.0
[9.47.0]: https://github.com/gchq/CyberChef/releases/tag/v9.47.0
[9.46.0]: https://github.com/gchq/CyberChef/releases/tag/v9.46.0
[9.45.0]: https://github.com/gchq/CyberChef/releases/tag/v9.45.0
[9.44.0]: https://github.com/gchq/CyberChef/releases/tag/v9.44.0
[9.43.0]: https://github.com/gchq/CyberChef/releases/tag/v9.43.0
[9.42.0]: https://github.com/gchq/CyberChef/releases/tag/v9.42.0
[9.41.0]: https://github.com/gchq/CyberChef/releases/tag/v9.41.0
[9.40.0]: https://github.com/gchq/CyberChef/releases/tag/v9.40.0
[9.39.0]: https://github.com/gchq/CyberChef/releases/tag/v9.39.0
[9.38.0]: https://github.com/gchq/CyberChef/releases/tag/v9.38.0
[9.37.0]: https://github.com/gchq/CyberChef/releases/tag/v9.37.0
[9.36.0]: https://github.com/gchq/CyberChef/releases/tag/v9.36.0
[9.35.0]: https://github.com/gchq/CyberChef/releases/tag/v9.35.0
[9.34.0]: https://github.com/gchq/CyberChef/releases/tag/v9.34.0
[9.33.0]: https://github.com/gchq/CyberChef/releases/tag/v9.33.0
[9.32.0]: https://github.com/gchq/CyberChef/releases/tag/v9.32.0
[9.31.0]: https://github.com/gchq/CyberChef/releases/tag/v9.31.0
[9.30.0]: https://github.com/gchq/CyberChef/releases/tag/v9.30.0
[9.29.0]: https://github.com/gchq/CyberChef/releases/tag/v9.29.0
[9.28.0]: https://github.com/gchq/CyberChef/releases/tag/v9.28.0
[9.27.0]: https://github.com/gchq/CyberChef/releases/tag/v9.27.0
[9.26.0]: https://github.com/gchq/CyberChef/releases/tag/v9.26.0
[9.25.0]: https://github.com/gchq/CyberChef/releases/tag/v9.25.0
[9.24.0]: https://github.com/gchq/CyberChef/releases/tag/v9.24.0
[9.23.0]: https://github.com/gchq/CyberChef/releases/tag/v9.23.0
[9.22.0]: https://github.com/gchq/CyberChef/releases/tag/v9.22.0
[9.21.0]: https://github.com/gchq/CyberChef/releases/tag/v9.21.0
[9.20.0]: https://github.com/gchq/CyberChef/releases/tag/v9.20.0
[9.19.0]: https://github.com/gchq/CyberChef/releases/tag/v9.19.0
[9.18.0]: https://github.com/gchq/CyberChef/releases/tag/v9.18.0
[9.17.0]: https://github.com/gchq/CyberChef/releases/tag/v9.17.0
[9.16.0]: https://github.com/gchq/CyberChef/releases/tag/v9.16.0
[9.15.0]: https://github.com/gchq/CyberChef/releases/tag/v9.15.0
[9.14.0]: https://github.com/gchq/CyberChef/releases/tag/v9.14.0
[9.13.0]: https://github.com/gchq/CyberChef/releases/tag/v9.13.0
[9.12.0]: https://github.com/gchq/CyberChef/releases/tag/v9.12.0
[9.11.0]: https://github.com/gchq/CyberChef/releases/tag/v9.11.0
[9.10.0]: https://github.com/gchq/CyberChef/releases/tag/v9.10.0
[9.9.0]: https://github.com/gchq/CyberChef/releases/tag/v9.9.0
[9.8.0]: https://github.com/gchq/CyberChef/releases/tag/v9.8.0
[9.7.0]: https://github.com/gchq/CyberChef/releases/tag/v9.7.0
[9.6.0]: https://github.com/gchq/CyberChef/releases/tag/v9.6.0
[9.5.0]: https://github.com/gchq/CyberChef/releases/tag/v9.5.0
[9.4.0]: https://github.com/gchq/CyberChef/releases/tag/v9.4.0
[9.3.0]: https://github.com/gchq/CyberChef/releases/tag/v9.3.0
[9.2.0]: https://github.com/gchq/CyberChef/releases/tag/v9.2.0
[9.1.0]: https://github.com/gchq/CyberChef/releases/tag/v9.1.0
[9.0.0]: https://github.com/gchq/CyberChef/releases/tag/v9.0.0
[8.38.0]: https://github.com/gchq/CyberChef/releases/tag/v8.38.0
[8.37.0]: https://github.com/gchq/CyberChef/releases/tag/v8.37.0
[8.36.0]: https://github.com/gchq/CyberChef/releases/tag/v8.36.0
[8.35.0]: https://github.com/gchq/CyberChef/releases/tag/v8.35.0
[8.34.0]: https://github.com/gchq/CyberChef/releases/tag/v8.34.0
[8.33.0]: https://github.com/gchq/CyberChef/releases/tag/v8.33.0
[8.32.0]: https://github.com/gchq/CyberChef/releases/tag/v8.32.0
[8.31.0]: https://github.com/gchq/CyberChef/releases/tag/v8.31.0
[8.30.0]: https://github.com/gchq/CyberChef/releases/tag/v8.30.0
[8.29.0]: https://github.com/gchq/CyberChef/releases/tag/v8.29.0
[8.28.0]: https://github.com/gchq/CyberChef/releases/tag/v8.28.0
[8.27.0]: https://github.com/gchq/CyberChef/releases/tag/v8.27.0
[8.26.0]: https://github.com/gchq/CyberChef/releases/tag/v8.26.0
[8.25.0]: https://github.com/gchq/CyberChef/releases/tag/v8.25.0
[8.24.0]: https://github.com/gchq/CyberChef/releases/tag/v8.24.0
[8.23.1]: https://github.com/gchq/CyberChef/releases/tag/v8.23.1
[8.23.0]: https://github.com/gchq/CyberChef/releases/tag/v8.23.0
[8.22.0]: https://github.com/gchq/CyberChef/releases/tag/v8.22.0
[8.21.0]: https://github.com/gchq/CyberChef/releases/tag/v8.21.0
[8.20.0]: https://github.com/gchq/CyberChef/releases/tag/v8.20.0
[8.19.0]: https://github.com/gchq/CyberChef/releases/tag/v8.19.0
[8.18.0]: https://github.com/gchq/CyberChef/releases/tag/v8.18.0
[8.17.0]: https://github.com/gchq/CyberChef/releases/tag/v8.17.0
[8.16.0]: https://github.com/gchq/CyberChef/releases/tag/v8.16.0
[8.15.0]: https://github.com/gchq/CyberChef/releases/tag/v8.15.0
[8.14.0]: https://github.com/gchq/CyberChef/releases/tag/v8.14.0
[8.13.0]: https://github.com/gchq/CyberChef/releases/tag/v8.13.0
[8.12.0]: https://github.com/gchq/CyberChef/releases/tag/v8.12.0
[8.11.0]: https://github.com/gchq/CyberChef/releases/tag/v8.11.0
[8.10.0]: https://github.com/gchq/CyberChef/releases/tag/v8.10.0
[8.9.0]: https://github.com/gchq/CyberChef/releases/tag/v8.9.0
[8.8.0]: https://github.com/gchq/CyberChef/releases/tag/v8.8.0
[8.7.0]: https://github.com/gchq/CyberChef/releases/tag/v8.7.0
[8.6.0]: https://github.com/gchq/CyberChef/releases/tag/v8.6.0
[8.5.0]: https://github.com/gchq/CyberChef/releases/tag/v8.5.0
[8.4.0]: https://github.com/gchq/CyberChef/releases/tag/v8.4.0
[8.3.0]: https://github.com/gchq/CyberChef/releases/tag/v8.3.0
[8.2.0]: https://github.com/gchq/CyberChef/releases/tag/v8.2.0
[8.1.0]: https://github.com/gchq/CyberChef/releases/tag/v8.1.0
[8.0.0]: https://github.com/gchq/CyberChef/releases/tag/v8.0.0
[7.0.0]: https://github.com/gchq/CyberChef/releases/tag/v7.0.0
[6.0.0]: https://github.com/gchq/CyberChef/releases/tag/v6.0.0
[5.0.0]: https://github.com/gchq/CyberChef/releases/tag/v5.0.0
[4.0.0]: https://github.com/gchq/CyberChef/commit/b1d73a725dc7ab9fb7eb789296efd2b7e4b08306
[@n1474335]: https://github.com/n1474335
[@d98762625]: https://github.com/d98762625
[@j433866]: https://github.com/j433866
[@n1073645]: https://github.com/n1073645
[@GCHQ77703]: https://github.com/GCHQ77703
[@h345983745]: https://github.com/h345983745
[@s2224834]: https://github.com/s2224834
[@artemisbot]: https://github.com/artemisbot
[@tlwr]: https://github.com/tlwr
[@picapi]: https://github.com/picapi
[@Dachande663]: https://github.com/Dachande663
[@JustAnotherMark]: https://github.com/JustAnotherMark
[@sevzero]: https://github.com/sevzero
[@PenguinGeorge]: https://github.com/PenguinGeorge
[@arnydo]: https://github.com/arnydo
[@klaxon1]: https://github.com/klaxon1
[@bwhitn]: https://github.com/bwhitn
[@jarmovanlenthe]: https://github.com/jarmovanlenthe
[@tcode2k16]: https://github.com/tcode2k16
[@Cynser]: https://github.com/Cynser
[@anthony-arnold]: https://github.com/anthony-arnold
[@masq]: https://github.com/masq
[@Ge0rg3]: https://github.com/Ge0rg3
[@MShwed]: https://github.com/MShwed
[@kassi]: https://github.com/kassi
[@jarrodconnolly]: https://github.com/jarrodconnolly
[@VirtualColossus]: https://github.com/VirtualColossus
[@cbeuw]: https://github.com/cbeuw
[@matthieuxyz]: https://github.com/matthieuxyz
[@Flavsditz]: https://github.com/Flavsditz
[@pointhi]: https://github.com/pointhi
[@MarvinJWendt]: https://github.com/MarvinJWendt
[@dmfj]: https://github.com/dmfj
[@mattnotmitt]: https://github.com/mattnotmitt
[@Danh4]: https://github.com/Danh4
[@john19696]: https://github.com/john19696
[@t-8ch]: https://github.com/t-8ch
[@hettysymes]: https://github.com/hettysymes
[@swesven]: https://github.com/swesven
[@mikecat]: https://github.com/mikecat
[@crespyl]: https://github.com/crespyl
[@thomasleplus]: https://github.com/thomasleplus
[@valdelaseras]: https://github.com/valdelaseras
[@brun0ne]: https://github.com/brun0ne
[@joostrijneveld]: https://github.com/joostrijneveld
[@Xenonym]: https://github.com/Xenonym
[@gchq77703]: https://github.com/gchq77703
[@a3957273]: https://github.com/a3957273
[@0xThiebaut]: https://github.com/0xThiebaut
[@cnotin]: https://github.com/cnotin
[@KevinSJ]: https://github.com/KevinSJ
[@sw5678]: https://github.com/sw5678
[@sg5506844]: https://github.com/sg5506844
[@AliceGrey]: https://github.com/AliceGrey
[@AshCorr]: https://github.com/AshCorr
[@simonw]: https://github.com/simonw
[@chriswhite199]: https://github.com/chriswhite199
[@breakersall]: https://github.com/breakersall
[@evanreichard]: https://github.com/evanreichard
[@devcydo]: https://github.com/devcydo
[@zb3]: https://github.com/zb3
[@jkataja]: https://github.com/jkataja
[@tomgond]: https://github.com/tomgond
[@e218736]: https://github.com/e218736
[@TheZ3ro]: https://github.com/TheZ3ro
[@EvieHarv]: https://github.com/EvieHarv
[@cplussharp]: https://github.com/cplussharp
[@robinsandhu]: https://github.com/robinsandhu
[@eltociear]: https://github.com/eltociear
[@GuilhermoReadonly]: https://github.com/GuilhermoReadonly
[@simonarnell]: https://github.com/simonarnell
[@RandomByte]: https://github.com/RandomByte
[@c65722]: https://github.com/c65722
[@c65722]: https://github.com/c65722
[@c65722]: https://github.com/c65722
[@max0x53]: https://github.com/max0x53
[@Adamkadaban]: https://github.com/Adamkadaban
[@c65722]: https://github.com/c65722
[@jb30795]: https://github.com/jb30795
[@FranciscoPombal]: https://github.com/FranciscoPombal
[@Oshawk]: https://github.com/Oshawk
[@Oshawk]: https://github.com/Oshawk
[@bartblaze]: https://github.com/bartblaze
[@exactlyaron]: https://github.com/exactlyaron
[@k3ach]: https://github.com/k3ach
[@vs4vijay]: https://github.com/vs4vijay
[@FranciscoPombal]: https://github.com/FranciscoPombal
[@FranciscoPombal]: https://github.com/FranciscoPombal
[@linuxgemini]: https://github.com/linuxgemini
[@depperm]: https://github.com/depperm
[@evenstensberg]: https://github.com/evenstensberg
[@bartblaze]: https://github.com/bartblaze
[@0xh3xa]: https://github.com/0xh3xa
[@flakjacket95]: https://github.com/flakjacket95
[@zhzy0077]: https://github.com/zhzy0077
[@JSCU-CNI]: https://github.com/JSCU-CNI
[@ccarpo]: https://github.com/ccarpo
[@r4mos]: https://github.com/r4mos
[@0xh3xa]: https://github.com/0xh3xa
[@0xh3xa]: https://github.com/0xh3xa
[@PathToLife]: https://github.com/PathToLife
[@peterc-s]: https://github.com/peterc-s
[@plvie]: https://github.com/plvie
[@kenduguay1]: https://github.com/kenduguay1
[@jonking-ajar]: https://github.com/jonking-ajar
[@PathToLife]: https://github.com/PathToLife
[@r4mos]: https://github.com/r4mos
[@jg42526]: https://github.com/jg42526
[@es45411]: https://github.com/es45411
[@gchq]: https://github.com/gchq
[@gchqdev364]: https://github.com/gchqdev364
[@GCHQDeveloper94872]: https://github.com/GCHQDeveloper94872
[@Sma-Das]: https://github.com/Sma-Das
[@gchq]: https://github.com/gchq
[@Odyhibit]: https://github.com/Odyhibit
[@ericli-splunk]: https://github.com/ericli-splunk
[@xumptex]: https://github.com/xumptex
[@bartvanandel]: https://github.com/bartvanandel
[@bartvanandel]: https://github.com/bartvanandel
[@kendallgoto]: https://github.com/kendallgoto
[@remingtr]: https://github.com/remingtr
[@0xff1ce]: https://github.com/0xff1ce
[@starplanet]: https://github.com/starplanet
[@C85297]: https://github.com/C85297
[@GCHQDeveloper581]: https://github.com/GCHQDeveloper581
[@ThomasNotTom]: https://github.com/ThomasNotTom
[@rbpi]: https://github.com/rbpi
[@AlexGustafsson]: https://github.com/AlexGustafsson
[@tuliperis]: https://github.com/tuliperis
[@thomasxm]: https://github.com/thomasxm
[@twostraws]: https://github.com/twostraws
[@beneri]: https://github.com/beneri
[@t-martine]: https://github.com/t-martine
[@wesinator]: https://github.com/wesinator
[@Raka-loah]: https://github.com/Raka-loah
[8ad18b]: https://github.com/gchq/CyberChef/commit/8ad18bc7db6d9ff184ba3518686293a7685bf7b7
[9a33498]: https://github.com/gchq/CyberChef/commit/9a33498fed26a8df9c9f35f39a78a174bf50a513
[289a417]: https://github.com/gchq/CyberChef/commit/289a417dfb5923de5e1694354ec42a08d9395bfe
[e9ca4dc]: https://github.com/gchq/CyberChef/commit/e9ca4dc9caf98f33fd986431cd400c88082a42b8
[dd18e52]: https://github.com/gchq/CyberChef/commit/dd18e529939078b89867297b181a584e8b2cc7da
[a895d1d]: https://github.com/gchq/CyberChef/commit/a895d1d82a2f92d440a0c5eca2bc7c898107b737
[31a7f83]: https://github.com/gchq/CyberChef/commit/31a7f83b82e78927f89689f323fcb9185144d6ff
[760eff4]: https://github.com/gchq/CyberChef/commit/760eff49b5307aaa3104c5e5b437ffe62299acd1
[65ffd8d]: https://github.com/gchq/CyberChef/commit/65ffd8d65d88eb369f6f61a5d1d0f807179bffb7
[0a353ee]: https://github.com/gchq/CyberChef/commit/0a353eeb378b9ca5d49e23c7dfc175ae07107b08
[66d445c]: https://github.com/gchq/CyberChef/commit/66d445c5ef4e8bd896fd15396e3ce2d660d8ace1
[ab37c1e]: https://github.com/gchq/CyberChef/commit/ab37c1e562dbee0495ed32876ecbb8225282af25
[965570d]: https://github.com/gchq/CyberChef/commit/965570d2504c17ee1f96211a1dc10ed40cd2b332
[a477f47]: https://github.com/gchq/CyberChef/commit/a477f47aecd01d78b11fe186ed4b20d9c487cfac
[7a5225c]: https://github.com/gchq/CyberChef/commit/7a5225c961a5e0d192b03152117cd10a761f73d6
[5f88ae4]: https://github.com/gchq/CyberChef/commit/5f88ae44ec77228d9bed8f11e8cc8e7dcfb36914
[0e82e4b]: https://github.com/gchq/CyberChef/commit/0e82e4b7c6c77cadb8be61cb145e081d6ecfdc88
[d635cca]: https://github.com/gchq/CyberChef/commit/d635cca2106aae2a59caf0e5d7e3633ee1ea3155
[895a929]: https://github.com/gchq/CyberChef/commit/895a9299255525cb57886deb9d9fd4ba17ae9548
[270a333]: https://github.com/gchq/CyberChef/commit/270a33317944612d27ea1cc15275ad6b0ed097e5
[d3adfc7]: https://github.com/gchq/CyberChef/commit/d3adfc7c3e5719279524356bce5261bd8350c0f8
[47c85a1]: https://github.com/gchq/CyberChef/commit/47c85a105ddbdd4cabfa44ddddbc56e3907a8c33
[3822c6c]: https://github.com/gchq/CyberChef/commit/3822c6c520a0b4200abc675c33f46082f5b9efc6
[66d445c]: https://github.com/gchq/CyberChef/commit/66d445c5ef4e8bd896fd15396e3ce2d660d8ace1
[ab37c1e]: https://github.com/gchq/CyberChef/commit/ab37c1e562dbee0495ed32876ecbb8225282af25
[965570d]: https://github.com/gchq/CyberChef/commit/965570d2504c17ee1f96211a1dc10ed40cd2b332
[a477f47]: https://github.com/gchq/CyberChef/commit/a477f47aecd01d78b11fe186ed4b20d9c487cfac
[7a5225c]: https://github.com/gchq/CyberChef/commit/7a5225c961a5e0d192b03152117cd10a761f73d6
[5f88ae4]: https://github.com/gchq/CyberChef/commit/5f88ae44ec77228d9bed8f11e8cc8e7dcfb36914
[0e82e4b]: https://github.com/gchq/CyberChef/commit/0e82e4b7c6c77cadb8be61cb145e081d6ecfdc88
[d635cca]: https://github.com/gchq/CyberChef/commit/d635cca2106aae2a59caf0e5d7e3633ee1ea3155
[895a929]: https://github.com/gchq/CyberChef/commit/895a9299255525cb57886deb9d9fd4ba17ae9548
[270a333]: https://github.com/gchq/CyberChef/commit/270a33317944612d27ea1cc15275ad6b0ed097e5
[d3adfc7]: https://github.com/gchq/CyberChef/commit/d3adfc7c3e5719279524356bce5261bd8350c0f8
[47c85a1]: https://github.com/gchq/CyberChef/commit/47c85a105ddbdd4cabfa44ddddbc56e3907a8c33
[3822c6c]: https://github.com/gchq/CyberChef/commit/3822c6c520a0b4200abc675c33f46082f5b9efc6
[66d445c]: https://github.com/gchq/CyberChef/commit/66d445c5ef4e8bd896fd15396e3ce2d660d8ace1
[ab37c1e]: https://github.com/gchq/CyberChef/commit/ab37c1e562dbee0495ed32876ecbb8225282af25
[965570d]: https://github.com/gchq/CyberChef/commit/965570d2504c17ee1f96211a1dc10ed40cd2b332
[a477f47]: https://github.com/gchq/CyberChef/commit/a477f47aecd01d78b11fe186ed4b20d9c487cfac
[7a5225c]: https://github.com/gchq/CyberChef/commit/7a5225c961a5e0d192b03152117cd10a761f73d6
[5f88ae4]: https://github.com/gchq/CyberChef/commit/5f88ae44ec77228d9bed8f11e8cc8e7dcfb36914
[0e82e4b]: https://github.com/gchq/CyberChef/commit/0e82e4b7c6c77cadb8be61cb145e081d6ecfdc88
[d635cca]: https://github.com/gchq/CyberChef/commit/d635cca2106aae2a59caf0e5d7e3633ee1ea3155
[895a929]: https://github.com/gchq/CyberChef/commit/895a9299255525cb57886deb9d9fd4ba17ae9548
[270a333]: https://github.com/gchq/CyberChef/commit/270a33317944612d27ea1cc15275ad6b0ed097e5
[d3adfc7]: https://github.com/gchq/CyberChef/commit/d3adfc7c3e5719279524356bce5261bd8350c0f8
[47c85a1]: https://github.com/gchq/CyberChef/commit/47c85a105ddbdd4cabfa44ddddbc56e3907a8c33
[3822c6c]: https://github.com/gchq/CyberChef/commit/3822c6c520a0b4200abc675c33f46082f5b9efc6
[66d445c]: https://github.com/gchq/CyberChef/commit/66d445c5ef4e8bd896fd15396e3ce2d660d8ace1
[#95]: https://github.com/gchq/CyberChef/pull/299
[#173]: https://github.com/gchq/CyberChef/pull/173
[#143]: https://github.com/gchq/CyberChef/pull/143
[#224]: https://github.com/gchq/CyberChef/pull/224
[#239]: https://github.com/gchq/CyberChef/pull/239
[#248]: https://github.com/gchq/CyberChef/pull/248
[#255]: https://github.com/gchq/CyberChef/issues/255
[#277]: https://github.com/gchq/CyberChef/issues/277
[#281]: https://github.com/gchq/CyberChef/pull/281
[#284]: https://github.com/gchq/CyberChef/pull/284
[#291]: https://github.com/gchq/CyberChef/pull/291
[#294]: https://github.com/gchq/CyberChef/pull/294
[#296]: https://github.com/gchq/CyberChef/pull/296
[#298]: https://github.com/gchq/CyberChef/pull/298
[#311]: https://github.com/gchq/CyberChef/pull/311
[#325]: https://github.com/gchq/CyberChef/pull/325
[#338]: https://github.com/gchq/CyberChef/pull/338
[#340]: https://github.com/gchq/CyberChef/pull/340
[#344]: https://github.com/gchq/CyberChef/pull/344
[#348]: https://github.com/gchq/CyberChef/pull/348
[#351]: https://github.com/gchq/CyberChef/pull/351
[#387]: https://github.com/gchq/CyberChef/pull/387
[#394]: https://github.com/gchq/CyberChef/pull/394
[#428]: https://github.com/gchq/CyberChef/pull/428
[#439]: https://github.com/gchq/CyberChef/pull/439
[#440]: https://github.com/gchq/CyberChef/pull/440
[#441]: https://github.com/gchq/CyberChef/pull/441
[#443]: https://github.com/gchq/CyberChef/pull/443
[#446]: https://github.com/gchq/CyberChef/pull/446
[#448]: https://github.com/gchq/CyberChef/pull/448
[#449]: https://github.com/gchq/CyberChef/pull/449
[#455]: https://github.com/gchq/CyberChef/pull/455
[#458]: https://github.com/gchq/CyberChef/pull/458
[#461]: https://github.com/gchq/CyberChef/pull/461
[#467]: https://github.com/gchq/CyberChef/pull/467
[#468]: https://github.com/gchq/CyberChef/pull/468
[#476]: https://github.com/gchq/CyberChef/pull/476
[#477]: https://github.com/gchq/CyberChef/pull/477
[#489]: https://github.com/gchq/CyberChef/pull/489
[#496]: https://github.com/gchq/CyberChef/pull/496
[#500]: https://github.com/gchq/CyberChef/pull/500
[#506]: https://github.com/gchq/CyberChef/pull/506
[#515]: https://github.com/gchq/CyberChef/pull/515
[#516]: https://github.com/gchq/CyberChef/pull/516
[#525]: https://github.com/gchq/CyberChef/pull/525
[#528]: https://github.com/gchq/CyberChef/pull/528
[#530]: https://github.com/gchq/CyberChef/pull/530
[#531]: https://github.com/gchq/CyberChef/pull/531
[#533]: https://github.com/gchq/CyberChef/pull/533
[#535]: https://github.com/gchq/CyberChef/pull/535
[#556]: https://github.com/gchq/CyberChef/pull/556
[#566]: https://github.com/gchq/CyberChef/pull/566
[#571]: https://github.com/gchq/CyberChef/pull/571
[#585]: https://github.com/gchq/CyberChef/pull/585
[#591]: https://github.com/gchq/CyberChef/pull/591
[#595]: https://github.com/gchq/CyberChef/pull/595
[#614]: https://github.com/gchq/CyberChef/pull/614
[#625]: https://github.com/gchq/CyberChef/pull/625
[#627]: https://github.com/gchq/CyberChef/pull/627
[#632]: https://github.com/gchq/CyberChef/pull/632
[#652]: https://github.com/gchq/CyberChef/pull/652
[#653]: https://github.com/gchq/CyberChef/pull/653
[#674]: https://github.com/gchq/CyberChef/pull/674
[#683]: https://github.com/gchq/CyberChef/pull/683
[#865]: https://github.com/gchq/CyberChef/pull/865
[#906]: https://github.com/gchq/CyberChef/pull/906
[#912]: https://github.com/gchq/CyberChef/pull/912
[#917]: https://github.com/gchq/CyberChef/pull/917
[#934]: https://github.com/gchq/CyberChef/pull/934
[#948]: https://github.com/gchq/CyberChef/pull/948
[#951]: https://github.com/gchq/CyberChef/pull/951
[#952]: https://github.com/gchq/CyberChef/pull/952
[#965]: https://github.com/gchq/CyberChef/pull/965
[#966]: https://github.com/gchq/CyberChef/pull/966
[#987]: https://github.com/gchq/CyberChef/pull/987
[#999]: https://github.com/gchq/CyberChef/pull/999
[#1006]: https://github.com/gchq/CyberChef/pull/1006
[#1022]: https://github.com/gchq/CyberChef/pull/1022
[#1037]: https://github.com/gchq/CyberChef/pull/1037
[#1045]: https://github.com/gchq/CyberChef/pull/1045
[#1049]: https://github.com/gchq/CyberChef/pull/1049
[#1065]: https://github.com/gchq/CyberChef/pull/1065
[#1066]: https://github.com/gchq/CyberChef/pull/1066
[#1083]: https://github.com/gchq/CyberChef/pull/1083
[#1189]: https://github.com/gchq/CyberChef/pull/1189
[#1242]: https://github.com/gchq/CyberChef/pull/1242
[#1244]: https://github.com/gchq/CyberChef/pull/1244
[#1313]: https://github.com/gchq/CyberChef/pull/1313
[#1326]: https://github.com/gchq/CyberChef/pull/1326
[#1364]: https://github.com/gchq/CyberChef/pull/1364
[#1264]: https://github.com/gchq/CyberChef/pull/1264
[#1266]: https://github.com/gchq/CyberChef/pull/1266
[#1250]: https://github.com/gchq/CyberChef/pull/1250
[#1308]: https://github.com/gchq/CyberChef/pull/1308
[#1405]: https://github.com/gchq/CyberChef/pull/1405
[#1421]: https://github.com/gchq/CyberChef/pull/1421
[#1427]: https://github.com/gchq/CyberChef/pull/1427
[#1472]: https://github.com/gchq/CyberChef/pull/1472
[#1457]: https://github.com/gchq/CyberChef/pull/1457
[#1466]: https://github.com/gchq/CyberChef/pull/1466
[#1456]: https://github.com/gchq/CyberChef/pull/1456
[#1450]: https://github.com/gchq/CyberChef/pull/1450
[#1498]: https://github.com/gchq/CyberChef/pull/1498
[#1499]: https://github.com/gchq/CyberChef/pull/1499
[#1528]: https://github.com/gchq/CyberChef/pull/1528
[#661]: https://github.com/gchq/CyberChef/pull/661
[#493]: https://github.com/gchq/CyberChef/pull/493
[#592]: https://github.com/gchq/CyberChef/issues/592
[#1703]: https://github.com/gchq/CyberChef/issues/1703
[#1675]: https://github.com/gchq/CyberChef/issues/1675
[#1678]: https://github.com/gchq/CyberChef/issues/1678
[#1541]: https://github.com/gchq/CyberChef/issues/1541
[#1667]: https://github.com/gchq/CyberChef/issues/1667
[#1555]: https://github.com/gchq/CyberChef/issues/1555
[#1694]: https://github.com/gchq/CyberChef/issues/1694
[#1699]: https://github.com/gchq/CyberChef/issues/1699
[#1757]: https://github.com/gchq/CyberChef/issues/1757
[#1752]: https://github.com/gchq/CyberChef/issues/1752
[#1753]: https://github.com/gchq/CyberChef/issues/1753
[#1750]: https://github.com/gchq/CyberChef/issues/1750
[#1591]: https://github.com/gchq/CyberChef/issues/1591
[#654]: https://github.com/gchq/CyberChef/issues/654
[#1762]: https://github.com/gchq/CyberChef/issues/1762
[#1606]: https://github.com/gchq/CyberChef/issues/1606
[#1197]: https://github.com/gchq/CyberChef/issues/1197
[#933]: https://github.com/gchq/CyberChef/issues/933
[#1361]: https://github.com/gchq/CyberChef/issues/1361
[#1765]: https://github.com/gchq/CyberChef/issues/1765
[#1767]: https://github.com/gchq/CyberChef/issues/1767
[#1769]: https://github.com/gchq/CyberChef/issues/1769
[#1759]: https://github.com/gchq/CyberChef/issues/1759
[#1504]: https://github.com/gchq/CyberChef/issues/1504
[#512]: https://github.com/gchq/CyberChef/issues/512
[#1732]: https://github.com/gchq/CyberChef/issues/1732
[#1789]: https://github.com/gchq/CyberChef/issues/1789
[#1040]: https://github.com/gchq/CyberChef/pull/1040
[#2176]: https://github.com/gchq/CyberChef/pull/2176
[#2177]: https://github.com/gchq/CyberChef/pull/2177
[#2174]: https://github.com/gchq/CyberChef/pull/2174
[#2058]: https://github.com/gchq/CyberChef/pull/2058
[#1861]: https://github.com/gchq/CyberChef/pull/1861
[#2055]: https://github.com/gchq/CyberChef/pull/2055
[#2169]: https://github.com/gchq/CyberChef/pull/2169
[#2175]: https://github.com/gchq/CyberChef/pull/2175
[#2173]: https://github.com/gchq/CyberChef/pull/2173
[#2172]: https://github.com/gchq/CyberChef/pull/2172
[#2136]: https://github.com/gchq/CyberChef/pull/2136
[#2165]: https://github.com/gchq/CyberChef/pull/2165
[#2159]: https://github.com/gchq/CyberChef/pull/2159
[#2086]: https://github.com/gchq/CyberChef/pull/2086
[#2118]: https://github.com/gchq/CyberChef/pull/2118
[#2166]: https://github.com/gchq/CyberChef/pull/2166
[#2188]: https://github.com/gchq/CyberChef/pull/2188
[#2137]: https://github.com/gchq/CyberChef/pull/2137
[#1876]: https://github.com/gchq/CyberChef/pull/1876
[#2186]: https://github.com/gchq/CyberChef/pull/2186
[#1573]: https://github.com/gchq/CyberChef/pull/1573
[#2183]: https://github.com/gchq/CyberChef/pull/2183
[#2182]: https://github.com/gchq/CyberChef/pull/2182
[#2181]: https://github.com/gchq/CyberChef/pull/2181
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at oss@gchq.gov.uk. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
================================================
FILE: Dockerfile
================================================
#####################################
# Build the app to a static website #
#####################################
# Modifier --platform=$BUILDPLATFORM limits the platform to "BUILDPLATFORM" during buildx multi-platform builds
# This is because npm "chromedriver" package is not compatiable with all platforms
# For more info see: https://docs.docker.com/build/building/multi-platform/#cross-compilation
FROM --platform=$BUILDPLATFORM node:18-alpine AS builder
WORKDIR /app
COPY package.json .
COPY package-lock.json .
# Install dependencies
# --ignore-scripts prevents postinstall script (which runs grunt) as it depends on files other than package.json
RUN npm ci --ignore-scripts
# Copy files needed for postinstall and build
COPY . .
# npm postinstall runs grunt, which depends on files other than package.json
RUN npm run postinstall
# Build the app
RUN npm run build
#########################################
# Package static build files into nginx #
#########################################
FROM nginx:stable-alpine AS cyberchef
LABEL maintainer="GCHQ <oss@gchq.gov.uk>"
COPY --from=builder /app/build/prod /usr/share/nginx/html/
================================================
FILE: Gruntfile.js
================================================
"use strict";
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
const glob = require("glob");
const path = require("path");
const nodeFlags = "--experimental-modules --experimental-json-modules --experimental-specifier-resolution=node --no-warnings --no-deprecation";
/**
* Grunt configuration for building the app in various formats.
*
* @author n1474335 [n1474335@gmail.com]
* @copyright Crown Copyright 2017
* @license Apache-2.0
*/
module.exports = function (grunt) {
grunt.file.defaultEncoding = "utf8";
grunt.file.preserveBOM = false;
// Tasks
grunt.registerTask("dev",
"A persistent task which creates a development build whenever source files are modified.",
["clean:dev", "clean:config", "exec:generateConfig", "concurrent:dev"]);
grunt.registerTask("prod",
"Creates a production-ready build. Use the --msg flag to add a compile message.",
[
"eslint", "clean:prod", "clean:config", "exec:generateConfig", "findModules", "webpack:web",
"copy:standalone", "zip:standalone", "clean:standalone", "exec:calcDownloadHash", "chmod"
]);
grunt.registerTask("node",
"Compiles CyberChef into a single NodeJS module.",
[
"clean:node", "clean:config", "clean:nodeConfig", "exec:generateConfig", "exec:generateNodeIndex"
]);
grunt.registerTask("configTests",
"A task which configures config files in preparation for tests to be run. Use `npm test` to run tests.",
[
"clean:config", "clean:nodeConfig", "exec:generateConfig", "exec:generateNodeIndex"
]);
grunt.registerTask("testui",
"A task which runs all the UI tests in the tests directory. The prod task must already have been run.",
["connect:prod", "exec:browserTests"]);
grunt.registerTask("testnodeconsumer",
"A task which checks whether consuming CJS and ESM apps work with the CyberChef build",
["exec:setupNodeConsumers", "exec:testCJSNodeConsumer", "exec:testESMNodeConsumer", "exec:teardownNodeConsumers"]);
grunt.registerTask("default",
"Lints the code base",
["eslint", "exec:repoSize"]);
grunt.registerTask("lint", "eslint");
grunt.registerTask("findModules",
"Finds all generated modules and updates the entry point list for Webpack",
function(arg1, arg2) {
const moduleEntryPoints = listEntryModules();
grunt.log.writeln(`Found ${Object.keys(moduleEntryPoints).length} modules.`);
grunt.config.set("webpack.web.entry",
Object.assign({
main: "./src/web/index.js"
}, moduleEntryPoints));
});
// Load tasks provided by each plugin
grunt.loadNpmTasks("grunt-eslint");
grunt.loadNpmTasks("grunt-webpack");
grunt.loadNpmTasks("grunt-contrib-clean");
grunt.loadNpmTasks("grunt-contrib-copy");
grunt.loadNpmTasks("grunt-contrib-watch");
grunt.loadNpmTasks("grunt-chmod");
grunt.loadNpmTasks("grunt-exec");
grunt.loadNpmTasks("grunt-concurrent");
grunt.loadNpmTasks("grunt-contrib-connect");
grunt.loadNpmTasks("grunt-zip");
// Project configuration
const compileYear = grunt.template.today("UTC:yyyy"),
compileTime = grunt.template.today("UTC:dd/mm/yyyy HH:MM:ss") + " UTC",
pkg = grunt.file.readJSON("package.json"),
webpackConfig = require("./webpack.config.js"),
BUILD_CONSTANTS = {
COMPILE_YEAR: JSON.stringify(compileYear),
COMPILE_TIME: JSON.stringify(compileTime),
COMPILE_MSG: JSON.stringify(grunt.option("compile-msg") || grunt.option("msg") || ""),
PKG_VERSION: JSON.stringify(pkg.version),
},
moduleEntryPoints = listEntryModules(),
nodeConsumerTestPath = "~/tmp-cyberchef",
/**
* Configuration for Webpack production build. Defined as a function so that it
* can be recalculated when new modules are generated.
*/
webpackProdConf = () => {
return {
mode: "production",
target: "web",
entry: Object.assign({
main: "./src/web/index.js"
}, moduleEntryPoints),
output: {
path: __dirname + "/build/prod",
filename: chunkData => {
return chunkData.chunk.name === "main" ? "assets/[name].js": "[name].js";
},
globalObject: "this"
},
resolve: {
alias: {
"./config/modules/OpModules.mjs": "./config/modules/Default.mjs"
}
},
plugins: [
new webpack.DefinePlugin(BUILD_CONSTANTS),
new HtmlWebpackPlugin({
filename: "index.html",
template: "./src/web/html/index.html",
chunks: ["main"],
compileYear: compileYear,
compileTime: compileTime,
version: pkg.version,
minify: {
removeComments: true,
collapseWhitespace: true,
minifyJS: true,
minifyCSS: true
}
}),
new BundleAnalyzerPlugin({
analyzerMode: "static",
reportFilename: "BundleAnalyzerReport.html",
openAnalyzer: false
}),
]
};
};
/**
* Generates an entry list for all the modules.
*/
function listEntryModules() {
const entryModules = {};
glob.sync("./src/core/config/modules/*.mjs").forEach(file => {
const basename = path.basename(file);
if (basename !== "Default.mjs" && basename !== "OpModules.mjs")
entryModules["modules/" + basename.split(".mjs")[0]] = path.resolve(file);
});
return entryModules;
}
/**
* Detects the correct delimiter to use to chain shell commands together
* based on the current OS.
*
* @param {string[]} cmds
* @returns {string}
*/
function chainCommands(cmds) {
const win = process.platform === "win32";
if (!win) {
return cmds.join(";");
}
return cmds
// && means that subsequent commands will not be executed if the
// previous one fails. & would coninue on a fail
.join("&&")
// Windows does not support \n properly
.replace(/\n/g, "\\n");
}
grunt.initConfig({
clean: {
dev: ["build/dev/*"],
prod: ["build/prod/*"],
node: ["build/node/*"],
config: ["src/core/config/OperationConfig.json", "src/core/config/modules/*", "src/code/operations/index.mjs"],
nodeConfig: ["src/node/index.mjs", "src/node/config/OperationConfig.json"],
standalone: ["build/prod/CyberChef*.html"]
},
eslint: {
configs: ["*.{js,mjs}"],
core: ["src/core/**/*.{js,mjs}", "!src/core/vendor/**/*", "!src/core/operations/legacy/**/*"],
web: ["src/web/**/*.{js,mjs}", "!src/web/static/**/*"],
node: ["src/node/**/*.{js,mjs}"],
tests: ["tests/**/*.{js,mjs}"],
},
webpack: {
options: webpackConfig,
myConfig: webpackConfig,
web: webpackProdConf(),
},
"webpack-dev-server": {
options: webpackConfig,
start: {
mode: "development",
target: "web",
entry: Object.assign({
main: "./src/web/index.js"
}, moduleEntryPoints),
resolve: {
alias: {
"./config/modules/OpModules.mjs": "./config/modules/Default.mjs"
}
},
devServer: {
port: grunt.option("port") || 8080,
client: {
logging: "error",
overlay: true
},
hot: "only"
},
plugins: [
new webpack.DefinePlugin(BUILD_CONSTANTS),
new HtmlWebpackPlugin({
filename: "index.html",
template: "./src/web/html/index.html",
chunks: ["main"],
compileYear: compileYear,
compileTime: compileTime,
version: pkg.version,
})
]
}
},
zip: {
standalone: {
cwd: "build/prod/",
src: [
"build/prod/**/*",
"!build/prod/index.html",
"!build/prod/BundleAnalyzerReport.html",
],
dest: `build/prod/CyberChef_v${pkg.version}.zip`
}
},
connect: {
prod: {
options: {
port: grunt.option("port") || 8000,
base: "build/prod/"
}
}
},
copy: {
ghPages: {
options: {
process: function (content, srcpath) {
if (srcpath.indexOf("index.html") >= 0) {
// Add Google Analytics code to index.html
content = content.replace("</body></html>",
grunt.file.read("src/web/static/ga.html") + "</body></html>");
// Add Structured Data for SEO
content = content.replace("</head>",
"<script type='application/ld+json'>" +
JSON.stringify(JSON.parse(grunt.file.read("src/web/static/structuredData.json"))) +
"</script></head>");
return grunt.template.process(content, srcpath);
} else {
return content;
}
},
noProcess: ["**", "!**/*.html"]
},
files: [
{
src: ["build/prod/index.html"],
dest: "build/prod/index.html"
}
]
},
standalone: {
options: {
process: function (content, srcpath) {
if (srcpath.indexOf("index.html") >= 0) {
// Replace download link with version number
content = content.replace(/<a [^>]+>Download CyberChef.+?<\/a>/,
`<span>Version ${pkg.version}</span>`);
return grunt.template.process(content, srcpath);
} else {
return content;
}
},
noProcess: ["**", "!**/*.html"]
},
files: [
{
src: ["build/prod/index.html"],
dest: `build/prod/CyberChef_v${pkg.version}.html`
}
]
}
},
chmod: {
build: {
options: {
mode: "755",
},
src: ["build/**/*", "build/"]
}
},
watch: {
config: {
files: ["src/core/operations/**/*", "!src/core/operations/index.mjs"],
tasks: ["exec:generateNodeIndex", "exec:generateConfig"]
}
},
concurrent: {
dev: ["watch:config", "webpack-dev-server:start"],
options: {
logConcurrentOutput: true
}
},
exec: {
calcDownloadHash: {
command: function () {
switch (process.platform) {
case "darwin":
return chainCommands([
`shasum -a 256 build/prod/CyberChef_v${pkg.version}.zip | awk '{print $1;}' > build/prod/sha256digest.txt`,
`sed -i '' -e "s/DOWNLOAD_HASH_PLACEHOLDER/$(cat build/prod/sha256digest.txt)/" build/prod/index.html`
]);
default:
return chainCommands([
`sha256sum build/prod/CyberChef_v${pkg.version}.zip | awk '{print $1;}' > build/prod/sha256digest.txt`,
`sed -i -e "s/DOWNLOAD_HASH_PLACEHOLDER/$(cat build/prod/sha256digest.txt)/" build/prod/index.html`
]);
}
},
},
repoSize: {
command: chainCommands([
"git ls-files | wc -l | xargs printf '\n%b\ttracked files\n'",
"du -hs | egrep -o '^[^\t]*' | xargs printf '%b\trepository size\n'"
]),
stderr: false
},
cleanGit: {
command: "git gc --prune=now --aggressive"
},
sitemap: {
command: `node ${nodeFlags} src/web/static/sitemap.mjs > build/prod/sitemap.xml`,
sync: true
},
generateConfig: {
command: chainCommands([
"echo '\n--- Regenerating config files. ---'",
"echo [] > src/core/config/OperationConfig.json",
`node ${nodeFlags} src/core/config/scripts/generateOpsIndex.mjs`,
`node ${nodeFlags} src/core/config/scripts/generateConfig.mjs`,
"echo '--- Config scripts finished. ---\n'"
]),
sync: true
},
generateNodeIndex: {
command: chainCommands([
"echo '\n--- Regenerating node index ---'",
`node ${nodeFlags} src/node/config/scripts/generateNodeIndex.mjs`,
"echo '--- Node index generated. ---\n'"
]),
sync: true
},
browserTests: {
command: "./node_modules/.bin/nightwatch --env prod"
},
setupNodeConsumers: {
command: chainCommands([
"echo '\n--- Testing node consumers ---'",
"npm link",
`mkdir ${nodeConsumerTestPath}`,
`cp tests/node/consumers/* ${nodeConsumerTestPath}`,
`cd ${nodeConsumerTestPath}`,
"npm link cyberchef"
]),
sync: true
},
teardownNodeConsumers: {
command: chainCommands([
`rm -rf ${nodeConsumerTestPath}`,
"echo '\n--- Node consumer tests complete ---'"
]),
},
testCJSNodeConsumer: {
command: chainCommands([
`cd ${nodeConsumerTestPath}`,
`node ${nodeFlags} cjs-consumer.js`,
]),
stdout: false,
},
testESMNodeConsumer: {
command: chainCommands([
`cd ${nodeConsumerTestPath}`,
`node ${nodeFlags} esm-consumer.mjs`,
]),
stdout: false,
},
fixCryptoApiImports: {
command: function () {
switch (process.platform) {
case "darwin":
return `find ./node_modules/crypto-api/src/ \\( -type d -name .git -prune \\) -o -type f -print0 | xargs -0 sed -i '' -e '/\\.mjs/!s/\\(from "\\.[^"]*\\)";/\\1.mjs";/g'`;
default:
return `find ./node_modules/crypto-api/src/ \\( -type d -name .git -prune \\) -o -type f -print0 | xargs -0 sed -i -e '/\\.mjs/!s/\\(from "\\.[^"]*\\)";/\\1.mjs";/g'`;
}
},
stdout: false
},
fixSnackbarMarkup: {
command: function () {
switch (process.platform) {
case "darwin":
return `sed -i '' 's/<div id=snackbar-container\\/>/<div id=snackbar-container>/g' ./node_modules/snackbarjs/src/snackbar.js`;
default:
return `sed -i 's/<div id=snackbar-container\\/>/<div id=snackbar-container>/g' ./node_modules/snackbarjs/src/snackbar.js`;
}
},
stdout: false
},
},
});
};
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
# CyberChef
[](https://github.com/gchq/CyberChef/actions?query=workflow%3A%22Master+Build%2C+Test+%26+Deploy%22)
[](https://www.npmjs.com/package/cyberchef)
[](https://github.com/gchq/CyberChef/blob/master/LICENSE)
[](https://gitter.im/gchq/CyberChef?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
#### *The Cyber Swiss Army Knife*
CyberChef is a simple, intuitive web app for carrying out all manner of "cyber" operations within a web browser. These operations include simple encoding like XOR and Base64, more complex encryption like AES, DES and Blowfish, creating binary and hexdumps, compression and decompression of data, calculating hashes and checksums, IPv6 and X.509 parsing, changing character encodings, and much more.
The tool is designed to enable both technical and non-technical analysts to manipulate data in complex ways without having to deal with complex tools or algorithms. It was conceived, designed, built and incrementally improved by an analyst in their 10% innovation time over several years.
## Live demo
CyberChef is still under active development. As a result, it shouldn't be considered a finished product. There is still testing and bug fixing to do, new features to be added and additional documentation to write. Please contribute!
Cryptographic operations in CyberChef should not be relied upon to provide security in any situation. No guarantee is offered for their correctness.
[A live demo can be found here][1] - have fun!
## Running Locally with Docker
**Prerequisites**
- [Docker](https://www.docker.com/products/docker-desktop/)
- Docker Desktop must be open and running on your machine
#### Option 1: Build the Docker Image Yourself
1. Build the docker image
```bash
docker build --tag cyberchef --ulimit nofile=10000 .
```
2. Run the docker container
```bash
docker run -it -p 8080:80 cyberchef
```
3. Navigate to `http://localhost:8080` in your browser
#### Option 2: Use the pre-built Docker Image
If you prefer to skip the build process, you can use the pre-built image
```bash
docker run -it -p 8080:80 ghcr.io/gchq/cyberchef:latest
```
Just like before, navigate to `http://localhost:8080` in your browser.
This image is built and published through our [GitHub Workflows](.github/workflows/releases.yml)
## How it works
There are four main areas in CyberChef:
1. The **input** box in the top right, where you can paste, type or drag the text or file you want to operate on.
2. The **output** box in the bottom right, where the outcome of your processing will be displayed.
3. The **operations** list on the far left, where you can find all the operations that CyberChef is capable of in categorised lists, or by searching.
4. The **recipe** area in the middle, where you can drag the operations that you want to use and specify arguments and options.
You can use as many operations as you like in simple or complex ways. Some examples are as follows:
- [Decode a Base64-encoded string][2]
- [Convert a date and time to a different time zone][3]
- [Parse a Teredo IPv6 address][4]
- [Convert data from a hexdump, then decompress][5]
- [Decrypt and disassemble shellcode][6]
- [Display multiple timestamps as full dates][7]
- [Carry out different operations on data of different types][8]
- [Use parts of the input as arguments to operations][9]
- [Perform AES decryption, extracting the IV from the beginning of the cipher stream][10]
- [Automagically detect several layers of nested encoding][12]
## Features
- Drag and drop
- Operations can be dragged in and out of the recipe list, or reorganised.
- Files up to 2GB can be dragged over the input box to load them directly into the browser.
- Auto Bake
- Whenever you modify the input or the recipe, CyberChef will automatically "bake" for you and produce the output immediately.
- This can be turned off and operated manually if it is affecting performance (if the input is very large, for instance).
- Automated encoding detection
- CyberChef uses [a number of techniques](https://github.com/gchq/CyberChef/wiki/Automatic-detection-of-encoded-data-using-CyberChef-Magic) to attempt to automatically detect which encodings your data is under. If it finds a suitable operation that make sense of your data, it displays the 'magic' icon in the Output field which you can click to decode your data.
- Breakpoints
- You can set breakpoints on any operation in your recipe to pause execution before running it.
- You can also step through the recipe one operation at a time to see what the data looks like at each stage.
- Save and load recipes
- If you come up with an awesome recipe that you know you’ll want to use again, just click "Save recipe" and add it to your local storage. It'll be waiting for you next time you visit CyberChef.
- You can also copy the URL, which includes your recipe and input, to easily share it with others.
- Search
- If you know the name of the operation you want or a word associated with it, start typing it into the search field and any matching operations will immediately be shown.
- Highlighting
- When you highlight text in the input or output, the offset and length values will be displayed and, if possible, the corresponding data will be highlighted in the output or input respectively (example: [highlight the word 'question' in the input to see where it appears in the output][11]).
- Save to file and load from file
- You can save the output to a file at any time or load a file by dragging and dropping it into the input field. Files up to around 2GB are supported (depending on your browser), however, some operations may take a very long time to run over this much data.
- CyberChef is entirely client-side
- It should be noted that none of your recipe configuration or input (either text or files) is ever sent to the CyberChef web server - all processing is carried out within your browser, on your own computer.
- Due to this feature, CyberChef can be downloaded and run locally. You can use the link in the top left corner of the app to download a full copy of CyberChef and drop it into a virtual machine, share it with other people, or host it in a closed network.
## Deep linking
By manipulating CyberChef's URL hash, you can change the initial settings with which the page opens.
The format is `https://gchq.github.io/CyberChef/#recipe=Operation()&input=...`
Supported arguments are `recipe`, `input` (encoded in Base64), and `theme`.
## Browser support
CyberChef is built to support
- Google Chrome 50+
- Mozilla Firefox 38+
## Node.js support
CyberChef is built to fully support Node.js `v16`. For more information, see the ["Node API" wiki page](https://github.com/gchq/CyberChef/wiki/Node-API)
## Contributing
Contributing a new operation to CyberChef is super easy! The quickstart script will walk you through the process. If you can write basic JavaScript, you can write a CyberChef operation.
An installation walkthrough, how-to guides for adding new operations and themes, descriptions of the repository structure, available data types and coding conventions can all be found in the ["Contributing" wiki page](https://github.com/gchq/CyberChef/wiki/Contributing).
- Push your changes to your fork.
- Submit a pull request. If you are doing this for the first time, you will be prompted to sign the [GCHQ Contributor Licence Agreement](https://cla-assistant.io/gchq/CyberChef) via the CLA assistant on the pull request. This will also ask whether you are happy for GCHQ to contact you about a token of thanks for your contribution, or about job opportunities at GCHQ.
## Licencing
CyberChef is released under the [Apache 2.0 Licence](https://www.apache.org/licenses/LICENSE-2.0) and is covered by [Crown Copyright](https://www.nationalarchives.gov.uk/information-management/re-using-public-sector-information/uk-government-licensing-framework/crown-copyright/).
[1]: https://gchq.github.io/CyberChef
[2]: https://gchq.github.io/CyberChef/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true)&input=VTI4Z2JHOXVaeUJoYm1RZ2RHaGhibXR6SUdadmNpQmhiR3dnZEdobElHWnBjMmd1
[3]: https://gchq.github.io/CyberChef/#recipe=Translate_DateTime_Format('Standard%20date%20and%20time','DD/MM/YYYY%20HH:mm:ss','UTC','dddd%20Do%20MMMM%20YYYY%20HH:mm:ss%20Z%20z','Australia/Queensland')&input=MTUvMDYvMjAxNSAyMDo0NTowMA
[4]: https://gchq.github.io/CyberChef/#recipe=Parse_IPv6_address()&input=MjAwMTowMDAwOjQxMzY6ZTM3ODo4MDAwOjYzYmY6M2ZmZjpmZGQy
[5]: https://gchq.github.io/CyberChef/#recipe=From_Hexdump()Gunzip()&input=MDAwMDAwMDAgIDFmIDhiIDA4IDAwIDEyIGJjIGYzIDU3IDAwIGZmIDBkIGM3IGMxIDA5IDAwIDIwICB8Li4uLi6881cu/y7HwS4uIHwKMDAwMDAwMTAgIDA4IDA1IGQwIDU1IGZlIDA0IDJkIGQzIDA0IDFmIGNhIDhjIDQ0IDIxIDViIGZmICB8Li7QVf4uLdMuLsouRCFb/3wKMDAwMDAwMjAgIDYwIGM3IGQ3IDAzIDE2IGJlIDQwIDFmIDc4IDRhIDNmIDA5IDg5IDBiIDlhIDdkICB8YMfXLi6%2BQC54Sj8uLi4ufXwKMDAwMDAwMzAgIDRlIGM4IDRlIDZkIDA1IDFlIDAxIDhiIDRjIDI0IDAwIDAwIDAwICAgICAgICAgICB8TshObS4uLi5MJC4uLnw
[6]: https://gchq.github.io/CyberChef/#recipe=RC4(%7B'option':'UTF8','string':'secret'%7D,'Hex','Hex')Disassemble_x86('64','Full%20x86%20architecture',16,0,true,true)&input=MjFkZGQyNTQwMTYwZWU2NWZlMDc3NzEwM2YyYTM5ZmJlNWJjYjZhYTBhYWJkNDE0ZjkwYzZjYWY1MzEyNzU0YWY3NzRiNzZiM2JiY2QxOTNjYjNkZGZkYmM1YTI2NTMzYTY4NmI1OWI4ZmVkNGQzODBkNDc0NDIwMWFlYzIwNDA1MDcxMzhlMmZlMmIzOTUwNDQ2ZGIzMWQyYmM2MjliZTRkM2YyZWIwMDQzYzI5M2Q3YTVkMjk2MmMwMGZlNmRhMzAwNzJkOGM1YTZiNGZlN2Q4NTlhMDQwZWVhZjI5OTczMzYzMDJmNWEwZWMxOQ
[7]: https://gchq.github.io/CyberChef/#recipe=Fork('%5C%5Cn','%5C%5Cn',false)From_UNIX_Timestamp('Seconds%20(s)')&input=OTc4MzQ2ODAwCjEwMTI2NTEyMDAKMTA0NjY5NjQwMAoxMDgxMDg3MjAwCjExMTUzMDUyMDAKMTE0OTYwOTYwMA
[8]: https://gchq.github.io/CyberChef/#recipe=Fork('%5C%5Cn','%5C%5Cn',false)Conditional_Jump('1',false,'base64',10)To_Hex('Space')Return()Label('base64')To_Base64('A-Za-z0-9%2B/%3D')&input=U29tZSBkYXRhIHdpdGggYSAxIGluIGl0ClNvbWUgZGF0YSB3aXRoIGEgMiBpbiBpdA
[9]: https://gchq.github.io/CyberChef/#recipe=Register('key%3D(%5B%5C%5Cda-f%5D*)',true,false)Find_/_Replace(%7B'option':'Regex','string':'.*data%3D(.*)'%7D,'$1',true,false,true)RC4(%7B'option':'Hex','string':'$R0'%7D,'Hex','Latin1')&input=aHR0cDovL21hbHdhcmV6LmJpei9iZWFjb24ucGhwP2tleT0wZTkzMmE1YyZkYXRhPThkYjdkNWViZTM4NjYzYTU0ZWNiYjMzNGUzZGIxMQ
[10]: https://gchq.github.io/CyberChef/#recipe=Register('(.%7B32%7D)',true,false)Drop_bytes(0,32,false)AES_Decrypt(%7B'option':'Hex','string':'1748e7179bd56570d51fa4ba287cc3e5'%7D,%7B'option':'Hex','string':'$R0'%7D,'CTR','Hex','Raw',%7B'option':'Hex','string':''%7D)&input=NTFlMjAxZDQ2MzY5OGVmNWY3MTdmNzFmNWI0NzEyYWYyMGJlNjc0YjNiZmY1M2QzODU0NjM5NmVlNjFkYWFjNDkwOGUzMTljYTNmY2Y3MDg5YmZiNmIzOGVhOTllNzgxZDI2ZTU3N2JhOWRkNmYzMTFhMzk0MjBiODk3OGU5MzAxNGIwNDJkNDQ3MjZjYWVkZjU0MzZlYWY2NTI0MjljMGRmOTRiNTIxNjc2YzdjMmNlODEyMDk3YzI3NzI3M2M3YzcyY2Q4OWFlYzhkOWZiNGEyNzU4NmNjZjZhYTBhZWUyMjRjMzRiYTNiZmRmN2FlYjFkZGQ0Nzc2MjJiOTFlNzJjOWU3MDlhYjYwZjhkYWY3MzFlYzBjYzg1Y2UwZjc0NmZmMTU1NGE1YTNlYzI5MWNhNDBmOWU2MjlhODcyNTkyZDk4OGZkZDgzNDUzNGFiYTc5YzFhZDE2NzY3NjlhN2MwMTBiZjA0NzM5ZWNkYjY1ZDk1MzAyMzcxZDYyOWQ5ZTM3ZTdiNGEzNjFkYTQ2OGYxZWQ1MzU4OTIyZDJlYTc1MmRkMTFjMzY2ZjMwMTdiMTRhYTAxMWQyYWYwM2M0NGY5NTU3OTA5OGExNWUzY2Y5YjQ0ODZmOGZmZTljMjM5ZjM0ZGU3MTUxZjZjYTY1MDBmZTRiODUwYzNmMWMwMmU4MDFjYWYzYTI0NDY0NjE0ZTQyODAxNjE1YjhmZmFhMDdhYzgyNTE0OTNmZmRhN2RlNWRkZjMzNjg4ODBjMmI5NWIwMzBmNDFmOGYxNTA2NmFkZDA3MWE2NmNmNjBlNWY0NmYzYTIzMGQzOTdiNjUyOTYzYTIxYTUzZg
[11]: https://gchq.github.io/CyberChef/#recipe=XOR(%7B'option':'Hex','string':'3a'%7D,'Standard',false)To_Hexdump(16,false,false)&input=VGhlIGFuc3dlciB0byB0aGUgdWx0aW1hdGUgcXVlc3Rpb24gb2YgbGlmZSwgdGhlIFVuaXZlcnNlLCBhbmQgZXZlcnl0aGluZyBpcyA0Mi4
[12]: https://gchq.github.io/CyberChef/#recipe=Magic(3,false,false)&input=V1VhZ3dzaWFlNm1QOGdOdENDTFVGcENwQ0IyNlJtQkRvREQ4UGFjZEFtekF6QlZqa0syUXN0RlhhS2hwQzZpVVM3UkhxWHJKdEZpc29SU2dvSjR3aGptMWFybTg2NHFhTnE0UmNmVW1MSHJjc0FhWmM1VFhDWWlmTmRnUzgzZ0RlZWpHWDQ2Z2FpTXl1QlY2RXNrSHQxc2NnSjg4eDJ0TlNvdFFEd2JHWTFtbUNvYjJBUkdGdkNLWU5xaU45aXBNcTFaVTFtZ2tkYk51R2NiNzZhUnRZV2hDR1VjOGc5M1VKdWRoYjhodHNoZVpud1RwZ3FoeDgzU1ZKU1pYTVhVakpUMnptcEM3dVhXdHVtcW9rYmRTaTg4WXRrV0RBYzFUb291aDJvSDRENGRkbU5LSldVRHBNd21uZ1VtSzE0eHdtb21jY1BRRTloTTE3MkFQblNxd3hkS1ExNzJSa2NBc3lzbm1qNWdHdFJtVk5OaDJzMzU5d3I2bVMyUVJQ
================================================
FILE: SECURITY.md
================================================
# Security Policy
## Supported Versions
CyberChef is supported on a best endeavours basis. Patches will be applied to
the latest version rather than retroactively to older versions. To ensure you
are using the most secure version of CyberChef, please make sure you have the
[latest release](https://github.com/gchq/CyberChef/releases/latest). The
official [live demo](https://gchq.github.io/CyberChef/) is always up to date.
## Reporting a Vulnerability
In most scenarios, the most appropriate way to report a vulnerability is to
[raise a new issue](https://github.com/gchq/CyberChef/issues/new/choose)
describing the problem in as much detail as possible, ideally with examples.
This will obviously be public. If you feel that the vulnerability is
significant enough to warrant a private disclosure, please email
[oss@gchq.gov.uk](mailto:oss@gchq.gov.uk) and
[n1474335@gmail.com](mailto:n1474335@gmail.com).
Disclosures of vulnerabilities in CyberChef are always welcomed. Whilst we aim
to write clean and secure code free from bugs, we recognise that this is an open
source project written by analysts in their spare time, relying on dozens of
open source libraries that are modified and updated on a regular basis. We hope
that the community will continue to support us as we endeavour to maintain and
develop this tool together.
================================================
FILE: babel.config.js
================================================
module.exports = function(api) {
api.cache.forever();
return {
"presets": [
["@babel/preset-env", {
"modules": false,
"useBuiltIns": "entry",
"corejs": 3
}]
],
"plugins": [
"@babel/plugin-syntax-import-assertions",
[
"@babel/plugin-transform-runtime", {
"regenerator": true
}
]
]
};
};
================================================
FILE: eslint.config.mjs
================================================
import babelParser from "@babel/eslint-parser";
import jsdoc from "eslint-plugin-jsdoc";
import js from "@eslint/js";
import globals from "globals";
export default [
js.configs.recommended,
{
languageOptions: {
ecmaVersion: 2022,
parser: babelParser,
parserOptions: {
ecmaVersion: 2022,
ecmaFeatures: {
impliedStrict: true
},
sourceType: "module",
allowImportExportEverywhere: true
},
globals: {
...globals.browser,
...globals.node,
...globals.es6,
"$": false,
"jQuery": false,
"log": false,
"app": false,
"COMPILE_TIME": false,
"COMPILE_MSG": false,
"PKG_VERSION": false
},
},
ignores: ["src/core/vendor/**"],
plugins: {
jsdoc
},
rules: {
// enable additional rules
"no-eval": "error",
"no-implied-eval": "error",
"dot-notation": "error",
"eqeqeq": ["error", "smart"],
"no-caller": "error",
"no-extra-bind": "error",
"no-unused-expressions": "error",
"no-useless-call": "error",
"no-useless-return": "error",
"radix": "warn",
// modify rules from base configurations
"no-unused-vars": ["error", {
"args": "none",
"vars": "all",
"caughtErrors": "none"
}],
"no-empty": ["error", {
"allowEmptyCatch": true
}],
// disable rules from base configurations
"no-control-regex": "off",
"require-atomic-updates": "off",
"no-async-promise-executor": "off",
// stylistic conventions
"brace-style": ["error", "1tbs"],
"space-before-blocks": ["error", "always"],
"block-spacing": "error",
"array-bracket-spacing": "error",
"comma-spacing": "error",
"spaced-comment": ["error", "always", { "exceptions": ["/"] }],
"comma-style": "error",
"computed-property-spacing": "error",
"no-trailing-spaces": "warn",
"eol-last": "error",
"func-call-spacing": "error",
"key-spacing": ["warn", {
"mode": "minimum"
}],
"indent": ["error", 4, {
"ignoreComments": true,
"ArrayExpression": "first",
"SwitchCase": 1
}],
"linebreak-style": ["error", "unix"],
"quotes": ["error", "double", {
"avoidEscape": true,
"allowTemplateLiterals": true
}],
"camelcase": ["error", {
"properties": "always"
}],
"semi": ["error", "always"],
"unicode-bom": "error",
"jsdoc/require-jsdoc": ["error", {
"require": {
"FunctionDeclaration": true,
"MethodDefinition": true,
"ClassDeclaration": true,
"ArrowFunctionExpression": false
}
}],
"keyword-spacing": ["error", {
"before": true,
"after": true
}],
"no-multiple-empty-lines": ["warn", {
"max": 2,
"maxEOF": 1,
"maxBOF": 0
}],
"no-whitespace-before-property": "error",
"operator-linebreak": ["error", "after"],
"space-in-parens": "error",
"no-var": "error",
"prefer-const": "error",
"no-console": "error"
},
},
// File-pattern specific overrides
{
files: ["tests/**/*"],
rules: {
"no-unused-expressions": "off",
"no-console": "off"
}
},
];
================================================
FILE: nightwatch.json
================================================
{
"src_folders": ["tests/browser"],
"exclude": ["tests/browser/browserUtils.js"],
"output_folder": "tests/browser/output",
"test_settings": {
"default": {
"launch_url": "http://localhost:8080",
"webdriver": {
"start_process": true,
"server_path": "./node_modules/.bin/chromedriver",
"port": 9515,
"log_path": "tests/browser/output"
},
"desiredCapabilities": {
"browserName": "chrome"
},
"enable_fail_fast": true
},
"dev": {
"launch_url": "http://localhost:8080"
},
"prod": {
"launch_url": "http://localhost:8000/index.html"
}
}
}
================================================
FILE: package.json
================================================
{
"name": "cyberchef",
"version": "10.22.1",
"description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
"author": "n1474335 <n1474335@gmail.com>",
"homepage": "https://gchq.github.io/CyberChef",
"copyright": "Crown copyright 2016",
"license": "Apache-2.0",
"keywords": [
"cipher",
"cypher",
"encode",
"decode",
"encrypt",
"decrypt",
"base64",
"xor",
"charset",
"hex",
"encoding",
"format",
"cybersecurity",
"data manipulation",
"data analysis"
],
"repository": {
"type": "git",
"url": "https://github.com/gchq/CyberChef/"
},
"main": "src/node/wrapper.js",
"exports": {
"import": "./src/node/index.mjs",
"require": "./src/node/wrapper.js"
},
"bugs": "https://github.com/gchq/CyberChef/issues",
"browserslist": [
"Chrome >= 50",
"Firefox >= 38",
"node >= 16"
],
"devDependencies": {
"@babel/eslint-parser": "^7.28.6",
"@babel/plugin-syntax-import-assertions": "^7.28.6",
"@babel/plugin-transform-runtime": "^7.29.0",
"@babel/preset-env": "^7.29.2",
"@babel/runtime": "^7.28.6",
"@codemirror/commands": "^6.10.3",
"@codemirror/language": "^6.12.2",
"@codemirror/search": "^6.6.0",
"@codemirror/state": "^6.5.4",
"@codemirror/view": "^6.39.17",
"autoprefixer": "^10.4.27",
"babel-loader": "^10.1.1",
"base64-loader": "^1.0.0",
"chromedriver": "^130.0.4",
"cli-progress": "^3.12.0",
"colors": "^1.4.0",
"compression-webpack-plugin": "^11.1.0",
"copy-webpack-plugin": "^13.0.1",
"core-js": "^3.48.0",
"cspell": "^8.19.4",
"css-loader": "7.1.4",
"eslint": "^9.39.4",
"eslint-plugin-jsdoc": "^50.8.0",
"globals": "^15.15.0",
"grunt": "^1.6.1",
"grunt-chmod": "~1.1.1",
"grunt-concurrent": "^3.0.0",
"grunt-contrib-clean": "~2.0.1",
"grunt-contrib-connect": "^5.0.1",
"grunt-contrib-copy": "~1.0.0",
"grunt-contrib-watch": "^1.1.0",
"grunt-eslint": "^25.0.0",
"grunt-exec": "~3.0.0",
"grunt-webpack": "^6.0.0",
"grunt-zip": "^1.0.0",
"html-webpack-plugin": "^5.6.6",
"imports-loader": "^5.0.0",
"mini-css-extract-plugin": "2.10.1",
"modify-source-webpack-plugin": "^4.1.0",
"nightwatch": "^3.15.0",
"postcss": "^8.5.8",
"postcss-css-variables": "^0.19.0",
"postcss-import": "^16.1.1",
"postcss-loader": "^8.2.1",
"prompt": "^1.3.0",
"sitemap": "^8.0.3",
"terser": "^5.46.1",
"webpack": "^5.105.4",
"webpack-bundle-analyzer": "^4.10.2",
"webpack-dev-server": "5.0.4",
"webpack-node-externals": "^3.0.0",
"worker-loader": "^3.0.8"
},
"dependencies": {
"@alexaltea/capstone-js": "^3.0.5",
"@astronautlabs/amf": "^0.0.6",
"@blu3r4y/lzma": "^2.3.3",
"@wavesenterprise/crypto-gost-js": "^2.1.0-RC1",
"@xmldom/xmldom": "^0.8.11",
"argon2-browser": "^1.18.0",
"arrive": "^2.5.2",
"assert": "^2.1.0",
"avsc": "^5.7.9",
"bcryptjs": "^2.4.3",
"bignumber.js": "^9.3.1",
"blakejs": "^1.2.1",
"bootstrap": "4.6.2",
"bootstrap-colorpicker": "^3.4.0",
"bootstrap-material-design": "^4.1.3",
"browserify-zlib": "^0.2.0",
"bson": "^4.7.2",
"buffer": "^6.0.3",
"cbor": "9.0.2",
"chi-squared": "^1.1.0",
"codepage": "^1.15.0",
"crypto-api": "^0.8.5",
"crypto-browserify": "^3.12.1",
"crypto-js": "^4.2.0",
"ctph.js": "0.0.5",
"d3": "7.9.0",
"d3-hexbin": "^0.2.2",
"diff": "^5.2.2",
"dompurify": "^3.3.3",
"es6-promisify": "^7.0.0",
"escodegen": "^2.1.0",
"esprima": "^4.0.1",
"events": "^3.3.0",
"exif-parser": "^0.1.12",
"fernet": "^0.3.3",
"file-saver": "^2.0.5",
"flat": "^6.0.1",
"geodesy": "1.1.3",
"handlebars": "^4.7.8",
"hash-wasm": "^4.12.0",
"highlight.js": "^11.11.1",
"ieee754": "^1.2.1",
"jimp": "^1.6.0",
"jq-web": "^0.5.1",
"jquery": "3.7.1",
"js-sha3": "^0.9.3",
"jsesc": "^3.1.0",
"json5": "^2.2.3",
"jsonata": "^2.1.0",
"jsonpath-plus": "^10.4.0",
"jsonwebtoken": "9.0.3",
"jsqr": "^1.4.0",
"jsrsasign": "^11.1.1",
"kbpgp": "^2.1.17",
"libbzip2-wasm": "0.0.4",
"libyara-wasm": "^1.2.1",
"lodash": "^4.17.23",
"loglevel": "^1.9.2",
"loglevel-message-prefix": "^3.0.0",
"lz-string": "^1.5.0",
"lz4js": "^0.2.0",
"markdown-it": "^14.1.1",
"moment": "^2.30.1",
"moment-timezone": "^0.6.1",
"ngeohash": "^0.6.3",
"node-forge": "^1.3.3",
"node-md6": "^0.1.0",
"nodom": "^2.4.0",
"notepack.io": "^3.0.1",
"ntlm": "^0.1.3",
"nwmatcher": "^1.4.4",
"otpauth": "9.3.6",
"path": "^0.12.7",
"popper.js": "^1.16.1",
"process": "^0.11.10",
"protobufjs": "^7.5.4",
"qr-image": "^3.2.0",
"reflect-metadata": "^0.2.2",
"rison": "^0.1.1",
"scryptsy": "^2.1.0",
"snackbarjs": "^1.1.0",
"sortablejs": "^1.15.7",
"split.js": "^1.6.5",
"sql-formatter": "^15.6.12",
"ssdeep.js": "0.0.3",
"stream-browserify": "^3.0.0",
"tesseract.js": "^6.0.1",
"ua-parser-js": "^1.0.41",
"unorm": "^1.6.0",
"url": "^0.11.4",
"utf8": "^3.0.0",
"uuid": "^13.0.0",
"vkbeautify": "^0.99.3",
"xpath": "0.0.34",
"xregexp": "^5.1.2",
"zlibjs": "^0.3.1"
},
"scripts": {
"start": "npx grunt dev",
"build": "npx grunt prod",
"node": "npx grunt node",
"repl": "node --experimental-modules --experimental-json-modules --experimental-specifier-resolution=node --no-experimental-fetch --no-warnings src/node/repl.mjs",
"test": "npx grunt configTests && node --experimental-modules --experimental-json-modules --no-warnings --no-deprecation --openssl-legacy-provider --no-experimental-fetch tests/node/index.mjs && node --experimental-modules --experimental-json-modules --no-warnings --no-deprecation --openssl-legacy-provider --no-experimental-fetch --trace-uncaught tests/operations/index.mjs",
"testnodeconsumer": "npx grunt testnodeconsumer",
"testui": "npx grunt testui",
"testuidev": "npx nightwatch --env=dev",
"lint": "npx grunt lint",
"lint:grammar": "cspell ./src",
"postinstall": "npx grunt exec:fixCryptoApiImports && npx grunt exec:fixSnackbarMarkup",
"newop": "node --experimental-modules --experimental-json-modules src/core/config/scripts/newOperation.mjs",
"minor": "node --experimental-modules --experimental-json-modules src/core/config/scripts/newMinorVersion.mjs && npm version minor --git-tag-version=false && echo \"Updated to version v$(npm pkg get version | xargs), please create a pull request and once merged use 'npm run tag'\"",
"tag": "git tag -s \"v$(npm pkg get version | xargs)\" -m \"$(npm pkg get version | xargs)\" && echo \"Created v$(npm pkg get version | xargs), now check and push the tag\"",
"getheapsize": "node -e 'console.log(`node heap limit = ${require(\"v8\").getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)'",
"setheapsize": "export NODE_OPTIONS=--max_old_space_size=2048"
}
}
================================================
FILE: postcss.config.js
================================================
module.exports = {
plugins: [
require("postcss-import"),
require("autoprefixer"),
require("postcss-css-variables")({
preserve: true
}),
]
};
================================================
FILE: src/core/Chef.mjs
================================================
/**
* @author n1474335 [n1474335@gmail.com]
* @copyright Crown Copyright 2016
* @license Apache-2.0
*/
import Dish from "./Dish.mjs";
import Recipe from "./Recipe.mjs";
import log from "loglevel";
import { isWorkerEnvironment } from "./Utils.mjs";
/**
* The main controller for CyberChef.
*/
class Chef {
/**
* Chef constructor
*/
constructor() {
this.dish = new Dish();
}
/**
* Runs the recipe over the input.
*
* @param {string|ArrayBuffer} input - The input data as a string or ArrayBuffer
* @param {Object[]} recipeConfig - The recipe configuration object
* @param {Object} [options={}] - The options object storing various user choices
* @param {string} [options.returnType] - What type to return the result as
*
* @returns {Object} response
* @returns {string} response.result - The output of the recipe
* @returns {string} response.type - The data type of the result
* @returns {number} response.progress - The position that we have got to in the recipe
* @returns {number} response.duration - The number of ms it took to execute the recipe
* @returns {number} response.error - The error object thrown by a failed operation (false if no error)
*/
async bake(input, recipeConfig, options={}) {
log.debug("Chef baking");
const startTime = Date.now(),
recipe = new Recipe(recipeConfig),
containsFc = recipe.containsFlowControl();
let error = false,
progress = 0;
if (containsFc && isWorkerEnvironment()) self.setOption("attemptHighlight", false);
// Load data
const type = input instanceof ArrayBuffer ? Dish.ARRAY_BUFFER : Dish.STRING;
this.dish.set(input, type);
try {
progress = await recipe.execute(this.dish, progress);
} catch (err) {
log.error(err);
error = {
displayStr: err.displayStr,
};
progress = err.progress;
}
// Create a raw version of the dish, unpresented
const rawDish = this.dish.clone();
// Present the raw result
await recipe.present(this.dish);
const returnType =
this.dish.type === Dish.HTML ? Dish.HTML :
options?.returnType ? options.returnType : Dish.ARRAY_BUFFER;
return {
dish: rawDish,
result: await this.dish.get(returnType),
type: Dish.enumLookup(this.dish.type),
progress: progress,
duration: Date.now() - startTime,
error: error
};
}
/**
* When a browser tab is unfocused and the browser has to run lots of dynamic content in other tabs,
* it swaps out the memory for that tab. If the CyberChef tab has been unfocused for more than a
* minute, we run a silent bake which will force the browser to load and cache all the relevant
* JavaScript code needed to do a real bake.
*
* This will stop baking taking a long time when the CyberChef browser tab has been unfocused for a
* long time and the browser has swapped out all its memory.
*
* The output will not be modified (hence "silent" bake).
*
* This will only actually execute the recipe if auto-bake is enabled, otherwise it will just load
* the recipe, ingredients and dish.
*
* @param {Object[]} recipeConfig - The recipe configuration object
* @returns {number} The time it took to run the silent bake in milliseconds.
*/
silentBake(recipeConfig) {
log.debug("Running silent bake");
const startTime = Date.now(),
recipe = new Recipe(recipeConfig),
dish = new Dish();
try {
recipe.execute(dish);
} catch (err) {
// Suppress all errors
}
return Date.now() - startTime;
}
/**
* Calculates highlight offsets if possible.
*
* @param {Object[]} recipeConfig
* @param {string} direction
* @param {Object} pos - The position object for the highlight.
* @param {number} pos.start - The start offset.
* @param {number} pos.end - The end offset.
* @returns {Object}
*/
async calculateHighlights(recipeConfig, direction, pos) {
const recipe = new Recipe(recipeConfig);
const highlights = await recipe.generateHighlightList();
if (!highlights) return false;
for (let i = 0; i < highlights.length; i++) {
// Remove multiple highlights before processing again
pos = [pos[0]];
const func = direction === "forward" ? highlights[i].f : highlights[i].b;
if (typeof func == "function") {
try {
pos = func(pos, highlights[i].args);
} catch (err) {
// Throw away highlighting errors
pos = [];
}
}
}
return {
pos: pos,
direction: direction
};
}
/**
* Translates the dish to a specified type and returns it.
*
* @param {Dish} dish
* @param {string} type
* @returns {Dish}
*/
async getDishAs(dish, type) {
const newDish = new Dish(dish);
return await newDish.get(type);
}
/**
* Gets the title of a dish and returns it
*
* @param {Dish} dish
* @param {number} [maxLength=100]
* @returns {string}
*/
async getDishTitle(dish, maxLength=100) {
const newDish = new Dish(dish);
return await newDish.getTitle(maxLength);
}
}
export default Chef;
================================================
FILE: src/core/ChefWorker.js
================================================
/**
* Web Worker to handle communications between the front-end and the core.
*
* @author n1474335 [n1474335@gmail.com]
* @copyright Crown Copyright 2017
* @license Apache-2.0
*/
import Chef from "./Chef.mjs";
import OperationConfig from "./config/OperationConfig.json" assert {type: "json"};
import OpModules from "./config/modules/OpModules.mjs";
import loglevelMessagePrefix from "loglevel-message-prefix";
// Set up Chef instance
self.chef = new Chef();
self.OpModules = OpModules;
self.OperationConfig = OperationConfig;
self.inputNum = -1;
// Tell the app that the worker has loaded and is ready to operate
self.postMessage({
action: "workerLoaded",
data: {}
});
/**
* Respond to message from parent thread.
*
* inputNum is optional and only used for baking multiple inputs.
* Defaults to -1 when one isn't sent with the bake message.
*
* Messages should have the following format:
* {
* action: "bake" | "silentBake",
* data: {
* input: {string},
* recipeConfig: {[Object]},
* options: {Object},
* progress: {number},
* step: {boolean},
* [inputNum=-1]: {number}
* }
* }
*/
self.addEventListener("message", function(e) {
// Handle message
const r = e.data;
log.debug(`Receiving command '${r.action}'`);
switch (r.action) {
case "bake":
bake(r.data);
break;
case "silentBake":
silentBake(r.data);
break;
case "getDishAs":
getDishAs(r.data);
break;
case "getDishTitle":
getDishTitle(r.data);
break;
case "docURL":
// Used to set the URL of the current document so that scripts can be
// imported into an inline worker.
self.docURL = r.data;
break;
case "highlight":
calculateHighlights(
r.data.recipeConfig,
r.data.direction,
r.data.pos
);
break;
case "setLogLevel":
log.setLevel(r.data, false);
break;
case "setLogPrefix":
loglevelMessagePrefix(log, {
prefixes: [],
staticPrefixes: [r.data]
});
break;
default:
break;
}
});
/**
* Baking handler
*
* @param {Object} data
*/
async function bake(data) {
// Ensure the relevant modules are loaded
self.loadRequiredModules(data.recipeConfig);
try {
self.inputNum = data.inputNum === undefined ? -1 : data.inputNum;
const response = await self.chef.bake(
data.input, // The user's input
data.recipeConfig, // The configuration of the recipe
data.options // Options set by the user
);
const transferable = (response.dish.value instanceof ArrayBuffer) ?
[response.dish.value] :
undefined;
self.postMessage({
action: "bakeComplete",
data: Object.assign(response, {
id: data.id,
inputNum: data.inputNum,
bakeId: data.bakeId
})
}, transferable);
} catch (err) {
self.postMessage({
action: "bakeError",
data: {
error: err.message || err,
id: data.id,
inputNum: data.inputNum
}
});
}
self.inputNum = -1;
}
/**
* Silent baking handler
*/
function silentBake(data) {
const duration = self.chef.silentBake(data.recipeConfig);
self.postMessage({
action: "silentBakeComplete",
data: duration
});
}
/**
* Translates the dish to a given type.
*/
async function getDishAs(data) {
const value = await self.chef.getDishAs(data.dish, data.type);
const transferable = (data.type === "ArrayBuffer") ? [value] : undefined;
self.postMessage({
action: "dishReturned",
data: {
value: value,
id: data.id
}
}, transferable);
}
/**
* Gets the dish title
*
* @param {object} data
* @param {Dish} data.dish
* @param {number} data.maxLength
* @param {number} data.id
*/
async function getDishTitle(data) {
const title = await self.chef.getDishTitle(data.dish, data.maxLength);
self.postMessage({
action: "dishReturned",
data: {
value: title,
id: data.id
}
});
}
/**
* Calculates highlight offsets if possible.
*
* @param {Object[]} recipeConfig
* @param {string} direction
* @param {Object[]} pos - The position object for the highlight.
* @param {number} pos.start - The start offset.
* @param {number} pos.end - The end offset.
*/
async function calculateHighlights(recipeConfig, direction, pos) {
pos = await self.chef.calculateHighlights(recipeConfig, direction, pos);
self.postMessage({
action: "highlightsCalculated",
data: pos
});
}
/**
* Checks that all required modules are loaded and loads them if not.
*
* @param {Object} recipeConfig
*/
self.loadRequiredModules = function(recipeConfig) {
recipeConfig.forEach(op => {
const module = self.OperationConfig[op.op].module;
if (!(module in OpModules)) {
log.info(`Loading ${module} module`);
self.sendStatusMessage(`Loading ${module} module`);
self.importScripts(`${self.docURL}/modules/${module}.js`); // lgtm [js/client-side-unvalidated-url-redirection]
self.sendStatusMessage("");
}
});
};
/**
* Send status update to the app.
*
* @param {string} msg
*/
self.sendStatusMessage = function(msg) {
self.postMessage({
action: "statusMessage",
data: {
message: msg,
inputNum: self.inputNum
}
});
};
/**
* Send progress update to the app.
*
* @param {number} progress
* @param {number} total
*/
self.sendProgressMessage = function(progress, total) {
self.postMessage({
action: "progressMessage",
data: {
progress: progress,
total: total,
inputNum: self.inputNum
}
});
};
/**
* Send an option value update to the app.
*
* @param {string} option
* @param {*} value
*/
self.setOption = function(option, value) {
self.postMessage({
action: "optionUpdate",
data: {
option: option,
value: value
}
});
};
/**
* Send register values back to the app.
*
* @param {number} opIndex
* @param {number} numPrevRegisters
* @param {string[]} registers
*/
self.setRegisters = function(opIndex, numPrevRegisters, registers) {
self.postMessage({
action: "setRegisters",
data: {
opIndex: opIndex,
numPrevRegisters: numPrevRegisters,
registers: registers
}
});
};
================================================
FILE: src/core/Dish.mjs
================================================
/**
* @author n1474335 [n1474335@gmail.com]
* @author Matt C [matt@artemisbot.uk]
* @copyright Crown Copyright 2016
* @license Apache-2.0
*/
import Utils, { isNodeEnvironment } from "./Utils.mjs";
import DishError from "./errors/DishError.mjs";
import BigNumber from "bignumber.js";
import { detectFileType } from "./lib/FileType.mjs";
import log from "loglevel";
import DishByteArray from "./dishTypes/DishByteArray.mjs";
import DishBigNumber from "./dishTypes/DishBigNumber.mjs";
import DishFile from "./dishTypes/DishFile.mjs";
import DishHTML from "./dishTypes/DishHTML.mjs";
import DishJSON from "./dishTypes/DishJSON.mjs";
import DishListFile from "./dishTypes/DishListFile.mjs";
import DishNumber from "./dishTypes/DishNumber.mjs";
import DishString from "./dishTypes/DishString.mjs";
/**
* The data being operated on by each operation.
*/
class Dish {
/**
* Dish constructor
*
* @param {Dish || *} [dishOrInput=null] - A dish to clone OR an object
* literal to make into a dish
* @param {Enum} [type=null] (optional) - A type to accompany object
* literal input
*/
constructor(dishOrInput=null, type = null) {
this.value = new ArrayBuffer(0);
this.type = Dish.ARRAY_BUFFER;
// Case: dishOrInput is dish object
if (dishOrInput &&
Object.prototype.hasOwnProperty.call(dishOrInput, "value") &&
Object.prototype.hasOwnProperty.call(dishOrInput, "type")) {
this.set(dishOrInput.value, dishOrInput.type);
// input and type defined separately
} else if (dishOrInput && type !== null) {
this.set(dishOrInput, type);
// No type declared, so infer it.
} else if (dishOrInput) {
const inferredType = Dish.typeEnum(dishOrInput.constructor.name);
this.set(dishOrInput, inferredType);
}
}
/**
* Returns the data type enum for the given type string.
*
* @param {string} typeStr - The name of the data type.
* @returns {number} The data type enum value.
*/
static typeEnum(typeStr) {
switch (typeStr.toLowerCase()) {
case "bytearray":
case "byte array":
return Dish.BYTE_ARRAY;
case "string":
return Dish.STRING;
case "number":
return Dish.NUMBER;
case "html":
return Dish.HTML;
case "arraybuffer":
case "array buffer":
return Dish.ARRAY_BUFFER;
case "bignumber":
case "big number":
return Dish.BIG_NUMBER;
case "json":
case "object": // object constructor name. To allow JSON input in node.
return Dish.JSON;
case "file":
return Dish.FILE;
case "list<file>":
return Dish.LIST_FILE;
default:
throw new DishError("Invalid data type string. No matching enum.");
}
}
/**
* Returns the data type string for the given type enum.
*
* @param {number} typeEnum - The enum value of the data type.
* @returns {string} The data type as a string.
*/
static enumLookup(typeEnum) {
switch (typeEnum) {
case Dish.BYTE_ARRAY:
return "byteArray";
case Dish.STRING:
return "string";
case Dish.NUMBER:
return "number";
case Dish.HTML:
return "html";
case Dish.ARRAY_BUFFER:
return "ArrayBuffer";
case Dish.BIG_NUMBER:
return "BigNumber";
case Dish.JSON:
return "JSON";
case Dish.FILE:
return "File";
case Dish.LIST_FILE:
return "List<File>";
default:
throw new DishError("Invalid data type enum. No matching type.");
}
}
/**
* Returns the value of the data in the type format specified.
*
* If running in a browser, get is asynchronous.
*
* @param {number} type - The data type of value, see Dish enums.
* @returns {* | Promise} - (Browser) A promise | (Node) value of dish in given type
*/
get(type) {
if (typeof type === "string") {
type = Dish.typeEnum(type);
}
if (this.type !== type) {
// Node environment => _translate is sync
if (isNodeEnvironment()) {
this._translate(type);
return this.value;
// Browser environment => _translate is async
} else {
return new Promise((resolve, reject) => {
this._translate(type)
.then(() => {
resolve(this.value);
})
.catch(reject);
});
}
}
return this.value;
}
/**
* Sets the data value and type and then validates them.
*
* @param {*} value
* - The value of the input data.
* @param {number} type
* - The data type of value, see Dish enums.
*/
set(value, type) {
if (typeof type === "string") {
type = Dish.typeEnum(type);
}
log.debug("Dish type: " + Dish.enumLookup(type));
this.value = value;
this.type = type;
if (!this.valid()) {
const sample = Utils.truncate(JSON.stringify(this.value), 25);
throw new DishError(`Data is not a valid ${Dish.enumLookup(type)}: ${sample}`);
}
}
/**
* Returns the Dish as the given type, without mutating the original dish.
*
* If running in a browser, get is asynchronous.
*
* @Node
*
* @param {number} type - The data type of value, see Dish enums.
* @returns {Dish | Promise} - (Browser) A promise | (Node) value of dish in given type
*/
presentAs(type) {
const clone = this.clone();
return clone.get(type);
}
/**
* Detects the MIME type of the current dish
* @returns {string}
*/
detectDishType() {
const data = new Uint8Array(this.value.slice(0, 2048)),
types = detectFileType(data);
if (!types.length || !types[0].mime || !(types[0].mime === "text/plain")) {
return null;
} else {
return types[0].mime;
}
}
/**
* Returns the title of the data up to the specified length
*
* @param {number} maxLength - The maximum title length
* @returns {string}
*/
async getTitle(maxLength) {
let title = "";
let cloned;
switch (this.type) {
case Dish.FILE:
title = this.value.name;
break;
case Dish.LIST_FILE:
title = `${this.value.length} file(s)`;
break;
case Dish.JSON:
title = "application/json";
break;
case Dish.NUMBER:
case Dish.BIG_NUMBER:
title = this.value.toString();
break;
case Dish.ARRAY_BUFFER:
case Dish.BYTE_ARRAY:
title = this.detectDishType();
if (title !== null) break;
// fall through if no mime type was detected
default:
try {
cloned = this.clone();
cloned.value = cloned.value.slice(0, 256);
title = await cloned.get(Dish.STRING);
} catch (err) {
log.error(`${Dish.enumLookup(this.type)} cannot be sliced. ${err}`);
}
}
return title.slice(0, maxLength);
}
/**
* Validates that the value is the type that has been specified.
* May have to disable parts of BYTE_ARRAY validation if it effects performance.
*
* @returns {boolean} Whether the data is valid or not.
*/
valid() {
switch (this.type) {
case Dish.BYTE_ARRAY:
if (!(this.value instanceof Uint8Array) && !(this.value instanceof Array)) {
return false;
}
// Check that every value is a number between 0 - 255
for (let i = 0; i < this.value.length; i++) {
if (typeof this.value[i] !== "number" ||
this.value[i] < 0 ||
this.value[i] > 255) {
return false;
}
}
return true;
case Dish.STRING:
case Dish.HTML:
return typeof this.value === "string";
case Dish.NUMBER:
return typeof this.value === "number";
case Dish.ARRAY_BUFFER:
return this.value instanceof ArrayBuffer;
case Dish.BIG_NUMBER:
if (BigNumber.isBigNumber(this.value)) return true;
/*
If a BigNumber is passed between WebWorkers it is serialised as a JSON
object with a coefficient (c), exponent (e) and sign (s). We detect this
and reinitialise it as a BigNumber object.
*/
if (Object.keys(this.value).sort().equals(["c", "e", "s"])) {
const temp = new BigNumber();
temp.c = this.value.c;
temp.e = this.value.e;
temp.s = this.value.s;
this.value = temp;
return true;
}
return false;
case Dish.JSON:
// All values can be serialised in some manner, so we return true in all cases
return true;
case Dish.FILE:
return this.value instanceof File;
case Dish.LIST_FILE:
return this.value instanceof Array &&
this.value.reduce((acc, curr) => acc && curr instanceof File, true);
default:
return false;
}
}
/**
* Determines how much space the Dish takes up.
* Numbers in JavaScript are 64-bit floating point, however for the purposes of the Dish,
* we measure how many bytes are taken up when the number is written as a string.
*
* @returns {number}
*/
get size() {
switch (this.type) {
case Dish.BYTE_ARRAY:
case Dish.STRING:
case Dish.HTML:
return this.value.length;
case Dish.NUMBER:
case Dish.BIG_NUMBER:
return this.value.toString().length;
case Dish.ARRAY_BUFFER:
return this.value.byteLength;
case Dish.JSON:
return JSON.stringify(this.value).length;
case Dish.FILE:
return this.value.size;
case Dish.LIST_FILE:
return this.value.reduce((acc, curr) => acc + curr.size, 0);
default:
return -1;
}
}
/**
* Returns a deep clone of the current Dish.
*
* @returns {Dish}
*/
clone() {
const newDish = new Dish();
switch (this.type) {
case Dish.STRING:
case Dish.HTML:
case Dish.NUMBER:
case Dish.BIG_NUMBER:
// These data types are immutable so it is acceptable to copy them by reference
newDish.set(
this.value,
this.type
);
break;
case Dish.BYTE_ARRAY:
case Dish.JSON:
// These data types are mutable so they need to be copied by value
newDish.set(
JSON.parse(JSON.stringify(this.value)),
this.type
);
break;
case Dish.ARRAY_BUFFER:
// Slicing an ArrayBuffer returns a new ArrayBuffer with a copy its contents
newDish.set(
this.value.slice(0),
this.type
);
break;
case Dish.FILE:
// A new file can be created by copying over all the values from the original
newDish.set(
new File([this.value], this.value.name, {
"type": this.value.type,
"lastModified": this.value.lastModified
}),
this.type
);
break;
case Dish.LIST_FILE:
newDish.set(
this.value.map(f =>
new File([f], f.name, {
"type": f.type,
"lastModified": f.lastModified
})
),
this.type
);
break;
default:
throw new DishError("Cannot clone Dish, unknown type");
}
return newDish;
}
/**
* Translates the data to the given type format.
*
* If running in the browser, _translate is asynchronous.
*
* @param {number} toType - The data type of value, see Dish enums.
* @returns {Promise || undefined}
*/
_translate(toType) {
log.debug(`Translating Dish from ${Dish.enumLookup(this.type)} to ${Dish.enumLookup(toType)}`);
// Node environment => translate is sync
if (isNodeEnvironment()) {
this._toArrayBuffer();
this.type = Dish.ARRAY_BUFFER;
this._fromArrayBuffer(toType);
// Browser environment => translate is async
} else {
return new Promise((resolve, reject) => {
this._toArrayBuffer()
.then(() => this.type = Dish.ARRAY_BUFFER)
.then(() => {
this._fromArrayBuffer(toType);
resolve();
})
.catch(reject);
});
}
}
/**
* Convert this.value to an ArrayBuffer
*
* If running in a browser, _toByteArray is asynchronous.
*
* @returns {Promise || undefined}
*/
_toArrayBuffer() {
// Using 'bind' here to allow this.value to be mutated within translation functions
const toByteArrayFuncs = {
browser: {
[Dish.STRING]: () => Promise.resolve(DishString.toArrayBuffer.bind(this)()),
[Dish.NUMBER]: () => Promise.resolve(DishNumber.toArrayBuffer.bind(this)()),
[Dish.HTML]: () => Promise.resolve(DishHTML.toArrayBuffer.bind(this)()),
[Dish.ARRAY_BUFFER]: () => Promise.resolve(),
[Dish.BIG_NUMBER]: () => Promise.resolve(DishBigNumber.toArrayBuffer.bind(this)()),
[Dish.JSON]: () => Promise.resolve(DishJSON.toArrayBuffer.bind(this)()),
[Dish.FILE]: () => DishFile.toArrayBuffer.bind(this)(),
[Dish.LIST_FILE]: () => Promise.resolve(DishListFile.toArrayBuffer.bind(this)()),
[Dish.BYTE_ARRAY]: () => Promise.resolve(DishByteArray.toArrayBuffer.bind(this)()),
},
node: {
[Dish.STRING]: () => DishString.toArrayBuffer.bind(this)(),
[Dish.NUMBER]: () => DishNumber.toArrayBuffer.bind(this)(),
[Dish.HTML]: () => DishHTML.toArrayBuffer.bind(this)(),
[Dish.ARRAY_BUFFER]: () => {},
[Dish.BIG_NUMBER]: () => DishBigNumber.toArrayBuffer.bind(this)(),
[Dish.JSON]: () => DishJSON.toArrayBuffer.bind(this)(),
[Dish.FILE]: () => DishFile.toArrayBuffer.bind(this)(),
[Dish.LIST_FILE]: () => DishListFile.toArrayBuffer.bind(this)(),
[Dish.BYTE_ARRAY]: () => DishByteArray.toArrayBuffer.bind(this)(),
}
};
try {
return toByteArrayFuncs[isNodeEnvironment() && "node" || "browser"][this.type]();
} catch (err) {
throw new DishError(`Error translating from ${Dish.enumLookup(this.type)} to ArrayBuffer: ${err}`);
}
}
/**
* Convert this.value to the given type from ArrayBuffer
*
* @param {number} toType - the Dish enum to convert to
*/
_fromArrayBuffer(toType) {
// Using 'bind' here to allow this.value to be mutated within translation functions
const toTypeFunctions = {
[Dish.STRING]: () => DishString.fromArrayBuffer.bind(this)(),
[Dish.NUMBER]: () => DishNumber.fromArrayBuffer.bind(this)(),
[Dish.HTML]: () => DishHTML.fromArrayBuffer.bind(this)(),
[Dish.ARRAY_BUFFER]: () => {},
[Dish.BIG_NUMBER]: () => DishBigNumber.fromArrayBuffer.bind(this)(),
[Dish.JSON]: () => DishJSON.fromArrayBuffer.bind(this)(),
[Dish.FILE]: () => DishFile.fromArrayBuffer.bind(this)(),
[Dish.LIST_FILE]: () => DishListFile.fromArrayBuffer.bind(this)(),
[Dish.BYTE_ARRAY]: () => DishByteArray.fromArrayBuffer.bind(this)(),
};
try {
toTypeFunctions[toType]();
this.type = toType;
} catch (err) {
throw new DishError(`Error translating from ArrayBuffer to ${Dish.enumLookup(toType)}: ${err}`);
}
}
}
/**
* Dish data type enum for byte arrays.
* @readonly
* @enum
*/
Dish.BYTE_ARRAY = 0;
/**
* Dish data type enum for strings.
* @readonly
* @enum
*/
Dish.STRING = 1;
/**
* Dish data type enum for numbers.
* @readonly
* @enum
*/
Dish.NUMBER = 2;
/**
* Dish data type enum for HTML.
* @readonly
* @enum
*/
Dish.HTML = 3;
/**
* Dish data type enum for ArrayBuffers.
* @readonly
* @enum
*/
Dish.ARRAY_BUFFER = 4;
/**
* Dish data type enum for BigNumbers.
* @readonly
* @enum
*/
Dish.BIG_NUMBER = 5;
/**
* Dish data type enum for JSON.
* @readonly
* @enum
*/
Dish.JSON = 6;
/**
* Dish data type enum for lists of files.
* @readonly
* @enum
*/
Dish.FILE = 7;
/**
* Dish data type enum for lists of files.
* @readonly
* @enum
*/
Dish.LIST_FILE = 8;
export default Dish;
================================================
FILE: src/core/Ingredient.mjs
================================================
/**
* @author n1474335 [n1474335@gmail.com]
* @copyright Crown Copyright 2016
* @license Apache-2.0
*/
import Utils from "./Utils.mjs";
import {fromHex} from "./lib/Hex.mjs";
/**
* The arguments to operations.
*/
class Ingredient {
/**
* Ingredient constructor
*
* @param {Object} ingredientConfig
*/
constructor(ingredientConfig) {
this.name = "";
this.type = "";
this._value = null;
this.disabled = false;
this.hint = "";
this.rows = 0;
this.toggleValues = [];
this.target = null;
this.defaultIndex = 0;
this.maxLength = null;
this.min = null;
this.max = null;
this.step = 1;
if (ingredientConfig) {
this._parseConfig(ingredientConfig);
}
}
/**
* Reads and parses the given config.
*
* @private
* @param {Object} ingredientConfig
*/
_parseConfig(ingredientConfig) {
this.name = ingredientConfig.name;
this.type = ingredientConfig.type;
this.defaultValue = ingredientConfig.value;
this.disabled = !!ingredientConfig.disabled;
this.hint = ingredientConfig.hint || false;
this.rows = ingredientConfig.rows || false;
this.toggleValues = ingredientConfig.toggleValues;
this.target = typeof ingredientConfig.target !== "undefined" ? ingredientConfig.target : null;
this.defaultIndex = typeof ingredientConfig.defaultIndex !== "undefined" ? ingredientConfig.defaultIndex : 0;
this.maxLength = ingredientConfig.maxLength || null;
this.min = ingredientConfig.min;
this.max = ingredientConfig.max;
this.step = ingredientConfig.step;
}
/**
* Returns the value of the Ingredient as it should be displayed in a recipe config.
*
* @returns {*}
*/
get config() {
return this._value;
}
/**
* Sets the value of the Ingredient.
*
* @param {*} value
*/
set value(value) {
this._value = Ingredient.prepare(value, this.type);
}
/**
* Gets the value of the Ingredient.
*
* @returns {*}
*/
get value() {
return this._value;
}
/**
* Most values will be strings when they are entered. This function converts them to the correct
* type.
*
* @param {*} data
* @param {string} type - The name of the data type.
*/
static prepare(data, type) {
let number;
switch (type) {
case "binaryString":
case "binaryShortString":
case "editableOption":
case "editableOptionShort":
return Utils.parseEscapedChars(data);
case "byteArray":
if (typeof data == "string") {
data = data.replace(/\s+/g, "");
return fromHex(data);
} else {
return data;
}
case "number":
if (data === null) return data;
number = parseFloat(data);
if (isNaN(number)) {
const sample = Utils.truncate(data.toString(), 10);
throw "Invalid ingredient value. Not a number: " + sample;
}
return number;
default:
return data;
}
}
}
export default Ingredient;
================================================
FILE: src/core/Operation.mjs
================================================
/**
* @author n1474335 [n1474335@gmail.com]
* @copyright Crown Copyright 2016
* @license Apache-2.0
*/
import Dish from "./Dish.mjs";
import Ingredient from "./Ingredient.mjs";
/**
* The Operation specified by the user to be run.
*/
class Operation {
/**
* Operation constructor
*/
constructor() {
// Private fields
this._inputType = -1;
this._outputType = -1;
this._presentType = -1;
this._breakpoint = false;
this._disabled = false;
this._flowControl = false;
this._manualBake = false;
this._ingList = [];
// Public fields
this.name = "";
this.module = "";
this.description = "";
this.infoURL = null;
}
/**
* Interface for operation runner
*
* @param {*} input
* @param {Object[]} args
* @returns {*}
*/
run(input, args) {
return input;
}
/**
* Interface for forward highlighter
*
* @param {Object[]} pos
* @param {number} pos[].start
* @param {number} pos[].end
* @param {Object[]} args
* @returns {Object[]} pos
*/
highlight(pos, args) {
return false;
}
/**
* Interface for reverse highlighter
*
* @param {Object[]} pos
* @param {number} pos[].start
* @param {number} pos[].end
* @param {Object[]} args
* @returns {Object[]} pos
*/
highlightReverse(pos, args) {
return false;
}
/**
* Method to be called when displaying the result of an operation in a human-readable
* format. This allows operations to return usable data from their run() method and
* only format them when this method is called.
*
* The default action is to return the data unchanged, but child classes can override
* this behaviour.
*
* @param {*} data - The result of the run() function
* @param {Object[]} args - The operation's arguments
* @returns {*} - A human-readable version of the data
*/
present(data, args) {
return data;
}
/**
* Sets the input type as a Dish enum.
*
* @param {string} typeStr
*/
set inputType(typeStr) {
this._inputType = Dish.typeEnum(typeStr);
}
/**
* Gets the input type as a readable string.
*
* @returns {string}
*/
get inputType() {
return Dish.enumLookup(this._inputType);
}
/**
* Sets the output type as a Dish enum.
*
* @param {string} typeStr
*/
set outputType(typeStr) {
this._outputType = Dish.typeEnum(typeStr);
if (this._presentType < 0) this._presentType = this._outputType;
}
/**
* Gets the output type as a readable string.
*
* @returns {string}
*/
get outputType() {
return Dish.enumLookup(this._outputType);
}
/**
* Sets the presentation type as a Dish enum.
*
* @param {string} typeStr
*/
set presentType(typeStr) {
this._presentType = Dish.typeEnum(typeStr);
}
/**
* Gets the presentation type as a readable string.
*
* @returns {string}
*/
get presentType() {
return Dish.enumLookup(this._presentType);
}
/**
* Sets the args for the current operation.
*
* @param {Object[]} conf
*/
set args(conf) {
conf.forEach(arg => {
const ingredient = new Ingredient(arg);
this.addIngredient(ingredient);
});
}
/**
* Gets the args for the current operation.
*
* @param {Object[]} conf
*/
get args() {
return this._ingList.map(ing => {
const conf = {
name: ing.name,
type: ing.type,
value: ing.defaultValue
};
if (ing.toggleValues) conf.toggleValues = ing.toggleValues;
if (ing.hint) conf.hint = ing.hint;
if (ing.rows) conf.rows = ing.rows;
if (ing.disabled) conf.disabled = ing.disabled;
if (ing.target) conf.target = ing.target;
if (ing.defaultIndex) conf.defaultIndex = ing.defaultIndex;
if (ing.maxLength) conf.maxLength = ing.maxLength;
if (typeof ing.min === "number") conf.min = ing.min;
if (typeof ing.max === "number") conf.max = ing.max;
if (ing.step) conf.step = ing.step;
return conf;
});
}
/**
* Returns the value of the Operation as it should be displayed in a recipe config.
*
* @returns {Object}
*/
get config() {
return {
"op": this.name,
"args": this._ingList.map(ing => ing.config)
};
}
/**
* Adds a new Ingredient to this Operation.
*
* @param {Ingredient} ingredient
*/
addIngredient(ingredient) {
this._ingList.push(ingredient);
}
/**
* Set the Ingredient values for this Operation.
*
* @param {Object[]} ingValues
*/
set ingValues(ingValues) {
ingValues.forEach((val, i) => {
this._ingList[i].value = val;
});
}
/**
* Get the Ingredient values for this Operation.
*
* @returns {Object[]}
*/
get ingValues() {
return this._ingList.map(ing => ing.value);
}
/**
* Set whether this Operation has a breakpoint.
*
* @param {boolean} value
*/
set breakpoint(value) {
this._breakpoint = !!value;
}
/**
* Returns true if this Operation has a breakpoint set.
*
* @returns {boolean}
*/
get breakpoint() {
return this._breakpoint;
}
/**
* Set whether this Operation is disabled.
*
* @param {boolean} value
*/
set disabled(value) {
this._disabled = !!value;
}
/**
* Returns true if this Operation is disabled.
*
* @returns {boolean}
*/
get disabled() {
return this._disabled;
}
/**
* Returns true if this Operation is a flow control.
*
* @returns {boolean}
*/
get flowControl() {
return this._flowControl;
}
/**
* Set whether this Operation is a flowcontrol op.
*
* @param {boolean} value
*/
set flowControl(value) {
this._flowControl = !!value;
}
/**
* Returns true if this Operation should not trigger AutoBake.
*
* @returns {boolean}
*/
get manualBake() {
return this._manualBake;
}
/**
* Set whether this Operation should trigger AutoBake.
*
* @param {boolean} value
*/
set manualBake(value) {
this._manualBake = !!value;
}
}
export default Operation;
================================================
FILE: src/core/Recipe.mjs
================================================
/**
* @author n1474335 [n1474335@gmail.com]
* @copyright Crown Copyright 2016
* @license Apache-2.0
*/
import OperationConfig from "./config/OperationConfig.json" assert {type: "json"};
import OperationError from "./errors/OperationError.mjs";
import Operation from "./Operation.mjs";
import DishError from "./errors/DishError.mjs";
import log from "loglevel";
import { isWorkerEnvironment } from "./Utils.mjs";
// Cache container for modules
let modules = null;
/**
* The Recipe controls a list of Operations and the Dish they operate on.
*/
class Recipe {
/**
* Recipe constructor
*
* @param {Object} recipeConfig
*/
constructor(recipeConfig) {
this.opList = [];
if (recipeConfig) {
this._parseConfig(recipeConfig);
}
}
/**
* Reads and parses the given config.
*
* @private
* @param {Object} recipeConfig
*/
_parseConfig(recipeConfig) {
recipeConfig.forEach(c => {
this.opList.push({
name: c.op,
module: OperationConfig[c.op].module,
ingValues: c.args,
breakpoint: c.breakpoint,
disabled: c.disabled || c.op === "Comment",
});
});
}
/**
* Populate elements of opList with operation instances.
* Dynamic import here removes top-level cyclic dependency issue.
*
* @private
*/
async _hydrateOpList() {
if (!modules) {
// Using Webpack Magic Comments to force the dynamic import to be included in the main chunk
// https://webpack.js.org/api/module-methods/
modules = await import(/* webpackMode: "eager" */ "./config/modules/OpModules.mjs");
modules = modules.default;
}
this.opList = this.opList.map(o => {
if (o instanceof Operation) {
return o;
} else {
const op = new modules[o.module][o.name]();
op.ingValues = o.ingValues;
op.breakpoint = o.breakpoint;
op.disabled = o.disabled;
return op;
}
});
}
/**
* Returns the value of the Recipe as it should be displayed in a recipe config.
*
* @returns {Object[]}
*/
get config() {
return this.opList.map(op => ({
op: op.name,
args: op.ingValues,
}));
}
/**
* Adds a new Operation to this Recipe.
*
* @param {Operation} operation
*/
addOperation(operation) {
this.opList.push(operation);
}
/**
* Adds a list of Operations to this Recipe.
*
* @param {Operation[]} operations
*/
addOperations(operations) {
operations.forEach(o => {
if (o instanceof Operation) {
this.opList.push(o);
} else {
this.opList.push({
name: o.name,
module: o.module,
ingValues: o.args,
breakpoint: o.breakpoint,
disabled: o.disabled,
});
}
});
}
/**
* Set a breakpoint on a specified Operation.
*
* @param {number} position - The index of the Operation
* @param {boolean} value
*/
setBreakpoint(position, value) {
try {
this.opList[position].breakpoint = value;
} catch (err) {
// Ignore index error
}
}
/**
* Remove breakpoints on all Operations in the Recipe up to the specified position. Used by Flow
* Control Fork operation.
*
* @param {number} pos
*/
removeBreaksUpTo(pos) {
for (let i = 0; i < pos; i++) {
this.opList[i].breakpoint = false;
}
}
/**
* Returns true if there is a Flow Control Operation in this Recipe.
*
* @returns {boolean}
*/
containsFlowControl() {
return this.opList.reduce((acc, curr) => {
return acc || curr.flowControl;
}, false);
}
/**
* Executes each operation in the recipe over the given Dish.
*
* @param {Dish} dish
* @param {number} [startFrom=0]
* - The index of the Operation to start executing from
* @param {number} [forkState={}]
* - If this is a forked recipe, the state of the recipe up to this point
* @returns {number}
* - The final progress through the recipe
*/
async execute(dish, startFrom=0, forkState={}) {
let op, input, output,
numJumps = 0,
numRegisters = forkState.numRegisters || 0;
if (startFrom === 0) this.lastRunOp = null;
await this._hydrateOpList();
log.debug(`[*] Executing recipe of ${this.opList.length} operations, starting at ${startFrom}`);
for (let i = startFrom; i < this.opList.length; i++) {
op = this.opList[i];
log.debug(`[${i}] ${op.name} ${JSON.stringify(op.ingValues)}`);
if (op.disabled) {
log.debug("Operation is disabled, skipping");
continue;
}
if (op.breakpoint) {
log.debug("Pausing at breakpoint");
return i;
}
try {
input = await dish.get(op.inputType);
log.debug(`Executing operation '${op.name}'`);
if (isWorkerEnvironment()) {
self.sendStatusMessage(`Baking... (${i+1}/${this.opList.length})`);
self.sendProgressMessage(i + 1, this.opList.length);
}
if (op.flowControl) {
// Package up the current state
let state = {
"progress": i,
"dish": dish,
"opList": this.opList,
"numJumps": numJumps,
"numRegisters": numRegisters,
"forkOffset": forkState.forkOffset || 0
};
state = await op.run(state);
i = state.progress;
numJumps = state.numJumps;
numRegisters = state.numRegisters;
} else {
output = await op.run(input, op.ingValues);
dish.set(output, op.outputType);
}
this.lastRunOp = op;
} catch (err) {
log.error(err);
// Return expected errors as output
if (err instanceof OperationError || err?.type === "OperationError") {
// Cannot rely on `err instanceof OperationError` here as extending
// native types is not fully supported yet.
dish.set(err.message, "string");
return i;
} else if (err instanceof DishError || err?.type === "DishError") {
dish.set(err.message, "string");
return i;
} else {
const e = typeof err == "string" ? { message: err } : err;
e.progress = i;
if (e.fileName) {
e.displayStr = `${op.name} - ${e.name} in ${e.fileName} on line ` +
`${e.lineNumber}.<br><br>Message: ${e.displayStr || e.message}`;
} else {
e.displayStr = `${op.name} - ${e.displayStr || e.message}`;
}
throw e;
}
}
}
log.debug("Recipe complete");
return this.opList.length;
}
/**
* Present the results of the final operation.
*
* @param {Dish} dish
*/
async present(dish) {
if (!this.lastRunOp) return;
const output = await this.lastRunOp.present(
await dish.get(this.lastRunOp.outputType),
this.lastRunOp.ingValues
);
dish.set(output, this.lastRunOp.presentType);
}
/**
* Returns the recipe configuration in string format.
*
* @returns {string}
*/
toString() {
return JSON.stringify(this.config);
}
/**
* Creates a Recipe from a given configuration string.
*
* @param {string} recipeStr
*/
fromString(recipeStr) {
const recipeConfig = JSON.parse(recipeStr);
this._parseConfig(recipeConfig);
}
/**
* Generates a list of all the highlight functions assigned to operations in the recipe, if the
* entire recipe supports highlighting.
*
* @returns {Object[]} highlights
* @returns {function} highlights[].f
* @returns {function} highlights[].b
* @returns {Object[]} highlights[].args
*/
async generateHighlightList() {
await this._hydrateOpList();
const highlights = [];
for (let i = 0; i < this.opList.length; i++) {
const op = this.opList[i];
if (op.disabled) continue;
// If any breakpoints are set, do not attempt to highlight
if (op.breakpoint) return false;
// If any of the operations do not support highlighting, fail immediately.
if (op.highlight === false || op.highlight === undefined) return false;
highlights.push({
f: op.highlight,
b: op.highlightReverse,
args: op.ingValues
});
}
return highlights;
}
/**
* Determines whether the previous operation has a different presentation type to its normal output.
*
* @param {number} progress
* @returns {boolean}
*/
lastOpPresented(progress) {
if (progress < 1) return false;
return this.opList[progress-1].presentType !== this.opList[progress-1].outputType;
}
}
export default Recipe;
================================================
FILE: src/core/Utils.mjs
================================================
/**
* @author n1474335 [n1474335@gmail.com]
* @copyright Crown Copyright 2016
* @license Apache-2.0
*/
// loglevel import required for Node API
import log from "loglevel";
import utf8 from "utf8";
import {fromBase64, toBase64} from "./lib/Base64.mjs";
import {fromHex} from "./lib/Hex.mjs";
import {fromDecimal} from "./lib/Decimal.mjs";
import {fromBinary} from "./lib/Binary.mjs";
/**
* Utility functions for use in operations, the core framework and the stage.
*/
class Utils {
/**
* Translates an ordinal into a character.
*
* @param {number} o
* @returns {char}
*
* @example
* // returns 'a'
* Utils.chr(97);
*/
static chr(o) {
// Detect astral symbols
// Thanks to @mathiasbynens for this solution
// https://mathiasbynens.be/notes/javascript-unicode
if (o > 0xffff) {
o -= 0x10000;
const high = String.fromCharCode(o >>> 10 & 0x3ff | 0xd800);
o = 0xdc00 | o & 0x3ff;
return high + String.fromCharCode(o);
}
return String.fromCharCode(o);
}
/**
* Translates a character into an ordinal.
*
* @param {char} c
* @returns {number}
*
* @example
* // returns 97
* Utils.ord('a');
*/
static ord(c) {
// Detect astral symbols
// Thanks to @mathiasbynens for this solution
// https://mathiasbynens.be/notes/javascript-unicode
if (c.length === 2) {
const high = c.charCodeAt(0);
const low = c.charCodeAt(1);
if (high >= 0xd800 && high < 0xdc00 &&
low >= 0xdc00 && low < 0xe000) {
return (high - 0xd800) * 0x400 + low - 0xdc00 + 0x10000;
}
}
return c.charCodeAt(0);
}
/**
* Adds trailing bytes to a byteArray.
*
* @author tlwr [toby@toby.codes]
*
* @param {byteArray} arr - byteArray to add trailing bytes to.
* @param {number} numBytes - Maximum width of the array.
* @param {Integer} [padByte=0] - The byte to pad with.
* @returns {byteArray}
*
* @example
* // returns ["a", 0, 0, 0]
* Utils.padBytesRight("a", 4);
*
* // returns ["a", 1, 1, 1]
* Utils.padBytesRight("a", 4, 1);
*
* // returns ["t", "e", "s", "t", 0, 0, 0, 0]
* Utils.padBytesRight("test", 8);
*
* // returns ["t", "e", "s", "t", 1, 1, 1, 1]
* Utils.padBytesRight("test", 8, 1);
*/
static padBytesRight(arr, numBytes, padByte=0) {
const paddedBytes = new Array(numBytes);
paddedBytes.fill(padByte);
[...arr].forEach((b, i) => {
paddedBytes[i] = b;
});
return paddedBytes;
}
/**
* Truncates a long string to max length and adds suffix.
*
* @param {string} str - String to truncate
* @param {number} max - Maximum length of the final string
* @param {string} [suffix='...'] - The string to add to the end of the final string
* @returns {string}
*
* @example
* // returns "A long..."
* Utils.truncate("A long string", 9);
*
* // returns "A long s-"
* Utils.truncate("A long string", 9, "-");
*/
static truncate(str, max, suffix="...") {
if (str.length > max) {
str = str.slice(0, max - suffix.length) + suffix;
}
return str;
}
/**
* Converts a character or number to its hex representation.
*
* @param {char|number} c
* @param {number} [length=2] - The width of the resulting hex number.
* @returns {string}
*
* @example
* // returns "6e"
* Utils.hex("n");
*
* // returns "6e"
* Utils.hex(110);
*/
static hex(c, length=2) {
c = typeof c == "string" ? Utils.ord(c) : c;
return c.toString(16).padStart(length, "0");
}
/**
* Converts a character or number to its binary representation.
*
* @param {char|number} c
* @param {number} [length=8] - The width of the resulting binary number.
* @returns {string}
*
* @example
* // returns "01101110"
* Utils.bin("n");
*
* // returns "01101110"
* Utils.bin(110);
*/
static bin(c, length=8) {
c = typeof c == "string" ? Utils.ord(c) : c;
return c.toString(2).padStart(length, "0");
}
/**
* Returns a string with all non-printable chars as dots, optionally preserving whitespace.
*
* @param {string} str - The input string to display.
* @param {boolean} [preserveWs=false] - Whether or not to print whitespace.
* @param {boolean} [onlyAscii=false] - Whether or not to replace non ASCII characters.
* @returns {string}
*/
static printable(str, preserveWs=false, onlyAscii=false) {
if (onlyAscii) {
return str.replace(/[^\x20-\x7e]/g, ".");
}
// eslint-disable-next-line no-misleading-character-class
const re = /[\0-\x08\x0B-\x0C\x0E-\x1F\x7F-\x9F\xAD\u0378\u0379\u037F-\u0383\u038B\u038D\u03A2\u0528-\u0530\u0557\u0558\u0560\u0588\u058B-\u058E\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08A1\u08AD-\u08E3\u08FF\u0978\u0980\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0C00\u0C04\u0C0D\u0C11\u0C29\u0C34\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5A-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C80\u0C81\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D01\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D4F-\u0D56\u0D58-\u0D5F\u0D64\u0D65\u0D76-\u0D78\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F5-\u13FF\u169D-\u169F\u16F1-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191D-\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C80-\u1CBF\u1CC8-\u1CCF\u1CF7-\u1CFF\u1DE7-\u1DFB\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BB-\u20CF\u20F1-\u20FF\u218A-\u218F\u23F4-\u23FF\u2427-\u243F\u244B-\u245F\u2700\u2B4D-\u2B4F\u2B5A-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E3C-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FCD-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA698-\uA69E\uA6F8-\uA6FF\uA78F\uA794-\uA79F\uA7AB-\uA7F7\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C5-\uA8CD\uA8DA-\uA8DF\uA8FC-\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9E0-\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAA7C-\uAA7F\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F-\uABBF\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uE000-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE27-\uFE2F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF]/g;
const wsRe = /[\x09-\x10\u2028\u2029]/g;
str = str.replace(re, ".");
if (!preserveWs) str = str.replace(wsRe, ".");
return str;
}
/**
* Returns a string with whitespace represented as special characters from the
* Unicode Private Use Area, which CyberChef will display as control characters.
* Private Use Area characters are in the range U+E000..U+F8FF.
* https://en.wikipedia.org/wiki/Private_Use_Areas
* @param {string} str
* @returns {string}
*/
static escapeWhitespace(str) {
return str.replace(/[\x09-\x10]/g, function(c) {
return String.fromCharCode(0xe000 + c.charCodeAt(0));
});
}
/**
* Parse a string entered by a user and replace escaped chars with the bytes they represent.
*
* @param {string} str
* @returns {string}
*
* @example
* // returns "\x00"
* Utils.parseEscapedChars("\\x00");
*
* // returns "\n"
* Utils.parseEscapedChars("\\n");
*/
static parseEscapedChars(str) {
return str.replace(/\\([abfnrtv'"]|[0-3][0-7]{2}|[0-7]{1,2}|x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]{1,6}\}|\\)/g, function(m, a) {
switch (a[0]) {
case "\\":
return "\\";
case "0":
case "1":
case "2":
case "3":
case "4":
case "5":
case "6":
case "7":
return String.fromCharCode(parseInt(a, 8));
case "a":
return String.fromCharCode(7);
case "b":
return "\b";
case "t":
return "\t";
case "n":
return "\n";
case "v":
return "\v";
case "f":
return "\f";
case "r":
return "\r";
case '"':
return '"';
case "'":
return "'";
case "x":
return String.fromCharCode(parseInt(a.substr(1), 16));
case "u":
if (a[1] === "{")
return String.fromCodePoint(parseInt(a.slice(2, -1), 16));
else
return String.fromCharCode(parseInt(a.substr(1), 16));
}
});
}
/**
* Escape a string containing regex control characters so that it can be safely
* used in a regex without causing unintended behaviours.
*
* @param {string} str
* @returns {string}
*
* @example
* // returns "\[example\]"
* Utils.escapeRegex("[example]");
*/
static escapeRegex(str) {
return str.replace(/([.*+?^=!:${}()|[\]/\\])/g, "\\$1");
}
/**
* Expand an alphabet range string into a list of the characters in that range.
*
* @param {string} alphStr
* @returns {char[]}
*
* @example
* // returns ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
* Utils.expandAlphRange("0-9");
*
* // returns ["a", "b", "c", "d", "0", "1", "2", "3", "+", "/"]
* Utils.expandAlphRange("a-d0-3+/");
*
* // returns ["a", "b", "c", "d", "0", "-", "3"]
* Utils.expandAlphRange("a-d0\\-3")
*/
static expandAlphRange(alphStr) {
const alphArr = [];
for (let i = 0; i < alphStr.length; i++) {
if (i < alphStr.length - 2 &&
alphStr[i+1] === "-" &&
alphStr[i] !== "\\") {
const start = Utils.ord(alphStr[i]),
end = Utils.ord(alphStr[i+2]);
for (let j = start; j <= end; j++) {
alphArr.push(Utils.chr(j));
}
i += 2;
} else if (i < alphStr.length - 2 &&
alphStr[i] === "\\" &&
alphStr[i+1] === "-") {
alphArr.push("-");
i++;
} else {
alphArr.push(alphStr[i]);
}
}
return alphArr;
}
/**
* Coverts data of varying types to a byteArray.
* Accepts hex, Base64, UTF8 and Latin1 strings.
*
* @param {string} str
* @param {string} type - One of "Binary", "Hex", "Decimal", "Base64", "UTF8" or "Latin1"
* @returns {byteArray}
*
* @example
* // returns [208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130]
* Utils.convertToByteArray("Привет", "utf8");
*
* // returns [208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130]
* Utils.convertToByteArray("d097d0b4d180d0b0d0b2d181d182d0b2d183d0b9d182d0b5", "hex");
*
* // returns [208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130]
* Utils.convertToByteArray("0JfQtNGA0LDQstGB0YLQstGD0LnRgtC1", "base64");
*/
static convertToByteArray(str, type) {
switch (type.toLowerCase()) {
case "binary":
return fromBinary(str);
case "hex":
return fromHex(str);
case "decimal":
return fromDecimal(str);
case "base64":
return fromBase64(str, null, "byteArray");
case "utf8":
return Utils.strToUtf8ByteArray(str);
case "latin1":
default:
return Utils.strToByteArray(str);
}
}
/**
* Coverts data of varying types to a byte string.
* Accepts hex, Base64, UTF8 and Latin1 strings.
*
* @param {string} str
* @param {string} type - One of "Binary", "Hex", "Decimal", "Base64", "UTF8" or "Latin1"
* @returns {string}
*
* @example
* // returns "ÐÑивеÑ"
* Utils.convertToByteString("Привет", "utf8");
*
* // returns "ÐдÑавÑÑвÑйÑе"
* Utils.convertToByteString("d097d0b4d180d0b0d0b2d181d182d0b2d183d0b9d182d0b5", "hex");
*
* // returns "ÐдÑавÑÑвÑйÑе"
* Utils.convertToByteString("0JfQtNGA0LDQstGB0YLQstGD0LnRgtC1", "base64");
*/
static convertToByteString(str, type) {
switch (type.toLowerCase()) {
case "binary":
return Utils.byteArrayToChars(fromBinary(str));
case "hex":
return Utils.byteArrayToChars(fromHex(str));
case "decimal":
return Utils.byteArrayToChars(fromDecimal(str));
case "base64":
return Utils.byteArrayToChars(fromBase64(str, null, "byteArray"));
case "utf8":
return utf8.encode(str);
case "latin1":
default:
return str;
}
}
/**
* Converts a byte array to an integer.
*
* @param {byteArray} byteArray
* @param {string} byteorder - "little" or "big"
* @returns {integer}
*
* @example
* // returns 67305985
* Utils.byteArrayToInt([1, 2, 3, 4], "little");
*
* // returns 16909060
* Utils.byteArrayToInt([1, 2, 3, 4], "big");
*/
static byteArrayToInt(byteArray, byteorder) {
let value = 0;
if (byteorder === "big") {
for (let i = 0; i < byteArray.length; i++) {
value = (value * 256) + byteArray[i];
}
} else {
for (let i = byteArray.length - 1; i >= 0; i--) {
value = (value * 256) + byteArray[i];
}
}
return value;
}
/**
* Converts an integer to a byte array of {length} bytes.
*
* @param {integer} value
* @param {integer} length
* @param {string} byteorder - "little" or "big"
* @returns {byteArray}
*
* @example
* // returns [5, 255, 109, 1]
* Utils.intToByteArray(23985925, 4, "little");
*
* // returns [1, 109, 255, 5]
* Utils.intToByteArray(23985925, 4, "big");
*
* // returns [0, 0, 0, 0, 1, 109, 255, 5]
* Utils.intToByteArray(23985925, 8, "big");
*/
static intToByteArray(value, length, byteorder) {
const arr = new Array(length);
if (byteorder === "little") {
for (let i = 0; i < length; i++) {
arr[i] = value & 0xFF;
value = value >>> 8;
}
} else {
for (let i = length - 1; i >= 0; i--) {
arr[i] = value & 0xFF;
value = value >>> 8;
}
}
return arr;
}
/**
* Converts a string to an ArrayBuffer.
* Treats the strin
gitextract_priqvjog/ ├── .cspell.json ├── .devcontainer/ │ └── devcontainer.json ├── .dockerignore ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── CONTRIBUTING.md │ ├── ISSUE_TEMPLATE/ │ │ ├── bug-report.md │ │ ├── feature-request.md │ │ └── operation-request.md │ ├── ISSUE_TEMPLATE.md │ ├── dependabot.yml │ └── workflows/ │ ├── master.yml │ ├── pull_requests.yml │ └── releases.yml ├── .gitignore ├── .npmignore ├── .nvmrc ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── Dockerfile ├── Gruntfile.js ├── LICENSE ├── README.md ├── SECURITY.md ├── babel.config.js ├── eslint.config.mjs ├── nightwatch.json ├── package.json ├── postcss.config.js ├── src/ │ ├── core/ │ │ ├── Chef.mjs │ │ ├── ChefWorker.js │ │ ├── Dish.mjs │ │ ├── Ingredient.mjs │ │ ├── Operation.mjs │ │ ├── Recipe.mjs │ │ ├── Utils.mjs │ │ ├── config/ │ │ │ ├── Categories.json │ │ │ └── scripts/ │ │ │ ├── generateConfig.mjs │ │ │ ├── generateOpsIndex.mjs │ │ │ ├── newMinorVersion.mjs │ │ │ └── newOperation.mjs │ │ ├── dishTypes/ │ │ │ ├── DishBigNumber.mjs │ │ │ ├── DishByteArray.mjs │ │ │ ├── DishFile.mjs │ │ │ ├── DishHTML.mjs │ │ │ ├── DishJSON.mjs │ │ │ ├── DishListFile.mjs │ │ │ ├── DishNumber.mjs │ │ │ ├── DishString.mjs │ │ │ ├── DishType.mjs │ │ │ └── index.mjs │ │ ├── errors/ │ │ │ ├── DishError.mjs │ │ │ ├── ExcludedOperationError.mjs │ │ │ ├── OperationError.mjs │ │ │ └── index.mjs │ │ ├── lib/ │ │ │ ├── Arithmetic.mjs │ │ │ ├── AudioBytes.mjs │ │ │ ├── AudioMetaSchema.mjs │ │ │ ├── AudioParsers.mjs │ │ │ ├── BCD.mjs │ │ │ ├── Bacon.mjs │ │ │ ├── Base32.mjs │ │ │ ├── Base45.mjs │ │ │ ├── Base58.mjs │ │ │ ├── Base64.mjs │ │ │ ├── Base85.mjs │ │ │ ├── Base92.mjs │ │ │ ├── Bech32.mjs │ │ │ ├── BigIntUtils.mjs │ │ │ ├── Binary.mjs │ │ │ ├── BitwiseOp.mjs │ │ │ ├── Blowfish.mjs │ │ │ ├── Bombe.mjs │ │ │ ├── Braille.mjs │ │ │ ├── CanvasComponents.mjs │ │ │ ├── Charts.mjs │ │ │ ├── ChrEnc.mjs │ │ │ ├── CipherSaber2.mjs │ │ │ ├── Ciphers.mjs │ │ │ ├── Code.mjs │ │ │ ├── Colossus.mjs │ │ │ ├── ConvertCoordinates.mjs │ │ │ ├── Crypt.mjs │ │ │ ├── DateTime.mjs │ │ │ ├── Decimal.mjs │ │ │ ├── Delim.mjs │ │ │ ├── Enigma.mjs │ │ │ ├── Extract.mjs │ │ │ ├── FileSignatures.mjs │ │ │ ├── FileType.mjs │ │ │ ├── FlowControl.mjs │ │ │ ├── FuzzyMatch.mjs │ │ │ ├── Hash.mjs │ │ │ ├── Hex.mjs │ │ │ ├── IP.mjs │ │ │ ├── JA4.mjs │ │ │ ├── JWT.mjs │ │ │ ├── LS47.mjs │ │ │ ├── LZNT1.mjs │ │ │ ├── LZString.mjs │ │ │ ├── LoremIpsum.mjs │ │ │ ├── Lorenz.mjs │ │ │ ├── Magic.mjs │ │ │ ├── Modhex.mjs │ │ │ ├── PGP.mjs │ │ │ ├── Protobuf.mjs │ │ │ ├── Protocol.mjs │ │ │ ├── PublicKey.mjs │ │ │ ├── QRCode.mjs │ │ │ ├── RC6.mjs │ │ │ ├── RSA.mjs │ │ │ ├── Rotate.mjs │ │ │ ├── SIGABA.mjs │ │ │ ├── SM2.mjs │ │ │ ├── SM4.mjs │ │ │ ├── Salsa20.mjs │ │ │ ├── Sort.mjs │ │ │ ├── Stream.mjs │ │ │ ├── TLS.mjs │ │ │ ├── TLVParser.mjs │ │ │ ├── Typex.mjs │ │ │ ├── XXTEA.mjs │ │ │ └── Zlib.mjs │ │ ├── operations/ │ │ │ ├── A1Z26CipherDecode.mjs │ │ │ ├── A1Z26CipherEncode.mjs │ │ │ ├── ADD.mjs │ │ │ ├── AESDecrypt.mjs │ │ │ ├── AESEncrypt.mjs │ │ │ ├── AESKeyUnwrap.mjs │ │ │ ├── AESKeyWrap.mjs │ │ │ ├── AMFDecode.mjs │ │ │ ├── AMFEncode.mjs │ │ │ ├── AND.mjs │ │ │ ├── AddLineNumbers.mjs │ │ │ ├── AddTextToImage.mjs │ │ │ ├── Adler32Checksum.mjs │ │ │ ├── AffineCipherDecode.mjs │ │ │ ├── AffineCipherEncode.mjs │ │ │ ├── AlternatingCaps.mjs │ │ │ ├── AnalyseHash.mjs │ │ │ ├── AnalyseUUID.mjs │ │ │ ├── Argon2.mjs │ │ │ ├── Argon2Compare.mjs │ │ │ ├── AtbashCipher.mjs │ │ │ ├── AvroToJSON.mjs │ │ │ ├── BLAKE2b.mjs │ │ │ ├── BLAKE2s.mjs │ │ │ ├── BLAKE3.mjs │ │ │ ├── BSONDeserialise.mjs │ │ │ ├── BSONSerialise.mjs │ │ │ ├── BaconCipherDecode.mjs │ │ │ ├── BaconCipherEncode.mjs │ │ │ ├── Bcrypt.mjs │ │ │ ├── BcryptCompare.mjs │ │ │ ├── BcryptParse.mjs │ │ │ ├── BifidCipherDecode.mjs │ │ │ ├── BifidCipherEncode.mjs │ │ │ ├── BitShiftLeft.mjs │ │ │ ├── BitShiftRight.mjs │ │ │ ├── BlowfishDecrypt.mjs │ │ │ ├── BlowfishEncrypt.mjs │ │ │ ├── BlurImage.mjs │ │ │ ├── Bombe.mjs │ │ │ ├── Bzip2Compress.mjs │ │ │ ├── Bzip2Decompress.mjs │ │ │ ├── CBORDecode.mjs │ │ │ ├── CBOREncode.mjs │ │ │ ├── CMAC.mjs │ │ │ ├── CRCChecksum.mjs │ │ │ ├── CSSBeautify.mjs │ │ │ ├── CSSMinify.mjs │ │ │ ├── CSSSelector.mjs │ │ │ ├── CSVToJSON.mjs │ │ │ ├── CTPH.mjs │ │ │ ├── CaesarBoxCipher.mjs │ │ │ ├── CaretMdecode.mjs │ │ │ ├── CartesianProduct.mjs │ │ │ ├── CetaceanCipherDecode.mjs │ │ │ ├── CetaceanCipherEncode.mjs │ │ │ ├── ChaCha.mjs │ │ │ ├── ChangeIPFormat.mjs │ │ │ ├── ChiSquare.mjs │ │ │ ├── CipherSaber2Decrypt.mjs │ │ │ ├── CipherSaber2Encrypt.mjs │ │ │ ├── CitrixCTX1Decode.mjs │ │ │ ├── CitrixCTX1Encode.mjs │ │ │ ├── Colossus.mjs │ │ │ ├── Comment.mjs │ │ │ ├── CompareCTPHHashes.mjs │ │ │ ├── CompareSSDEEPHashes.mjs │ │ │ ├── ConditionalJump.mjs │ │ │ ├── ContainImage.mjs │ │ │ ├── ConvertArea.mjs │ │ │ ├── ConvertCoordinateFormat.mjs │ │ │ ├── ConvertDataUnits.mjs │ │ │ ├── ConvertDistance.mjs │ │ │ ├── ConvertImageFormat.mjs │ │ │ ├── ConvertLeetSpeak.mjs │ │ │ ├── ConvertMass.mjs │ │ │ ├── ConvertSpeed.mjs │ │ │ ├── ConvertToNATOAlphabet.mjs │ │ │ ├── CountOccurrences.mjs │ │ │ ├── CoverImage.mjs │ │ │ ├── CropImage.mjs │ │ │ ├── DESDecrypt.mjs │ │ │ ├── DESEncrypt.mjs │ │ │ ├── DNSOverHTTPS.mjs │ │ │ ├── DateTimeDelta.mjs │ │ │ ├── DechunkHTTPResponse.mjs │ │ │ ├── DecodeNetBIOSName.mjs │ │ │ ├── DecodeText.mjs │ │ │ ├── DefangIPAddresses.mjs │ │ │ ├── DefangURL.mjs │ │ │ ├── DeriveEVPKey.mjs │ │ │ ├── DeriveHKDFKey.mjs │ │ │ ├── DerivePBKDF2Key.mjs │ │ │ ├── DetectFileType.mjs │ │ │ ├── Diff.mjs │ │ │ ├── DisassembleARM.mjs │ │ │ ├── DisassembleX86.mjs │ │ │ ├── DitherImage.mjs │ │ │ ├── Divide.mjs │ │ │ ├── DropBytes.mjs │ │ │ ├── DropNthBytes.mjs │ │ │ ├── ECDSASign.mjs │ │ │ ├── ECDSASignatureConversion.mjs │ │ │ ├── ECDSAVerify.mjs │ │ │ ├── ELFInfo.mjs │ │ │ ├── EncodeNetBIOSName.mjs │ │ │ ├── EncodeText.mjs │ │ │ ├── Enigma.mjs │ │ │ ├── Entropy.mjs │ │ │ ├── EscapeString.mjs │ │ │ ├── EscapeUnicodeCharacters.mjs │ │ │ ├── ExpandAlphabetRange.mjs │ │ │ ├── ExtractAudioMetadata.mjs │ │ │ ├── ExtractDates.mjs │ │ │ ├── ExtractDomains.mjs │ │ │ ├── ExtractEXIF.mjs │ │ │ ├── ExtractEmailAddresses.mjs │ │ │ ├── ExtractFilePaths.mjs │ │ │ ├── ExtractFiles.mjs │ │ │ ├── ExtractHashes.mjs │ │ │ ├── ExtractID3.mjs │ │ │ ├── ExtractIPAddresses.mjs │ │ │ ├── ExtractLSB.mjs │ │ │ ├── ExtractMACAddresses.mjs │ │ │ ├── ExtractRGBA.mjs │ │ │ ├── ExtractURLs.mjs │ │ │ ├── FangURL.mjs │ │ │ ├── FernetDecrypt.mjs │ │ │ ├── FernetEncrypt.mjs │ │ │ ├── FileTree.mjs │ │ │ ├── Filter.mjs │ │ │ ├── FindReplace.mjs │ │ │ ├── FlaskSessionDecode.mjs │ │ │ ├── FlaskSessionSign.mjs │ │ │ ├── FlaskSessionVerify.mjs │ │ │ ├── Fletcher16Checksum.mjs │ │ │ ├── Fletcher32Checksum.mjs │ │ │ ├── Fletcher64Checksum.mjs │ │ │ ├── Fletcher8Checksum.mjs │ │ │ ├── FlipImage.mjs │ │ │ ├── Fork.mjs │ │ │ ├── FormatMACAddresses.mjs │ │ │ ├── FrequencyDistribution.mjs │ │ │ ├── FromBCD.mjs │ │ │ ├── FromBase.mjs │ │ │ ├── FromBase32.mjs │ │ │ ├── FromBase45.mjs │ │ │ ├── FromBase58.mjs │ │ │ ├── FromBase62.mjs │ │ │ ├── FromBase64.mjs │ │ │ ├── FromBase85.mjs │ │ │ ├── FromBase92.mjs │ │ │ ├── FromBech32.mjs │ │ │ ├── FromBinary.mjs │ │ │ ├── FromBraille.mjs │ │ │ ├── FromCaseInsensitiveRegex.mjs │ │ │ ├── FromCharcode.mjs │ │ │ ├── FromDecimal.mjs │ │ │ ├── FromFloat.mjs │ │ │ ├── FromHTMLEntity.mjs │ │ │ ├── FromHex.mjs │ │ │ ├── FromHexContent.mjs │ │ │ ├── FromHexdump.mjs │ │ │ ├── FromMessagePack.mjs │ │ │ ├── FromModhex.mjs │ │ │ ├── FromMorseCode.mjs │ │ │ ├── FromOctal.mjs │ │ │ ├── FromPunycode.mjs │ │ │ ├── FromQuotedPrintable.mjs │ │ │ ├── FromUNIXTimestamp.mjs │ │ │ ├── FuzzyMatch.mjs │ │ │ ├── GOSTDecrypt.mjs │ │ │ ├── GOSTEncrypt.mjs │ │ │ ├── GOSTHash.mjs │ │ │ ├── GOSTKeyUnwrap.mjs │ │ │ ├── GOSTKeyWrap.mjs │ │ │ ├── GOSTSign.mjs │ │ │ ├── GOSTVerify.mjs │ │ │ ├── GenerateAllChecksums.mjs │ │ │ ├── GenerateAllHashes.mjs │ │ │ ├── GenerateDeBruijnSequence.mjs │ │ │ ├── GenerateECDSAKeyPair.mjs │ │ │ ├── GenerateHOTP.mjs │ │ │ ├── GenerateImage.mjs │ │ │ ├── GenerateLoremIpsum.mjs │ │ │ ├── GeneratePGPKeyPair.mjs │ │ │ ├── GenerateQRCode.mjs │ │ │ ├── GenerateRSAKeyPair.mjs │ │ │ ├── GenerateTOTP.mjs │ │ │ ├── GenerateUUID.mjs │ │ │ ├── GenericCodeBeautify.mjs │ │ │ ├── GetAllCasings.mjs │ │ │ ├── GetTime.mjs │ │ │ ├── GroupIPAddresses.mjs │ │ │ ├── Gunzip.mjs │ │ │ ├── Gzip.mjs │ │ │ ├── HAS160.mjs │ │ │ ├── HASSHClientFingerprint.mjs │ │ │ ├── HASSHServerFingerprint.mjs │ │ │ ├── HMAC.mjs │ │ │ ├── HTMLToText.mjs │ │ │ ├── HTTPRequest.mjs │ │ │ ├── HammingDistance.mjs │ │ │ ├── HaversineDistance.mjs │ │ │ ├── Head.mjs │ │ │ ├── HeatmapChart.mjs │ │ │ ├── HexDensityChart.mjs │ │ │ ├── HexToObjectIdentifier.mjs │ │ │ ├── HexToPEM.mjs │ │ │ ├── IPv6TransitionAddresses.mjs │ │ │ ├── ImageBrightnessContrast.mjs │ │ │ ├── ImageFilter.mjs │ │ │ ├── ImageHueSaturationLightness.mjs │ │ │ ├── ImageOpacity.mjs │ │ │ ├── IndexOfCoincidence.mjs │ │ │ ├── InvertImage.mjs │ │ │ ├── JA3Fingerprint.mjs │ │ │ ├── JA3SFingerprint.mjs │ │ │ ├── JA4Fingerprint.mjs │ │ │ ├── JA4ServerFingerprint.mjs │ │ │ ├── JPathExpression.mjs │ │ │ ├── JSONBeautify.mjs │ │ │ ├── JSONMinify.mjs │ │ │ ├── JSONToCSV.mjs │ │ │ ├── JSONtoYAML.mjs │ │ │ ├── JWKToPem.mjs │ │ │ ├── JWTDecode.mjs │ │ │ ├── JWTSign.mjs │ │ │ ├── JWTVerify.mjs │ │ │ ├── JavaScriptBeautify.mjs │ │ │ ├── JavaScriptMinify.mjs │ │ │ ├── JavaScriptParser.mjs │ │ │ ├── Jq.mjs │ │ │ ├── Jsonata.mjs │ │ │ ├── Jump.mjs │ │ │ ├── Keccak.mjs │ │ │ ├── LMHash.mjs │ │ │ ├── LS47Decrypt.mjs │ │ │ ├── LS47Encrypt.mjs │ │ │ ├── LZ4Compress.mjs │ │ │ ├── LZ4Decompress.mjs │ │ │ ├── LZMACompress.mjs │ │ │ ├── LZMADecompress.mjs │ │ │ ├── LZNT1Decompress.mjs │ │ │ ├── LZStringCompress.mjs │ │ │ ├── LZStringDecompress.mjs │ │ │ ├── Label.mjs │ │ │ ├── LevenshteinDistance.mjs │ │ │ ├── Lorenz.mjs │ │ │ ├── LuhnChecksum.mjs │ │ │ ├── MD2.mjs │ │ │ ├── MD4.mjs │ │ │ ├── MD5.mjs │ │ │ ├── MD6.mjs │ │ │ ├── MIMEDecoding.mjs │ │ │ ├── Magic.mjs │ │ │ ├── Mean.mjs │ │ │ ├── Median.mjs │ │ │ ├── Merge.mjs │ │ │ ├── MicrosoftScriptDecoder.mjs │ │ │ ├── MultipleBombe.mjs │ │ │ ├── Multiply.mjs │ │ │ ├── MurmurHash3.mjs │ │ │ ├── NOT.mjs │ │ │ ├── NTHash.mjs │ │ │ ├── NormaliseImage.mjs │ │ │ ├── NormaliseUnicode.mjs │ │ │ ├── Numberwang.mjs │ │ │ ├── OR.mjs │ │ │ ├── ObjectIdentifierToHex.mjs │ │ │ ├── OffsetChecker.mjs │ │ │ ├── OpticalCharacterRecognition.mjs │ │ │ ├── PEMToHex.mjs │ │ │ ├── PEMToJWK.mjs │ │ │ ├── PGPDecrypt.mjs │ │ │ ├── PGPDecryptAndVerify.mjs │ │ │ ├── PGPEncrypt.mjs │ │ │ ├── PGPEncryptAndSign.mjs │ │ │ ├── PGPVerify.mjs │ │ │ ├── PHPDeserialize.mjs │ │ │ ├── PHPSerialize.mjs │ │ │ ├── PLISTViewer.mjs │ │ │ ├── PadLines.mjs │ │ │ ├── ParseASN1HexString.mjs │ │ │ ├── ParseCSR.mjs │ │ │ ├── ParseColourCode.mjs │ │ │ ├── ParseDateTime.mjs │ │ │ ├── ParseIPRange.mjs │ │ │ ├── ParseIPv4Header.mjs │ │ │ ├── ParseIPv6Address.mjs │ │ │ ├── ParseObjectIDTimestamp.mjs │ │ │ ├── ParseQRCode.mjs │ │ │ ├── ParseSSHHostKey.mjs │ │ │ ├── ParseTCP.mjs │ │ │ ├── ParseTLSRecord.mjs │ │ │ ├── ParseTLV.mjs │ │ │ ├── ParseUDP.mjs │ │ │ ├── ParseUNIXFilePermissions.mjs │ │ │ ├── ParseURI.mjs │ │ │ ├── ParseUserAgent.mjs │ │ │ ├── ParseX509CRL.mjs │ │ │ ├── ParseX509Certificate.mjs │ │ │ ├── PlayMedia.mjs │ │ │ ├── PowerSet.mjs │ │ │ ├── ProtobufDecode.mjs │ │ │ ├── ProtobufEncode.mjs │ │ │ ├── PseudoRandomIntegerGenerator.mjs │ │ │ ├── PseudoRandomNumberGenerator.mjs │ │ │ ├── PubKeyFromCert.mjs │ │ │ ├── PubKeyFromPrivKey.mjs │ │ │ ├── RAKE.mjs │ │ │ ├── RC2Decrypt.mjs │ │ │ ├── RC2Encrypt.mjs │ │ │ ├── RC4.mjs │ │ │ ├── RC4Drop.mjs │ │ │ ├── RC6Decrypt.mjs │ │ │ ├── RC6Encrypt.mjs │ │ │ ├── RIPEMD.mjs │ │ │ ├── ROT13.mjs │ │ │ ├── ROT13BruteForce.mjs │ │ │ ├── ROT47.mjs │ │ │ ├── ROT47BruteForce.mjs │ │ │ ├── ROT8000.mjs │ │ │ ├── RSADecrypt.mjs │ │ │ ├── RSAEncrypt.mjs │ │ │ ├── RSASign.mjs │ │ │ ├── RSAVerify.mjs │ │ │ ├── Rabbit.mjs │ │ │ ├── RailFenceCipherDecode.mjs │ │ │ ├── RailFenceCipherEncode.mjs │ │ │ ├── RandomizeColourPalette.mjs │ │ │ ├── RawDeflate.mjs │ │ │ ├── RawInflate.mjs │ │ │ ├── Register.mjs │ │ │ ├── RegularExpression.mjs │ │ │ ├── RemoveDiacritics.mjs │ │ │ ├── RemoveEXIF.mjs │ │ │ ├── RemoveLineNumbers.mjs │ │ │ ├── RemoveNullBytes.mjs │ │ │ ├── RemoveWhitespace.mjs │ │ │ ├── RenderImage.mjs │ │ │ ├── RenderMarkdown.mjs │ │ │ ├── ResizeImage.mjs │ │ │ ├── Return.mjs │ │ │ ├── Reverse.mjs │ │ │ ├── RisonDecode.mjs │ │ │ ├── RisonEncode.mjs │ │ │ ├── RotateImage.mjs │ │ │ ├── RotateLeft.mjs │ │ │ ├── RotateRight.mjs │ │ │ ├── SHA0.mjs │ │ │ ├── SHA1.mjs │ │ │ ├── SHA2.mjs │ │ │ ├── SHA3.mjs │ │ │ ├── SIGABA.mjs │ │ │ ├── SM2Decrypt.mjs │ │ │ ├── SM2Encrypt.mjs │ │ │ ├── SM3.mjs │ │ │ ├── SM4Decrypt.mjs │ │ │ ├── SM4Encrypt.mjs │ │ │ ├── SQLBeautify.mjs │ │ │ ├── SQLMinify.mjs │ │ │ ├── SSDEEP.mjs │ │ │ ├── SUB.mjs │ │ │ ├── Salsa20.mjs │ │ │ ├── ScanForEmbeddedFiles.mjs │ │ │ ├── ScatterChart.mjs │ │ │ ├── Scrypt.mjs │ │ │ ├── SeriesChart.mjs │ │ │ ├── SetDifference.mjs │ │ │ ├── SetIntersection.mjs │ │ │ ├── SetUnion.mjs │ │ │ ├── Shake.mjs │ │ │ ├── SharpenImage.mjs │ │ │ ├── ShowBase64Offsets.mjs │ │ │ ├── ShowOnMap.mjs │ │ │ ├── Shuffle.mjs │ │ │ ├── Sleep.mjs │ │ │ ├── Snefru.mjs │ │ │ ├── Sort.mjs │ │ │ ├── Split.mjs │ │ │ ├── SplitColourChannels.mjs │ │ │ ├── StandardDeviation.mjs │ │ │ ├── Streebog.mjs │ │ │ ├── Strings.mjs │ │ │ ├── StripHTMLTags.mjs │ │ │ ├── StripHTTPHeaders.mjs │ │ │ ├── StripIPv4Header.mjs │ │ │ ├── StripTCPHeader.mjs │ │ │ ├── StripUDPHeader.mjs │ │ │ ├── Subsection.mjs │ │ │ ├── Substitute.mjs │ │ │ ├── Subtract.mjs │ │ │ ├── Sum.mjs │ │ │ ├── SwapCase.mjs │ │ │ ├── SwapEndianness.mjs │ │ │ ├── SymmetricDifference.mjs │ │ │ ├── SyntaxHighlighter.mjs │ │ │ ├── TCPIPChecksum.mjs │ │ │ ├── Tail.mjs │ │ │ ├── TakeBytes.mjs │ │ │ ├── TakeNthBytes.mjs │ │ │ ├── Tar.mjs │ │ │ ├── Template.mjs │ │ │ ├── TextEncodingBruteForce.mjs │ │ │ ├── TextIntegerConverter.mjs │ │ │ ├── ToBCD.mjs │ │ │ ├── ToBase.mjs │ │ │ ├── ToBase32.mjs │ │ │ ├── ToBase45.mjs │ │ │ ├── ToBase58.mjs │ │ │ ├── ToBase62.mjs │ │ │ ├── ToBase64.mjs │ │ │ ├── ToBase85.mjs │ │ │ ├── ToBase92.mjs │ │ │ ├── ToBech32.mjs │ │ │ ├── ToBinary.mjs │ │ │ ├── ToBraille.mjs │ │ │ ├── ToCamelCase.mjs │ │ │ ├── ToCaseInsensitiveRegex.mjs │ │ │ ├── ToCharcode.mjs │ │ │ ├── ToDecimal.mjs │ │ │ ├── ToFloat.mjs │ │ │ ├── ToHTMLEntity.mjs │ │ │ ├── ToHex.mjs │ │ │ ├── ToHexContent.mjs │ │ │ ├── ToHexdump.mjs │ │ │ ├── ToKebabCase.mjs │ │ │ ├── ToLowerCase.mjs │ │ │ ├── ToMessagePack.mjs │ │ │ ├── ToModhex.mjs │ │ │ ├── ToMorseCode.mjs │ │ │ ├── ToOctal.mjs │ │ │ ├── ToPunycode.mjs │ │ │ ├── ToQuotedPrintable.mjs │ │ │ ├── ToSnakeCase.mjs │ │ │ ├── ToTable.mjs │ │ │ ├── ToUNIXTimestamp.mjs │ │ │ ├── ToUpperCase.mjs │ │ │ ├── TranslateDateTimeFormat.mjs │ │ │ ├── TripleDESDecrypt.mjs │ │ │ ├── TripleDESEncrypt.mjs │ │ │ ├── Typex.mjs │ │ │ ├── UNIXTimestampToWindowsFiletime.mjs │ │ │ ├── URLDecode.mjs │ │ │ ├── URLEncode.mjs │ │ │ ├── UnescapeString.mjs │ │ │ ├── UnescapeUnicodeCharacters.mjs │ │ │ ├── UnicodeTextFormat.mjs │ │ │ ├── Unique.mjs │ │ │ ├── Untar.mjs │ │ │ ├── Unzip.mjs │ │ │ ├── VarIntDecode.mjs │ │ │ ├── VarIntEncode.mjs │ │ │ ├── ViewBitPlane.mjs │ │ │ ├── VigenèreDecode.mjs │ │ │ ├── VigenèreEncode.mjs │ │ │ ├── Whirlpool.mjs │ │ │ ├── WindowsFiletimeToUNIXTimestamp.mjs │ │ │ ├── XKCDRandomNumber.mjs │ │ │ ├── XMLBeautify.mjs │ │ │ ├── XMLMinify.mjs │ │ │ ├── XOR.mjs │ │ │ ├── XORBruteForce.mjs │ │ │ ├── XORChecksum.mjs │ │ │ ├── XPathExpression.mjs │ │ │ ├── XSalsa20.mjs │ │ │ ├── XXTEADecrypt.mjs │ │ │ ├── XXTEAEncrypt.mjs │ │ │ ├── YAMLToJSON.mjs │ │ │ ├── YARARules.mjs │ │ │ ├── Zip.mjs │ │ │ ├── ZlibDeflate.mjs │ │ │ └── ZlibInflate.mjs │ │ └── vendor/ │ │ ├── DisassembleX86-64.mjs │ │ ├── gost/ │ │ │ ├── gostCipher.mjs │ │ │ ├── gostCoding.mjs │ │ │ ├── gostCrypto.mjs │ │ │ ├── gostDigest.mjs │ │ │ ├── gostEngine.mjs │ │ │ ├── gostRandom.mjs │ │ │ └── gostSign.mjs │ │ └── remove-exif.mjs │ ├── node/ │ │ ├── File.mjs │ │ ├── NodeDish.mjs │ │ ├── NodeRecipe.mjs │ │ ├── api.mjs │ │ ├── apiUtils.mjs │ │ ├── config/ │ │ │ ├── excludedOperations.mjs │ │ │ └── scripts/ │ │ │ └── generateNodeIndex.mjs │ │ ├── repl.mjs │ │ └── wrapper.js │ └── web/ │ ├── App.mjs │ ├── HTMLCategory.mjs │ ├── HTMLIngredient.mjs │ ├── HTMLOperation.mjs │ ├── Manager.mjs │ ├── html/ │ │ └── index.html │ ├── index.js │ ├── static/ │ │ ├── fonts/ │ │ │ └── bmfonts/ │ │ │ ├── Roboto72White.fnt │ │ │ ├── RobotoBlack72White.fnt │ │ │ ├── RobotoMono72White.fnt │ │ │ └── RobotoSlab72White.fnt │ │ ├── ga.html │ │ ├── images/ │ │ │ └── IMAGE_LICENCES.md │ │ ├── sitemap.mjs │ │ └── structuredData.json │ ├── stylesheets/ │ │ ├── components/ │ │ │ ├── _button.css │ │ │ ├── _list.css │ │ │ ├── _operation.css │ │ │ └── _pane.css │ │ ├── index.css │ │ ├── index.js │ │ ├── layout/ │ │ │ ├── _banner.css │ │ │ ├── _controls.css │ │ │ ├── _io.css │ │ │ ├── _modals.css │ │ │ ├── _operations.css │ │ │ ├── _recipe.css │ │ │ └── _structure.css │ │ ├── operations/ │ │ │ ├── diff.css │ │ │ └── json.css │ │ ├── preloader.css │ │ ├── themes/ │ │ │ ├── _classic.css │ │ │ ├── _dark.css │ │ │ ├── _geocities.css │ │ │ ├── _solarizedDark.css │ │ │ └── _solarizedLight.css │ │ └── utils/ │ │ ├── _general.css │ │ └── _overrides.css │ ├── utils/ │ │ ├── copyOverride.mjs │ │ ├── editorUtils.mjs │ │ ├── fileDetails.mjs │ │ ├── htmlWidget.mjs │ │ ├── sidePanel.mjs │ │ └── statusBar.mjs │ ├── waiters/ │ │ ├── BackgroundWorkerWaiter.mjs │ │ ├── BindingsWaiter.mjs │ │ ├── ControlsWaiter.mjs │ │ ├── HighlighterWaiter.mjs │ │ ├── InputWaiter.mjs │ │ ├── OperationsWaiter.mjs │ │ ├── OptionsWaiter.mjs │ │ ├── OutputWaiter.mjs │ │ ├── RecipeWaiter.mjs │ │ ├── SeasonalWaiter.mjs │ │ ├── TabWaiter.mjs │ │ ├── TimingWaiter.mjs │ │ ├── WindowWaiter.mjs │ │ └── WorkerWaiter.mjs │ └── workers/ │ ├── DishWorker.mjs │ ├── InputWorker.mjs │ ├── LoaderWorker.js │ └── ZipWorker.mjs ├── tests/ │ ├── browser/ │ │ ├── 00_nightwatch.js │ │ ├── 01_io.js │ │ ├── 02_ops.js │ │ └── browserUtils.js │ ├── lib/ │ │ ├── TestRegister.mjs │ │ └── utils.mjs │ ├── node/ │ │ ├── assertionHandler.mjs │ │ ├── consumers/ │ │ │ ├── cjs-consumer.js │ │ │ └── esm-consumer.mjs │ │ ├── index.mjs │ │ └── tests/ │ │ ├── Categories.mjs │ │ ├── Dish.mjs │ │ ├── File.mjs │ │ ├── NodeDish.mjs │ │ ├── Utils.mjs │ │ ├── lib/ │ │ │ └── BigIntUtils.mjs │ │ ├── nodeApi.mjs │ │ └── operations.mjs │ ├── operations/ │ │ ├── index.mjs │ │ └── tests/ │ │ ├── A1Z26CipherDecode.mjs │ │ ├── AESKeyWrap.mjs │ │ ├── AlternatingCaps.mjs │ │ ├── AvroToJSON.mjs │ │ ├── BCD.mjs │ │ ├── BLAKE2b.mjs │ │ ├── BLAKE2s.mjs │ │ ├── BLAKE3.mjs │ │ ├── BSON.mjs │ │ ├── BaconCipher.mjs │ │ ├── Base32.mjs │ │ ├── Base45.mjs │ │ ├── Base58.mjs │ │ ├── Base62.mjs │ │ ├── Base64.mjs │ │ ├── Base85.mjs │ │ ├── Base92.mjs │ │ ├── Bech32.mjs │ │ ├── BitwiseOp.mjs │ │ ├── Bombe.mjs │ │ ├── ByteRepr.mjs │ │ ├── CBORDecode.mjs │ │ ├── CBOREncode.mjs │ │ ├── CMAC.mjs │ │ ├── CRCChecksum.mjs │ │ ├── CSV.mjs │ │ ├── CaesarBoxCipher.mjs │ │ ├── CaretMdecode.mjs │ │ ├── CartesianProduct.mjs │ │ ├── CetaceanCipherDecode.mjs │ │ ├── CetaceanCipherEncode.mjs │ │ ├── ChaCha.mjs │ │ ├── ChangeIPFormat.mjs │ │ ├── CharEnc.mjs │ │ ├── Charts.mjs │ │ ├── CipherSaber2.mjs │ │ ├── Ciphers.mjs │ │ ├── Code.mjs │ │ ├── Colossus.mjs │ │ ├── Comment.mjs │ │ ├── Compress.mjs │ │ ├── ConditionalJump.mjs │ │ ├── ConvertCoordinateFormat.mjs │ │ ├── ConvertLeetSpeak.mjs │ │ ├── ConvertToNATOAlphabet.mjs │ │ ├── Crypt.mjs │ │ ├── DateTime.mjs │ │ ├── DefangIP.mjs │ │ ├── DisassembleARM.mjs │ │ ├── DropNthBytes.mjs │ │ ├── ECDSA.mjs │ │ ├── ELFInfo.mjs │ │ ├── Enigma.mjs │ │ ├── ExtractAudioMetadata.mjs │ │ ├── ExtractEmailAddresses.mjs │ │ ├── ExtractHashes.mjs │ │ ├── ExtractIPAddresses.mjs │ │ ├── Fernet.mjs │ │ ├── FileTree.mjs │ │ ├── FlaskSession.mjs │ │ ├── FletcherChecksum.mjs │ │ ├── Float.mjs │ │ ├── Fork.mjs │ │ ├── FromDecimal.mjs │ │ ├── GOST.mjs │ │ ├── GenerateAllChecksums.mjs │ │ ├── GenerateAllHashes.mjs │ │ ├── GenerateDeBruijnSequence.mjs │ │ ├── GenerateQRCode.mjs │ │ ├── GetAllCasings.mjs │ │ ├── Gunzip.mjs │ │ ├── Gzip.mjs │ │ ├── HASSH.mjs │ │ ├── HKDF.mjs │ │ ├── Hash.mjs │ │ ├── HaversineDistance.mjs │ │ ├── Hex.mjs │ │ ├── Hexdump.mjs │ │ ├── IPv6Transition.mjs │ │ ├── Image.mjs │ │ ├── IndexOfCoincidence.mjs │ │ ├── JA3Fingerprint.mjs │ │ ├── JA3SFingerprint.mjs │ │ ├── JA4.mjs │ │ ├── JSONBeautify.mjs │ │ ├── JSONMinify.mjs │ │ ├── JSONtoCSV.mjs │ │ ├── JSONtoYAML.mjs │ │ ├── JWK.mjs │ │ ├── JWTDecode.mjs │ │ ├── JWTSign.mjs │ │ ├── JWTVerify.mjs │ │ ├── Jsonata.mjs │ │ ├── Jump.mjs │ │ ├── LS47.mjs │ │ ├── LZNT1Decompress.mjs │ │ ├── LZString.mjs │ │ ├── LevenshteinDistance.mjs │ │ ├── Lorenz.mjs │ │ ├── LuhnChecksum.mjs │ │ ├── MIMEDecoding.mjs │ │ ├── MS.mjs │ │ ├── Magic.mjs │ │ ├── Media.mjs │ │ ├── Modhex.mjs │ │ ├── MorseCode.mjs │ │ ├── MultipleBombe.mjs │ │ ├── MurmurHash3.mjs │ │ ├── NTLM.mjs │ │ ├── NetBIOS.mjs │ │ ├── NormaliseUnicode.mjs │ │ ├── OTP.mjs │ │ ├── PEMtoHex.mjs │ │ ├── PGP.mjs │ │ ├── PHP.mjs │ │ ├── PHPSerialize.mjs │ │ ├── ParseCSR.mjs │ │ ├── ParseIPRange.mjs │ │ ├── ParseObjectIDTimestamp.mjs │ │ ├── ParseQRCode.mjs │ │ ├── ParseSSHHostKey.mjs │ │ ├── ParseTCP.mjs │ │ ├── ParseTLSRecord.mjs │ │ ├── ParseTLV.mjs │ │ ├── ParseUDP.mjs │ │ ├── ParseX509CRL.mjs │ │ ├── PowerSet.mjs │ │ ├── Protobuf.mjs │ │ ├── PubKeyFromCert.mjs │ │ ├── PubKeyFromPrivKey.mjs │ │ ├── RAKE.mjs │ │ ├── RC6.mjs │ │ ├── RSA.mjs │ │ ├── Rabbit.mjs │ │ ├── Regex.mjs │ │ ├── Register.mjs │ │ ├── RisonEncodeDecode.mjs │ │ ├── Rotate.mjs │ │ ├── SIGABA.mjs │ │ ├── SM2.mjs │ │ ├── SM4.mjs │ │ ├── SQLBeautify.mjs │ │ ├── Salsa20.mjs │ │ ├── SeqUtils.mjs │ │ ├── SetDifference.mjs │ │ ├── SetIntersection.mjs │ │ ├── SetUnion.mjs │ │ ├── Shuffle.mjs │ │ ├── SplitColourChannels.mjs │ │ ├── StrUtils.mjs │ │ ├── StripIPv4Header.mjs │ │ ├── StripTCPHeader.mjs │ │ ├── StripUDPHeader.mjs │ │ ├── Subsection.mjs │ │ ├── SwapCase.mjs │ │ ├── SymmetricDifference.mjs │ │ ├── TakeNthBytes.mjs │ │ ├── Template.mjs │ │ ├── TextEncodingBruteForce.mjs │ │ ├── TextIntegerConverter.mjs │ │ ├── ToFromInsensitiveRegex.mjs │ │ ├── TranslateDateTimeFormat.mjs │ │ ├── Typex.mjs │ │ ├── URLEncodeDecode.mjs │ │ ├── UnescapeString.mjs │ │ ├── Unicode.mjs │ │ ├── XORChecksum.mjs │ │ ├── XSalsa20.mjs │ │ ├── XXTEA.mjs │ │ └── YARA.mjs │ └── samples/ │ ├── Audio.mjs │ ├── Ciphers.mjs │ ├── Executables.mjs │ └── Images.mjs └── webpack.config.js
Showing preview only (244K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3366 symbols across 639 files)
FILE: Gruntfile.js
function listEntryModules (line 153) | function listEntryModules() {
function chainCommands (line 172) | function chainCommands(cmds) {
FILE: src/core/Chef.mjs
class Chef (line 15) | class Chef {
method constructor (line 20) | constructor() {
method bake (line 40) | async bake(input, recipeConfig, options={}) {
method silentBake (line 102) | silentBake(recipeConfig) {
method calculateHighlights (line 128) | async calculateHighlights(recipeConfig, direction, pos) {
method getDishAs (line 164) | async getDishAs(dish, type) {
method getDishTitle (line 176) | async getDishTitle(dish, maxLength=100) {
FILE: src/core/ChefWorker.js
function bake (line 98) | async function bake(data) {
function silentBake (line 139) | function silentBake(data) {
function getDishAs (line 152) | async function getDishAs(data) {
function getDishTitle (line 173) | async function getDishTitle(data) {
function calculateHighlights (line 194) | async function calculateHighlights(recipeConfig, direction, pos) {
FILE: src/core/Dish.mjs
class Dish (line 27) | class Dish {
method constructor (line 37) | constructor(dishOrInput=null, type = null) {
method typeEnum (line 63) | static typeEnum(typeStr) {
method enumLookup (line 99) | static enumLookup(typeEnum) {
method get (line 133) | get(type) {
method set (line 169) | set(value, type) {
method presentAs (line 194) | presentAs(type) {
method detectDishType (line 204) | detectDishType() {
method getTitle (line 222) | async getTitle(maxLength) {
method valid (line 264) | valid() {
method size (line 324) | get size() {
method clone (line 352) | clone() {
method _translate (line 417) | _translate(toType) {
method _toArrayBuffer (line 448) | _toArrayBuffer() {
method _fromArrayBuffer (line 487) | _fromArrayBuffer(toType) {
FILE: src/core/Ingredient.mjs
class Ingredient (line 13) | class Ingredient {
method constructor (line 20) | constructor(ingredientConfig) {
method _parseConfig (line 47) | _parseConfig(ingredientConfig) {
method config (line 69) | get config() {
method value (line 79) | set value(value) {
method value (line 89) | get value() {
method prepare (line 101) | static prepare(data, type) {
FILE: src/core/Operation.mjs
class Operation (line 13) | class Operation {
method constructor (line 18) | constructor() {
method run (line 44) | run(input, args) {
method highlight (line 58) | highlight(pos, args) {
method highlightReverse (line 72) | highlightReverse(pos, args) {
method present (line 89) | present(data, args) {
method inputType (line 99) | set inputType(typeStr) {
method inputType (line 109) | get inputType() {
method outputType (line 119) | set outputType(typeStr) {
method outputType (line 130) | get outputType() {
method presentType (line 140) | set presentType(typeStr) {
method presentType (line 150) | get presentType() {
method args (line 160) | set args(conf) {
method args (line 173) | get args() {
method config (line 201) | get config() {
method addIngredient (line 214) | addIngredient(ingredient) {
method ingValues (line 224) | set ingValues(ingValues) {
method ingValues (line 236) | get ingValues() {
method breakpoint (line 246) | set breakpoint(value) {
method breakpoint (line 256) | get breakpoint() {
method disabled (line 266) | set disabled(value) {
method disabled (line 276) | get disabled() {
method flowControl (line 286) | get flowControl() {
method flowControl (line 296) | set flowControl(value) {
method manualBake (line 306) | get manualBake() {
method manualBake (line 316) | set manualBake(value) {
FILE: src/core/Recipe.mjs
class Recipe (line 20) | class Recipe {
method constructor (line 27) | constructor(recipeConfig) {
method _parseConfig (line 42) | _parseConfig(recipeConfig) {
method _hydrateOpList (line 61) | async _hydrateOpList() {
method config (line 88) | get config() {
method addOperation (line 101) | addOperation(operation) {
method addOperations (line 111) | addOperations(operations) {
method setBreakpoint (line 134) | setBreakpoint(position, value) {
method removeBreaksUpTo (line 149) | removeBreaksUpTo(pos) {
method containsFlowControl (line 161) | containsFlowControl() {
method execute (line 179) | async execute(dish, startFrom=0, forkState={}) {
method present (line 268) | async present(dish) {
method toString (line 284) | toString() {
method fromString (line 294) | fromString(recipeStr) {
method generateHighlightList (line 309) | async generateHighlightList() {
method lastOpPresented (line 340) | lastOpPresented(progress) {
FILE: src/core/Utils.mjs
class Utils (line 18) | class Utils {
method chr (line 30) | static chr(o) {
method ord (line 55) | static ord(c) {
method padBytesRight (line 95) | static padBytesRight(arr, numBytes, padByte=0) {
method truncate (line 122) | static truncate(str, max, suffix="...") {
method hex (line 144) | static hex(c, length=2) {
method bin (line 164) | static bin(c, length=8) {
method printable (line 178) | static printable(str, preserveWs=false, onlyAscii=false) {
method escapeWhitespace (line 201) | static escapeWhitespace(str) {
method parseEscapedChars (line 221) | static parseEscapedChars(str) {
method escapeRegex (line 276) | static escapeRegex(str) {
method expandAlphRange (line 297) | static expandAlphRange(alphStr) {
method convertToByteArray (line 342) | static convertToByteArray(str, type) {
method convertToByteString (line 379) | static convertToByteString(str, type) {
method byteArrayToInt (line 412) | static byteArrayToInt(byteArray, byteorder) {
method intToByteArray (line 445) | static intToByteArray(value, length, byteorder) {
method strToArrayBuffer (line 476) | static strToArrayBuffer(str) {
method strToUtf8ArrayBuffer (line 505) | static strToUtf8ArrayBuffer(str) {
method strToByteArray (line 537) | static strToByteArray(str) {
method strToUtf8ByteArray (line 565) | static strToUtf8ByteArray(str) {
method strToCharcode (line 595) | static strToCharcode(str) {
method byteArrayToUtf8 (line 631) | static byteArrayToUtf8(byteArray) {
method byteArrayToChars (line 669) | static byteArrayToChars(byteArray) {
method arrayBufferToStr (line 693) | static arrayBufferToStr(arrayBuffer, utf8=true) {
method calculateShannonEntropy (line 706) | static calculateShannonEntropy(data) {
method parseCSV (line 751) | static parseCSV(data, cellDelims=[","], lineDelims=["\n", "\r"]) {
method stripHtmlTags (line 812) | static stripHtmlTags(htmlStr, removeScriptAndStyle=false) {
method escapeHtml (line 850) | static escapeHtml(str) {
method unescapeHtml (line 877) | static unescapeHtml(str) {
method toTitleCase (line 905) | static toTitleCase(str) {
method encodeURIFragment (line 934) | static encodeURIFragment(str) {
method generatePrettyRecipe (line 978) | static generatePrettyRecipe(recipeConfig, newline = false) {
method parseRecipeConfig (line 1011) | static parseRecipeConfig(recipe) {
method displayFilesAsHTML (line 1052) | static async displayFilesAsHTML(files) {
method parseURIParams (line 1148) | static parseURIParams(paramStr) {
method readFile (line 1183) | static readFile(file) {
method readFileSync (line 1228) | static readFileSync(file) {
method mod (line 1246) | static mod(x, y) {
method gcd (line 1259) | static gcd(x, y) {
method modInv (line 1275) | static modInv(x, y) {
method charRep (line 1291) | static charRep(token) {
method regexRep (line 1317) | static regexRep(token) {
method chunked (line 1341) | static* chunked(iterable, chunksize) {
function isNodeEnvironment (line 1365) | function isNodeEnvironment() {
function isWebEnvironment (line 1373) | function isWebEnvironment() {
function isWorkerEnvironment (line 1381) | function isWorkerEnvironment() {
function sendStatusMessage (line 1501) | function sendStatusMessage(msg) {
function debounce (line 1525) | function debounce(func, wait, id, scope, args) {
FILE: src/core/config/scripts/newMinorVersion.mjs
function main (line 19) | async function main() {
FILE: src/core/dishTypes/DishBigNumber.mjs
class DishBigNumber (line 14) | class DishBigNumber extends DishType {
method toArrayBuffer (line 20) | static toArrayBuffer() {
method fromArrayBuffer (line 28) | static fromArrayBuffer() {
FILE: src/core/dishTypes/DishByteArray.mjs
class DishByteArray (line 12) | class DishByteArray extends DishType {
method toArrayBuffer (line 17) | static toArrayBuffer() {
method fromArrayBuffer (line 25) | static fromArrayBuffer() {
FILE: src/core/dishTypes/DishFile.mjs
class DishFile (line 13) | class DishFile extends DishType {
method toArrayBuffer (line 19) | static toArrayBuffer() {
method fromArrayBuffer (line 36) | static fromArrayBuffer() {
FILE: src/core/dishTypes/DishHTML.mjs
class DishHTML (line 13) | class DishHTML extends DishString {
method toArrayBuffer (line 19) | static toArrayBuffer() {
FILE: src/core/dishTypes/DishJSON.mjs
class DishJSON (line 13) | class DishJSON extends DishType {
method toArrayBuffer (line 18) | static toArrayBuffer() {
method fromArrayBuffer (line 26) | static fromArrayBuffer() {
FILE: src/core/dishTypes/DishListFile.mjs
class DishListFile (line 14) | class DishListFile extends DishType {
method toArrayBuffer (line 19) | static async toArrayBuffer() {
method fromArrayBuffer (line 32) | static fromArrayBuffer() {
method concatenateTypedArraysWithTypedElements (line 43) | static async concatenateTypedArraysWithTypedElements(...arrays) {
method concatenateTypedArrays (line 65) | static concatenateTypedArrays(...arrays) {
FILE: src/core/dishTypes/DishNumber.mjs
class DishNumber (line 14) | class DishNumber extends DishType {
method toArrayBuffer (line 19) | static toArrayBuffer() {
method fromArrayBuffer (line 27) | static fromArrayBuffer() {
FILE: src/core/dishTypes/DishString.mjs
class DishString (line 14) | class DishString extends DishType {
method toArrayBuffer (line 19) | static toArrayBuffer() {
method fromArrayBuffer (line 27) | static fromArrayBuffer() {
FILE: src/core/dishTypes/DishType.mjs
class DishType (line 11) | class DishType {
method checkForValue (line 16) | static checkForValue(value) {
method toArrayBuffer (line 26) | static toArrayBuffer() {
method fromArrayBuffer (line 33) | static fromArrayBuffer() {
FILE: src/core/errors/DishError.mjs
class DishError (line 9) | class DishError extends Error {
method constructor (line 15) | constructor(...args) {
FILE: src/core/errors/ExcludedOperationError.mjs
class ExcludedOperationError (line 8) | class ExcludedOperationError extends Error {
method constructor (line 14) | constructor(...args) {
FILE: src/core/errors/OperationError.mjs
class OperationError (line 9) | class OperationError extends Error {
method constructor (line 15) | constructor(...args) {
FILE: src/core/lib/Arithmetic.mjs
function createNumArray (line 19) | function createNumArray(input, delim) {
function sum (line 45) | function sum(data) {
function sub (line 58) | function sub(data) {
function multi (line 71) | function multi(data) {
function div (line 84) | function div(data) {
function mean (line 97) | function mean(data) {
function median (line 110) | function median(data) {
function stdDev (line 130) | function stdDev(data) {
FILE: src/core/lib/AudioBytes.mjs
function ascii4 (line 10) | function ascii4(b, off) {
function indexOfAscii (line 16) | function indexOfAscii(b, s, start, end) {
function u32be (line 32) | function u32be(bytes, off) {
function u32le (line 37) | function u32le(bytes, off) {
function u16le (line 42) | function u16le(bytes, off) {
function u64le (line 47) | function u64le(bytes, off) {
function synchsafeToInt (line 52) | function synchsafeToInt(b0, b1, b2, b3) {
function decodeUtf16LE (line 57) | function decodeUtf16LE(b, off, len) {
function readNullTerminated (line 67) | function readNullTerminated(bytes, start, encoding) {
constant ID3_ENCODINGS (line 79) | const ID3_ENCODINGS = ["iso-8859-1", "utf-16", "utf-16be", "utf-8"];
function decodeText (line 82) | function decodeText(bytes, encoding) {
function safeUtf8 (line 92) | function safeUtf8(bytes) {
function decodeLatin1Trim (line 101) | function decodeLatin1Trim(bytes) {
FILE: src/core/lib/AudioMetaSchema.mjs
function makeEmptyReport (line 14) | function makeEmptyReport(filename, byteLength, container) {
function sniffContainer (line 49) | function sniffContainer(b) {
FILE: src/core/lib/AudioParsers.mjs
function parseMp3 (line 19) | function parseMp3(b, report) {
function processId3v2 (line 31) | function processId3v2(b, report) {
function processGeobFrame (line 72) | function processGeobFrame(f, entry, report) {
function processId3v1 (line 104) | function processId3v1(b, report) {
function parseRiffWave (line 114) | function parseRiffWave(b, report, maxTextBytes) {
function processRiffChunk (line 132) | function processRiffChunk(b, c, riff, info, report, maxTextBytes) {
function parseFlac (line 162) | function parseFlac(b, report, maxTextBytes) {
function parseOgg (line 188) | function parseOgg(b, report) {
function parseMp4BestEffort (line 212) | function parseMp4BestEffort(b, report) {
function parseAiffBestEffort (line 237) | function parseAiffBestEffort(b, report, maxTextBytes) {
constant AAC_SAMPLE_RATES (line 263) | const AAC_SAMPLE_RATES = [96000, 88200, 64000, 48000, 44100, 32000, 2400...
constant AAC_PROFILES (line 264) | const AAC_PROFILES = ["Main", "LC", "SSR", "LTP"];
constant AAC_CHANNELS (line 265) | const AAC_CHANNELS = ["defined in AOT", "mono", "stereo", "3.0", "4.0", ...
function parseAacAdts (line 268) | function parseAacAdts(b, report) {
constant AC3_SAMPLE_RATES (line 287) | const AC3_SAMPLE_RATES = [48000, 44100, 32000];
constant AC3_BITRATES (line 288) | const AC3_BITRATES = [32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 22...
constant AC3_ACMODES (line 289) | const AC3_ACMODES = [
function parseAc3 (line 295) | function parseAc3(b, report) {
function parseWmaAsf (line 315) | function parseWmaAsf(b, report) {
constant ID3_FRAME_DESCRIPTIONS (line 365) | const ID3_FRAME_DESCRIPTIONS = {
constant ID3_TO_COMMON (line 374) | const ID3_TO_COMMON = {
constant VORBIS_TO_COMMON (line 378) | const VORBIS_TO_COMMON = {
constant WMA_TO_COMMON (line 382) | const WMA_TO_COMMON = {
constant ID3V1_TO_COMMON (line 386) | const ID3V1_TO_COMMON = { title: "title", artist: "artist", album: "albu...
constant RIFF_TO_COMMON (line 387) | const RIFF_TO_COMMON = { INAM: "title", IART: "artist", ICMT: "comment",...
constant ASF_CD_TO_COMMON (line 388) | const ASF_CD_TO_COMMON = { title: "title", author: "artist", copyright: ...
function mapCommon (line 391) | function mapCommon(report, source, mapping) {
function mapCommonId3 (line 398) | function mapCommonId3(report, frameId, text) {
function decodeCommFrame (line 404) | function decodeCommFrame(data) {
function normalizeTlen (line 415) | function normalizeTlen(s) {
function parseId3v2 (line 424) | function parseId3v2(mp3) {
function parseId3v1 (line 449) | function parseId3v1(b) {
function decodeTxxx (line 468) | function decodeTxxx(data) {
function parseApeV2BestEffort (line 478) | function parseApeV2BestEffort(b) {
function enumerateChunks (line 511) | function enumerateChunks(b, start, end, maxCount) {
function parseBext (line 526) | function parseBext(b, off, size) {
constant FLAC_TYPE_NAMES (line 539) | const FLAC_TYPE_NAMES = { 0: "STREAMINFO", 1: "PADDING", 2: "APPLICATION...
function parseFlacMetaBlocks (line 542) | function parseFlacMetaBlocks(b) {
function parseVorbisComment (line 560) | function parseVorbisComment(buf) {
function mapVorbisCommon (line 579) | function mapVorbisCommon(report, vc) {
function parseFlacPicture (line 586) | function parseFlacPicture(data, maxTextBytes) {
function parseAsfContentDescription (line 596) | function parseAsfContentDescription(b, off) {
function parseAsfExtContentDescription (line 609) | function parseAsfExtContentDescription(b, off, end) {
FILE: src/core/lib/BCD.mjs
constant ENCODING_SCHEME (line 12) | const ENCODING_SCHEME = [
constant ENCODING_LOOKUP (line 35) | const ENCODING_LOOKUP = {
constant FORMAT (line 48) | const FORMAT = ["Nibbles", "Bytes", "Raw"];
FILE: src/core/lib/Bacon.mjs
constant BACON_ALPHABETS (line 12) | const BACON_ALPHABETS = {
constant BACON_TRANSLATION_01 (line 21) | const BACON_TRANSLATION_01 = "0/1";
constant BACON_TRANSLATION_AB (line 22) | const BACON_TRANSLATION_AB = "A/B";
constant BACON_TRANSLATION_CASE (line 23) | const BACON_TRANSLATION_CASE = "Case";
constant BACON_TRANSLATION_AMNZ (line 24) | const BACON_TRANSLATION_AMNZ = "A-M/N-Z first letter";
constant BACON_TRANSLATIONS (line 25) | const BACON_TRANSLATIONS = [
constant BACON_TRANSLATIONS_FOR_ENCODING (line 31) | const BACON_TRANSLATIONS_FOR_ENCODING = [
constant BACON_CLEARER_MAP (line 35) | const BACON_CLEARER_MAP = {
constant BACON_NORMALIZE_MAP (line 40) | const BACON_NORMALIZE_MAP = {
function swapZeroAndOne (line 59) | function swapZeroAndOne(string) {
FILE: src/core/lib/Base32.mjs
constant ALPHABET_OPTIONS (line 13) | const ALPHABET_OPTIONS = [
FILE: src/core/lib/Base45.mjs
function highlightToBase45 (line 12) | function highlightToBase45(pos, args) {
function highlightFromBase45 (line 21) | function highlightFromBase45(pos, args) {
constant ALPHABET (line 27) | const ALPHABET = "0-9A-Z $%*+\\-./:";
FILE: src/core/lib/Base58.mjs
constant ALPHABET_OPTIONS (line 13) | const ALPHABET_OPTIONS = [
FILE: src/core/lib/Base64.mjs
function toBase64 (line 26) | function toBase64(data, alphabet="A-Za-z0-9+/=") {
function fromBase64 (line 85) | function fromBase64(data, alphabet="A-Za-z0-9+/=", returnType="string", ...
constant ALPHABET_OPTIONS (line 165) | const ALPHABET_OPTIONS = [
FILE: src/core/lib/Base85.mjs
constant ALPHABET_OPTIONS (line 14) | const ALPHABET_OPTIONS = [
function alphabetName (line 36) | function alphabetName(alphabet) {
FILE: src/core/lib/Base92.mjs
function base92Chr (line 17) | function base92Chr(val) {
function base92Ord (line 35) | function base92Ord(val) {
FILE: src/core/lib/Bech32.mjs
constant CHARSET (line 15) | const CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l";
constant CHARSET_REV (line 18) | const CHARSET_REV = {};
constant BECH32_CONST (line 24) | const BECH32_CONST = 1;
constant BECH32M_CONST (line 27) | const BECH32M_CONST = 0x2bc830a3;
constant GENERATOR (line 30) | const GENERATOR = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1...
function polymod (line 37) | function polymod(values) {
function hrpExpand (line 56) | function hrpExpand(hrp) {
function verifyChecksum (line 75) | function verifyChecksum(hrp, data, encoding) {
function createChecksum (line 87) | function createChecksum(hrp, data, encoding) {
function toWords (line 103) | function toWords(data) {
function fromWords (line 131) | function fromWords(words) {
function encode (line 171) | function encode(hrp, data, encoding = "Bech32", segwit = false) {
function decode (line 236) | function decode(str, encoding = "Auto-detect") {
FILE: src/core/lib/BigIntUtils.mjs
function parseBigInt (line 23) | function parseBigInt(value, param) {
function egcd (line 38) | function egcd(a, b) {
function modPow (line 59) | function modPow(base, exponent, modulus) {
FILE: src/core/lib/Binary.mjs
function toBinary (line 31) | function toBinary(data, delim="Space", padding=8) {
function fromBinary (line 67) | function fromBinary(data, delim="Space", byteLen=8) {
FILE: src/core/lib/BitwiseOp.mjs
function bitOp (line 19) | function bitOp (input, key, func, nullPreserving, scheme) {
function xor (line 56) | function xor(operand, key) {
function not (line 67) | function not(operand, _) {
function and (line 79) | function and(operand, key) {
function or (line 91) | function or(operand, key) {
function add (line 103) | function add(operand, key) {
function sub (line 115) | function sub(operand, key) {
constant BITWISE_OP_DELIMS (line 124) | const BITWISE_OP_DELIMS = ["Hex", "Decimal", "Binary", "Base64", "UTF8",...
FILE: src/core/lib/Bombe.mjs
class CopyRotor (line 20) | class CopyRotor extends Rotor {
method copy (line 25) | copy() {
class Node (line 43) | class Node {
method constructor (line 48) | constructor(letter) {
class Edge (line 60) | class Edge {
method constructor (line 67) | constructor(pos, node1, node2) {
method getOther (line 81) | getOther(node) {
class SharedScrambler (line 90) | class SharedScrambler {
method constructor (line 96) | constructor(rotors, reflector) {
method changeRotors (line 111) | changeRotors(rotors, reflector) {
method step (line 123) | step(n) {
method cacheGen (line 138) | cacheGen() {
method transform (line 168) | transform(i) {
class Scrambler (line 179) | class Scrambler {
method constructor (line 187) | constructor(base, rotor, pos, end1, end2) {
method changeRotor (line 203) | changeRotor(rotor) {
method step (line 213) | step() {
method transform (line 228) | transform(i) {
method getOtherEnd (line 247) | getOtherEnd(end) {
method getPos (line 260) | getPos() {
class BombeMachine (line 276) | class BombeMachine {
method constructor (line 299) | constructor(rotors, reflector, ciphertext, crib, check, update=undefin...
method initRotors (line 371) | initRotors(rotors) {
method changeRotors (line 385) | changeRotors(rotors, reflector) {
method update (line 398) | update(...msg) {
method dfs (line 412) | dfs(node) {
method makeMenu (line 457) | makeMenu() {
method energise (line 501) | energise(i, j) {
method tryDecrypt (line 558) | tryDecrypt(stecker) {
method formatPair (line 579) | formatPair(a, b) {
method checkingMachine (line 601) | checkingMachine(pair) {
method checkStop (line 640) | checkStop() {
method run (line 711) | run() {
FILE: src/core/lib/Braille.mjs
constant BRAILLE_LOOKUP (line 12) | const BRAILLE_LOOKUP = {
FILE: src/core/lib/CanvasComponents.mjs
function drawLine (line 18) | function drawLine(ctx, startX, startY, endX, endY) {
function drawBarChart (line 37) | function drawBarChart(canvas, scores, xAxisLabel, yAxisLabel, numXLabels...
function drawScaleBar (line 143) | function drawScaleBar(canvas, score, max, markings) {
FILE: src/core/lib/Charts.mjs
constant RECORD_DELIMITER_OPTIONS (line 15) | const RECORD_DELIMITER_OPTIONS = ["Line feed", "CRLF"];
constant FIELD_DELIMITER_OPTIONS (line 22) | const FIELD_DELIMITER_OPTIONS = ["Space", "Comma", "Semi-colon", "Colon"...
constant COLOURS (line 31) | const COLOURS = {
function getValues (line 47) | function getValues(input, recordDelimiter, fieldDelimiter, columnHeading...
function getScatterValues (line 76) | function getScatterValues(input, recordDelimiter, fieldDelimiter, column...
function getScatterValuesWithColour (line 112) | function getScatterValuesWithColour(input, recordDelimiter, fieldDelimit...
function getSeriesValues (line 147) | function getSeriesValues(input, recordDelimiter, fieldDelimiter, columnH...
FILE: src/core/lib/ChrEnc.mjs
constant CHR_ENC_CODE_PAGES (line 14) | const CHR_ENC_CODE_PAGES = {
constant CHR_ENC_SIMPLE_LOOKUP (line 170) | const CHR_ENC_SIMPLE_LOOKUP = {};
constant CHR_ENC_SIMPLE_REVERSE_LOOKUP (line 171) | const CHR_ENC_SIMPLE_REVERSE_LOOKUP = {};
function chrEncWidth (line 189) | function chrEncWidth(page) {
constant UNICODE_NORMALISATION_FORMS (line 227) | const UNICODE_NORMALISATION_FORMS = ["NFD", "NFC", "NFKD", "NFKC"];
function isUTF8 (line 236) | function isUTF8(data) {
FILE: src/core/lib/CipherSaber2.mjs
function encode (line 6) | function encode(tempIVP, key, rounds, input) {
FILE: src/core/lib/Ciphers.mjs
function affineEncode (line 25) | function affineEncode(input, args) {
function genPolybiusSquare (line 62) | function genPolybiusSquare (keyword) {
FILE: src/core/lib/Code.mjs
function replaceVariableNames (line 16) | function replaceVariableNames(input, replacer) {
FILE: src/core/lib/Colossus.mjs
class ColossusComputer (line 13) | class ColossusComputer {
method constructor (line 24) | constructor(ciphertext, pattern, qbusin, qbusswitches, control, starts...
method run (line 70) | run() {
method runTape (line 135) | runTape() {
method stepThyratrons (line 177) | stepThyratrons() {
method getQbusInputs (line 248) | getQbusInputs(charZin) {
method runQbusProcessingConditional (line 306) | runQbusProcessingConditional() {
method runQbusProcessingAddition (line 343) | runQbusProcessingAddition(cnt) {
method initThyratrons (line 382) | initThyratrons(pattern) {
method readBusSwitches (line 408) | readBusSwitches(row) {
FILE: src/core/lib/ConvertCoordinates.mjs
constant FORMATS (line 29) | const FORMATS = [
constant NO_CHANGE (line 42) | const NO_CHANGE = [
function convertCoordinates (line 61) | function convertCoordinates (input, inFormat, inDelim, outFormat, outDel...
function splitInput (line 343) | function splitInput (input) {
function convDMSToDD (line 366) | function convDMSToDD (degrees, minutes, seconds, precision) {
function convDDMToDD (line 388) | function convDDMToDD (degrees, minutes, precision) {
function convDDToDD (line 410) | function convDDToDD (degrees, precision) {
function convDDToDMS (line 424) | function convDDToDMS (decDegrees, precision) {
function convDDToDDM (line 449) | function convDDToDDM (decDegrees, precision) {
function findDirs (line 474) | function findDirs(input, delim) {
function findFormat (line 535) | function findFormat (input, delim) {
function findDelim (line 600) | function findDelim (input) {
function realDelim (line 637) | function realDelim (delim) {
function isNegativeZero (line 654) | function isNegativeZero(zero) {
function round (line 665) | function round(input, precision) {
FILE: src/core/lib/DateTime.mjs
constant UNITS (line 12) | const UNITS = ["Seconds (s)", "Milliseconds (ms)", "Microseconds (μs)", ...
constant DATETIME_FORMATS (line 17) | const DATETIME_FORMATS = [
constant FORMAT_EXAMPLES (line 51) | const FORMAT_EXAMPLES = `Format string tokens:
FILE: src/core/lib/Decimal.mjs
function fromDecimal (line 26) | function fromDecimal(data, delim="Auto") {
FILE: src/core/lib/Delim.mjs
constant DELIM_OPTIONS (line 12) | const DELIM_OPTIONS = ["Space", "Comma", "Semi-colon", "Colon", "Line fe...
constant BIN_DELIM_OPTIONS (line 17) | const BIN_DELIM_OPTIONS = ["Space", "Comma", "Semi-colon", "Colon", "Lin...
constant LETTER_DELIM_OPTIONS (line 22) | const LETTER_DELIM_OPTIONS = ["Space", "Line feed", "CRLF", "Forward sla...
constant WORD_DELIM_OPTIONS (line 27) | const WORD_DELIM_OPTIONS = ["Line feed", "CRLF", "Forward slash", "Backs...
constant INPUT_DELIM_OPTIONS (line 32) | const INPUT_DELIM_OPTIONS = ["Line feed", "CRLF", "Space", "Comma", "Sem...
constant ARITHMETIC_DELIM_OPTIONS (line 37) | const ARITHMETIC_DELIM_OPTIONS = ["Line feed", "Space", "Comma", "Semi-c...
constant HASH_DELIM_OPTIONS (line 42) | const HASH_DELIM_OPTIONS = ["Line feed", "CRLF", "Space", "Comma"];
constant IP_DELIM_OPTIONS (line 47) | const IP_DELIM_OPTIONS = ["Line feed", "CRLF", "Space", "Comma", "Semi-c...
constant SPLIT_DELIM_OPTIONS (line 52) | const SPLIT_DELIM_OPTIONS = [
constant JOIN_DELIM_OPTIONS (line 65) | const JOIN_DELIM_OPTIONS = [
constant RGBA_DELIM_OPTIONS (line 78) | const RGBA_DELIM_OPTIONS = [
FILE: src/core/lib/Enigma.mjs
constant ROTORS (line 16) | const ROTORS = [
constant ROTORS_FOURTH (line 27) | const ROTORS_FOURTH = [
constant REFLECTORS (line 36) | const REFLECTORS = [
constant LETTERS (line 43) | const LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
function a2i (line 52) | function a2i(c, permissive=false) {
function i2a (line 73) | function i2a(i) {
class Rotor (line 83) | class Rotor {
method constructor (line 92) | constructor(wiring, steps, ringSetting, initialPosition) {
method step (line 133) | step() {
method transform (line 144) | transform(c) {
method revTransform (line 154) | revTransform(c) {
class PairMapBase (line 163) | class PairMapBase {
method constructor (line 170) | constructor(pairs, name="PairMapBase") {
method transform (line 205) | transform(c) {
method revTransform (line 218) | revTransform(c) {
class Reflector (line 228) | class Reflector extends PairMapBase {
method constructor (line 233) | constructor(pairs) {
method transform (line 252) | transform(c) {
class Plugboard (line 260) | class Plugboard extends PairMapBase {
method constructor (line 264) | constructor(pairs) {
class EnigmaBase (line 272) | class EnigmaBase {
method constructor (line 280) | constructor(rotors, reflector, plugboard) {
method step (line 300) | step() {
method crypt (line 323) | crypt(input) {
class EnigmaMachine (line 355) | class EnigmaMachine extends EnigmaBase {
method constructor (line 363) | constructor(rotors, reflector, plugboard) {
FILE: src/core/lib/Extract.mjs
function search (line 21) | function search(input, searchRegex, removeRegex=null, sortBy=null, uniqu...
constant URL_REGEX (line 58) | const URL_REGEX = new RegExp(protocol + hostname + "(?:" + port + ")?(?:...
constant DOMAIN_REGEX (line 64) | const DOMAIN_REGEX = /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]...
constant DMARC_DOMAIN_REGEX (line 70) | const DMARC_DOMAIN_REGEX = /\b((?=[a-z0-9_-]{1,63}\.)(xn--)?[a-z0-9_]+(-...
FILE: src/core/lib/FileSignatures.mjs
constant FILE_SIGNATURES (line 15) | const FILE_SIGNATURES = {
function extractJPEG (line 2629) | function extractJPEG(bytes, offset) {
function extractGIF (line 2733) | function extractGIF(bytes, offset) {
function extractMZPE (line 2777) | function extractMZPE(bytes, offset) {
function extractPDF (line 2844) | function extractPDF(bytes, offset) {
function extractZIP (line 2864) | function extractZIP(bytes, offset) {
function extractMACHO (line 2886) | function extractMACHO(bytes, offset) {
function extractTAR (line 2995) | function extractTAR(bytes, offset) {
function extractPNG (line 3034) | function extractPNG(bytes, offset) {
function extractWEBP (line 3063) | function extractWEBP(bytes, offset) {
function extractBMP (line 3087) | function extractBMP(bytes, offset) {
function extractICO (line 3109) | function extractICO(bytes, offset) {
function extractTARGA (line 3135) | function extractTARGA(bytes, offset) {
function extractWAV (line 3220) | function extractWAV(bytes, offset) {
function extractMP3 (line 3240) | function extractMP3(bytes, offset) {
function extractFLV (line 3313) | function extractFLV(bytes, offset) {
function extractRTF (line 3360) | function extractRTF(bytes, offset) {
function extractSQLITE (line 3400) | function extractSQLITE(bytes, offset) {
function extractPListXML (line 3425) | function extractPListXML(bytes, offset) {
function extractMacOSXKeychain (line 3467) | function extractMacOSXKeychain(bytes, offset) {
function extractOLE2 (line 3487) | function extractOLE2(bytes, offset) {
function extractGZIP (line 3576) | function extractGZIP(bytes, offset) {
function extractBZIP2 (line 3645) | function extractBZIP2(bytes, offset) {
function extractZlib (line 3682) | function extractZlib(bytes, offset) {
function extractXZ (line 3713) | function extractXZ(bytes, offset) {
function extractDEB (line 3732) | function extractDEB(bytes, offset) {
function extractELF (line 3764) | function extractELF(bytes, offset) {
function parseDEFLATE (line 3820) | function parseDEFLATE(stream) {
function parseHuffmanBlock (line 3917) | function parseHuffmanBlock(stream, litTab, distTab) {
function buildHuffmanTable (line 3952) | function buildHuffmanTable(lengths) {
function readHuffmanCode (line 3992) | function readHuffmanCode(stream, table) {
function extractEVTX (line 4017) | function extractEVTX(bytes, offset) {
function extractEVT (line 4043) | function extractEVT(bytes, offset) {
function extractDMP (line 4067) | function extractDMP(bytes, offset) {
function extractPF (line 4087) | function extractPF(bytes, offset) {
function extractPFWin10 (line 4105) | function extractPFWin10(bytes, offset) {
function extractLNK (line 4122) | function extractLNK(bytes, offset) {
function extractLZOP (line 4140) | function extractLZOP(bytes, offset) {
FILE: src/core/lib/FileType.mjs
function signatureMatches (line 23) | function signatureMatches(sig, buf, offset=0) {
function bytesMatch (line 50) | function bytesMatch(sig, buf, offset=0) {
function detectFileType (line 86) | function detectFileType(buf, categories=Object.keys(FILE_SIGNATURES)) {
function scanForFileTypes (line 131) | function scanForFileTypes(buf, categories=Object.keys(FILE_SIGNATURES)) {
function locatePotentialSig (line 183) | function locatePotentialSig(buf, sig, offset) {
function isType (line 213) | function isType(type, buf) {
function isImage (line 240) | function isImage(buf) {
function extractFile (line 256) | function extractFile(bytes, fileDetail, offset) {
FILE: src/core/lib/FlowControl.mjs
function getLabelIndex (line 16) | function getLabelIndex(name, state) {
FILE: src/core/lib/FuzzyMatch.mjs
constant DEFAULT_WEIGHTS (line 19) | const DEFAULT_WEIGHTS = {
function fuzzyMatch (line 38) | function fuzzyMatch(pattern, str, global=false, weights=DEFAULT_WEIGHTS) {
function fuzzyMatchRecursive (line 90) | function fuzzyMatchRecursive(
function calcMatchRanges (line 237) | function calcMatchRanges(matches) {
FILE: src/core/lib/Hash.mjs
function runHash (line 22) | function runHash(name, input, options={}) {
FILE: src/core/lib/Hex.mjs
function toHex (line 31) | function toHex(data, delim=" ", padding=2, extraDelim="", lineSize=0) {
function toHexFast (line 73) | function toHexFast(data) {
function fromHex (line 103) | function fromHex(data, delim="Auto", byteLen=2) {
constant TO_HEX_DELIM_OPTIONS (line 127) | const TO_HEX_DELIM_OPTIONS = ["Space", "Percent", "Comma", "Semi-colon",...
constant FROM_HEX_DELIM_OPTIONS (line 133) | const FROM_HEX_DELIM_OPTIONS = ["Auto"].concat(TO_HEX_DELIM_OPTIONS);
FILE: src/core/lib/IP.mjs
function ipv4CidrRange (line 23) | function ipv4CidrRange(cidr, includeNetworkInfo, enumerateAddresses, all...
function ipv6CidrRange (line 61) | function ipv6CidrRange(cidr, includeNetworkInfo) {
function ipv4HyphenatedRange (line 112) | function ipv4HyphenatedRange(range, includeNetworkInfo, enumerateAddress...
function ipv6HyphenatedRange (line 165) | function ipv6HyphenatedRange(range, includeNetworkInfo) {
function ipv4ListedRange (line 202) | function ipv4ListedRange(match, includeNetworkInfo, enumerateAddresses, ...
function ipv6ListedRange (line 238) | function ipv6ListedRange(match, includeNetworkInfo) {
function strToIpv4 (line 289) | function strToIpv4(ipStr) {
function ipv4ToStr (line 328) | function ipv4ToStr(ipInt) {
function strToIpv6 (line 348) | function strToIpv6(ipStr) {
function ipv6ToStr (line 395) | function ipv6ToStr(ipv6, compact) {
function generateIpv4Range (line 447) | function generateIpv4Range(ip, endIp) {
function genIpv6Mask (line 465) | function genIpv6Mask(cidr) {
function ipv4Compare (line 489) | function ipv4Compare(a, b) {
function ipv6Compare (line 500) | function ipv6Compare(a, b) {
constant IPV4_REGEX (line 518) | const IPV4_REGEX = /^\s*((?:\d{1,3}\.){3}\d{1,3})\s*$/;
constant IPV6_REGEX (line 523) | const IPV6_REGEX = /^\s*(((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|...
FILE: src/core/lib/JA4.mjs
function toJA4 (line 24) | function toJA4(bytes) {
function toJA4S (line 167) | function toJA4S(bytes) {
function tlsVersionMapper (line 249) | function tlsVersionMapper(version) {
function isAlphanumeric (line 267) | function isAlphanumeric(byte) {
function alpnFingerprint (line 280) | function alpnFingerprint(rawBytes) {
FILE: src/core/lib/JWT.mjs
constant JWT_ALGORITHMS (line 13) | const JWT_ALGORITHMS = [
FILE: src/core/lib/LS47.mjs
function initTiles (line 15) | function initTiles() {
function rotateDown (line 28) | function rotateDown(key, col, n) {
function rotateRight (line 56) | function rotateRight(key, row, n) {
function findIx (line 68) | function findIx(letter) {
function deriveKey (line 81) | function deriveKey(password) {
function checkKey (line 97) | function checkKey(key) {
function findPos (line 119) | function findPos (key, letter) {
function findAtPos (line 133) | function findAtPos(key, coord) {
function addPos (line 144) | function addPos(a, b) {
function subPos (line 157) | function subPos(a, b) {
function encrypt (line 170) | function encrypt(key, plaintext) {
function decrypt (line 195) | function decrypt(key, ciphertext) {
function encryptPad (line 222) | function encryptPad(key, plaintext, signature, paddingSize) {
function decryptPad (line 240) | function decryptPad(key, ciphertext, paddingSize) {
FILE: src/core/lib/LZNT1.mjs
constant COMPRESSED_MASK (line 15) | const COMPRESSED_MASK = 1 << 15,
constant SIZE_MASK (line 15) | const COMPRESSED_MASK = 1 << 15,
function getDisplacement (line 22) | function getDisplacement(offset) {
function decompress (line 35) | function decompress(compressed) {
FILE: src/core/lib/LZString.mjs
constant COMPRESSION_OUTPUT_FORMATS (line 11) | const COMPRESSION_OUTPUT_FORMATS = ["default", "UTF16", "Base64"];
constant COMPRESSION_FUNCTIONS (line 12) | const COMPRESSION_FUNCTIONS = {
constant DECOMPRESSION_FUNCTIONS (line 17) | const DECOMPRESSION_FUNCTIONS = {
FILE: src/core/lib/LoremIpsum.mjs
function GenerateParagraphs (line 15) | function GenerateParagraphs(length=3) {
function GenerateSentences (line 39) | function GenerateSentences(length=3) {
function GenerateWords (line 57) | function GenerateWords(length=3) {
function GenerateBytes (line 71) | function GenerateBytes(length=3) {
function getWords (line 84) | function getWords(length=3) {
function wordsToSentences (line 106) | function wordsToSentences(words) {
function sentencesToParagraphs (line 127) | function sentencesToParagraphs(sentences) {
function formatSentence (line 146) | function formatSentence(words) {
function formatParagraph (line 166) | function formatParagraph(sentences) {
function getRandomLength (line 181) | function getRandomLength(mean, stdDev) {
function replaceStart (line 197) | function replaceStart(str) {
constant SENTENCE_LENGTH_MEAN (line 212) | const SENTENCE_LENGTH_MEAN = 15;
constant SENTENCE_LENGTH_STD_DEV (line 213) | const SENTENCE_LENGTH_STD_DEV = 9;
constant PARAGRAPH_LENGTH_MEAN (line 214) | const PARAGRAPH_LENGTH_MEAN = 5;
constant PARAGRAPH_LENGTH_STD_DEV (line 215) | const PARAGRAPH_LENGTH_STD_DEV = 2;
constant PROBABILITY_OF_A_COMMA (line 216) | const PROBABILITY_OF_A_COMMA = 0.35;
FILE: src/core/lib/Lorenz.mjs
constant SWITCHES (line 9) | const SWITCHES = [
constant VALID_ITA2 (line 15) | const VALID_ITA2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ34589+-./";
constant ITA2_TABLE (line 17) | const ITA2_TABLE = {
constant ROTOR_SIZES (line 56) | const ROTOR_SIZES = {
constant INIT_PATTERNS (line 74) | const INIT_PATTERNS = {
FILE: src/core/lib/Magic.mjs
class Magic (line 17) | class Magic {
method constructor (line 26) | constructor(buf, opCriteria=Magic._generateOpCriteria(), prevOp=null) {
method findMatchingInputOps (line 38) | findMatchingInputOps() {
method detectLanguage (line 67) | detectLanguage(extLang = false) {
method detectFileType (line 103) | detectFileType() {
method calcEntropy (line 120) | calcEntropy(data=this.inputBuffer, standalone=false) {
method bruteForce (line 142) | async bruteForce() {
method outputCheckPasses (line 210) | outputCheckPasses(data, criteria) {
method speculativeExecution (line 243) | async speculativeExecution(
method _runRecipe (line 370) | async _runRecipe(recipeConfig, input=this.inputBuffer) {
method _freqDist (line 400) | _freqDist(data=this.inputBuffer, standalone=false) {
method _generateOpCriteria (line 430) | static _generateOpCriteria() {
method _chiSqr (line 465) | static _chiSqr(observed, expected, ddof=0) {
method codeToLanguage (line 488) | static codeToLanguage(code) {
constant COMMON_LANG_FREQS (line 803) | const COMMON_LANG_FREQS = {
constant EXTENSIVE_LANG_FREQS (line 844) | const EXTENSIVE_LANG_FREQS = Object.assign({}, COMMON_LANG_FREQS, {
function _buffersEqual (line 1100) | function _buffersEqual(a, b) {
FILE: src/core/lib/Modhex.mjs
constant MODHEX_ALPHABET (line 14) | const MODHEX_ALPHABET = "cbdefghijklnrtuv";
constant MODHEX_ALPHABET_MAP (line 20) | const MODHEX_ALPHABET_MAP = MODHEX_ALPHABET.split("");
constant HEX_ALPHABET (line 26) | const HEX_ALPHABET = "0123456789abcdef";
constant HEX_ALPHABET_MAP (line 32) | const HEX_ALPHABET_MAP = HEX_ALPHABET.split("");
function toModhex (line 50) | function toModhex(data, delim=" ", padding=2, extraDelim="", lineSize=0) {
function toModhexFast (line 100) | function toModhexFast(data) {
function fromModhex (line 129) | function fromModhex(data, delim="Auto", byteLen=2) {
constant TO_MODHEX_DELIM_OPTIONS (line 159) | const TO_MODHEX_DELIM_OPTIONS = ["Space", "Percent", "Comma", "Semi-colo...
constant FROM_MODHEX_DELIM_OPTIONS (line 165) | const FROM_MODHEX_DELIM_OPTIONS = ["Auto"].concat(TO_MODHEX_DELIM_OPTIONS);
FILE: src/core/lib/PGP.mjs
constant ASP (line 22) | const ASP = kbpgp.ASP({
function getSubkeySize (line 60) | function getSubkeySize(keySize) {
function importPrivateKey (line 77) | async function importPrivateKey(privateKey, passphrase) {
function importPublicKey (line 106) | async function importPublicKey (publicKey) {
FILE: src/core/lib/Protobuf.mjs
class Protobuf (line 15) | class Protobuf {
method constructor (line 22) | constructor(data) {
method varIntEncode (line 50) | static varIntEncode(number) {
method varIntDecode (line 76) | static varIntDecode(input) {
method encode (line 88) | static encode(input, args) {
method decode (line 112) | static decode(input, args) {
method updateProtoRoot (line 124) | static updateProtoRoot(protoText) {
method updateMainMessageName (line 140) | static updateMainMessageName() {
method mergeDecodes (line 171) | static mergeDecodes(input) {
method appendTypesToFieldNames (line 214) | static appendTypesToFieldNames(schemaRoot) {
method showRawTypes (line 233) | static showRawTypes(rawDecode, fieldTypes) {
method compareFields (line 280) | static compareFields(rawDecodedMessage, schemaMessage) {
method getTypeInfo (line 345) | static getTypeInfo(wireType) {
method _parse (line 366) | _parse() {
method _addField (line 391) | _addField(field, object) {
method _parseField (line 409) | _parseField() {
method _fieldHeader (line 444) | _fieldHeader() {
method _fieldType (line 457) | _fieldType() {
method _fieldNumber (line 471) | _fieldNumber() {
method _varInt (line 493) | _varInt() {
method _uint64 (line 512) | _uint64() {
method _lenDelim (line 525) | _lenDelim(fieldNum) {
method _uint32 (line 553) | _uint32() {
FILE: src/core/lib/Protocol.mjs
function objToTable (line 18) | function objToTable(obj, nested=false) {
function bytesToLargeNumber (line 48) | function bytesToLargeNumber(bs) {
FILE: src/core/lib/PublicKey.mjs
function formatDnObj (line 18) | function formatDnObj(dnObj, indent) {
function formatByteStr (line 47) | function formatByteStr(byteStr, length, indent) {
FILE: src/core/lib/QRCode.mjs
function parseQrCode (line 22) | async function parseQrCode(input, normalise) {
function generateQrCode (line 74) | function generateQrCode(
FILE: src/core/lib/RC6.mjs
constant P_256 (line 24) | const P_256 = 0xb7e151628aed2a6abf7158809cf4f3c762e7160f38b4da56a784d904...
constant Q_256 (line 30) | const Q_256 = 0x9e3779b97f4a7c15f39cc0605cedc8341082276bf3a27251f86c6a11...
function getP (line 37) | function getP(w) {
function getQ (line 46) | function getQ(w) {
function getBlockSize (line 56) | function getBlockSize(w) {
function getDefaultRounds (line 65) | function getDefaultRounds(w) {
function wordMask (line 77) | function wordMask(w) {
function ROL (line 90) | function ROL(x, n, w, lgMask) {
function ROR (line 107) | function ROR(x, n, w, lgMask) {
function bytesToWords (line 121) | function bytesToWords(bytes, w) {
function wordsToBytes (line 140) | function wordsToBytes(words, w) {
function generateSubkeys (line 159) | function generateSubkeys(key, rounds, w) {
function encryptBlock (line 214) | function encryptBlock(block, S, rounds, w) {
function decryptBlock (line 265) | function decryptBlock(block, S, rounds, w) {
function xorBlocks (line 313) | function xorBlocks(a, b) {
function incrementCounter (line 326) | function incrementCounter(counter) {
function applyPadding (line 343) | function applyPadding(message, padding, blockSize) {
function removePadding (line 399) | function removePadding(message, padding, blockSize) {
function encryptRC6 (line 452) | function encryptRC6(message, key, iv, mode = "ECB", padding = "PKCS5", r...
function decryptRC6 (line 546) | function decryptRC6(cipherText, key, iv, mode = "ECB", padding = "PKCS5"...
FILE: src/core/lib/RSA.mjs
constant MD_ALGORITHMS (line 11) | const MD_ALGORITHMS = {
FILE: src/core/lib/Rotate.mjs
function rot (line 20) | function rot(data, amount, algo) {
function rotr (line 39) | function rotr(b) {
function rotl (line 50) | function rotl(b) {
function rotrCarry (line 64) | function rotrCarry(data, amount) {
function rotlCarry (line 89) | function rotlCarry(data, amount) {
FILE: src/core/lib/SIGABA.mjs
constant CR_ROTORS (line 12) | const CR_ROTORS = [
constant I_ROTORS (line 28) | const I_ROTORS = [
constant NUMBERS (line 36) | const NUMBERS = "0123456789".split("");
function convToUpperCase (line 44) | function convToUpperCase(letter) {
class SigabaMachine (line 55) | class SigabaMachine {
method constructor (line 64) | constructor(cipherRotors, controlRotors, indexRotors) {
method step (line 73) | step() {
method encryptLetter (line 85) | encryptLetter(letter) {
method decryptLetter (line 103) | decryptLetter(letter) {
method encrypt (line 119) | encrypt(msg) {
method decrypt (line 133) | decrypt(msg) {
class CipherBank (line 146) | class CipherBank {
method constructor (line 153) | constructor(rotors) {
method encrypt (line 163) | encrypt(inputPos) {
method decrypt (line 176) | decrypt(inputPos) {
method step (line 189) | step(indexInputs) {
class ControlBank (line 211) | class ControlBank {
method constructor (line 218) | constructor(rotors) {
method crypt (line 228) | crypt(inputPos) {
method getOutputs (line 240) | getOutputs() {
method step (line 259) | step() {
method goThroughControl (line 276) | goThroughControl() {
class IndexBank (line 287) | class IndexBank {
method constructor (line 294) | constructor(rotors) {
method crypt (line 304) | crypt(inputPos) {
method goThroughIndex (line 317) | goThroughIndex(controlInputs) {
class Rotor (line 330) | class Rotor {
method constructor (line 339) | constructor(wireSetting, key, rev) {
method getNumMapping (line 352) | getNumMapping(wireSetting, rev) {
method getPosMapping (line 371) | getPosMapping(rev) {
method cryptNum (line 401) | cryptNum(inputPos, direction) {
method step (line 416) | step() {
class CRRotor (line 427) | class CRRotor extends Rotor {
method constructor (line 436) | constructor(wireSetting, key, rev=false) {
method letterToNum (line 447) | static letterToNum(letter) {
method numToLetter (line 457) | static numToLetter(num) {
method crypt (line 468) | crypt(inputPos, direction) {
class IRotor (line 479) | class IRotor extends Rotor {
method constructor (line 487) | constructor(wireSetting, key) {
method crypt (line 498) | crypt(inputPos) {
FILE: src/core/lib/SM2.mjs
class SM2 (line 18) | class SM2 {
method constructor (line 25) | constructor(curve, format) {
method setPublicKey (line 54) | setPublicKey(publicKeyX, publicKeyY) {
method setPrivateKey (line 71) | setPrivateKey(privateKeyHex) {
method encrypt (line 81) | encrypt(input) {
method decrypt (line 126) | decrypt(input) {
method getBigRandom (line 172) | getBigRandom(limit) {
method generatePublicKey (line 184) | generatePublicKey() {
method kdf (line 197) | kdf(p2, len) {
method c3 (line 221) | c3(p2, input) {
method sm3 (line 236) | sm3(data) {
method getPointAsHex (line 249) | getPointAsHex(point) {
FILE: src/core/lib/SM4.mjs
constant NROUNDS (line 19) | const NROUNDS = 32;
constant BLOCKSIZE (line 22) | const BLOCKSIZE = 16;
function ROL (line 65) | function ROL(i, n) {
function transformL (line 74) | function transformL(b) {
function transformLprime (line 87) | function transformLprime(b) {
function initSM4RoundKey (line 97) | function initSM4RoundKey(rawkey) {
function encryptBlockSM4 (line 112) | function encryptBlockSM4(X, roundKey) {
function bytesToInts (line 125) | function bytesToInts(bArray, offs=0) {
function intsToBytes (line 141) | function intsToBytes(ints) {
function encryptSM4 (line 162) | function encryptSM4(message, key, iv, mode="ECB", noPadding=false) {
function decryptSM4 (line 249) | function decryptSM4(cipherText, key, iv, mode="ECB", ignorePadding=false) {
FILE: src/core/lib/Salsa20.mjs
function salsa20Permute (line 15) | function salsa20Permute(x, rounds) {
function salsa20Block (line 65) | function salsa20Block(key, nonce, counter, rounds) {
function hsalsa20 (line 112) | function hsalsa20(key, nonce, rounds) {
FILE: src/core/lib/Sort.mjs
function caseInsensitiveSort (line 17) | function caseInsensitiveSort(a, b) {
function ipSort (line 29) | function ipSort(a, b) {
function numericSort (line 51) | function numericSort(a, b) {
function hexadecimalSort (line 78) | function hexadecimalSort(a, b) {
function lengthSort (line 114) | function lengthSort(a, b) {
FILE: src/core/lib/Stream.mjs
class Stream (line 15) | class Stream {
method constructor (line 24) | constructor(input, pos=0, bitPos=0) {
method clone (line 36) | clone() {
method getBytes (line 46) | getBytes(numBytes=null) {
method readString (line 65) | readString(numBytes=-1) {
method readInt (line 88) | readInt(numBytes, endianness="be") {
method readBits (line 115) | readBits(numBits, endianness="be") {
method continueUntil (line 168) | continueUntil(val) {
method consumeWhile (line 234) | consumeWhile(val) {
method consumeIf (line 249) | consumeIf(val) {
method moveForwardsBy (line 261) | moveForwardsBy(numBytes) {
method moveBackwardsBy (line 274) | moveBackwardsBy(numBytes) {
method moveBackwardsByBits (line 287) | moveBackwardsByBits(numBits) {
method moveTo (line 310) | moveTo(pos) {
method hasMore (line 322) | hasMore() {
method carve (line 333) | carve(start=0, finish=this.position) {
FILE: src/core/lib/TLS.mjs
function parseTLSRecord (line 17) | function parseTLSRecord(bytes) {
function parseHandshake (line 66) | function parseHandshake(bytes) {
function parseClientHello (line 113) | function parseClientHello(s, b, h) {
function parseServerHello (line 204) | function parseServerHello(s, b, h) {
function parseCipherSuites (line 275) | function parseCipherSuites(bytes) {
function parseCompressionMethods (line 296) | function parseCompressionMethods(bytes) {
function parseExtensions (line 317) | function parseExtensions(bytes) {
constant EXTENSION_LOOKUP (line 358) | const EXTENSION_LOOKUP = {
constant CIPHER_SUITES_LOOKUP (line 446) | const CIPHER_SUITES_LOOKUP = {
constant GREASE_VALUES (line 820) | const GREASE_VALUES = [
function parseHighestSupportedVersion (line 844) | function parseHighestSupportedVersion(bytes) {
function parseFirstALPNValue (line 870) | function parseFirstALPNValue(bytes) {
FILE: src/core/lib/TLVParser.mjs
class TLVParser (line 19) | class TLVParser {
method constructor (line 27) | constructor(input, options) {
method getLength (line 35) | getLength() {
method getValue (line 60) | getValue(length) {
method atEnd (line 75) | atEnd() {
FILE: src/core/lib/Typex.mjs
constant ROTORS (line 17) | const ROTORS = [
constant REFLECTORS (line 31) | const REFLECTORS = [
constant KEYBOARD (line 36) | const KEYBOARD = {
constant KEYBOARD_REV (line 41) | const KEYBOARD_REV = {};
class TypexMachine (line 49) | class TypexMachine extends Enigma.EnigmaBase {
method constructor (line 57) | constructor(rotors, reflector, plugboard, keyboard) {
method step (line 69) | step() {
method crypt (line 91) | crypt(input) {
class Rotor (line 145) | class Rotor extends Enigma.Rotor {
method constructor (line 155) | constructor(wiring, steps, reversed, ringSetting, initialPos) {
class Plugboard (line 179) | class Plugboard extends Enigma.Rotor {
method constructor (line 185) | constructor(wiring) {
method transform (line 214) | transform(c) {
method revTransform (line 224) | revTransform(c) {
FILE: src/core/lib/XXTEA.mjs
constant DELTA (line 13) | const DELTA = 0x9E3779B9;
function toUint8Array (line 21) | function toUint8Array(v, includeLength) {
function toUint32Array (line 45) | function toUint32Array(bs, includeLength) {
function int32 (line 69) | function int32(i) {
function mx (line 83) | function mx(sum, y, z, p, e, k) {
function fixk (line 92) | function fixk(k) {
function encryptUint32Array (line 107) | function encryptUint32Array(v, k) {
function decryptUint32Array (line 132) | function decryptUint32Array(v, k) {
function encrypt (line 156) | function encrypt(data, key) {
function decrypt (line 169) | function decrypt(data, key) {
FILE: src/core/lib/Zlib.mjs
constant COMPRESSION_TYPE (line 13) | const COMPRESSION_TYPE = ["Dynamic Huffman Coding", "Fixed Huffman Codin...
constant INFLATE_BUFFER_TYPE (line 14) | const INFLATE_BUFFER_TYPE = ["Adaptive", "Block"];
constant ZLIB_COMPRESSION_TYPE_LOOKUP (line 15) | const ZLIB_COMPRESSION_TYPE_LOOKUP = {
FILE: src/core/operations/A1Z26CipherDecode.mjs
class A1Z26CipherDecode (line 15) | class A1Z26CipherDecode extends Operation {
method constructor (line 20) | constructor() {
method run (line 75) | run(input, args) {
FILE: src/core/operations/A1Z26CipherEncode.mjs
class A1Z26CipherEncode (line 14) | class A1Z26CipherEncode extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/ADD.mjs
class ADD (line 14) | class ADD extends Operation {
method constructor (line 19) | constructor() {
method run (line 43) | run(input, args) {
method highlight (line 58) | highlight(pos, args) {
method highlightReverse (line 71) | highlightReverse(pos, args) {
FILE: src/core/operations/AESDecrypt.mjs
class AESDecrypt (line 15) | class AESDecrypt extends Operation {
method constructor (line 20) | constructor() {
method run (line 112) | run(input, args) {
FILE: src/core/operations/AESEncrypt.mjs
class AESEncrypt (line 15) | class AESEncrypt extends Operation {
method constructor (line 20) | constructor() {
method run (line 106) | run(input, args) {
FILE: src/core/operations/AESKeyUnwrap.mjs
class AESKeyUnwrap (line 16) | class AESKeyUnwrap extends Operation {
method constructor (line 21) | constructor() {
method run (line 61) | run(input, args) {
FILE: src/core/operations/AESKeyWrap.mjs
class AESKeyWrap (line 16) | class AESKeyWrap extends Operation {
method constructor (line 21) | constructor() {
method run (line 61) | run(input, args) {
FILE: src/core/operations/AMFDecode.mjs
class AMFDecode (line 14) | class AMFDecode extends Operation {
method constructor (line 19) | constructor() {
method run (line 43) | run(input, args) {
FILE: src/core/operations/AMFEncode.mjs
class AMFEncode (line 14) | class AMFEncode extends Operation {
method constructor (line 19) | constructor() {
method run (line 43) | run(input, args) {
FILE: src/core/operations/AND.mjs
class AND (line 14) | class AND extends Operation {
method constructor (line 19) | constructor() {
method run (line 43) | run(input, args) {
method highlight (line 58) | highlight(pos, args) {
method highlightReverse (line 71) | highlightReverse(pos, args) {
FILE: src/core/operations/AddLineNumbers.mjs
class AddLineNumbers (line 12) | class AddLineNumbers extends Operation {
method constructor (line 17) | constructor() {
method run (line 39) | run(input, args) {
FILE: src/core/operations/AddTextToImage.mjs
class AddTextToImage (line 24) | class AddTextToImage extends Operation {
method constructor (line 28) | constructor() {
method run (line 112) | async run(input, args) {
method present (line 306) | present(data) {
FILE: src/core/operations/Adler32Checksum.mjs
class Adler32Checksum (line 13) | class Adler32Checksum extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/AffineCipherDecode.mjs
class AffineCipherDecode (line 14) | class AffineCipherDecode extends Operation {
method constructor (line 19) | constructor() {
method run (line 49) | run(input, args) {
method highlight (line 87) | highlight(pos, args) {
method highlightReverse (line 100) | highlightReverse(pos, args) {
FILE: src/core/operations/AffineCipherEncode.mjs
class AffineCipherEncode (line 13) | class AffineCipherEncode extends Operation {
method constructor (line 18) | constructor() {
method run (line 46) | run(input, args) {
method highlight (line 59) | highlight(pos, args) {
method highlightReverse (line 72) | highlightReverse(pos, args) {
FILE: src/core/operations/AlternatingCaps.mjs
class AlternatingCaps (line 12) | class AlternatingCaps extends Operation {
method constructor (line 17) | constructor() {
method run (line 34) | run(input, args) {
FILE: src/core/operations/AnalyseHash.mjs
class AnalyseHash (line 13) | class AnalyseHash extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/AnalyseUUID.mjs
class AnalyseUUID (line 15) | class AnalyseUUID extends Operation {
method constructor (line 20) | constructor() {
method run (line 37) | run(input, args) {
FILE: src/core/operations/Argon2.mjs
class Argon2 (line 15) | class Argon2 extends Operation {
method constructor (line 20) | constructor() {
method run (line 75) | async run(input, args) {
FILE: src/core/operations/Argon2Compare.mjs
class Argon2Compare (line 13) | class Argon2Compare extends Operation {
method constructor (line 18) | constructor() {
method run (line 41) | async run(input, args) {
FILE: src/core/operations/AtbashCipher.mjs
class AtbashCipher (line 13) | class AtbashCipher extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
method highlight (line 48) | highlight(pos, args) {
method highlightReverse (line 61) | highlightReverse(pos, args) {
FILE: src/core/operations/AvroToJSON.mjs
class AvroToJSON (line 14) | class AvroToJSON extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/BLAKE2b.mjs
class BLAKE2b (line 16) | class BLAKE2b extends Operation {
method constructor (line 21) | constructor() {
method run (line 55) | run(input, args) {
FILE: src/core/operations/BLAKE2s.mjs
class BLAKE2s (line 16) | class BLAKE2s extends Operation {
method constructor (line 21) | constructor() {
method run (line 56) | run(input, args) {
FILE: src/core/operations/BLAKE3.mjs
class BLAKE3 (line 13) | class BLAKE3 extends Operation {
method constructor (line 18) | constructor() {
method run (line 44) | run(input, args) {
FILE: src/core/operations/BSONDeserialise.mjs
class BSONDeserialise (line 14) | class BSONDeserialise extends Operation {
method constructor (line 19) | constructor() {
method run (line 36) | run(input, args) {
FILE: src/core/operations/BSONSerialise.mjs
class BSONSerialise (line 14) | class BSONSerialise extends Operation {
method constructor (line 19) | constructor() {
method run (line 36) | run(input, args) {
FILE: src/core/operations/BaconCipherDecode.mjs
class BaconCipherDecode (line 17) | class BaconCipherDecode extends Operation {
method constructor (line 21) | constructor() {
method run (line 96) | run(input, args) {
FILE: src/core/operations/BaconCipherEncode.mjs
class BaconCipherEncode (line 17) | class BaconCipherEncode extends Operation {
method constructor (line 21) | constructor() {
method run (line 59) | run(input, args) {
FILE: src/core/operations/Bcrypt.mjs
class Bcrypt (line 14) | class Bcrypt extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | async run(input, args) {
FILE: src/core/operations/BcryptCompare.mjs
class BcryptCompare (line 15) | class BcryptCompare extends Operation {
method constructor (line 20) | constructor() {
method run (line 43) | async run(input, args) {
FILE: src/core/operations/BcryptParse.mjs
class BcryptParse (line 14) | class BcryptParse extends Operation {
method constructor (line 19) | constructor() {
method run (line 36) | async run(input, args) {
FILE: src/core/operations/BifidCipherDecode.mjs
class BifidCipherDecode (line 14) | class BifidCipherDecode extends Operation {
method constructor (line 19) | constructor() {
method run (line 44) | run(input, args) {
method highlight (line 106) | highlight(pos, args) {
method highlightReverse (line 119) | highlightReverse(pos, args) {
FILE: src/core/operations/BifidCipherEncode.mjs
class BifidCipherEncode (line 14) | class BifidCipherEncode extends Operation {
method constructor (line 19) | constructor() {
method run (line 44) | run(input, args) {
method highlight (line 111) | highlight(pos, args) {
method highlightReverse (line 124) | highlightReverse(pos, args) {
FILE: src/core/operations/BitShiftLeft.mjs
class BitShiftLeft (line 12) | class BitShiftLeft extends Operation {
method constructor (line 17) | constructor() {
method run (line 40) | run(input, args) {
method highlight (line 58) | highlight(pos, args) {
method highlightReverse (line 71) | highlightReverse(pos, args) {
FILE: src/core/operations/BitShiftRight.mjs
class BitShiftRight (line 12) | class BitShiftRight extends Operation {
method constructor (line 17) | constructor() {
method run (line 45) | run(input, args) {
method highlight (line 65) | highlight(pos, args) {
method highlightReverse (line 78) | highlightReverse(pos, args) {
FILE: src/core/operations/BlowfishDecrypt.mjs
class BlowfishDecrypt (line 16) | class BlowfishDecrypt extends Operation {
method constructor (line 21) | constructor() {
method run (line 66) | run(input, args) {
FILE: src/core/operations/BlowfishEncrypt.mjs
class BlowfishEncrypt (line 16) | class BlowfishEncrypt extends Operation {
method constructor (line 21) | constructor() {
method run (line 66) | run(input, args) {
FILE: src/core/operations/BlurImage.mjs
class BlurImage (line 17) | class BlurImage extends Operation {
method constructor (line 21) | constructor() {
method run (line 52) | async run(input, args) {
method present (line 97) | present(data) {
FILE: src/core/operations/Bombe.mjs
class Bombe (line 21) | class Bombe extends Operation {
method constructor (line 25) | constructor() {
method updateStatus (line 103) | updateStatus(nLoops, nStops, progress) {
method run (line 113) | run(input, args) {
method present (line 168) | present(output) {
FILE: src/core/operations/Bzip2Compress.mjs
class Bzip2Compress (line 15) | class Bzip2Compress extends Operation {
method constructor (line 20) | constructor() {
method run (line 50) | run(input, args) {
FILE: src/core/operations/Bzip2Decompress.mjs
class Bzip2Decompress (line 15) | class Bzip2Decompress extends Operation {
method constructor (line 20) | constructor() {
method run (line 50) | async run(input, args) {
FILE: src/core/operations/CBORDecode.mjs
class CBORDecode (line 13) | class CBORDecode extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/CBOREncode.mjs
class CBOREncode (line 13) | class CBOREncode extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/CMAC.mjs
class CMAC (line 16) | class CMAC extends Operation {
method constructor (line 21) | constructor() {
method run (line 50) | run(input, args) {
FILE: src/core/operations/CRCChecksum.mjs
class CRCChecksum (line 13) | class CRCChecksum extends Operation {
method constructor (line 18) | constructor() {
method reflectData (line 765) | reflectData(data, reflect) {
method calculateCrcBitPerBit (line 787) | calculateCrcBitPerBit(width, input, poly, remainder, reflectIn, reflec...
method generateTable (line 827) | generateTable(width, poly, MASK, TOP_BIT) {
method calculateCrcBytePerByte (line 852) | calculateCrcBytePerByte(width, input, poly, remainder, reflectIn, refl...
method crc (line 886) | crc(width, input, poly, init, reflectIn, reflectOut, xorOut) {
method custom (line 905) | custom(widthObject, input, polyObject, initObject, reflectInObject, re...
method run (line 927) | run(input, args) {
FILE: src/core/operations/CSSBeautify.mjs
class CSSBeautify (line 13) | class CSSBeautify extends Operation {
method constructor (line 18) | constructor() {
method run (line 40) | run(input, args) {
FILE: src/core/operations/CSSMinify.mjs
class CSSMinify (line 13) | class CSSMinify extends Operation {
method constructor (line 18) | constructor() {
method run (line 40) | run(input, args) {
FILE: src/core/operations/CSSSelector.mjs
class CSSSelector (line 15) | class CSSSelector extends Operation {
method constructor (line 20) | constructor() {
method run (line 48) | run(input, args) {
FILE: src/core/operations/CSVToJSON.mjs
class CSVToJSON (line 14) | class CSVToJSON extends Operation {
method constructor (line 19) | constructor() {
method run (line 52) | run(input, args) {
FILE: src/core/operations/CTPH.mjs
class CTPH (line 13) | class CTPH extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/CaesarBoxCipher.mjs
class CaesarBoxCipher (line 12) | class CaesarBoxCipher extends Operation {
method constructor (line 17) | constructor() {
method run (line 40) | run(input, args) {
FILE: src/core/operations/CaretMdecode.mjs
class CaretMdecode (line 14) | class CaretMdecode extends Operation {
method constructor (line 19) | constructor() {
method run (line 36) | run(input, args) {
FILE: src/core/operations/CartesianProduct.mjs
class CartesianProduct (line 13) | class CartesianProduct extends Operation {
method constructor (line 18) | constructor() {
method validateSampleNumbers (line 47) | validateSampleNumbers(sets) {
method run (line 62) | run(input, args) {
method runCartesianProduct (line 79) | runCartesianProduct(a, b, ...c) {
FILE: src/core/operations/CetaceanCipherDecode.mjs
class CetaceanCipherDecode (line 12) | class CetaceanCipherDecode extends Operation {
method constructor (line 17) | constructor() {
method run (line 41) | run(input, args) {
FILE: src/core/operations/CetaceanCipherEncode.mjs
class CetaceanCipherEncode (line 13) | class CetaceanCipherEncode extends Operation {
method constructor (line 18) | constructor() {
method run (line 34) | run(input, args) {
FILE: src/core/operations/ChaCha.mjs
function chacha (line 21) | function chacha(key, nonce, counter, rounds) {
class ChaCha (line 94) | class ChaCha extends Operation {
method constructor (line 99) | constructor() {
method run (line 150) | run(input, args) {
method highlight (line 207) | highlight(pos, args) {
method highlightReverse (line 224) | highlightReverse(pos, args) {
FILE: src/core/operations/ChangeIPFormat.mjs
class ChangeIPFormat (line 15) | class ChangeIPFormat extends Operation {
method constructor (line 20) | constructor() {
method run (line 47) | run(input, args) {
method fromNumber (line 126) | fromNumber(value, radix) {
FILE: src/core/operations/ChiSquare.mjs
class ChiSquare (line 12) | class ChiSquare extends Operation {
method constructor (line 17) | constructor() {
method run (line 34) | run(input, args) {
FILE: src/core/operations/CipherSaber2Decrypt.mjs
class CipherSaber2Decrypt (line 14) | class CipherSaber2Decrypt extends Operation {
method constructor (line 19) | constructor() {
method run (line 48) | run(input, args) {
FILE: src/core/operations/CipherSaber2Encrypt.mjs
class CipherSaber2Encrypt (line 15) | class CipherSaber2Encrypt extends Operation {
method constructor (line 20) | constructor() {
method run (line 49) | run(input, args) {
FILE: src/core/operations/CitrixCTX1Decode.mjs
class CitrixCTX1Decode (line 14) | class CitrixCTX1Decode extends Operation {
method constructor (line 19) | constructor() {
method run (line 36) | run(input, args) {
FILE: src/core/operations/CitrixCTX1Encode.mjs
class CitrixCTX1Encode (line 13) | class CitrixCTX1Encode extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/Colossus.mjs
class Colossus (line 20) | class Colossus extends Operation {
method constructor (line 25) | constructor() {
method run (line 362) | run(input, args) {
method selectProgram (line 465) | selectProgram(progname, args) {
method present (line 570) | present(output) {
FILE: src/core/operations/Comment.mjs
class Comment (line 12) | class Comment extends Operation {
method constructor (line 17) | constructor() {
method run (line 42) | run(state) {
FILE: src/core/operations/CompareCTPHHashes.mjs
class CompareCTPHHashes (line 16) | class CompareCTPHHashes extends Operation {
method constructor (line 21) | constructor() {
method run (line 44) | run(input, args) {
FILE: src/core/operations/CompareSSDEEPHashes.mjs
class CompareSSDEEPHashes (line 16) | class CompareSSDEEPHashes extends Operation {
method constructor (line 21) | constructor() {
method run (line 44) | run(input, args) {
FILE: src/core/operations/ConditionalJump.mjs
class ConditionalJump (line 14) | class ConditionalJump extends Operation {
method constructor (line 19) | constructor() {
method run (line 60) | async run(state) {
FILE: src/core/operations/ContainImage.mjs
class ContainImage (line 23) | class ContainImage extends Operation {
method constructor (line 27) | constructor() {
method run (line 88) | async run(input, args) {
method present (line 159) | present(data) {
FILE: src/core/operations/ConvertArea.mjs
class ConvertArea (line 12) | class ConvertArea extends Operation {
method constructor (line 17) | constructor() {
method run (line 45) | run(input, args) {
constant AREA_UNITS (line 55) | const AREA_UNITS = [
constant AREA_FACTOR (line 63) | const AREA_FACTOR = { // Multiples of a square metre
FILE: src/core/operations/ConvertCoordinateFormat.mjs
class ConvertCoordinateFormat (line 13) | class ConvertCoordinateFormat extends Operation {
method constructor (line 18) | constructor() {
method run (line 84) | run(input, args) {
FILE: src/core/operations/ConvertDataUnits.mjs
class ConvertDataUnits (line 12) | class ConvertDataUnits extends Operation {
method constructor (line 17) | constructor() {
method run (line 45) | run(input, args) {
constant DATA_UNITS (line 54) | const DATA_UNITS = [
constant DATA_FACTOR (line 62) | const DATA_FACTOR = { // Multiples of a bit
FILE: src/core/operations/ConvertDistance.mjs
class ConvertDistance (line 12) | class ConvertDistance extends Operation {
method constructor (line 17) | constructor() {
method run (line 45) | run(input, args) {
constant DISTANCE_UNITS (line 54) | const DISTANCE_UNITS = [
constant DISTANCE_FACTOR (line 62) | const DISTANCE_FACTOR = { // Multiples of a metre
FILE: src/core/operations/ConvertImageFormat.mjs
class ConvertImageFormat (line 16) | class ConvertImageFormat extends Operation {
method constructor (line 20) | constructor() {
method run (line 64) | async run(input, args) {
method present (line 124) | present(data) {
FILE: src/core/operations/ConvertLeetSpeak.mjs
class ConvertLeetSpeak (line 12) | class ConvertLeetSpeak extends Operation {
method constructor (line 16) | constructor() {
method run (line 40) | run(input, args) {
FILE: src/core/operations/ConvertMass.mjs
class ConvertMass (line 12) | class ConvertMass extends Operation {
method constructor (line 17) | constructor() {
method run (line 45) | run(input, args) {
constant MASS_UNITS (line 55) | const MASS_UNITS = [
constant MASS_FACTOR (line 64) | const MASS_FACTOR = { // Multiples of a gram
FILE: src/core/operations/ConvertSpeed.mjs
class ConvertSpeed (line 12) | class ConvertSpeed extends Operation {
method constructor (line 17) | constructor() {
method run (line 45) | run(input, args) {
constant SPEED_UNITS (line 54) | const SPEED_UNITS = [
constant SPEED_FACTOR (line 61) | const SPEED_FACTOR = { // Multiples of m/s
FILE: src/core/operations/ConvertToNATOAlphabet.mjs
class ConvertToNATOAlphabet (line 12) | class ConvertToNATOAlphabet extends Operation {
method constructor (line 16) | constructor() {
method run (line 33) | run(input, args) {
FILE: src/core/operations/CountOccurrences.mjs
class CountOccurrences (line 13) | class CountOccurrences extends Operation {
method constructor (line 18) | constructor() {
method run (line 41) | run(input, args) {
FILE: src/core/operations/CoverImage.mjs
class CoverImage (line 23) | class CoverImage extends Operation {
method constructor (line 27) | constructor() {
method run (line 83) | async run(input, args) {
method present (line 139) | present(data) {
FILE: src/core/operations/CropImage.mjs
class CropImage (line 17) | class CropImage extends Operation {
method constructor (line 21) | constructor() {
method run (line 94) | async run(input, args) {
method present (line 152) | present(data) {
FILE: src/core/operations/DESDecrypt.mjs
class DESDecrypt (line 15) | class DESDecrypt extends Operation {
method constructor (line 20) | constructor() {
method run (line 65) | run(input, args) {
FILE: src/core/operations/DESEncrypt.mjs
class DESEncrypt (line 15) | class DESEncrypt extends Operation {
method constructor (line 20) | constructor() {
method run (line 65) | run(input, args) {
FILE: src/core/operations/DNSOverHTTPS.mjs
class DNSOverHTTPS (line 12) | class DNSOverHTTPS extends Operation {
method constructor (line 17) | constructor() {
method run (line 95) | run(input, args) {
function extractData (line 130) | function extractData(data) {
FILE: src/core/operations/DateTimeDelta.mjs
class DateTimeDelta (line 14) | class DateTimeDelta extends Operation {
method constructor (line 19) | constructor() {
method run (line 74) | run(input, args) {
FILE: src/core/operations/DechunkHTTPResponse.mjs
class DechunkHTTPResponse (line 12) | class DechunkHTTPResponse extends Operation {
method constructor (line 17) | constructor() {
method run (line 41) | run(input, args) {
FILE: src/core/operations/DecodeNetBIOSName.mjs
class DecodeNetBIOSName (line 12) | class DecodeNetBIOSName extends Operation {
method constructor (line 17) | constructor() {
method run (line 47) | run(input, args) {
FILE: src/core/operations/DecodeText.mjs
class DecodeText (line 14) | class DecodeText extends Operation {
method constructor (line 19) | constructor() {
method run (line 49) | run(input, args) {
FILE: src/core/operations/DefangIPAddresses.mjs
class DefangIPAddresses (line 13) | class DefangIPAddresses extends Operation {
method constructor (line 18) | constructor() {
method run (line 46) | run(input, args) {
constant IPV4_REGEX (line 65) | const IPV4_REGEX = new RegExp("(?:(?:\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\...
constant IPV6_REGEX (line 71) | const IPV6_REGEX = new RegExp("((?=.*::)(?!.*::.+::)(::)?([\\dA-Fa-f]{1,...
FILE: src/core/operations/DefangURL.mjs
class DefangURL (line 14) | class DefangURL extends Operation {
method constructor (line 19) | constructor() {
method run (line 57) | run(input, args) {
function defangURL (line 94) | function defangURL(url, dots, http, slashes) {
FILE: src/core/operations/DeriveEVPKey.mjs
class DeriveEVPKey (line 14) | class DeriveEVPKey extends Operation {
method constructor (line 19) | constructor() {
method run (line 64) | run(input, args) {
FILE: src/core/operations/DeriveHKDFKey.mjs
class DeriveHKDFKey (line 15) | class DeriveHKDFKey extends Operation {
method constructor (line 20) | constructor() {
method run (line 101) | run(input, args) {
FILE: src/core/operations/DerivePBKDF2Key.mjs
class DerivePBKDF2Key (line 14) | class DerivePBKDF2Key extends Operation {
method constructor (line 19) | constructor() {
method run (line 64) | run(input, args) {
FILE: src/core/operations/DetectFileType.mjs
class DetectFileType (line 21) | class DetectFileType extends Operation {
method constructor (line 26) | constructor() {
method run (line 50) | run(input, args) {
FILE: src/core/operations/Diff.mjs
class Diff (line 15) | class Diff extends Operation {
method constructor (line 20) | constructor() {
method run (line 69) | run(input, args) {
FILE: src/core/operations/DisassembleARM.mjs
class DisassembleARM (line 15) | class DisassembleARM extends Operation {
method constructor (line 20) | constructor() {
method run (line 68) | async run(input, args) {
FILE: src/core/operations/DisassembleX86.mjs
class DisassembleX86 (line 14) | class DisassembleX86 extends Operation {
method constructor (line 19) | constructor() {
method run (line 77) | run(input, args) {
FILE: src/core/operations/DitherImage.mjs
class DitherImage (line 17) | class DitherImage extends Operation {
method constructor (line 21) | constructor() {
method run (line 39) | async run(input, args) {
method present (line 74) | present(data) {
FILE: src/core/operations/Divide.mjs
class Divide (line 17) | class Divide extends Operation {
method constructor (line 22) | constructor() {
method run (line 44) | run(input, args) {
FILE: src/core/operations/DropBytes.mjs
class DropBytes (line 12) | class DropBytes extends Operation {
method constructor (line 17) | constructor() {
method run (line 51) | run(input, args) {
FILE: src/core/operations/DropNthBytes.mjs
class DropNthBytes (line 13) | class DropNthBytes extends Operation {
method constructor (line 18) | constructor() {
method run (line 51) | run(input, args) {
FILE: src/core/operations/ECDSASign.mjs
class ECDSASign (line 16) | class ECDSASign extends Operation {
method constructor (line 21) | constructor() {
method run (line 65) | run(input, args) {
FILE: src/core/operations/ECDSASignatureConversion.mjs
class ECDSASignatureConversion (line 16) | class ECDSASignatureConversion extends Operation {
method constructor (line 21) | constructor() {
method run (line 60) | run(input, args) {
FILE: src/core/operations/ECDSAVerify.mjs
class ECDSAVerify (line 17) | class ECDSAVerify extends Operation {
method constructor (line 22) | constructor() {
method run (line 77) | run(input, args) {
FILE: src/core/operations/ELFInfo.mjs
class ELFInfo (line 15) | class ELFInfo extends Operation {
method constructor (line 20) | constructor() {
method run (line 37) | run(input, args) {
FILE: src/core/operations/EncodeNetBIOSName.mjs
class EncodeNetBIOSName (line 12) | class EncodeNetBIOSName extends Operation {
method constructor (line 17) | constructor() {
method run (line 40) | run(input, args) {
FILE: src/core/operations/EncodeText.mjs
class EncodeText (line 14) | class EncodeText extends Operation {
method constructor (line 19) | constructor() {
method run (line 49) | run(input, args) {
FILE: src/core/operations/Enigma.mjs
class Enigma (line 19) | class Enigma extends Operation {
method constructor (line 23) | constructor() {
method parseRotorStr (line 139) | parseRotorStr(rotor, i) {
method run (line 154) | run(input, args) {
method highlight (line 194) | highlight(pos, args) {
method highlightReverse (line 209) | highlightReverse(pos, args) {
FILE: src/core/operations/Entropy.mjs
class Entropy (line 18) | class Entropy extends Operation {
method constructor (line 23) | constructor() {
method calculateShannonEntropy (line 48) | calculateShannonEntropy(input) {
method calculateScanningEntropy (line 83) | calculateScanningEntropy(inputBytes) {
method createAxes (line 107) | createAxes(svg, xScale, yScale, svgHeight, svgWidth, margins, title, x...
method calculateByteFrequency (line 150) | calculateByteFrequency(inputBytes) {
method createByteFrequencyLineHistogram (line 173) | createByteFrequencyLineHistogram(byteFrequency) {
method createByteFrequencyBarHistogram (line 217) | createByteFrequencyBarHistogram(byteFrequency) {
method createEntropyCurve (line 260) | createEntropyCurve(entropyData) {
method createEntropyImage (line 305) | createEntropyImage(entropyData) {
method createShannonEntropyVisualization (line 350) | createShannonEntropyVisualization(entropy) {
method run (line 387) | run(input, args) {
method present (line 411) | present(entropyData, args) {
FILE: src/core/operations/EscapeString.mjs
class EscapeString (line 14) | class EscapeString extends Operation {
method constructor (line 19) | constructor() {
method run (line 69) | run(input, args) {
FILE: src/core/operations/EscapeUnicodeCharacters.mjs
class EscapeUnicodeCharacters (line 12) | class EscapeUnicodeCharacters extends Operation {
method constructor (line 17) | constructor() {
method run (line 54) | run(input, args) {
FILE: src/core/operations/ExpandAlphabetRange.mjs
class ExpandAlphabetRange (line 13) | class ExpandAlphabetRange extends Operation {
method constructor (line 18) | constructor() {
method run (line 40) | run(input, args) {
FILE: src/core/operations/ExtractAudioMetadata.mjs
class ExtractAudioMetadata (line 20) | class ExtractAudioMetadata extends Operation {
method constructor (line 22) | constructor() {
method run (line 45) | run(input, args) {
method present (line 84) | present(data) {
FILE: src/core/operations/ExtractDates.mjs
class ExtractDates (line 13) | class ExtractDates extends Operation {
method constructor (line 18) | constructor() {
method run (line 40) | run(input, args) {
FILE: src/core/operations/ExtractDomains.mjs
class ExtractDomains (line 14) | class ExtractDomains extends Operation {
method constructor (line 19) | constructor() {
method run (line 56) | run(input, args) {
FILE: src/core/operations/ExtractEXIF.mjs
class ExtractEXIF (line 14) | class ExtractEXIF extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/ExtractEmailAddresses.mjs
class ExtractEmailAddresses (line 14) | class ExtractEmailAddresses extends Operation {
method constructor (line 19) | constructor() {
method run (line 51) | run(input, args) {
FILE: src/core/operations/ExtractFilePaths.mjs
class ExtractFilePaths (line 14) | class ExtractFilePaths extends Operation {
method constructor (line 19) | constructor() {
method run (line 61) | run(input, args) {
FILE: src/core/operations/ExtractFiles.mjs
class ExtractFiles (line 16) | class ExtractFiles extends Operation {
method constructor (line 21) | constructor() {
method run (line 71) | run(input, args) {
method present (line 117) | async present(files) {
FILE: src/core/operations/ExtractHashes.mjs
class ExtractHashes (line 13) | class ExtractHashes extends Operation {
method constructor (line 18) | constructor() {
method run (line 51) | run(input, args) {
FILE: src/core/operations/ExtractID3.mjs
class ExtractID3 (line 15) | class ExtractID3 extends Operation {
method constructor (line 20) | constructor() {
method run (line 38) | run(input, args) {
method present (line 146) | present(data) {
constant FRAME_DESCRIPTIONS (line 165) | const FRAME_DESCRIPTIONS = {
FILE: src/core/operations/ExtractIPAddresses.mjs
class ExtractIPAddresses (line 14) | class ExtractIPAddresses extends Operation {
method constructor (line 19) | constructor() {
method run (line 66) | run(input, args) {
FILE: src/core/operations/ExtractLSB.mjs
class ExtractLSB (line 17) | class ExtractLSB extends Operation {
method constructor (line 21) | constructor() {
method run (line 71) | async run(input, args) {
constant COLOUR_OPTIONS (line 118) | const COLOUR_OPTIONS = ["R", "G", "B", "A"];
FILE: src/core/operations/ExtractMACAddresses.mjs
class ExtractMACAddresses (line 14) | class ExtractMACAddresses extends Operation {
method constructor (line 19) | constructor() {
method run (line 51) | run(input, args) {
FILE: src/core/operations/ExtractRGBA.mjs
class ExtractRGBA (line 17) | class ExtractRGBA extends Operation {
method constructor (line 21) | constructor() {
method run (line 50) | async run(input, args) {
FILE: src/core/operations/ExtractURLs.mjs
class ExtractURLs (line 14) | class ExtractURLs extends Operation {
method constructor (line 19) | constructor() {
method run (line 51) | run(input, args) {
FILE: src/core/operations/FangURL.mjs
class FangURL (line 12) | class FangURL extends Operation {
method constructor (line 17) | constructor() {
method run (line 50) | run(input, args) {
function fangURL (line 70) | function fangURL(url, dots, http, slashes) {
FILE: src/core/operations/FernetDecrypt.mjs
class FernetDecrypt (line 14) | class FernetDecrypt extends Operation {
method constructor (line 18) | constructor() {
method run (line 47) | run(input, args) {
FILE: src/core/operations/FernetEncrypt.mjs
class FernetEncrypt (line 14) | class FernetEncrypt extends Operation {
method constructor (line 18) | constructor() {
method run (line 40) | run(input, args) {
FILE: src/core/operations/FileTree.mjs
class FileTree (line 14) | class FileTree extends Operation {
method constructor (line 19) | constructor() {
method run (line 47) | run(input, args) {
FILE: src/core/operations/Filter.mjs
class Filter (line 16) | class Filter extends Operation {
method constructor (line 21) | constructor() {
method run (line 53) | run(input, args) {
FILE: src/core/operations/FindReplace.mjs
class FindReplace (line 14) | class FindReplace extends Operation {
method constructor (line 19) | constructor() {
method run (line 68) | run(input, args) {
FILE: src/core/operations/FlaskSessionDecode.mjs
class FlaskSessionDecode (line 13) | class FlaskSessionDecode extends Operation {
method constructor (line 17) | constructor() {
method run (line 39) | run(input, args) {
FILE: src/core/operations/FlaskSessionSign.mjs
class FlaskSessionSign (line 15) | class FlaskSessionSign extends Operation {
method constructor (line 19) | constructor() {
method run (line 53) | run(input, args) {
FILE: src/core/operations/FlaskSessionVerify.mjs
class FlaskSessionVerify (line 15) | class FlaskSessionVerify extends Operation {
method constructor (line 19) | constructor() {
method run (line 58) | run(input, args) {
FILE: src/core/operations/Fletcher16Checksum.mjs
class Fletcher16Checksum (line 13) | class Fletcher16Checksum extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/Fletcher32Checksum.mjs
class Fletcher32Checksum (line 13) | class Fletcher32Checksum extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/Fletcher64Checksum.mjs
class Fletcher64Checksum (line 13) | class Fletcher64Checksum extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/Fletcher8Checksum.mjs
class Fletcher8Checksum (line 13) | class Fletcher8Checksum extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/FlipImage.mjs
class FlipImage (line 17) | class FlipImage extends Operation {
method constructor (line 21) | constructor() {
method run (line 45) | async run(input, args) {
method present (line 92) | present(data) {
FILE: src/core/operations/Fork.mjs
class Fork (line 14) | class Fork extends Operation {
method constructor (line 19) | constructor() {
method run (line 54) | async run(state) {
FILE: src/core/operations/FormatMACAddresses.mjs
class FormatMACAddresses (line 12) | class FormatMACAddresses extends Operation {
method constructor (line 17) | constructor() {
method run (line 65) | run(input, args) {
FILE: src/core/operations/FrequencyDistribution.mjs
class FrequencyDistribution (line 14) | class FrequencyDistribution extends Operation {
method constructor (line 19) | constructor() {
method run (line 48) | run(input, args) {
method present (line 83) | present(freq, args) {
FILE: src/core/operations/FromBCD.mjs
class FromBCD (line 16) | class FromBCD extends Operation {
method constructor (line 21) | constructor() {
method run (line 66) | run(input, args) {
FILE: src/core/operations/FromBase.mjs
class FromBase (line 14) | class FromBase extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/FromBase32.mjs
class FromBase32 (line 15) | class FromBase32 extends Operation {
method constructor (line 20) | constructor() {
method run (line 60) | run(input, args) {
FILE: src/core/operations/FromBase45.mjs
class FromBase45 (line 16) | class FromBase45 extends Operation {
method constructor (line 21) | constructor() {
method run (line 52) | run(input, args) {
FILE: src/core/operations/FromBase58.mjs
class FromBase58 (line 15) | class FromBase58 extends Operation {
method constructor (line 20) | constructor() {
method run (line 60) | run(input, args) {
FILE: src/core/operations/FromBase62.mjs
class FromBase62 (line 15) | class FromBase62 extends Operation {
method constructor (line 20) | constructor() {
method run (line 43) | run(input, args) {
FILE: src/core/operations/FromBase64.mjs
class FromBase64 (line 13) | class FromBase64 extends Operation {
method constructor (line 18) | constructor() {
method run (line 138) | run(input, args) {
method highlight (line 153) | highlight(pos, args) {
method highlightReverse (line 168) | highlightReverse(pos, args) {
FILE: src/core/operations/FromBase85.mjs
class FromBase85 (line 15) | class FromBase85 extends Operation {
method constructor (line 20) | constructor() {
method run (line 83) | run(input, args) {
FILE: src/core/operations/FromBase92.mjs
class FromBase92 (line 13) | class FromBase92 extends Operation {
method constructor (line 17) | constructor() {
method run (line 33) | run(input, args) {
FILE: src/core/operations/FromBech32.mjs
class FromBech32 (line 14) | class FromBech32 extends Operation {
method constructor (line 19) | constructor() {
method run (line 85) | run(input, args) {
FILE: src/core/operations/FromBinary.mjs
class FromBinary (line 15) | class FromBinary extends Operation {
method constructor (line 20) | constructor() {
method run (line 86) | run(input, args) {
method highlight (line 100) | highlight(pos, args) {
method highlightReverse (line 116) | highlightReverse(pos, args) {
FILE: src/core/operations/FromBraille.mjs
class FromBraille (line 13) | class FromBraille extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
method highlight (line 51) | highlight(pos, args) {
method highlightReverse (line 64) | highlightReverse(pos, args) {
FILE: src/core/operations/FromCaseInsensitiveRegex.mjs
class FromCaseInsensitiveRegex (line 12) | class FromCaseInsensitiveRegex extends Operation {
method constructor (line 17) | constructor() {
method run (line 34) | run(input, args) {
FILE: src/core/operations/FromCharcode.mjs
class FromCharcode (line 16) | class FromCharcode extends Operation {
method constructor (line 21) | constructor() {
method run (line 51) | run(input, args) {
FILE: src/core/operations/FromDecimal.mjs
class FromDecimal (line 14) | class FromDecimal extends Operation {
method constructor (line 19) | constructor() {
method run (line 78) | run(input, args) {
FILE: src/core/operations/FromFloat.mjs
class FromFloat (line 15) | class FromFloat extends Operation {
method constructor (line 20) | constructor() {
method run (line 59) | run(input, args) {
FILE: src/core/operations/FromHTMLEntity.mjs
class FromHTMLEntity (line 13) | class FromHTMLEntity extends Operation {
method constructor (line 18) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/FromHex.mjs
class FromHex (line 14) | class FromHex extends Operation {
method constructor (line 19) | constructor() {
method run (line 94) | run(input, args) {
method highlight (line 108) | highlight(pos, args) {
method highlightReverse (line 136) | highlightReverse(pos, args) {
FILE: src/core/operations/FromHexContent.mjs
class FromHexContent (line 14) | class FromHexContent extends Operation {
method constructor (line 19) | constructor() {
method run (line 43) | run(input, args) {
FILE: src/core/operations/FromHexdump.mjs
class FromHexdump (line 15) | class FromHexdump extends Operation {
method constructor (line 20) | constructor() {
method run (line 44) | run(input, args) {
method highlight (line 74) | highlight(pos, args) {
method highlightReverse (line 112) | highlightReverse(pos, args) {
FILE: src/core/operations/FromMessagePack.mjs
class FromMessagePack (line 14) | class FromMessagePack extends Operation {
method constructor (line 19) | constructor() {
method run (line 36) | run(input, args) {
FILE: src/core/operations/FromModhex.mjs
class FromModhex (line 13) | class FromModhex extends Operation {
method constructor (line 18) | constructor() {
method run (line 78) | run(input, args) {
FILE: src/core/operations/FromMorseCode.mjs
class FromMorseCode (line 14) | class FromMorseCode extends Operation {
method constructor (line 19) | constructor() {
method run (line 54) | run(input, args) {
method reverseTable (line 85) | reverseTable() {
constant MORSE_TABLE (line 96) | const MORSE_TABLE = {
FILE: src/core/operations/FromOctal.mjs
class FromOctal (line 14) | class FromOctal extends Operation {
method constructor (line 19) | constructor() {
method run (line 74) | run(input, args) {
FILE: src/core/operations/FromPunycode.mjs
class FromPunycode (line 13) | class FromPunycode extends Operation {
method constructor (line 18) | constructor() {
method run (line 41) | run(input, args) {
FILE: src/core/operations/FromQuotedPrintable.mjs
class FromQuotedPrintable (line 16) | class FromQuotedPrintable extends Operation {
method constructor (line 21) | constructor() {
method run (line 45) | run(input, args) {
FILE: src/core/operations/FromUNIXTimestamp.mjs
class FromUNIXTimestamp (line 15) | class FromUNIXTimestamp extends Operation {
method constructor (line 20) | constructor() {
method run (line 67) | run(input, args) {
FILE: src/core/operations/FuzzyMatch.mjs
class FuzzyMatch (line 14) | class FuzzyMatch extends Operation {
method constructor (line 19) | constructor() {
method run (line 83) | run(input, args) {
FILE: src/core/operations/GOSTDecrypt.mjs
class GOSTDecrypt (line 16) | class GOSTDecrypt extends Operation {
method constructor (line 21) | constructor() {
method run (line 99) | async run(input, args) {
FILE: src/core/operations/GOSTEncrypt.mjs
class GOSTEncrypt (line 16) | class GOSTEncrypt extends Operation {
method constructor (line 21) | constructor() {
method run (line 99) | async run(input, args) {
FILE: src/core/operations/GOSTHash.mjs
class GOSTHash (line 15) | class GOSTHash extends Operation {
method constructor (line 20) | constructor() {
method run (line 64) | run(input, args) {
FILE: src/core/operations/GOSTKeyUnwrap.mjs
class GOSTKeyUnwrap (line 16) | class GOSTKeyUnwrap extends Operation {
method constructor (line 21) | constructor() {
method run (line 89) | async run(input, args) {
FILE: src/core/operations/GOSTKeyWrap.mjs
class GOSTKeyWrap (line 16) | class GOSTKeyWrap extends Operation {
method constructor (line 21) | constructor() {
method run (line 89) | async run(input, args) {
FILE: src/core/operations/GOSTSign.mjs
class GOSTSign (line 16) | class GOSTSign extends Operation {
method constructor (line 21) | constructor() {
method run (line 92) | async run(input, args) {
FILE: src/core/operations/GOSTVerify.mjs
class GOSTVerify (line 16) | class GOSTVerify extends Operation {
method constructor (line 21) | constructor() {
method run (line 85) | async run(input, args) {
FILE: src/core/operations/GenerateAllChecksums.mjs
class GenerateAllChecksums (line 18) | class GenerateAllChecksums extends Operation {
method constructor (line 23) | constructor() {
method run (line 238) | run(input, args) {
FILE: src/core/operations/GenerateAllHashes.mjs
class GenerateAllHashes (line 36) | class GenerateAllHashes extends Operation {
method constructor (line 41) | constructor() {
method run (line 116) | run(input, args) {
method executeAlgo (line 140) | executeAlgo(algo, inputType, params=[]) {
method formatDigest (line 167) | formatDigest(digest, length, includeNames, name) {
FILE: src/core/operations/GenerateDeBruijnSequence.mjs
class GenerateDeBruijnSequence (line 13) | class GenerateDeBruijnSequence extends Operation {
method constructor (line 18) | constructor() {
method run (line 46) | run(input, args) {
FILE: src/core/operations/GenerateECDSAKeyPair.mjs
class GenerateECDSAKeyPair (line 14) | class GenerateECDSAKeyPair extends Operation {
method constructor (line 19) | constructor() {
method run (line 55) | async run(input, args) {
FILE: src/core/operations/GenerateHOTP.mjs
class GenerateHOTP (line 13) | class GenerateHOTP extends Operation {
method constructor (line 17) | constructor() {
method run (line 48) | run(input, args) {
FILE: src/core/operations/GenerateImage.mjs
class GenerateImage (line 18) | class GenerateImage extends Operation {
method constructor (line 22) | constructor() {
method run (line 57) | async run(input, args) {
method present (line 178) | present(data) {
FILE: src/core/operations/GenerateLoremIpsum.mjs
class GenerateLoremIpsum (line 14) | class GenerateLoremIpsum extends Operation {
method constructor (line 19) | constructor() {
method run (line 48) | run(input, args) {
FILE: src/core/operations/GeneratePGPKeyPair.mjs
class GeneratePGPKeyPair (line 20) | class GeneratePGPKeyPair extends Operation {
method constructor (line 25) | constructor() {
method run (line 63) | async run(input, args) {
FILE: src/core/operations/GenerateQRCode.mjs
class GenerateQRCode (line 17) | class GenerateQRCode extends Operation {
method constructor (line 22) | constructor() {
method run (line 64) | run(input, args) {
method present (line 76) | present(data, args) {
FILE: src/core/operations/GenerateRSAKeyPair.mjs
class GenerateRSAKeyPair (line 15) | class GenerateRSAKeyPair extends Operation {
method constructor (line 20) | constructor() {
method run (line 56) | async run(input, args) {
FILE: src/core/operations/GenerateTOTP.mjs
class GenerateTOTP (line 13) | class GenerateTOTP extends Operation {
method constructor (line 17) | constructor() {
method run (line 52) | run(input, args) {
FILE: src/core/operations/GenerateUUID.mjs
class GenerateUUID (line 13) | class GenerateUUID extends Operation {
method constructor (line 18) | constructor() {
method run (line 62) | run(input, args) {
FILE: src/core/operations/GenericCodeBeautify.mjs
class GenericCodeBeautify (line 12) | class GenericCodeBeautify extends Operation {
method constructor (line 17) | constructor() {
method run (line 33) | run(input, args) {
FILE: src/core/operations/GetAllCasings.mjs
class GetAllCasings (line 12) | class GetAllCasings extends Operation {
method constructor (line 17) | constructor() {
method run (line 34) | run(input, args) {
FILE: src/core/operations/GetTime.mjs
class GetTime (line 15) | class GetTime extends Operation {
method constructor (line 20) | constructor() {
method run (line 43) | run(input, args) {
FILE: src/core/operations/GroupIPAddresses.mjs
class GroupIPAddresses (line 16) | class GroupIPAddresses extends Operation {
method constructor (line 21) | constructor() {
method run (line 54) | run(input, args) {
FILE: src/core/operations/Gunzip.mjs
class Gunzip (line 15) | class Gunzip extends Operation {
method constructor (line 20) | constructor() {
method run (line 44) | run(input, args) {
FILE: src/core/operations/Gzip.mjs
class Gzip (line 16) | class Gzip extends Operation {
method constructor (line 21) | constructor() {
method run (line 59) | run(input, args) {
FILE: src/core/operations/HAS160.mjs
class HAS160 (line 13) | class HAS160 extends Operation {
method constructor (line 18) | constructor() {
method run (line 43) | run(input, args) {
FILE: src/core/operations/HASSHClientFingerprint.mjs
class HASSHClientFingerprint (line 26) | class HASSHClientFingerprint extends Operation {
method constructor (line 31) | constructor() {
method run (line 59) | run(input, args) {
FILE: src/core/operations/HASSHServerFingerprint.mjs
class HASSHServerFingerprint (line 26) | class HASSHServerFingerprint extends Operation {
method constructor (line 31) | constructor() {
method run (line 59) | run(input, args) {
FILE: src/core/operations/HMAC.mjs
class HMAC (line 14) | class HMAC extends Operation {
method constructor (line 19) | constructor() {
method run (line 69) | run(input, args) {
FILE: src/core/operations/HTMLToText.mjs
class HTMLToText (line 13) | class HTMLToText extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/HTTPRequest.mjs
class HTTPRequest (line 14) | class HTTPRequest extends Operation {
method constructor (line 19) | constructor() {
method run (line 78) | run(input, args) {
FILE: src/core/operations/HammingDistance.mjs
class HammingDistance (line 15) | class HammingDistance extends Operation {
method constructor (line 20) | constructor() {
method run (line 53) | run(input, args) {
FILE: src/core/operations/HaversineDistance.mjs
class HaversineDistance (line 13) | class HaversineDistance extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/Head.mjs
class Head (line 14) | class Head extends Operation {
method constructor (line 19) | constructor() {
method run (line 46) | run(input, args) {
FILE: src/core/operations/HeatmapChart.mjs
class HeatmapChart (line 22) | class HeatmapChart extends Operation {
method constructor (line 27) | constructor() {
method run (line 97) | run(input, args) {
method getHeatmapPacking (line 231) | getHeatmapPacking(values, vBins, hBins) {
FILE: src/core/operations/HexDensityChart.mjs
class HexDensityChart (line 24) | class HexDensityChart extends Operation {
method constructor (line 29) | constructor() {
method run (line 104) | run(input, args) {
method getEmptyHexagons (line 271) | getEmptyHexagons(centres, radius) {
FILE: src/core/operations/HexToObjectIdentifier.mjs
class HexToObjectIdentifier (line 13) | class HexToObjectIdentifier extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/HexToPEM.mjs
class HexToPEM (line 13) | class HexToPEM extends Operation {
method constructor (line 18) | constructor() {
method run (line 41) | run(input, args) {
FILE: src/core/operations/IPv6TransitionAddresses.mjs
class IPv6TransitionAddresses (line 12) | class IPv6TransitionAddresses extends Operation {
method constructor (line 17) | constructor() {
method run (line 45) | run(input, args) {
FILE: src/core/operations/ImageBrightnessContrast.mjs
class ImageBrightnessContrast (line 17) | class ImageBrightnessContrast extends Operation {
method constructor (line 21) | constructor() {
method run (line 54) | async run(input, args) {
method present (line 97) | present(data) {
FILE: src/core/operations/ImageFilter.mjs
class ImageFilter (line 17) | class ImageFilter extends Operation {
method constructor (line 21) | constructor() {
method run (line 45) | async run(input, args) {
method present (line 89) | present(data) {
FILE: src/core/operations/ImageHueSaturationLightness.mjs
class ImageHueSaturationLightness (line 17) | class ImageHueSaturationLightness extends Operation {
method constructor (line 21) | constructor() {
method run (line 62) | async run(input, args) {
method present (line 126) | present(data) {
FILE: src/core/operations/ImageOpacity.mjs
class ImageOpacity (line 17) | class ImageOpacity extends Operation {
method constructor (line 21) | constructor() {
method run (line 47) | async run(input, args) {
method present (line 81) | present(data) {
FILE: src/core/operations/IndexOfCoincidence.mjs
class IndexOfCoincidence (line 13) | class IndexOfCoincidence extends Operation {
method constructor (line 18) | constructor() {
method run (line 36) | run(input, args) {
method present (line 69) | present(ic) {
FILE: src/core/operations/InvertImage.mjs
class InvertImage (line 17) | class InvertImage extends Operation {
method constructor (line 21) | constructor() {
method run (line 39) | async run(input, args) {
method present (line 72) | present(data) {
FILE: src/core/operations/JA3Fingerprint.mjs
class JA3Fingerprint (line 23) | class JA3Fingerprint extends Operation {
method constructor (line 28) | constructor() {
method run (line 56) | run(input, args) {
function parseJA3Segment (line 176) | function parseJA3Segment(stream, size=2) {
constant GREASE_CIPHERSUITES (line 186) | const GREASE_CIPHERSUITES = [
FILE: src/core/operations/JA3SFingerprint.mjs
class JA3SFingerprint (line 23) | class JA3SFingerprint extends Operation {
method constructor (line 28) | constructor() {
method run (line 56) | run(input, args) {
FILE: src/core/operations/JA4Fingerprint.mjs
class JA4Fingerprint (line 14) | class JA4Fingerprint extends Operation {
method constructor (line 19) | constructor() {
method run (line 47) | run(input, args) {
FILE: src/core/operations/JA4ServerFingerprint.mjs
class JA4ServerFingerprint (line 14) | class JA4ServerFingerprint extends Operation {
method constructor (line 19) | constructor() {
method run (line 47) | run(input, args) {
FILE: src/core/operations/JPathExpression.mjs
class JPathExpression (line 14) | class JPathExpression extends Operation {
method constructor (line 19) | constructor() {
method run (line 47) | run(input, args) {
FILE: src/core/operations/JSONBeautify.mjs
class JSONBeautify (line 16) | class JSONBeautify extends Operation {
method constructor (line 21) | constructor() {
method run (line 54) | run(input, args) {
method present (line 78) | present(data, args) {
function sortKeys (line 111) | function sortKeys(o) {
function isCollapsable (line 128) | function isCollapsable(arg) {
function isUrl (line 136) | function isUrl(string) {
function json2html (line 156) | function json2html(json, options) {
FILE: src/core/operations/JSONMinify.mjs
class JSONMinify (line 13) | class JSONMinify extends Operation {
method constructor (line 18) | constructor() {
method run (line 34) | run(input, args) {
FILE: src/core/operations/JSONToCSV.mjs
class JSONToCSV (line 15) | class JSONToCSV extends Operation {
method constructor (line 20) | constructor() {
method toCSV (line 49) | toCSV(force=false) {
method run (line 83) | run(input, args) {
method escapeCellContents (line 116) | escapeCellContents(data, force=false) {
FILE: src/core/operations/JSONtoYAML.mjs
class JSONtoYAML (line 14) | class JSONtoYAML extends Operation {
method constructor (line 19) | constructor() {
method run (line 36) | run(input, args) {
FILE: src/core/operations/JWKToPem.mjs
class PEMToJWK (line 14) | class PEMToJWK extends Operation {
method constructor (line 19) | constructor() {
method run (line 43) | run(input, args) {
FILE: src/core/operations/JWTDecode.mjs
class JWTDecode (line 14) | class JWTDecode extends Operation {
method constructor (line 19) | constructor() {
method run (line 43) | run(input, args) {
FILE: src/core/operations/JWTSign.mjs
class JWTSign (line 15) | class JWTSign extends Operation {
method constructor (line 20) | constructor() {
method run (line 53) | run(input, args) {
FILE: src/core/operations/JWTVerify.mjs
class JWTVerify (line 15) | class JWTVerify extends Operation {
method constructor (line 20) | constructor() {
method run (line 43) | run(input, args) {
FILE: src/core/operations/JavaScriptBeautify.mjs
class JavaScriptBeautify (line 15) | class JavaScriptBeautify extends Operation {
method constructor (line 20) | constructor() {
method run (line 57) | run(input, args) {
FILE: src/core/operations/JavaScriptMinify.mjs
class JavaScriptMinify (line 14) | class JavaScriptMinify extends Operation {
method constructor (line 19) | constructor() {
method run (line 35) | async run(input, args) {
FILE: src/core/operations/JavaScriptParser.mjs
class JavaScriptParser (line 13) | class JavaScriptParser extends Operation {
method constructor (line 18) | constructor() {
method run (line 61) | run(input, args) {
FILE: src/core/operations/Jq.mjs
class Jq (line 14) | class Jq extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/Jsonata.mjs
class JsonataQuery (line 14) | class JsonataQuery extends Operation {
method constructor (line 18) | constructor() {
method run (line 42) | async run(input, args) {
FILE: src/core/operations/Jump.mjs
class Jump (line 13) | class Jump extends Operation {
method constructor (line 18) | constructor() {
method run (line 49) | run(state) {
FILE: src/core/operations/Keccak.mjs
class Keccak (line 14) | class Keccak extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/LMHash.mjs
class LMHash (line 13) | class LMHash extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/LS47Decrypt.mjs
class LS47Decrypt (line 13) | class LS47Decrypt extends Operation {
method constructor (line 18) | constructor() {
method run (line 46) | run(input, args) {
FILE: src/core/operations/LS47Encrypt.mjs
class LS47Encrypt (line 13) | class LS47Encrypt extends Operation {
method constructor (line 18) | constructor() {
method run (line 51) | run(input, args) {
FILE: src/core/operations/LZ4Compress.mjs
class LZ4Compress (line 13) | class LZ4Compress extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/LZ4Decompress.mjs
class LZ4Decompress (line 13) | class LZ4Decompress extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/LZMACompress.mjs
class LZMACompress (line 16) | class LZMACompress extends Operation {
method constructor (line 21) | constructor() {
method run (line 47) | async run(input, args) {
FILE: src/core/operations/LZMADecompress.mjs
class LZMADecompress (line 15) | class LZMADecompress extends Operation {
method constructor (line 20) | constructor() {
method run (line 36) | async run(input, args) {
FILE: src/core/operations/LZNT1Decompress.mjs
class LZNT1Decompress (line 13) | class LZNT1Decompress extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/LZStringCompress.mjs
class LZStringCompress (line 15) | class LZStringCompress extends Operation {
method constructor (line 20) | constructor() {
method run (line 44) | run(input, args) {
FILE: src/core/operations/LZStringDecompress.mjs
class LZStringDecompress (line 15) | class LZStringDecompress extends Operation {
method constructor (line 20) | constructor() {
method run (line 44) | run(input, args) {
FILE: src/core/operations/Label.mjs
class Label (line 12) | class Label extends Operation {
method constructor (line 17) | constructor() {
method run (line 42) | run(state) {
FILE: src/core/operations/LevenshteinDistance.mjs
class LevenshteinDistance (line 13) | class LevenshteinDistance extends Operation {
method constructor (line 18) | constructor() {
method run (line 56) | run(input, args) {
FILE: src/core/operations/Lorenz.mjs
class Lorenz (line 18) | class Lorenz extends Operation {
method constructor (line 23) | constructor() {
method run (line 228) | run(input, args) {
method reverseTable (line 471) | reverseTable() {
method readLugs (line 488) | readLugs(lugstr) {
method convertToITA2 (line 502) | convertToITA2(input, intype, mode) {
method convertFromITA2 (line 558) | convertFromITA2(input, outtype, mode) {
constant ITA2_TABLE (line 604) | const ITA2_TABLE = {
constant INIT_PATTERNS (line 679) | const INIT_PATTERNS = {
FILE: src/core/operations/LuhnChecksum.mjs
class LuhnChecksum (line 14) | class LuhnChecksum extends Operation {
method constructor (line 19) | constructor() {
method checksum (line 43) | checksum(inputStr, radix = 10) {
method run (line 71) | run(input, args) {
FILE: src/core/operations/MD2.mjs
class MD2 (line 13) | class MD2 extends Operation {
method constructor (line 18) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/MD4.mjs
class MD4 (line 13) | class MD4 extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/MD5.mjs
class MD5 (line 13) | class MD5 extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/MD6.mjs
class MD6 (line 14) | class MD6 extends Operation {
method constructor (line 19) | constructor() {
method run (line 52) | run(input, args) {
FILE: src/core/operations/MIMEDecoding.mjs
class MIMEDecoding (line 17) | class MIMEDecoding extends Operation {
method constructor (line 22) | constructor() {
method run (line 39) | run(input, args) {
method decodeHeaders (line 53) | decodeHeaders(headerString) {
method convertFromCharset (line 122) | convertFromCharset(charset, encodedText) {
method parseQEncodedWord (line 145) | parseQEncodedWord(encodedWord) {
FILE: src/core/operations/Magic.mjs
class Magic (line 15) | class Magic extends Operation {
method constructor (line 20) | constructor() {
method run (line 62) | async run(state) {
method present (line 88) | present(options) {
FILE: src/core/operations/Mean.mjs
class Mean (line 16) | class Mean extends Operation {
method constructor (line 21) | constructor() {
method run (line 44) | run(input, args) {
FILE: src/core/operations/Median.mjs
class Median (line 16) | class Median extends Operation {
method constructor (line 21) | constructor() {
method run (line 44) | run(input, args) {
FILE: src/core/operations/Merge.mjs
class Merge (line 12) | class Merge extends Operation {
method constructor (line 17) | constructor() {
method run (line 42) | run(state) {
FILE: src/core/operations/MicrosoftScriptDecoder.mjs
class MicrosoftScriptDecoder (line 12) | class MicrosoftScriptDecoder extends Operation {
method constructor (line 17) | constructor() {
method run (line 41) | run(input, args) {
method _decode (line 60) | static _decode(data) {
constant D_DECODE (line 89) | const D_DECODE = [
constant D_COMBINATION (line 220) | const D_COMBINATION = [
FILE: src/core/operations/MultipleBombe.mjs
function rotorsFormat (line 24) | function rotorsFormat(rotors, s, n) {
function choose (line 38) | function choose(n, k) {
class MultipleBombe (line 49) | class MultipleBombe extends Operation {
method constructor (line 53) | constructor() {
method updateStatus (line 146) | updateStatus(nLoops, nStops, progress, start) {
method validateRotor (line 162) | validateRotor(rstr) {
method run (line 183) | run(input, args) {
method present (line 292) | present(output) {
FILE: src/core/operations/Multiply.mjs
class Multiply (line 17) | class Multiply extends Operation {
method constructor (line 22) | constructor() {
method run (line 45) | run(input, args) {
FILE: src/core/operations/MurmurHash3.mjs
class MurmurHash3 (line 16) | class MurmurHash3 extends Operation {
method constructor (line 21) | constructor() {
method mmh3 (line 53) | mmh3(input, seed) {
method unsignedToSigned (line 117) | unsignedToSigned(value) {
method run (line 126) | run(input, args) {
FILE: src/core/operations/NOT.mjs
class NOT (line 13) | class NOT extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
method highlight (line 49) | highlight(pos, args) {
method highlightReverse (line 62) | highlightReverse(pos, args) {
FILE: src/core/operations/NTHash.mjs
class NTHash (line 13) | class NTHash extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/NormaliseImage.mjs
class NormaliseImage (line 16) | class NormaliseImage extends Operation {
method constructor (line 20) | constructor() {
method run (line 38) | async run(input, args) {
method present (line 70) | present(data) {
FILE: src/core/operations/NormaliseUnicode.mjs
class NormaliseUnicode (line 15) | class NormaliseUnicode extends Operation {
method constructor (line 20) | constructor() {
method run (line 43) | run(input, args) {
FILE: src/core/operations/Numberwang.mjs
class Numberwang (line 12) | class Numberwang extends Operation {
method constructor (line 17) | constructor() {
method run (line 34) | run(input, args) {
FILE: src/core/operations/OR.mjs
class OR (line 14) | class OR extends Operation {
method constructor (line 19) | constructor() {
method run (line 43) | run(input, args) {
method highlight (line 59) | highlight(pos, args) {
method highlightReverse (line 72) | highlightReverse(pos, args) {
FILE: src/core/operations/ObjectIdentifierToHex.mjs
class ObjectIdentifierToHex (line 13) | class ObjectIdentifierToHex extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/OffsetChecker.mjs
class OffsetChecker (line 14) | class OffsetChecker extends Operation {
method constructor (line 19) | constructor() {
method run (line 41) | run(input, args) {
FILE: src/core/operations/OpticalCharacterRecognition.mjs
constant OEM_MODES (line 17) | const OEM_MODES = ["Tesseract only", "LSTM only", "Tesseract/LSTM Combin...
class OpticalCharacterRecognition (line 22) | class OpticalCharacterRecognition extends Operation {
method constructor (line 27) | constructor() {
method run (line 56) | async run(input, args) {
FILE: src/core/operations/PEMToHex.mjs
class PEMToHex (line 16) | class PEMToHex extends Operation {
method constructor (line 21) | constructor() {
method run (line 44) | run(input, args) {
FILE: src/core/operations/PEMToJWK.mjs
class PEMToJWK (line 14) | class PEMToJWK extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/PGPDecrypt.mjs
class PGPDecrypt (line 17) | class PGPDecrypt extends Operation {
method constructor (line 22) | constructor() {
method run (line 61) | async run(input, args) {
FILE: src/core/operations/PGPDecryptAndVerify.mjs
class PGPDecryptAndVerify (line 17) | class PGPDecryptAndVerify extends Operation {
method constructor (line 22) | constructor() {
method run (line 66) | async run(input, args) {
FILE: src/core/operations/PGPEncrypt.mjs
class PGPEncrypt (line 17) | class PGPEncrypt extends Operation {
method constructor (line 22) | constructor() {
method run (line 55) | async run(input, args) {
FILE: src/core/operations/PGPEncryptAndSign.mjs
class PGPEncryptAndSign (line 17) | class PGPEncryptAndSign extends Operation {
method constructor (line 22) | constructor() {
method run (line 68) | async run(input, args) {
FILE: src/core/operations/PGPVerify.mjs
class PGPVerify (line 18) | class PGPVerify extends Operation {
method constructor (line 23) | constructor() {
method run (line 56) | async run(input, args) {
FILE: src/core/operations/PHPDeserialize.mjs
class PHPDeserialize (line 13) | class PHPDeserialize extends Operation {
method constructor (line 18) | constructor() {
method run (line 41) | run(input, args) {
FILE: src/core/operations/PHPSerialize.mjs
class PHPSerialize (line 13) | class PHPSerialize extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/PLISTViewer.mjs
class PlistViewer (line 12) | class PlistViewer extends Operation {
method constructor (line 17) | constructor() {
method run (line 34) | run(input, args) {
FILE: src/core/operations/PadLines.mjs
class PadLines (line 12) | class PadLines extends Operation {
method constructor (line 17) | constructor() {
method run (line 49) | run(input, args) {
FILE: src/core/operations/ParseASN1HexString.mjs
class ParseASN1HexString (line 13) | class ParseASN1HexString extends Operation {
method constructor (line 18) | constructor() {
method run (line 46) | run(input, args) {
FILE: src/core/operations/ParseCSR.mjs
class ParseCSR (line 15) | class ParseCSR extends Operation {
method constructor (line 20) | constructor() {
method run (line 50) | run(input, args) {
function formatSignature (line 71) | function formatSignature(sigAlg, sigHex) {
function formatSubjectPublicKey (line 96) | function formatSubjectPublicKey(publicKeyPEM) {
function formatRequestedExtensions (line 130) | function formatRequestedExtensions(csrParam) {
function formatExtensionCriticalTag (line 176) | function formatExtensionCriticalTag(extension) {
function formatHexOntoMultiLine (line 185) | function formatHexOntoMultiLine(hex) {
function absBigIntToHex (line 198) | function absBigIntToHex(int) {
function ensureHexIsPositiveInTwosComplement (line 209) | function ensureHexIsPositiveInTwosComplement(hex) {
function formatMultiLine (line 227) | function formatMultiLine(longStr) {
function describeBasicConstraints (line 243) | function describeBasicConstraints(extension) {
function describeKeyUsage (line 258) | function describeKeyUsage(extension) {
function describeExtendedKeyUsage (line 294) | function describeExtendedKeyUsage(extension) {
function describeSubjectAlternativeName (line 333) | function describeSubjectAlternativeName(extension) {
function indent (line 376) | function indent(n, parts) {
function chop (line 386) | function chop(s) {
FILE: src/core/operations/ParseColourCode.mjs
class ParseColourCode (line 12) | class ParseColourCode extends Operation {
method constructor (line 17) | constructor() {
method run (line 34) | run(input, args) {
method _hslToRgb (line 134) | static _hslToRgb(h, s, l) {
method _rgbToHsl (line 172) | static _rgbToHsl(r, g, b) {
FILE: src/core/operations/ParseDateTime.mjs
class ParseDateTime (line 14) | class ParseDateTime extends Operation {
method constructor (line 19) | constructor() {
method run (line 53) | run(input, args) {
FILE: src/core/operations/ParseIPRange.mjs
class ParseIPRange (line 15) | class ParseIPRange extends Operation {
method constructor (line 20) | constructor() {
method run (line 53) | run(input, args) {
FILE: src/core/operations/ParseIPv4Header.mjs
class ParseIPv4Header (line 17) | class ParseIPv4Header extends Operation {
method constructor (line 22) | constructor() {
method run (line 45) | run(input, args) {
FILE: src/core/operations/ParseIPv6Address.mjs
class ParseIPv6Address (line 16) | class ParseIPv6Address extends Operation {
method constructor (line 21) | constructor() {
method run (line 38) | run(input, args) {
FILE: src/core/operations/ParseObjectIDTimestamp.mjs
class ParseObjectIDTimestamp (line 14) | class ParseObjectIDTimestamp extends Operation {
method constructor (line 19) | constructor() {
method run (line 36) | run(input, args) {
FILE: src/core/operations/ParseQRCode.mjs
class ParseQRCode (line 15) | class ParseQRCode extends Operation {
method constructor (line 19) | constructor() {
method run (line 52) | async run(input, args) {
FILE: src/core/operations/ParseSSHHostKey.mjs
class ParseSSHHostKey (line 16) | class ParseSSHHostKey extends Operation {
method constructor (line 21) | constructor() {
method run (line 55) | run(input, args) {
method convertKeyToBinary (line 91) | convertKeyToBinary(inputKey, inputFormat) {
method detectKeyFormat (line 118) | detectKeyFormat(inputKey) {
method parseKey (line 137) | parseKey(key) {
FILE: src/core/operations/ParseTCP.mjs
class ParseTCP (line 19) | class ParseTCP extends Operation {
method constructor (line 24) | constructor() {
method run (line 48) | run(input, args) {
method present (line 148) | present(data) {
constant TCP_OPTION_KIND_LOOKUP (line 156) | const TCP_OPTION_KIND_LOOKUP = {
function tcpAlternateChecksumParser (line 201) | function tcpAlternateChecksumParser(data) {
function tcpTimestampParser (line 216) | function tcpTimestampParser(data) {
function windowScaleParser (line 235) | function windowScaleParser(data) {
FILE: src/core/operations/ParseTLSRecord.mjs
class ParseTLSRecord (line 15) | class ParseTLSRecord extends Operation {
method constructor (line 20) | constructor() {
method run (line 44) | run(input, args) {
method _readRecord (line 65) | _readRecord(input) {
method present (line 103) | present(data) {
class RecordHeader (line 123) | class RecordHeader {
method constructor (line 132) | constructor(type, version, length, truncated) {
class HandshakeParser (line 146) | class HandshakeParser {
method constructor (line 151) | constructor() {
method parse (line 172) | parse(input, recordHeader) {
class ClientHelloParser (line 245) | class ClientHelloParser {
method constructor (line 250) | constructor() {
method parse (line 260) | parse(input) {
method _readClientVersion (line 284) | _readClientVersion(input) {
method _readRandom (line 294) | _readRandom(input) {
method _readSessionID (line 304) | _readSessionID(input) {
method _readCipherSuites (line 314) | _readCipherSuites(input) {
method _readCompressionMethods (line 345) | _readCompressionMethods(input) {
method _readExtensions (line 376) | _readExtensions(input) {
class ServerHelloParser (line 398) | class ServerHelloParser {
method constructor (line 403) | constructor() {
method parse (line 413) | parse(input) {
method _readServerVersion (line 437) | _readServerVersion(input) {
method _readRandom (line 447) | _readRandom(input) {
method _readSessionID (line 457) | _readSessionID(input) {
method _readCipherSuite (line 467) | _readCipherSuite(input) {
method _readCompressionMethod (line 477) | _readCompressionMethod(input) {
method _readExtensions (line 487) | _readExtensions(input) {
class ExtensionsParser (line 509) | class ExtensionsParser {
method parse (line 517) | parse(input) {
method _readExtension (line 536) | _readExtension(input) {
class NewSessionTicketParser (line 566) | class NewSessionTicketParser {
method parse (line 574) | parse(input) {
method _readTicketLifetimeHint (line 587) | _readTicketLifetimeHint(input) {
method _readTicket (line 602) | _readTicket(input) {
class CertificateParser (line 610) | class CertificateParser {
method parse (line 618) | parse(input) {
method _readCertificateList (line 632) | _readCertificateList(input) {
method _readCertificate (line 668) | _readCertificate(input) {
class CertificateRequestParser (line 676) | class CertificateRequestParser {
method parse (line 684) | parse(input) {
method _readCertificateTypes (line 704) | _readCertificateTypes(input) {
method _readSupportedSignatureAlgorithms (line 735) | _readSupportedSignatureAlgorithms(input) {
method _readCertificateAuthorities (line 766) | _readCertificateAuthorities(input) {
method _readCertificateAuthority (line 797) | _readCertificateAuthority(input) {
class CertificateVerifyParser (line 805) | class CertificateVerifyParser {
method parse (line 813) | parse(input) {
method _readAlgorithmHash (line 827) | _readAlgorithmHash(input) {
method _readAlgorithmSignature (line 837) | _readAlgorithmSignature(input) {
method _readSignature (line 847) | _readSignature(input) {
function readSizePrefixedBytesAsHex (line 860) | function readSizePrefixedBytesAsHex(input, sizePrefixLength) {
function readBytesAsHex (line 877) | function readBytesAsHex(input, n) {
FILE: src/core/operations/ParseTLV.mjs
class ParseTLV (line 15) | class ParseTLV extends Operation {
method constructor (line 20) | constructor() {
method run (line 53) | run(input, args) {
FILE: src/core/operations/ParseUDP.mjs
class ParseUDP (line 17) | class ParseUDP extends Operation {
method constructor (line 22) | constructor() {
method run (line 46) | run(input, args) {
method present (line 82) | present(data) {
FILE: src/core/operations/ParseUNIXFilePermissions.mjs
class ParseUNIXFilePermissions (line 13) | class ParseUNIXFilePermissions extends Operation {
method constructor (line 18) | constructor() {
method run (line 42) | run(input, args) {
function permsToStr (line 230) | function permsToStr(perms) {
function permsToOctal (line 289) | function permsToOctal(perms) {
function ftFromPerms (line 321) | function ftFromPerms(perms) {
FILE: src/core/operations/ParseURI.mjs
class ParseURI (line 13) | class ParseURI extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/ParseUserAgent.mjs
class ParseUserAgent (line 13) | class ParseUserAgent extends Operation {
method constructor (line 18) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/ParseX509CRL.mjs
class ParseX509CRL (line 18) | class ParseX509CRL extends Operation {
method constructor (line 23) | constructor() {
method run (line 53) | run(input, args) {
function generalizedDateTimeToUTC (line 107) | function generalizedDateTimeToUTC(datetime) {
function formatCRLExtensions (line 141) | function formatCRLExtensions(extensions, indent) {
function formatGeneralNames (line 209) | function formatGeneralNames(names, indent) {
function colonDelimitedHexFormatString (line 248) | function colonDelimitedHexFormatString(hexString) {
function formatRevokedCertificates (line 262) | function formatRevokedCertificates(revokedCertificates, indent) {
function formatCRLEntryExtensions (line 289) | function formatCRLEntryExtensions(exts) {
function formatCRLSignature (line 345) | function formatCRLSignature(sigHex, indent) {
function formatMultiLine (line 358) | function formatMultiLine(longStr) {
function indentString (line 374) | function indentString(input, spaces) {
function chop (line 384) | function chop(s) {
FILE: src/core/operations/ParseX509Certificate.mjs
class ParseX509Certificate (line 18) | class ParseX509Certificate extends Operation {
method constructor (line 23) | constructor() {
method run (line 53) | run(input, args) {
function formatDate (line 218) | function formatDate (dateStr) {
FILE: src/core/operations/PlayMedia.mjs
class PlayMedia (line 17) | class PlayMedia extends Operation {
method constructor (line 22) | constructor() {
method run (line 46) | run(input, args) {
method present (line 83) | async present(data) {
FILE: src/core/operations/PowerSet.mjs
class PowerSet (line 12) | class PowerSet extends Operation {
method constructor (line 17) | constructor() {
method run (line 42) | run(input, args) {
method runPowerSet (line 60) | runPowerSet(a) {
FILE: src/core/operations/ProtobufDecode.mjs
class ProtobufDecode (line 14) | class ProtobufDecode extends Operation {
method constructor (line 19) | constructor() {
method run (line 54) | run(input, args) {
FILE: src/core/operations/ProtobufEncode.mjs
class ProtobufEncode (line 14) | class ProtobufEncode extends Operation {
method constructor (line 19) | constructor() {
method run (line 44) | run(input, args) {
FILE: src/core/operations/PseudoRandomIntegerGenerator.mjs
class PseudoRandomIntegerGenerator (line 16) | class PseudoRandomIntegerGenerator extends Operation {
method constructor (line 26) | constructor() {
method run (line 78) | run(input, args) {
method _generateRandomValue (line 130) | _generateRandomValue(rejectionThreshold) {
method _resetRandomBuffer (line 147) | _resetRandomBuffer() {
FILE: src/core/operations/PseudoRandomNumberGenerator.mjs
class PseudoRandomNumberGenerator (line 16) | class PseudoRandomNumberGenerator extends Operation {
method constructor (line 21) | constructor() {
method run (line 49) | run(input, args) {
FILE: src/core/operations/PubKeyFromCert.mjs
class PubKeyFromCert (line 14) | class PubKeyFromCert extends Operation {
method constructor (line 19) | constructor() {
method run (line 37) | run(input, args) {
FILE: src/core/operations/PubKeyFromPrivKey.mjs
class PubKeyFromPrivKey (line 14) | class PubKeyFromPrivKey extends Operation {
method constructor (line 19) | constructor() {
method run (line 37) | run(input, args) {
FILE: src/core/operations/RAKE.mjs
class RAKE (line 12) | class RAKE extends Operation {
method constructor (line 17) | constructor() {
method run (line 55) | run(input, args) {
FILE: src/core/operations/RC2Decrypt.mjs
class RC2Decrypt (line 14) | class RC2Decrypt extends Operation {
method constructor (line 19) | constructor() {
method run (line 59) | run(input, args) {
FILE: src/core/operations/RC2Encrypt.mjs
class RC2Encrypt (line 15) | class RC2Encrypt extends Operation {
method constructor (line 20) | constructor() {
method run (line 60) | run(input, args) {
FILE: src/core/operations/RC4.mjs
class RC4 (line 14) | class RC4 extends Operation {
method constructor (line 19) | constructor() {
method run (line 53) | run(input, args) {
method highlight (line 70) | highlight(pos, args) {
method highlightReverse (line 83) | highlightReverse(pos, args) {
FILE: src/core/operations/RC4Drop.mjs
class RC4Drop (line 14) | class RC4Drop extends Operation {
method constructor (line 19) | constructor() {
method run (line 58) | run(input, args) {
method highlight (line 76) | highlight(pos, args) {
method highlightReverse (line 89) | highlightReverse(pos, args) {
FILE: src/core/operations/RC6Decrypt.mjs
class RC6Decrypt (line 16) | class RC6Decrypt extends Operation {
method constructor (line 21) | constructor() {
method run (line 86) | run(input, args) {
FILE: src/core/operations/RC6Encrypt.mjs
class RC6Encrypt (line 16) | class RC6Encrypt extends Operation {
method constructor (line 21) | constructor() {
method run (line 86) | run(input, args) {
FILE: src/core/operations/RIPEMD.mjs
class RIPEMD (line 13) | class RIPEMD extends Operation {
method constructor (line 18) | constructor() {
method run (line 41) | run(input, args) {
FILE: src/core/operations/ROT13.mjs
class ROT13 (line 13) | class ROT13 extends Operation {
method constructor (line 18) | constructor() {
method run (line 56) | run(input, args) {
method highlight (line 96) | highlight(pos, args) {
method highlightReverse (line 109) | highlightReverse(pos, args) {
FILE: src/core/operations/ROT13BruteForce.mjs
class ROT13BruteForce (line 12) | class ROT13BruteForce extends Operation {
method constructor (line 17) | constructor() {
method run (line 70) | run(input, args) {
FILE: src/core/operations/ROT47.mjs
class ROT47 (line 13) | class ROT47 extends Operation {
method constructor (line 18) | constructor() {
method run (line 41) | run(input, args) {
method highlight (line 71) | highlight(pos, args) {
method highlightReverse (line 84) | highlightReverse(pos, args) {
FILE: src/core/operations/ROT47BruteForce.mjs
class ROT47BruteForce (line 12) | class ROT47BruteForce extends Operation {
method constructor (line 17) | constructor() {
method run (line 55) | run(input, args) {
FILE: src/core/operations/ROT8000.mjs
class ROT8000 (line 13) | class ROT8000 extends Operation {
method constructor (line 18) | constructor() {
method run (line 34) | run(input, args) {
method highlight (line 105) | highlight(pos, args) {
method highlightReverse (line 118) | highlightReverse(pos, args) {
FILE: src/core/operations/RSADecrypt.mjs
class RSADecrypt (line 15) | class RSADecrypt extends Operation {
method constructor (line 20) | constructor() {
method run (line 70) | run(input, args) {
FILE: src/core/operations/RSAEncrypt.mjs
class RSAEncrypt (line 15) | class RSAEncrypt extends Operation {
method constructor (line 20) | constructor() {
method run (line 65) | run(input, args) {
FILE: src/core/operations/RSASign.mjs
class RSASign (line 16) | class RSASign extends Operation {
method constructor (line 21) | constructor() {
method run (line 54) | run(input, args) {
FILE: src/core/operations/RSAVerify.mjs
class RSAVerify (line 16) | class RSAVerify extends Operation {
method constructor (line 21) | constructor() {
method run (line 59) | run(input, args) {
FILE: src/core/operations/Rabbit.mjs
class Rabbit (line 15) | class Rabbit extends Operation {
method constructor (line 20) | constructor() {
method run (line 65) | run(input, args) {
FILE: src/core/operations/RailFenceCipherDecode.mjs
class RailFenceCipherDecode (line 13) | class RailFenceCipherDecode extends Operation {
method constructor (line 18) | constructor() {
method run (line 46) | run(input, args) {
FILE: src/core/operations/RailFenceCipherEncode.mjs
class RailFenceCipherEncode (line 13) | class RailFenceCipherEncode extends Operation {
method constructor (line 18) | constructor() {
method run (line 46) | run(input, args) {
FILE: src/core/operations/RandomizeColourPalette.mjs
class RandomizeColourPalette (line 18) | class RandomizeColourPalette extends Operation {
method constructor (line 22) | constructor() {
method run (line 47) | async run(input, args) {
method present (line 75) | present(data) {
FILE: src/core/operations/RawDeflate.mjs
constant RAW_COMPRESSION_TYPE_LOOKUP (line 13) | const RAW_COMPRESSION_TYPE_LOOKUP = {
class RawDeflate (line 22) | class RawDeflate extends Operation {
method constructor (line 27) | constructor() {
method run (line 50) | run(input, args) {
FILE: src/core/operations/RawInflate.mjs
constant RAW_BUFFER_TYPE_LOOKUP (line 13) | const RAW_BUFFER_TYPE_LOOKUP = {
class RawInflate (line 21) | class RawInflate extends Operation {
method constructor (line 26) | constructor() {
method run (line 75) | run(input, args) {
FILE: src/core/operations/Register.mjs
class Register (line 15) | class Register extends Operation {
method constructor (line 20) | constructor() {
method run (line 61) | async run(state) {
FILE: src/core/operations/RegularExpression.mjs
class RegularExpression (line 15) | class RegularExpression extends Operation {
method constructor (line 20) | constructor() {
method run (line 141) | run(input, args) {
function regexList (line 192) | function regexList(input, regex, displayTotal, matches, captureGroups) {
function regexHighlight (line 232) | function regexHighlight(input, regex, displayTotal) {
FILE: src/core/operations/RemoveDiacritics.mjs
class RemoveDiacritics (line 12) | class RemoveDiacritics extends Operation {
method constructor (line 17) | constructor() {
method run (line 34) | run(input, args) {
FILE: src/core/operations/RemoveEXIF.mjs
class RemoveEXIF (line 14) | class RemoveEXIF extends Operation {
method constructor (line 19) | constructor() {
method run (line 40) | run(input, args) {
FILE: src/core/operations/RemoveLineNumbers.mjs
class RemoveLineNumbers (line 12) | class RemoveLineNumbers extends Operation {
method constructor (line 17) | constructor() {
method run (line 33) | run(input, args) {
FILE: src/core/operations/RemoveNullBytes.mjs
class RemoveNullBytes (line 12) | class RemoveNullBytes extends Operation {
method constructor (line 17) | constructor() {
method run (line 33) | run(input, args) {
FILE: src/core/operations/RemoveWhitespace.mjs
class RemoveWhitespace (line 12) | class RemoveWhitespace extends Operation {
method constructor (line 17) | constructor() {
method run (line 64) | run(input, args) {
FILE: src/core/operations/RenderImage.mjs
class RenderImage (line 17) | class RenderImage extends Operation {
method constructor (line 22) | constructor() {
method run (line 56) | run(input, args) {
method present (line 91) | async present(data) {
FILE: src/core/operations/RenderMarkdown.mjs
class RenderMarkdown (line 14) | class RenderMarkdown extends Operation {
method constructor (line 19) | constructor() {
method run (line 47) | run(input, args) {
FILE: src/core/operations/ResizeImage.mjs
class ResizeImage (line 17) | class ResizeImage extends Operation {
method constructor (line 21) | constructor() {
method run (line 75) | async run(input, args) {
method present (line 139) | present(data) {
FILE: src/core/operations/Return.mjs
class Return (line 12) | class Return extends Operation {
method constructor (line 17) | constructor() {
method run (line 36) | run(state) {
FILE: src/core/operations/Reverse.mjs
class Reverse (line 13) | class Reverse extends Operation {
method constructor (line 18) | constructor() {
method run (line 41) | run(input, args) {
FILE: src/core/operations/RisonDecode.mjs
class RisonDecode (line 14) | class RisonDecode extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/RisonEncode.mjs
class RisonEncode (line 14) | class RisonEncode extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/RotateImage.mjs
class RotateImage (line 17) | class RotateImage extends Operation {
method constructor (line 21) | constructor() {
method run (line 46) | async run(input, args) {
method present (line 81) | present(data) {
FILE: src/core/operations/RotateLeft.mjs
class RotateLeft (line 14) | class RotateLeft extends Operation {
method constructor (line 19) | constructor() {
method run (line 47) | run(input, args) {
method highlight (line 64) | highlight(pos, args) {
method highlightReverse (line 77) | highlightReverse(pos, args) {
FILE: src/core/operations/RotateRight.mjs
class RotateRight (line 14) | class RotateRight extends Operation {
method constructor (line 19) | constructor() {
method run (line 47) | run(input, args) {
method highlight (line 64) | highlight(pos, args) {
method highlightReverse (line 77) | highlightReverse(pos, args) {
FILE: src/core/operations/SHA0.mjs
class SHA0 (line 13) | class SHA0 extends Operation {
method constructor (line 18) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/SHA1.mjs
class SHA1 (line 13) | class SHA1 extends Operation {
method constructor (line 18) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/SHA2.mjs
class SHA2 (line 13) | class SHA2 extends Operation {
method constructor (line 18) | constructor() {
method run (line 84) | run(input, args) {
FILE: src/core/operations/SHA3.mjs
class SHA3 (line 14) | class SHA3 extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/SIGABA.mjs
class Sigaba (line 16) | class Sigaba extends Operation {
method constructor (line 21) | constructor() {
method run (line 259) | run(input, args) {
FILE: src/core/operations/SM2Decrypt.mjs
class SM2Decrypt (line 15) | class SM2Decrypt extends Operation {
method constructor (line 20) | constructor() {
method run (line 55) | run(input, args) {
FILE: src/core/operations/SM2Encrypt.mjs
class SM2Encrypt (line 15) | class SM2Encrypt extends Operation {
method constructor (line 20) | constructor() {
method run (line 61) | run(input, args) {
FILE: src/core/operations/SM3.mjs
class SM3 (line 15) | class SM3 extends Operation {
method constructor (line 20) | constructor() {
method run (line 49) | run(input, args) {
FILE: src/core/operations/SM4Decrypt.mjs
class SM4Decrypt (line 16) | class SM4Decrypt extends Operation {
method constructor (line 21) | constructor() {
method run (line 66) | run(input, args) {
FILE: src/core/operations/SM4Encrypt.mjs
class SM4Encrypt (line 16) | class SM4Encrypt extends Operation {
method constructor (line 21) | constructor() {
method run (line 66) | run(input, args) {
FILE: src/core/operations/SQLBeautify.mjs
class SQLBeautify (line 12) | class SQLBeautify extends Operation {
method constructor (line 17) | constructor() {
method run (line 39) | run(input, args) {
FILE: src/core/operations/SQLMinify.mjs
class SQLMinify (line 13) | class SQLMinify extends Operation {
method constructor (line 18) | constructor() {
method run (line 34) | run(input, args) {
FILE: src/core/operations/SSDEEP.mjs
class SSDEEP (line 13) | class SSDEEP extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/SUB.mjs
class SUB (line 14) | class SUB extends Operation {
method constructor (line 19) | constructor() {
method run (line 43) | run(input, args) {
method highlight (line 58) | highlight(pos, args) {
method highlightReverse (line 71) | highlightReverse(pos, args) {
FILE: src/core/operations/Salsa20.mjs
class Salsa20 (line 16) | class Salsa20 extends Operation {
method constructor (line 21) | constructor() {
method run (line 72) | run(input, args) {
method highlight (line 127) | highlight(pos, args) {
method highlightReverse (line 144) | highlightReverse(pos, args) {
FILE: src/core/operations/ScanForEmbeddedFiles.mjs
class ScanForEmbeddedFiles (line 15) | class ScanForEmbeddedFiles extends Operation {
method constructor (line 20) | constructor() {
method run (line 43) | run(input, args) {
FILE: src/core/operations/ScatterChart.mjs
class ScatterChart (line 21) | class ScatterChart extends Operation {
method constructor (line 26) | constructor() {
method run (line 86) | run(input, args) {
FILE: src/core/operations/Scrypt.mjs
class Scrypt (line 16) | class Scrypt extends Operation {
method constructor (line 21) | constructor() {
method run (line 65) | run(input, args) {
FILE: src/core/operations/SeriesChart.mjs
class SeriesChart (line 21) | class SeriesChart extends Operation {
method constructor (line 26) | constructor() {
method run (line 70) | run(input, args) {
FILE: src/core/operations/SetDifference.mjs
class SetDifference (line 13) | class SetDifference extends Operation {
method constructor (line 18) | constructor() {
method validateSampleNumbers (line 47) | validateSampleNumbers(sets) {
method run (line 61) | run(input, args) {
method runSetDifference (line 77) | runSetDifference(a, b) {
FILE: src/core/operations/SetIntersection.mjs
class SetIntersection (line 13) | class SetIntersection extends Operation {
method constructor (line 18) | constructor() {
method validateSampleNumbers (line 47) | validateSampleNumbers(sets) {
method run (line 61) | run(input, args) {
method runIntersect (line 77) | runIntersect(a, b) {
FILE: src/core/operations/SetUnion.mjs
class SetUnion (line 13) | class SetUnion extends Operation {
method constructor (line 18) | constructor() {
method validateSampleNumbers (line 47) | validateSampleNumbers(sets) {
method run (line 61) | run(input, args) {
method runUnion (line 77) | runUnion(a, b) {
FILE: src/core/operations/Shake.mjs
class Shake (line 14) | class Shake extends Operation {
method constructor (line 19) | constructor() {
method run (line 47) | run(input, args) {
FILE: src/core/operations/SharpenImage.mjs
class SharpenImage (line 17) | class SharpenImage extends Operation {
method constructor (line 21) | constructor() {
method run (line 60) | async run(input, args) {
method present (line 188) | present(data) {
FILE: src/core/operations/ShowBase64Offsets.mjs
class ShowBase64Offsets (line 15) | class ShowBase64Offsets extends Operation {
method constructor (line 20) | constructor() {
method run (line 53) | run(input, args) {
FILE: src/core/operations/ShowOnMap.mjs
class ShowOnMap (line 15) | class ShowOnMap extends Operation {
method constructor (line 20) | constructor() {
method run (line 62) | run(input, args) {
method present (line 84) | async present(data, args) {
FILE: src/core/operations/Shuffle.mjs
class Shuffle (line 14) | class Shuffle extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/Sleep.mjs
class Sleep (line 12) | class Sleep extends Operation {
method constructor (line 17) | constructor() {
method run (line 39) | async run(input, args) {
FILE: src/core/operations/Snefru.mjs
class Snefru (line 13) | class Snefru extends Operation {
method constructor (line 18) | constructor() {
method run (line 49) | run(input, args) {
FILE: src/core/operations/Sort.mjs
class Sort (line 15) | class Sort extends Operation {
method constructor (line 20) | constructor() {
method run (line 52) | run(input, args) {
FILE: src/core/operations/Split.mjs
class Split (line 13) | class Split extends Operation {
method constructor (line 18) | constructor() {
method run (line 45) | run(input, args) {
FILE: src/core/operations/SplitColourChannels.mjs
class SplitColourChannels (line 16) | class SplitColourChannels extends Operation {
method constructor (line 20) | constructor() {
method run (line 39) | async run(input, args) {
method present (line 123) | async present(files) {
FILE: src/core/operations/StandardDeviation.mjs
class StandardDeviation (line 17) | class StandardDeviation extends Operation {
method constructor (line 22) | constructor() {
method run (line 45) | run(input, args) {
FILE: src/core/operations/Streebog.mjs
class Streebog (line 15) | class Streebog extends Operation {
method constructor (line 20) | constructor() {
method run (line 43) | run(input, args) {
FILE: src/core/operations/Strings.mjs
class Strings (line 15) | class Strings extends Operation {
method constructor (line 20) | constructor() {
method run (line 71) | run(input, args) {
FILE: src/core/operations/StripHTMLTags.mjs
class StripHTMLTags (line 13) | class StripHTMLTags extends Operation {
method constructor (line 18) | constructor() {
method run (line 52) | run(input, args) {
FILE: src/core/operations/StripHTTPHeaders.mjs
class StripHTTPHeaders (line 12) | class StripHTTPHeaders extends Operation {
method constructor (line 17) | constructor() {
method run (line 41) | run(input, args) {
FILE: src/core/operations/StripIPv4Header.mjs
class StripIPv4Header (line 14) | class StripIPv4Header extends Operation {
method constructor (line 19) | constructor() {
method run (line 36) | run(input, args) {
FILE: src/core/operations/StripTCPHeader.mjs
class StripTCPHeader (line 14) | class StripTCPHeader extends Operation {
method constructor (line 19) | constructor() {
method run (line 36) | run(input, args) {
FILE: src/core/operations/StripUDPHeader.mjs
class StripUDPHeader (line 14) | class StripUDPHeader extends Operation {
method constructor (line 19) | constructor() {
method run (line 36) | run(input, args) {
FILE: src/core/operations/Subsection.mjs
class Subsection (line 14) | class Subsection extends Operation {
method constructor (line 19) | constructor() {
method run (line 60) | async run(state) {
FILE: src/core/operations/Substitute.mjs
class Substitute (line 13) | class Substitute extends Operation {
method constructor (line 18) | constructor() {
method cipherSingleChar (line 55) | cipherSingleChar(char, dict, ignoreCase) {
method run (line 86) | run(input, args) {
FILE: src/core/operations/Subtract.mjs
class Subtract (line 17) | class Subtract extends Operation {
method constructor (line 22) | constructor() {
method run (line 45) | run(input, args) {
FILE: src/core/operations/Sum.mjs
class Sum (line 17) | class Sum extends Operation {
method constructor (line 22) | constructor() {
method run (line 45) | run(input, args) {
FILE: src/core/operations/SwapCase.mjs
class SwapCase (line 12) | class SwapCase extends Operation {
method constructor (line 17) | constructor() {
method run (line 34) | run(input, args) {
method highlight (line 57) | highlight(pos, args) {
method highlightReverse (line 70) | highlightReverse(pos, args) {
FILE: src/core/operations/SwapEndianness.mjs
class SwapEndianness (line 15) | class SwapEndianness extends Operation {
method constructor (line 20) | constructor() {
method run (line 53) | run(input, args) {
method highlight (line 119) | highlight(pos, args) {
method highlightReverse (line 132) | highlightReverse(pos, args) {
FILE: src/core/operations/SymmetricDifference.mjs
class SymmetricDifference (line 14) | class SymmetricDifference extends Operation {
method constructor (line 19) | constructor() {
method validateSampleNumbers (line 48) | validateSampleNumbers(sets) {
method run (line 62) | run(input, args) {
method runSetDifference (line 78) | runSetDifference(a, b) {
method runSymmetricDifference (line 91) | runSymmetricDifference(a, b) {
FILE: src/core/operations/SyntaxHighlighter.mjs
class SyntaxHighlighter (line 13) | class SyntaxHighlighter extends Operation {
method constructor (line 18) | constructor() {
method run (line 41) | run(input, args) {
method highlight (line 60) | highlight(pos, args) {
method highlightReverse (line 73) | highlightReverse(pos, args) {
FILE: src/core/operations/TCPIPChecksum.mjs
class TCPIPChecksum (line 13) | class TCPIPChecksum extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/Tail.mjs
class Tail (line 14) | class Tail extends Operation {
method constructor (line 19) | constructor() {
method run (line 47) | run(input, args) {
FILE: src/core/operations/TakeBytes.mjs
class TakeBytes (line 12) | class TakeBytes extends Operation {
method constructor (line 17) | constructor() {
method run (line 51) | run(input, args) {
FILE: src/core/operations/TakeNthBytes.mjs
class TakeNthBytes (line 13) | class TakeNthBytes extends Operation {
method constructor (line 18) | constructor() {
method run (line 51) | run(input, args) {
FILE: src/core/operations/Tar.mjs
class Tar (line 13) | class Tar extends Operation {
method constructor (line 18) | constructor() {
method run (line 41) | run(input, args) {
FILE: src/core/operations/Template.mjs
class Template (line 14) | class Template extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/TextEncodingBruteForce.mjs
class TextEncodingBruteForce (line 16) | class TextEncodingBruteForce extends Operation {
method constructor (line 21) | constructor() {
method run (line 52) | run(input, args) {
method present (line 78) | present(encodings) {
FILE: src/core/operations/TextIntegerConverter.mjs
function textToBigInt (line 15) | function textToBigInt(text) {
function bigIntToText (line 34) | function bigIntToText(value) {
class TextIntegerConverter (line 53) | class TextIntegerConverter extends Operation {
method constructor (line 57) | constructor() {
method run (line 90) | run(input, args) {
FILE: src/core/operations/ToBCD.mjs
class ToBCD (line 16) | class ToBCD extends Operation {
method constructor (line 21) | constructor() {
method run (line 59) | run(input, args) {
FILE: src/core/operations/ToBase.mjs
class ToBase (line 13) | class ToBase extends Operation {
method constructor (line 18) | constructor() {
method run (line 41) | run(input, args) {
FILE: src/core/operations/ToBase32.mjs
class ToBase32 (line 14) | class ToBase32 extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/ToBase45.mjs
class ToBase45 (line 14) | class ToBase45 extends Operation {
method constructor (line 19) | constructor() {
method run (line 45) | run(input, args) {
FILE: src/core/operations/ToBase58.mjs
class ToBase58 (line 15) | class ToBase58 extends Operation {
method constructor (line 20) | constructor() {
method run (line 43) | run(input, args) {
FILE: src/core/operations/ToBase62.mjs
class ToBase62 (line 15) | class ToBase62 extends Operation {
method constructor (line 20) | constructor() {
method run (line 43) | run(input, args) {
FILE: src/core/operations/ToBase64.mjs
class ToBase64 (line 13) | class ToBase64 extends Operation {
method constructor (line 18) | constructor() {
method run (line 41) | run(input, args) {
method highlight (line 55) | highlight(pos, args) {
method highlightReverse (line 70) | highlightReverse(pos, args) {
FILE: src/core/operations/ToBase85.mjs
class ToBase85 (line 15) | class ToBase85 extends Operation {
method constructor (line 20) | constructor() {
method run (line 48) | run(input, args) {
FILE: src/core/operations/ToBase92.mjs
class ToBase92 (line 13) | class ToBase92 extends Operation {
method constructor (line 17) | constructor() {
method run (line 33) | run(input, args) {
FILE: src/core/operations/ToBech32.mjs
class ToBech32 (line 14) | class ToBech32 extends Operation {
method constructor (line 19) | constructor() {
method run (line 63) | run(input, args) {
FILE: src/core/operations/ToBinary.mjs
class ToBinary (line 15) | class ToBinary extends Operation {
method constructor (line 20) | constructor() {
method run (line 48) | run(input, args) {
method highlight (line 63) | highlight(pos, args) {
method highlightReverse (line 79) | highlightReverse(pos, args) {
FILE: src/core/operations/ToBraille.mjs
class ToBraille (line 13) | class ToBraille extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
method highlight (line 51) | highlight(pos, args) {
method highlightReverse (line 64) | highlightReverse(pos, args) {
FILE: src/core/operations/ToCamelCase.mjs
class ToCamelCase (line 14) | class ToCamelCase extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/ToCaseInsensitiveRegex.mjs
class ToCaseInsensitiveRegex (line 14) | class ToCaseInsensitiveRegex extends Operation {
method constructor (line 19) | constructor() {
method run (line 36) | run(input, args) {
FILE: src/core/operations/ToCharcode.mjs
class ToCharcode (line 16) | class ToCharcode extends Operation {
method constructor (line 21) | constructor() {
method run (line 51) | run(input, args) {
FILE: src/core/operations/ToDecimal.mjs
class ToDecimal (line 15) | class ToDecimal extends Operation {
method constructor (line 20) | constructor() {
method run (line 47) | run(input, args) {
FILE: src/core/operations/ToFloat.mjs
class ToFloat (line 16) | class ToFloat extends Operation {
method constructor (line 21) | constructor() {
method run (line 60) | run(input, args) {
FILE: src/core/operations/ToHTMLEntity.mjs
class ToHTMLEntity (line 13) | class ToHTMLEntity extends Operation {
method constructor (line 18) | constructor() {
method run (line 46) | run(input, args) {
FILE: src/core/operations/ToHex.mjs
class ToHex (line 14) | class ToHex extends Operation {
method constructor (line 19) | constructor() {
method run (line 47) | run(input, args) {
method highlight (line 69) | highlight(pos, args) {
method highlightReverse (line 107) | highlightReverse(pos, args) {
FILE: src/core/operations/ToHexContent.mjs
class ToHexContent (line 14) | class ToHexContent extends Operation {
method constructor (line 19) | constructor() {
method run (line 47) | run(input, args) {
FILE: src/core/operations/ToHexdump.mjs
class ToHexdump (line 14) | class ToHexdump extends Operation {
method constructor (line 19) | constructor() {
method run (line 58) | run(input, args) {
method highlight (line 103) | highlight(pos, args) {
method highlightReverse (line 164) | highlightReverse(pos, args) {
FILE: src/core/operations/ToKebabCase.mjs
class ToKebabCase (line 14) | class ToKebabCase extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/ToLowerCase.mjs
class ToLowerCase (line 12) | class ToLowerCase extends Operation {
method constructor (line 17) | constructor() {
method run (line 33) | run(input, args) {
method highlight (line 46) | highlight(pos, args) {
method highlightReverse (line 59) | highlightReverse(pos, args) {
FILE: src/core/operations/ToMessagePack.mjs
class ToMessagePack (line 15) | class ToMessagePack extends Operation {
method constructor (line 20) | constructor() {
method run (line 37) | run(input, args) {
FILE: src/core/operations/ToModhex.mjs
class ToModhex (line 14) | class ToModhex extends Operation {
method constructor (line 19) | constructor() {
method run (line 47) | run(input, args) {
FILE: src/core/operations/ToMorseCode.mjs
class ToMorseCode (line 14) | class ToMorseCode extends Operation {
method constructor (line 19) | constructor() {
method run (line 52) | run(input, args) {
constant MORSE_TABLE (line 97) | const MORSE_TABLE = {
FILE: src/core/operations/ToOctal.mjs
class ToOctal (line 15) | class ToOctal extends Operation {
method constructor (line 20) | constructor() {
method run (line 43) | run(input, args) {
FILE: src/core/operations/ToPunycode.mjs
class ToPunycode (line 13) | class ToPunycode extends Operation {
method constructor (line 18) | constructor() {
method run (line 41) | run(input, args) {
FILE: src/core/operations/ToQuotedPrintable.mjs
class ToQuotedPrintable (line 16) | class ToQuotedPrintable extends Operation {
method constructor (line 21) | constructor() {
method run (line 38) | run(input, args) {
method mimeEncode (line 80) | mimeEncode(buffer) {
method _checkRanges (line 113) | _checkRanges(nr, ranges) {
method _addSoftLinebreaks (line 135) | _addSoftLinebreaks(str, encoding) {
method _addBase64SoftLinebreaks (line 155) | _addBase64SoftLinebreaks(base64EncodedStr, lineLengthMax) {
method _addQPSoftLinebreaks (line 168) | _addQPSoftLinebreaks(mimeEncodedStr, lineLengthMax) {
FILE: src/core/operations/ToSnakeCase.mjs
class ToSnakeCase (line 14) | class ToSnakeCase extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/ToTable.mjs
class ToTable (line 13) | class ToTable extends Operation {
method constructor (line 18) | constructor() {
method run (line 56) | run(input, args) {
FILE: src/core/operations/ToUNIXTimestamp.mjs
class ToUNIXTimestamp (line 15) | class ToUNIXTimestamp extends Operation {
method constructor (line 20) | constructor() {
method run (line 55) | run(input, args) {
FILE: src/core/operations/ToUpperCase.mjs
class ToUpperCase (line 13) | class ToUpperCase extends Operation {
method constructor (line 18) | constructor() {
method run (line 40) | run(input, args) {
method highlight (line 76) | highlight(pos, args) {
method highlightReverse (line 89) | highlightReverse(pos, args) {
FILE: src/core/operations/TranslateDateTimeFormat.mjs
class TranslateDateTimeFormat (line 15) | class TranslateDateTimeFormat extends Operation {
method constructor (line 20) | constructor() {
method run (line 67) | run(input, args) {
method present (line 85) | present(data) {
FILE: src/core/operations/TripleDESDecrypt.mjs
class TripleDESDecrypt (line 15) | class TripleDESDecrypt extends Operation {
method constructor (line 20) | constructor() {
method run (line 65) | run(input, args) {
FILE: src/core/operations/TripleDESEncrypt.mjs
class TripleDESEncrypt (line 15) | class TripleDESEncrypt extends Operation {
method constructor (line 20) | constructor() {
method run (line 65) | run(input, args) {
FILE: src/core/operations/Typex.mjs
class Typex (line 20) | class Typex extends Operation {
method constructor (line 24) | constructor() {
method parseRotorStr (line 171) | parseRotorStr(rotor, i) {
method run (line 186) | run(input, args) {
method highlight (line 230) | highlight(pos, args) {
method highlightReverse (line 245) | highlightReverse(pos, args) {
FILE: src/core/operations/UNIXTimestampToWindowsFiletime.mjs
class UNIXTimestampToWindowsFiletime (line 14) | class UNIXTimestampToWindowsFiletime extends Operation {
method constructor (line 19) | constructor() {
method run (line 47) | run(input, args) {
FILE: src/core/operations/URLDecode.mjs
class URLDecode (line 12) | class URLDecode extends Operation {
method constructor (line 17) | constructor() {
method run (line 47) | run(input, args) {
FILE: src/core/operations/URLEncode.mjs
class URLEncode (line 12) | class URLEncode extends Operation {
method constructor (line 17) | constructor() {
method run (line 40) | run(input, args) {
method encodeAllChars (line 51) | encodeAllChars (str) {
FILE: src/core/operations/UnescapeString.mjs
class UnescapeString (line 13) | class UnescapeString extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/UnescapeUnicodeCharacters.mjs
class UnescapeUnicodeCharacters (line 13) | class UnescapeUnicodeCharacters extends Operation {
method constructor (line 18) | constructor() {
method run (line 57) | run(input, args) {
FILE: src/core/operations/UnicodeTextFormat.mjs
class UnicodeTextFormat (line 13) | class UnicodeTextFormat extends Operation {
method constructor (line 18) | constructor() {
method run (line 46) | run(input, args) {
FILE: src/core/operations/Unique.mjs
class Unique (line 14) | class Unique extends Operation {
method constructor (line 19) | constructor() {
method run (line 46) | run(input, args) {
FILE: src/core/operations/Untar.mjs
class Untar (line 14) | class Untar extends Operation {
method constructor (line 19) | constructor() {
method run (line 44) | run(input, args) {
method present (line 103) | async present(files) {
FILE: src/core/operations/Unzip.mjs
class Unzip (line 16) | class Unzip extends Operation {
method constructor (line 21) | constructor() {
method run (line 57) | run(input, args) {
method present (line 77) | async present(files) {
FILE: src/core/operations/VarIntDecode.mjs
class VarIntDecode (line 14) | class VarIntDecode extends Operation {
method constructor (line 19) | constructor() {
method run (line 36) | run(input, args) {
FILE: src/core/operations/VarIntEncode.mjs
class VarIntEncode (line 14) | class VarIntEncode extends Operation {
method constructor (line 19) | constructor() {
method run (line 36) | run(input, args) {
FILE: src/core/operations/ViewBitPlane.mjs
class ViewBitPlane (line 17) | class ViewBitPlane extends Operation {
method constructor (line 21) | constructor() {
method run (line 51) | async run(input, args) {
method present (line 93) | present(data) {
constant COLOUR_OPTIONS (line 101) | const COLOUR_OPTIONS = ["Red", "Green", "Blue", "Alpha"];
FILE: src/core/operations/VigenèreDecode.mjs
class VigenèreDecode (line 12) | class VigenèreDecode extends Operation {
method constructor (line 17) | constructor() {
method run (line 40) | run(input, args) {
method highlight (line 83) | highlight(pos, args) {
method highlightReverse (line 96) | highlightReverse(pos, args) {
FILE: src/core/operations/VigenèreEncode.mjs
class VigenèreEncode (line 13) | class VigenèreEncode extends Operation {
method constructor (line 18) | constructor() {
method run (line 41) | run(input, args) {
method highlight (line 88) | highlight(pos, args) {
method highlightReverse (line 101) | highlightReverse(pos, args) {
FILE: src/core/operations/Whirlpool.mjs
class Whirlpool (line 13) | class Whirlpool extends Operation {
method constructor (line 18) | constructor() {
method run (line 48) | run(input, args) {
FILE: src/core/operations/WindowsFiletimeToUNIXTimestamp.mjs
class WindowsFiletimeToUNIXTimestamp (line 14) | class WindowsFiletimeToUNIXTimestamp extends Operation {
method constructor (line 19) | constructor() {
method run (line 47) | run(input, args) {
FILE: src/core/operations/XKCDRandomNumber.mjs
class XKCDRandomNumber (line 12) | class XKCDRandomNumber extends Operation {
method constructor (line 17) | constructor() {
method run (line 34) | run(input, args) {
FILE: src/core/operations/XMLBeautify.mjs
class XMLBeautify (line 13) | class XMLBeautify extends Operation {
method constructor (line 18) | constructor() {
method run (line 40) | run(input, args) {
FILE: src/core/operations/XMLMinify.mjs
class XMLMinify (line 13) | class XMLMinify extends Operation {
method constructor (line 18) | constructor() {
method run (line 40) | run(input, args) {
FILE: src/core/operations/XOR.mjs
class XOR (line 14) | class XOR extends Operation {
method constructor (line 19) | constructor() {
method run (line 53) | run(input, args) {
method highlight (line 70) | highlight(pos, args) {
method highlightReverse (line 83) | highlightReverse(pos, args) {
FILE: src/core/operations/XORBruteForce.mjs
class XORBruteForce (line 16) | class XORBruteForce extends Operation {
method constructor (line 21) | constructor() {
method run (line 79) | run(input, args) {
FILE: src/core/operations/XORChecksum.mjs
class XORChecksum (line 14) | class XORChecksum extends Operation {
method constructor (line 19) | constructor() {
method run (line 42) | run(input, args) {
FILE: src/core/operations/XPathExpression.mjs
class XPathExpression (line 15) | class XPathExpression extends Operation {
method constructor (line 20) | constructor() {
method run (line 48) | run(input, args) {
FILE: src/core/operations/XSalsa20.mjs
class XSalsa20 (line 16) | class XSalsa20 extends Operation {
method constructor (line 21) | constructor() {
method run (line 72) | run(input, args) {
method highlight (line 129) | highlight(pos, args) {
method highlightReverse (line 146) | highlightReverse(pos, args) {
FILE: src/core/operations/XXTEADecrypt.mjs
class XXTEADecrypt (line 17) | class XXTEADecrypt extends Operation {
method constructor (line 22) | constructor() {
method run (line 46) | run(input, args) {
FILE: src/core/operations/XXTEAEncrypt.mjs
class XXTEAEncrypt (line 16) | class XXTEAEncrypt extends Operation {
method constructor (line 21) | constructor() {
method run (line 45) | run(input, args) {
FILE: src/core/operations/YAMLToJSON.mjs
class YAMLToJSON (line 13) | class YAMLToJSON extends Operation {
method constructor (line 18) | constructor() {
method run (line 35) | run(input, args) {
FILE: src/core/operations/YARARules.mjs
class YARARules (line 15) | class YARARules extends Operation {
method constructor (line 20) | constructor() {
method run (line 74) | async run(input, args) {
FILE: src/core/operations/Zip.mjs
constant ZIP_COMPRESSION_METHOD_LOOKUP (line 14) | const ZIP_COMPRESSION_METHOD_LOOKUP = {
constant ZIP_OS_LOOKUP (line 19) | const ZIP_OS_LOOKUP = {
class Zip (line 28) | class Zip extends Operation {
method constructor (line 33) | constructor() {
method run (line 81) | run(input, args) {
FILE: src/core/operations/ZlibDeflate.mjs
class ZlibDeflate (line 16) | class ZlibDeflate extends Operation {
method constructor (line 21) | constructor() {
method run (line 44) | run(input, args) {
FILE: src/core/operations/ZlibInflate.mjs
constant ZLIB_BUFFER_TYPE_LOOKUP (line 13) | const ZLIB_BUFFER_TYPE_LOOKUP = {
class ZlibInflate (line 21) | class ZlibInflate extends Operation {
method constructor (line 26) | constructor() {
method run (line 76) | run(input, args) {
FILE: src/core/vendor/DisassembleX86-64.mjs
constant REG (line 3068) | const REG = [
constant PTR (line 3276) | const PTR = [
function CompatibilityMode (line 3347) | function CompatibilityMode( type )
function LoadBinCode (line 3546) | function LoadBinCode( HexStr )
function NextByte (line 3608) | function NextByte()
function SetBasePosition (line 3635) | function SetBasePosition( Address )
function GetPosition (line 3664) | function GetPosition()
function GotoPosition (line 3702) | function GotoPosition( Address )
function GetOperandSize (line 3796) | function GetOperandSize( SizeAttribute )
function Decode_ModRM_SIB_Value (line 3908) | function Decode_ModRM_SIB_Value()
function DecodeImmediate (line 3961) | function DecodeImmediate( type, BySize, SizeSetting )
function DecodeRegValue (line 4160) | function DecodeRegValue( RValue, BySize, Setting )
function Decode_ModRM_SIB_Address (line 4213) | function Decode_ModRM_SIB_Address( ModRM, BySize, Setting )
function DecodePrefixAdjustments (line 4588) | function DecodePrefixAdjustments()
function DecodeOpcode (line 4946) | function DecodeOpcode()
function DecodeOperandString (line 5041) | function DecodeOperandString()
function DecodeOperands (line 5152) | function DecodeOperands()
function DecodeInstruction (line 5395) | function DecodeInstruction()
function Reset (line 5641) | function Reset()
function LDisassemble (line 5694) | function LDisassemble()
function setBitMode (line 5751) | function setBitMode (val) {
function setShowInstructionHex (line 5754) | function setShowInstructionHex (val) {
function setShowInstructionPos (line 5757) | function setShowInstructionPos (val) {
FILE: src/core/vendor/gost/gostCipher.mjs
function signed (line 178) | function signed(x) {
function unsigned (line 182) | function unsigned(x) {
function randomSeed (line 188) | function randomSeed(e) {
function buffer (line 198) | function buffer(d) {
function byteArray (line 209) | function byteArray(d) {
function cloneArray (line 214) | function cloneArray(d) {
function intArray (line 220) | function intArray(d) {
function swap32 (line 225) | function swap32(b) {
function gmul (line 248) | function gmul(a, b) {
function funcR (line 278) | function funcR(d) {
function funcReverseR (line 288) | function funcReverseR(d) {
function funcS (line 327) | function funcS(d) {
function funcReverseS (line 332) | function funcReverseS(d) {
function funcX (line 337) | function funcX(a, b) {
function funcL (line 342) | function funcL(d) {
function funcReverseL (line 347) | function funcReverseL(d) {
function funcLSX (line 352) | function funcLSX(a, b) {
function funcReverseLSX (line 358) | function funcReverseLSX(a, b) {
function funcF (line 364) | function funcF(inputKey, inputKeySecond, iterationConst) {
function funcC (line 371) | function funcC(number, d) {
function keySchedule128 (line 390) | function keySchedule128(k) // <editor-fold defaultstate="collapsed">
function process128 (line 418) | function process128(k, d, ofs, e) // <editor-fold defaultstate="collapsed">
function round (line 446) | function round(S, m, k) // <editor-fold defaultstate="collapsed">
function process89 (line 477) | function process89(k, d, ofs) // <editor-fold defaultstate="collapsed">
function process15 (line 502) | function process15(k, d, ofs) // <editor-fold defaultstate="collapsed">
function keySchedule89 (line 529) | function keySchedule89(k, e) // <editor-fold defaultstate="collapsed">
function keySchedule15 (line 568) | function keySchedule15(k, e) // <editor-fold defaultstate="collapsed">
function rol (line 670) | function rol(R, s) {
function ror (line 674) | function ror(R, s) {
function mix (line 678) | function mix(i) {
function mash (line 690) | function mash(i) {
function perform (line 698) | function perform(method, count) {
function encryptECB (line 747) | function encryptECB(k, d) // <editor-fold defaultstate="collapsed">
function decryptECB (line 773) | function decryptECB(k, d) // <editor-fold defaultstate="collapsed">
function encryptCFB (line 801) | function encryptCFB(k, d, iv) // <editor-fold defaultstate="collapsed">
function decryptCFB (line 854) | function decryptCFB(k, d, iv) // <editor-fold defaultstate="collapsed">
function processOFB (line 924) | function processOFB(k, d, iv) // <editor-fold defaultstate="collapsed">
function processCTR89 (line 994) | function processCTR89(k, d, iv) // <editor-fold defaultstate="collapsed">
function processCTR15 (line 1039) | function processCTR15(k, d, iv) // <editor-fold defaultstate="collapsed">
function encryptCBC (line 1097) | function encryptCBC(k, d, iv) // <editor-fold defaultstate="collapsed">
function decryptCBC (line 1144) | function decryptCBC(k, d, iv) // <editor-fold defaultstate="collapsed">
function generateKey (line 1186) | function generateKey() // <editor-fold defaultstate="collapsed">
function processMAC89 (line 1210) | function processMAC89(key, s, d) // <editor-fold defaultstate="collapsed">
function processKeyMAC15 (line 1228) | function processKeyMAC15(s) // <editor-fold defaultstate="collapsed">
function processMAC15 (line 1244) | function processMAC15(key, s, d) // <editor-fold defaultstate="collapsed">
function signMAC (line 1287) | function signMAC(k, d, iv) // <editor-fold defaultstate="collapsed">
function verifyMAC (line 1315) | function verifyMAC(k, m, d, iv) // <editor-fold defaultstate="collapsed">
function wrapKeyGOST (line 1344) | function wrapKeyGOST(kek, cek) // <editor-fold defaultstate="collapsed">
function unwrapKeyGOST (line 1378) | function unwrapKeyGOST(kek, data) // <editor-fold defaultstate="collapsed">
function diversifyKEK (line 1418) | function diversifyKEK(kek, ukm) // <editor-fold defaultstate="collapsed">
function wrapKeyCP (line 1473) | function wrapKeyCP(kek, cek) // <editor-fold defaultstate="collapsed">
function unwrapKeyCP (line 1512) | function unwrapKeyCP(kek, data) // <editor-fold defaultstate="collapsed">
function packKeySC (line 1569) | function packKeySC(unpacked, ukm) // <editor-fold defaultstate="collapsed">
function unpackKeySC (line 1616) | function unpackKeySC(packed) // <editor-fold defaultstate="collapsed">
function wrapKeySC (line 1663) | function wrapKeySC(kek, cek) // <editor-fold defaultstate="collapsed">
function unwrapKeySC (line 1690) | function unwrapKeySC(kek, cek) // <editor-fold defaultstate="collapsed">
function generateWrappingKeySC (line 1715) | function generateWrappingKeySC() // <editor-fold defaultstate="collapsed">
function maskKey (line 1720) | function maskKey(mask, key, inverse, keySize) // <editor-fold defaultsta...
function wrapKeyMask (line 1747) | function wrapKeyMask(mask, key) // <editor-fold defaultstate="collapsed">
function unwrapKeyMask (line 1764) | function unwrapKeyMask(mask, key) // <editor-fold defaultstate="collapsed">
function keyMeshingCP (line 1785) | function keyMeshingCP(k, s, i, key, e) // <editor-fold defaultstate="col...
function noKeyMeshing (line 1807) | function noKeyMeshing(k) // <editor-fold defaultstate="collapsed">
function noPad (line 1824) | function noPad(d) // <editor-fold defaultstate="collapsed">
function pkcs5Pad (line 1843) | function pkcs5Pad(d) // <editor-fold defaultstate="collapsed">
function pkcs5Unpad (line 1856) | function pkcs5Unpad(d) // <editor-fold defaultstate="collapsed">
function zeroPad (line 1883) | function zeroPad(d) // <editor-fold defaultstate="collapsed">
function bitPad (line 1909) | function bitPad(d) // <editor-fold defaultstate="collapsed">
function bitUnpad (line 1922) | function bitUnpad(d) // <editor-fold defaultstate="collapsed">
function randomPad (line 1950) | function randomPad(d) // <editor-fold defaultstate="collapsed">
function GostCipher (line 2060) | function GostCipher(algorithm) // <editor-fold defaultstate="collapsed">
FILE: src/core/vendor/gost/gostCoding.mjs
function buffer (line 48) | function buffer(d) {
function GostCoding (line 58) | function GostCoding() {
function encodeBER (line 447) | function encodeBER(source, format, onlyContent) {
function decodeBER (line 743) | function decodeBER(source, offset) {
FILE: src/core/vendor/gost/gostCrypto.mjs
function normalize (line 58) | function normalize(algorithm, method) {
function checkNative (line 364) | function checkNative(algorithm) {
function checkKey (line 390) | function checkKey(key, method) {
function extractKey (line 439) | function extractKey(method, algorithm, key) {
function convertKey (line 481) | function convertKey(algorithm, extractable, keyUsages, keyData, keyType) {
function convertKeyPair (line 493) | function convertKeyPair(publicAlgorithm, privateAlgorithm, extractable, ...
function swapBytes (line 512) | function swapBytes(src) {
function mswrap (line 543) | function mswrap(value) {
function Promise (line 557) | function Promise(executor) {
function asyncResolve (line 683) | function asyncResolve(k) {
function asyncReject (line 693) | function asyncReject(reason) {
function importScripts (line 739) | function importScripts() {
function execute (line 806) | function execute(algorithm, method, args) {
function call (line 833) | function call(callback) {
function SubtleCrypto (line 998) | function SubtleCrypto() {
FILE: src/core/vendor/gost/gostDigest.mjs
function arraycopy (line 56) | function arraycopy(s, sOfs, d, dOfs, len) {
function swap (line 62) | function swap(s) {
function b64decode (line 72) | function b64decode(s) {
function getSeed (line 101) | function getSeed(length) {
function buffer (line 113) | function buffer(d) {
function get8 (line 205) | function get8(x, i) {
function add512 (line 210) | function add512(x, y) {
function get512 (line 220) | function get512(d) {
function copy512 (line 225) | function copy512(r, d) {
function new512 (line 230) | function new512() {
function xor512 (line 235) | function xor512(x, y) {
function XLPS (line 242) | function XLPS(x, y) {
function g (line 260) | function g(h, N, m)
function stage2 (line 285) | function stage2(d) {
function stage3 (line 293) | function stage3(d) {
function P (line 375) | function P(d) {
function A (line 389) | function A(d)
function fw (line 405) | function fw(d) {
function encrypt (line 413) | function encrypt(key, s, sOff, d, dOff) {
function process (line 421) | function process(d, dOff) {
function summing (line 475) | function summing(d)
function common (line 573) | function common(a, e, w, k, f) {
function f1 (line 577) | function f1(a, b, c, d, e, w) {
function f2 (line 581) | function f2(a, b, c, d, e, w) {
function f3 (line 585) | function f3(a, b, c, d, e, w) {
function f4 (line 589) | function f4(a, b, c, d, e, w) {
function cycle (line 593) | function cycle(state, block) {
function swap32 (line 631) | function swap32(b) {
function signHMAC (line 713) | function signHMAC(key, data) // <editor-fold defaultstate="collapsed">
function verifyHMAC (line 756) | function verifyHMAC(key, signature, data) // <editor-fold defaultstate="...
function generateKey (line 779) | function generateKey() // <editor-fold defaultstate="collapsed">
function deriveBitsPFXKDF (line 799) | function deriveBitsPFXKDF(baseKey, length) // <editor-fold defaultstate=...
function deriveBitsKDF (line 883) | function deriveBitsKDF(baseKey, length) // <editor-fold defaultstate="co...
function deriveBitsPBKDF1 (line 923) | function deriveBitsPBKDF1(baseKey, length) // <editor-fold defaultstate=...
function deriveBitsPBKDF2 (line 959) | function deriveBitsPBKDF2(baseKey, length) // <editor-fold defaultstate=...
function deriveBitsCP (line 1015) | function deriveBitsCP(baseKey, length) {
function deriveKey (line 1086) | function deriveKey(baseKey) // <editor-fold defaultstate="collapsed">
function GostDigest (line 1168) | function GostDigest(algorithm) // <editor-fold defaultstate="collapsed">
FILE: src/core/vendor/gost/gostEngine.mjs
function defineEngine (line 46) | function defineEngine(method, algorithm) {
FILE: src/core/vendor/gost/gostRandom.mjs
function GostRandom (line 90) | function GostRandom() {
FILE: src/core/vendor/gost/gostSign.mjs
function am (line 194) | function am(y, i, x, w, j, c, n) {
function nbi (line 207) | function nbi(words) {
function copyTo (line 214) | function copyTo(x, r) {
function copy (line 222) | function copy(x) {
function setInt (line 226) | function setInt(x, i) {
function nbv (line 238) | function nbv(i) {
function clamp (line 246) | function clamp(x) {
function subTo (line 253) | function subTo(x, a, r) {
function sub (line 287) | function sub(x, y) {
function addTo (line 291) | function addTo(x, a, r) {
function add (line 325) | function add(x, y) {
function negTo (line 329) | function negTo(x, r) {
function neg (line 333) | function neg(x) {
function absTo (line 337) | function absTo(x, r) {
function abs (line 341) | function abs(x) {
function compare (line 345) | function compare(x, a) {
function equals (line 359) | function equals(x, y) {
function min (line 363) | function min(x, y) {
function max (line 367) | function max(x, y) {
function nbits (line 371) | function nbits(x) {
function dshlTo (line 396) | function dshlTo(x, n, r) {
function dshrTo (line 406) | function dshrTo(x, n, r) {
function shlTo (line 414) | function shlTo(x, n, r) {
function shrTo (line 431) | function shrTo(x, n, r) {
function shl (line 452) | function shl(x, n) {
function shr (line 461) | function shr(x, n) {
function bitLength (line 470) | function bitLength(x) {
function mulTo (line 476) | function mulTo(b, a, r) {
function mul (line 490) | function mul(x, y) {
function sqrTo (line 494) | function sqrTo(a, r) {
function sqr (line 512) | function sqr(a) {
function divRemTo (line 516) | function divRemTo(n, m, q, r) {
function modTo (line 579) | function modTo(b, a, r) {
function mod (line 586) | function mod(b, a) {
function div (line 590) | function div(b, a) {
function isEven (line 594) | function isEven(x) {
function isZero (line 599) | function isZero(x) {
function sig (line 603) | function sig(x) {
function invMod (line 612) | function invMod(x, m) {
function testBit (line 672) | function testBit(x, n) {
function nothing (line 679) | function nothing(x) {
function extend (line 683) | function extend(c, o) {
function invDig (line 720) | function invDig(a) {
function dAddOffset (line 792) | function dAddOffset(x, n, w) {
function mulLowerTo (line 806) | function mulLowerTo(x, a, n, r) {
function mulUpperTo (line 820) | function mulUpperTo(x, a, n, r) {
function Barrett (line 833) | function Barrett(m) {
function expMod (line 887) | function expMod(x, e, m) {
function newFE (line 981) | function newFE(a, x) {
function copyFE (line 988) | function copyFE(a, x) {
function negFE (line 994) | function negFE(a) {
function addFE (line 998) | function addFE(a, b) {
function subFE (line 1005) | function subFE(a, b) {
function mulFE (line 1012) | function mulFE(a, b) {
function sqrFE (line 1016) | function sqrFE(a) {
function shlFE (line 1020) | function shlFE(a, i) {
function invFE (line 1024) | function invFE(a) {
function newEC (line 1029) | function newEC(curve, x, y, z) {
function getX (line 1038) | function getX(point) {
function getY (line 1044) | function getY(point) {
function isInfinity (line 1050) | function isInfinity(a) {
function getInfinity (line 1056) | function getInfinity(a) {
function equalsEC (line 1060) | function equalsEC(a, b) {
function negEC (line 1077) | function negEC(a) {
function addEC (line 1081) | function addEC(a, b) {
function twiceEC (line 1117) | function twiceEC(b) {
function mulEC (line 1147) | function mulEC(a, k) {
function mul2AndAddEC (line 1174) | function mul2AndAddEC(a, k) {
function mulTwoEC (line 1193) | function mulTwoEC(a, j, x, k) {
function newCurve (line 1224) | function newCurve(q, a, b) {
function atobi (line 1239) | function atobi(d) {
function bitoa (line 1263) | function bitoa(s, bitLength) {
function htobi (line 1297) | function htobi(s) {
function bitoh (line 1331) | function bitoh(x) {
function bitoi (line 1364) | function bitoi(s) {
function itobi (line 1395) | function itobi(d) {
function swap (line 1425) | function swap(s) {
function hash (line 1434) | function hash(d) {
function buffer (line 1445) | function buffer(d) {
function to2 (line 1456) | function to2(d) {
function from2 (line 1464) | function from2(x, y, bitLength) {
function getSeed (line 1473) | function getSeed(length) {
function sign (line 1496) | function sign(privateKey, data) // <editor-fold defaultstate="collapsed">
function verify (line 1566) | function verify(publicKey, signature, data) // <editor-fold defaultstate...
function generateKey (line 1630) | function generateKey() // <editor-fold defaultstate="collapsed">
function generateMaskKey (line 1675) | function generateMaskKey() // <editor-fold defaultstate="collapsed">
function unwrapKey (line 1702) | function unwrapKey(baseKey, data) // <editor-fold defaultstate="collapsed">
function wrapKey (line 1727) | function wrapKey(baseKey, data) // <editor-fold defaultstate="collapsed">
function derive (line 1750) | function derive(baseKey) // <editor-fold defaultstate="collapsed">
function deriveBits (line 1795) | function deriveBits(baseKey, length) // <editor-fold defaultstate="colla...
function deriveKey (line 1822) | function deriveKey(baseKey) // <editor-fold defaultstate="collapsed">
function GostSign (line 1904) | function GostSign(algorithm) // <editor-fold defaultstate="collapsed">
FILE: src/core/vendor/remove-exif.mjs
function removeEXIF (line 24) | function removeEXIF(jpeg) {
function splitIntoSegments (line 50) | function splitIntoSegments(data) {
function unpack (line 75) | function unpack(mark, str) {
FILE: src/node/File.mjs
class File (line 18) | class File {
method constructor (line 29) | constructor(data, name="", stats={}) {
method size (line 63) | get size() {
method lastModifiedDate (line 70) | get lastModifiedDate() {
FILE: src/node/NodeDish.mjs
class NodeDish (line 15) | class NodeDish extends Dish {
method constructor (line 22) | constructor(inputOrDish=null, type=null) {
method apply (line 41) | apply(operation, args=null) {
method to (line 49) | to(...args) {
method toString (line 56) | toString() {
method inspect (line 71) | inspect() {
method valueOf (line 78) | valueOf() {
method [util.inspect.custom] (line 63) | [util.inspect.custom](depth, options) {
FILE: src/node/NodeRecipe.mjs
class NodeRecipe (line 15) | class NodeRecipe {
method constructor (line 21) | constructor(recipeConfig) {
method _validateIngredient (line 33) | _validateIngredient(ing) {
method _parseConfig (line 73) | _parseConfig(recipeConfig) {
method execute (line 91) | execute(dish) {
FILE: src/node/api.mjs
function transformArgs (line 31) | function transformArgs(opArgsList, newArgs) {
function ensureIsDish (line 100) | function ensureIsDish(input) {
function prepareOp (line 120) | function prepareOp(opInstance, input, args) {
function createArgInfo (line 139) | function createArgInfo(op) {
function _wrap (line 175) | function _wrap(OpClass) {
function help (line 258) | function help(input) {
function bake (line 327) | function bake(input, recipeConfig) {
function _explainExcludedFunction (line 340) | function _explainExcludedFunction(name) {
FILE: src/node/apiUtils.mjs
function decapitalise (line 35) | function decapitalise(str) {
function removeSubheadingsFromArray (line 52) | function removeSubheadingsFromArray(array) {
function sanitise (line 68) | function sanitise(str) {
function sentenceToCamelCase (line 77) | function sentenceToCamelCase(str) {
FILE: src/web/App.mjs
class App (line 21) | class App {
method constructor (line 31) | constructor(categories, operations, defaultFavourites, defaultOptions) {
method setup (line 58) | setup() {
method loaded (line 82) | loaded() {
method handleError (line 123) | handleError(err, logToConsole) {
method bake (line 136) | bake(step=false) {
method autoBake (line 157) | autoBake() {
method step (line 178) | step() {
method silentBake (line 210) | silentBake() {
method setInput (line 228) | setInput(input) {
method populateOperationsList (line 251) | populateOperationsList() {
method initialiseSplitter (line 303) | initialiseSplitter(minimise=false) {
method loadLocalStorage (line 331) | loadLocalStorage() {
method loadFavourites (line 349) | loadFavourites() {
method validFavourites (line 384) | validFavourites(favourites) {
method saveFavourites (line 403) | saveFavourites(favourites) {
method resetFavourites (line 420) | resetFavourites() {
method addFavourite (line 433) | addFavourite(name) {
method getURIParams (line 453) | getURIParams() {
method loadURIParams (line 475) | loadURIParams(params=this.getURIParams()) {
method nextIngId (line 553) | nextIngId() {
method getRecipeConfig (line 563) | getRecipeConfig() {
method setRecipeConfig (line 574) | setRecipeConfig(recipeConfig) {
method resetLayout (line 617) | resetLayout() {
method adjustComponentSizes (line 626) | adjustComponentSizes() {
method setCompileMessage (line 637) | setCompileMessage() {
method isLocalStorageAvailable (line 672) | isLocalStorageAvailable() {
method alert (line 700) | alert(str, timeout=0, silent=false) {
method confirm (line 732) | confirm(title, body, accept, reject, callback, scope) {
method stateChange (line 770) | stateChange(e) {
method updateURL (line 786) | updateURL(includeInput, input=null, changeUrl=true) {
method popState (line 818) | popState(e) {
FILE: src/web/HTMLCategory.mjs
class HTMLCategory (line 10) | class HTMLCategory {
method constructor (line 18) | constructor(name, selected) {
method addOperation (line 30) | addOperation(operation) {
method toHtml (line 40) | toHtml() {
FILE: src/web/HTMLIngredient.mjs
class HTMLIngredien
Condensed preview — 871 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,505K chars).
[
{
"path": ".cspell.json",
"chars": 296,
"preview": "{\n \"version\": \"0.2\",\n \"language\": \"en,en-gb\",\n \"words\": [],\n \"dictionaries\": [\n \"npm\",\n \"softwareT"
},
{
"path": ".devcontainer/devcontainer.json",
"chars": 1291,
"preview": "// For format details, see https://aka.ms/devcontainer.json. For config options, see the\n// README at: https://github.co"
},
{
"path": ".dockerignore",
"chars": 19,
"preview": "node_modules\nbuild\n"
},
{
"path": ".editorconfig",
"chars": 314,
"preview": "# top-most EditorConfig file\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing"
},
{
"path": ".gitattributes",
"chars": 19,
"preview": "* text=auto eol=lf\n"
},
{
"path": ".github/CONTRIBUTING.md",
"chars": 2347,
"preview": "# Contributing\n\nTake a look through the [Wiki pages](https://github.com/gchq/CyberChef/wiki) for guides on [compiling Cy"
},
{
"path": ".github/ISSUE_TEMPLATE/bug-report.md",
"chars": 795,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: 'Bug report: <Insert title here>'\nlabels: bug\nassi"
},
{
"path": ".github/ISSUE_TEMPLATE/feature-request.md",
"chars": 636,
"preview": "---\nname: Feature request\nabout: Suggest an idea for the project\ntitle: 'Feature request: <Insert title here>'\nlabels: f"
},
{
"path": ".github/ISSUE_TEMPLATE/operation-request.md",
"chars": 195,
"preview": "---\nname: Operation request\nabout: Suggest a new operation\ntitle: 'Operation request: <Insert title here>'\nlabels: opera"
},
{
"path": ".github/ISSUE_TEMPLATE.md",
"chars": 45,
"preview": "<!-- Prefix the title above with 'Misc:' -->\n"
},
{
"path": ".github/dependabot.yml",
"chars": 2407,
"preview": "# See the documentation for all configuration options:\n# https://docs.github.com/code-security/dependabot/dependabot-ver"
},
{
"path": ".github/workflows/master.yml",
"chars": 1441,
"preview": "name: \"Master Build, Test & Deploy\"\n\non:\n workflow_dispatch:\n push:\n branches:\n - master\n\npermissions:\n conte"
},
{
"path": ".github/workflows/pull_requests.yml",
"chars": 1256,
"preview": "name: \"Pull Requests\"\n\npermissions:\n contents: read\n\non:\n workflow_dispatch:\n pull_request:\n types: [synchronize, "
},
{
"path": ".github/workflows/releases.yml",
"chars": 3194,
"preview": "name: \"Releases\"\n\non:\n workflow_dispatch:\n push:\n tags:\n - \"v*\"\n\npermissions:\n contents: read\n\nenv:\n REGISTR"
},
{
"path": ".gitignore",
"chars": 265,
"preview": "node_modules\nnpm-debug.log\ntravis.log\nbuild\n.vscode\n.idea\n.*.swp\nsrc/core/config/modules/*\nsrc/core/config/OperationConf"
},
{
"path": ".npmignore",
"chars": 74,
"preview": "node_modules\nnpm-debug.log\ntravis.log\nbuild/*\n!build/node\n.vscode\n.github\n"
},
{
"path": ".nvmrc",
"chars": 3,
"preview": "18\n"
},
{
"path": "CHANGELOG.md",
"chars": 51914,
"preview": "# Changelog\n\n## Versioning\n\nCyberChef uses the [semver](https://semver.org/) system to manage versioning: `<MAJOR>.<MINO"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3212,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
},
{
"path": "Dockerfile",
"chars": 1146,
"preview": "#####################################\n# Build the app to a static website #\n#####################################\n# Modi"
},
{
"path": "Gruntfile.js",
"chars": 17437,
"preview": "\"use strict\";\n\nconst webpack = require(\"webpack\");\nconst HtmlWebpackPlugin = require(\"html-webpack-plugin\");\nconst Bundl"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 12558,
"preview": "# CyberChef\n\n[](https://gi"
},
{
"path": "SECURITY.md",
"chars": 1338,
"preview": "# Security Policy\n\n## Supported Versions\n\nCyberChef is supported on a best endeavours basis. Patches will be applied to\n"
},
{
"path": "babel.config.js",
"chars": 491,
"preview": "module.exports = function(api) {\n api.cache.forever();\n\n return {\n \"presets\": [\n [\"@babel/preset"
},
{
"path": "eslint.config.mjs",
"chars": 4145,
"preview": "import babelParser from \"@babel/eslint-parser\";\nimport jsdoc from \"eslint-plugin-jsdoc\";\nimport js from \"@eslint/js\";\nim"
},
{
"path": "nightwatch.json",
"chars": 658,
"preview": "{\n \"src_folders\": [\"tests/browser\"],\n \"exclude\": [\"tests/browser/browserUtils.js\"],\n \"output_folder\": \"tests/browser/"
},
{
"path": "package.json",
"chars": 7103,
"preview": "{\n \"name\": \"cyberchef\",\n \"version\": \"10.22.1\",\n \"description\": \"The Cyber Swiss Army Knife for encryption, encoding, "
},
{
"path": "postcss.config.js",
"chars": 193,
"preview": "module.exports = {\n plugins: [\n require(\"postcss-import\"),\n require(\"autoprefixer\"),\n require(\"p"
},
{
"path": "src/core/Chef.mjs",
"chars": 5715,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Dish "
},
{
"path": "src/core/ChefWorker.js",
"chars": 6956,
"preview": "/**\n * Web Worker to handle communications between the front-end and the core.\n *\n * @author n1474335 [n1474335@gmail.co"
},
{
"path": "src/core/Dish.mjs",
"chars": 18669,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @author Matt C [matt@artemisbot.uk]\n * @copyright Crown Copyright 2016\n "
},
{
"path": "src/core/Ingredient.mjs",
"chars": 3446,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Utils"
},
{
"path": "src/core/Operation.mjs",
"chars": 6902,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Dish "
},
{
"path": "src/core/Recipe.mjs",
"chars": 10058,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/Utils.mjs",
"chars": 51399,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\n// loglevel "
},
{
"path": "src/core/config/Categories.json",
"chars": 16127,
"preview": "[\n {\n \"name\": \"Favourites\",\n \"ops\": []\n },\n {\n \"name\": \"Data format\",\n \"ops\": [\n "
},
{
"path": "src/core/config/scripts/generateConfig.mjs",
"chars": 3509,
"preview": "/**\n * This script automatically generates OperationConfig.json, containing metadata\n * for each operation in the src/co"
},
{
"path": "src/core/config/scripts/generateOpsIndex.mjs",
"chars": 1497,
"preview": "/**\n * This script automatically generates src/core/operations/index.mjs, containing\n * imports for all operations in sr"
},
{
"path": "src/core/config/scripts/newMinorVersion.mjs",
"chars": 6778,
"preview": "/**\n * This script updates the CHANGELOG when a new minor version is created.\n *\n * @author n1474335 [n1474335@gmail.com"
},
{
"path": "src/core/config/scripts/newOperation.mjs",
"chars": 9176,
"preview": "/**\n * Interactive script for generating a new operation template.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyr"
},
{
"path": "src/core/dishTypes/DishBigNumber.mjs",
"chars": 970,
"preview": "/**\n * @author d98762625 [d98762625@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nimport Dis"
},
{
"path": "src/core/dishTypes/DishByteArray.mjs",
"chars": 711,
"preview": "/**\n * @author d98762625 [d98762625@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nimport Dis"
},
{
"path": "src/core/dishTypes/DishFile.mjs",
"chars": 1048,
"preview": "/**\n * @author d98762625 [d98762625@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nimport Dis"
},
{
"path": "src/core/dishTypes/DishHTML.mjs",
"chars": 608,
"preview": "/**\n * @author d98762625 [d98762625@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nimport Dis"
},
{
"path": "src/core/dishTypes/DishJSON.mjs",
"chars": 781,
"preview": "/**\n * @author d98762625 [d98762625@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nimport Dis"
},
{
"path": "src/core/dishTypes/DishListFile.mjs",
"chars": 2060,
"preview": "/**\n * @author d98762625 [d98762625@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nimport Dis"
},
{
"path": "src/core/dishTypes/DishNumber.mjs",
"chars": 801,
"preview": "/**\n * @author d98762625 [d98762625@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\n\nimport Di"
},
{
"path": "src/core/dishTypes/DishString.mjs",
"chars": 759,
"preview": "/**\n * @author d98762625 [d98762625@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\n\nimport Di"
},
{
"path": "src/core/dishTypes/DishType.mjs",
"chars": 808,
"preview": "/**\n * @author d98762625 [d98762625@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\n\n/**\n * Ab"
},
{
"path": "src/core/dishTypes/index.mjs",
"chars": 602,
"preview": "/**\n * @author d98762625 [d98762625@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\n\nimport Di"
},
{
"path": "src/core/errors/DishError.mjs",
"chars": 611,
"preview": "/**\n * Custom error type for handling Dish type errors.\n * i.e. where the Dish cannot be successfully translated between"
},
{
"path": "src/core/errors/ExcludedOperationError.mjs",
"chars": 620,
"preview": "/**\n * Custom error type for handling operation that isnt included in node.js API\n *\n * @author d98762625 [d98762625@gma"
},
{
"path": "src/core/errors/OperationError.mjs",
"chars": 652,
"preview": "/**\n * Custom error type for handling operation input errors.\n * i.e. where the operation can handle the error and print"
},
{
"path": "src/core/errors/index.mjs",
"chars": 235,
"preview": "import OperationError from \"./OperationError.mjs\";\nimport DishError from \"./DishError.mjs\";\nimport ExcludedOperationErro"
},
{
"path": "src/core/lib/Arithmetic.mjs",
"chars": 2970,
"preview": "/**\n * @author bwhitn [brian.m.whitney@outlook.com]\n * @author d98762625 [d98762625@gmailcom]\n * @copyright Crown Copyri"
},
{
"path": "src/core/lib/AudioBytes.mjs",
"chars": 3541,
"preview": "/**\n * Byte-reading and text-decoding utilities for audio metadata parsing.\n *\n * @author d0s1nt [d0s1nt@cyberchefaudio]"
},
{
"path": "src/core/lib/AudioMetaSchema.mjs",
"chars": 3517,
"preview": "/**\n * Report skeleton and container detection for audio metadata extraction.\n *\n * @author d0s1nt [d0s1nt@cyberchefaudi"
},
{
"path": "src/core/lib/AudioParsers.mjs",
"chars": 26352,
"preview": "/**\n * Format-specific audio metadata parsers.\n *\n * @author d0s1nt [d0s1nt@cyberchefaudio]\n * @copyright Crown Copyrigh"
},
{
"path": "src/core/lib/BCD.mjs",
"chars": 1385,
"preview": "/**\n * Binary Code Decimal resources.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2017\n * "
},
{
"path": "src/core/lib/Bacon.mjs",
"chars": 1587,
"preview": "/**\n * Bacon Cipher resources.\n *\n * @author Karsten Silkenbäumer [github.com/kassi]\n * @copyright Karsten Silkenbäumer "
},
{
"path": "src/core/lib/Base32.mjs",
"chars": 445,
"preview": "// import Utils from \"../Utils.mjs\";\n\n/**\n * Base32 resources.\n *\n * @author Peter C-S [petercs@purelymail.com]\n * @lice"
},
{
"path": "src/core/lib/Base45.mjs",
"chars": 582,
"preview": "/**\n * Base45 resources.\n *\n * @author Thomas Weißschuh [thomas@t-8ch.de]\n * @copyright Crown Copyright 2021\n * @license"
},
{
"path": "src/core/lib/Base58.mjs",
"chars": 468,
"preview": "/**\n * Base58 resources.\n *\n * @author tlwr [toby@toby.codes]\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Cro"
},
{
"path": "src/core/lib/Base64.mjs",
"chars": 6707,
"preview": "/**\n * Base64 functions.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apac"
},
{
"path": "src/core/lib/Base85.mjs",
"chars": 903,
"preview": "import Utils from \"../Utils.mjs\";\n\n/**\n * Base85 resources.\n *\n * @author PenguinGeorge [george@penguingeorge.com]\n * @c"
},
{
"path": "src/core/lib/Base92.mjs",
"chars": 987,
"preview": "/**\n * Base92 resources.\n *\n * @author sg5506844 [sg5506844@gmail.com]\n * @copyright Crown Copyright 2021\n * @license Ap"
},
{
"path": "src/core/lib/Bech32.mjs",
"chars": 12114,
"preview": "/**\n * Pure JavaScript implementation of Bech32 and Bech32m encoding.\n *\n * Bech32 is defined in BIP-0173: https://githu"
},
{
"path": "src/core/lib/BigIntUtils.mjs",
"chars": 1642,
"preview": "/**\n * @author p-leriche [philip.leriche@cantab.net]\n * @copyright Crown Copyright 2025\n * @license Apache-2.0\n */\n\nimpo"
},
{
"path": "src/core/lib/Binary.mjs",
"chars": 2071,
"preview": "/**\n * Binary functions.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2018\n * @license Apac"
},
{
"path": "src/core/lib/BitwiseOp.mjs",
"chars": 2523,
"preview": "/**\n * Bitwise operation resources.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2018\n * @l"
},
{
"path": "src/core/lib/Blowfish.mjs",
"chars": 23283,
"preview": "/**\n Blowfish.js from Dojo Toolkit 1.8.1 (https://github.com/dojo/dojox/tree/1.8/encoding)\n Extracted by Sladex (xslad"
},
{
"path": "src/core/lib/Bombe.mjs",
"chars": 28786,
"preview": "/**\n * Emulation of the Bombe machine.\n *\n * @author s2224834\n * @author The National Museum of Computing - Bombe Rebuil"
},
{
"path": "src/core/lib/Braille.mjs",
"chars": 360,
"preview": "/**\n * Braille resources.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2018\n * @license Apa"
},
{
"path": "src/core/lib/CanvasComponents.mjs",
"chars": 6251,
"preview": "/**\n * Various components for drawing diagrams on an HTML5 canvas.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyr"
},
{
"path": "src/core/lib/Charts.mjs",
"chars": 4641,
"preview": "/**\n * @author tlwr [toby@toby.codes]\n * @author Matt C [me@mitt.dev]\n * @copyright Crown Copyright 2019\n * @license Apa"
},
{
"path": "src/core/lib/ChrEnc.mjs",
"chars": 11329,
"preview": "/**\n * Character encoding resources.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @"
},
{
"path": "src/core/lib/CipherSaber2.mjs",
"chars": 967,
"preview": "/**\n * @author n1073645 [n1073645@gmail.com]\n * @copyright Crown Copyright 2020\n * @license Apache-2.0\n */\nexport functi"
},
{
"path": "src/core/lib/Ciphers.mjs",
"chars": 2408,
"preview": "/**\n * Cipher functions.\n *\n * @author Matt C [matt@artemisbot.uk]\n * @author n1474335 [n1474335@gmail.com]\n * @author E"
},
{
"path": "src/core/lib/Code.mjs",
"chars": 722,
"preview": "/**\n * Code resources.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2018\n * @license Apache"
},
{
"path": "src/core/lib/Colossus.mjs",
"chars": 14902,
"preview": "/**\n * Colossus - an emulation of the world's first electronic computer\n *\n * @author VirtualColossus [martin@virtualcol"
},
{
"path": "src/core/lib/ConvertCoordinates.mjs",
"chars": 23473,
"preview": "/**\n * Co-ordinate conversion resources.\n *\n * @author j433866 [j433866@gmail.com]\n * @copyright Crown Copyright 2019\n *"
},
{
"path": "src/core/lib/Crypt.mjs",
"chars": 399,
"preview": "/**\n * Crypt resources.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2021\n * @license Apach"
},
{
"path": "src/core/lib/DateTime.mjs",
"chars": 5989,
"preview": "/**\n * DateTime resources.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Ap"
},
{
"path": "src/core/lib/Decimal.mjs",
"chars": 806,
"preview": "/**\n * Decimal functions.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2018\n * @license Apa"
},
{
"path": "src/core/lib/Delim.mjs",
"chars": 2140,
"preview": "/**\n * Various delimiters\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2018\n * @license Apa"
},
{
"path": "src/core/lib/Enigma.mjs",
"chars": 11441,
"preview": "/**\n * Emulation of the Enigma machine.\n *\n * @author s2224834\n * @copyright Crown Copyright 2019\n * @license Apache-2.0"
},
{
"path": "src/core/lib/Extract.mjs",
"chars": 1851,
"preview": "/**\n * Identifier extraction functions\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n *"
},
{
"path": "src/core/lib/FileSignatures.mjs",
"chars": 114574,
"preview": "/**\n * File signatures and extractor functions\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright"
},
{
"path": "src/core/lib/FileType.mjs",
"chars": 8708,
"preview": "/**\n * File type functions\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2018\n * @license Ap"
},
{
"path": "src/core/lib/FlowControl.mjs",
"chars": 506,
"preview": "/**\n * Flow control functions\n *\n * @author d98762625 [d98762625@gmail.com]\n * @copyright Crown Copyright 2018\n * @licen"
},
{
"path": "src/core/lib/FuzzyMatch.mjs",
"chars": 7402,
"preview": "/**\n * LICENSE\n *\n * This software is dual-licensed to the public domain and under the following\n * license: you are"
},
{
"path": "src/core/lib/Hash.mjs",
"chars": 611,
"preview": "/**\n * Hashing resources.\n *\n * @author n1474335 [n1474335@gmail.com]\n *\n * @copyright Crown Copyright 2016\n * @license "
},
{
"path": "src/core/lib/Hex.mjs",
"chars": 3488,
"preview": "/**\n * Hexadecimal functions.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license"
},
{
"path": "src/core/lib/IP.mjs",
"chars": 24047,
"preview": "/**\n * IP resources.\n *\n * @author picapi\n * @author n1474335 [n1474335@gmail.com]\n * @author Klaxon [klaxon@veyr.com]\n "
},
{
"path": "src/core/lib/JA4.mjs",
"chars": 11569,
"preview": "/**\n * JA4 resources.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2024\n * @license Apache-"
},
{
"path": "src/core/lib/JWT.mjs",
"chars": 348,
"preview": "/**\n * JWT resources\n *\n * @author mt3571 [mt3571@protonmail.com]\n * @copyright Crown Copyright 2020\n * @license Apache-"
},
{
"path": "src/core/lib/LS47.mjs",
"chars": 5988,
"preview": "/**\n * @author n1073645 [n1073645@gmail.com]\n * @copyright Crown Copyright 2020\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/lib/LZNT1.mjs",
"chars": 2851,
"preview": "/**\n *\n * LZNT1 Decompress.\n *\n * @author 0xThiebaut [thiebaut.dev]\n * @copyright Crown Copyright 2023\n * @license Apach"
},
{
"path": "src/core/lib/LZString.mjs",
"chars": 567,
"preview": "/**\n * lz-string exports.\n *\n * @author crespyl [peter@crespyl.net]\n * @copyright Peter Jacobs 2021\n * @license Apache-2"
},
{
"path": "src/core/lib/LoremIpsum.mjs",
"chars": 6133,
"preview": "/**\n * Lorem Ipsum generator.\n *\n * @author Klaxon [klaxon@veyr.com]\n * @copyright Crown Copyright 2018\n * @license Apac"
},
{
"path": "src/core/lib/Lorenz.mjs",
"chars": 8550,
"preview": "/**\n * Resources required by the Lorenz SZ40/42 and Colossus\n *\n * @author VirtualColossus [martin@virtualcolossus.co.uk"
},
{
"path": "src/core/lib/Magic.mjs",
"chars": 566233,
"preview": "import OperationConfig from \"../config/OperationConfig.json\" assert {type: \"json\"};\nimport Utils, { isWorkerEnvironment "
},
{
"path": "src/core/lib/Modhex.mjs",
"chars": 4365,
"preview": "/**\n * @author linuxgemini [ilteris@asenkron.com.tr]\n * @copyright Crown Copyright 2024\n * @license Apache-2.0\n */\n\nimpo"
},
{
"path": "src/core/lib/PGP.mjs",
"chars": 3001,
"preview": "/**\n * PGP functions.\n *\n * @author tlwr [toby@toby.codes]\n * @author Matt C [matt@artemisbot.uk]\n * @author n1474335 [n"
},
{
"path": "src/core/lib/Protobuf.mjs",
"chars": 18012,
"preview": "import Utils from \"../Utils.mjs\";\nimport protobuf from \"protobufjs\";\n\n/**\n * Protobuf lib. Contains functions to decode "
},
{
"path": "src/core/lib/Protocol.mjs",
"chars": 1309,
"preview": "/**\n * Protocol parsing functions.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2022\n * @li"
},
{
"path": "src/core/lib/PublicKey.mjs",
"chars": 1522,
"preview": "/**\n * Public key resources.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license "
},
{
"path": "src/core/lib/QRCode.mjs",
"chars": 2990,
"preview": "/**\n * QR code resources\n *\n * @author j433866 [j433866@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache"
},
{
"path": "src/core/lib/RC6.mjs",
"chars": 20311,
"preview": "/**\n * Complete implementation of RC6 block cipher encryption/decryption with\n * configurable word size (w), rounds (r),"
},
{
"path": "src/core/lib/RSA.mjs",
"chars": 336,
"preview": "/**\n * RSA resources.\n *\n * @author Matt C [me@mitt.dev]\n * @copyright Crown Copyright 2021\n * @license Apache-2.0\n */\n\n"
},
{
"path": "src/core/lib/Rotate.mjs",
"chars": 2317,
"preview": "/**\n * Bit rotation functions.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @licens"
},
{
"path": "src/core/lib/SIGABA.mjs",
"chars": 15281,
"preview": "/**\n * Emulation of the SIGABA machine\n *\n * @author hettysymes\n * @copyright hettysymes 2020\n * @license Apache-2.0\n */"
},
{
"path": "src/core/lib/SM2.mjs",
"chars": 8278,
"preview": "/**\n * Utilities and operations utilized for SM2 encryption and decryption\n * @author flakjacket95 [dflack95@gmail.com]\n"
},
{
"path": "src/core/lib/SM4.mjs",
"chars": 13983,
"preview": "/**\n * Complete implementation of SM4 cipher encryption/decryption with\n * ECB, CBC, CFB, OFB, CTR block modes.\n * These"
},
{
"path": "src/core/lib/Salsa20.mjs",
"chars": 3768,
"preview": "/**\n * @author joostrijneveld [joost@joostrijneveld.nl]\n * @copyright Crown Copyright 2024\n * @license Apache-2.0\n */\n\ni"
},
{
"path": "src/core/lib/Sort.mjs",
"chars": 2908,
"preview": "/**\n * Sorting functions\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2022\n * @license Apac"
},
{
"path": "src/core/lib/Stream.mjs",
"chars": 9263,
"preview": "/**\n * Stream class for parsing binary protocols.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @author tlwr [toby@toby"
},
{
"path": "src/core/lib/TLS.mjs",
"chars": 29756,
"preview": "/**\n * TLS resources.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2024\n * @license Apache-"
},
{
"path": "src/core/lib/TLVParser.mjs",
"chars": 1610,
"preview": "/**\n * Parser for Type-length-value data.\n *\n * @author gchq77703 []\n * @author n1474335 [n1474335@gmail.com]\n * @copyri"
},
{
"path": "src/core/lib/Typex.mjs",
"chars": 8119,
"preview": "/**\n * Emulation of the Typex machine.\n *\n * @author s2224834\n * @author The National Museum of Computing - Bombe Rebuil"
},
{
"path": "src/core/lib/XXTEA.mjs",
"chars": 3979,
"preview": "/**\n * XXTEA library\n *\n * Encryption Algorithm Authors:\n * David J. Wheeler\n * Roger M. Needham\n *\n * @author M"
},
{
"path": "src/core/lib/Zlib.mjs",
"chars": 626,
"preview": "/**\n * Zlib exports.\n *\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2"
},
{
"path": "src/core/operations/A1Z26CipherDecode.mjs",
"chars": 2667,
"preview": "/**\n * @author Jarmo van Lenthe [github.com/jarmovanlenthe]\n * @copyright Crown Copyright 2018\n * @license Apache-2.0\n *"
},
{
"path": "src/core/operations/A1Z26CipherEncode.mjs",
"chars": 1652,
"preview": "/**\n * @author Jarmo van Lenthe [github.com/jarmovanlenthe]\n * @copyright Crown Copyright 2018\n * @license Apache-2.0\n *"
},
{
"path": "src/core/operations/ADD.mjs",
"chars": 1746,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/AESDecrypt.mjs",
"chars": 5396,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/AESEncrypt.mjs",
"chars": 5344,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/AESKeyUnwrap.mjs",
"chars": 4451,
"preview": "/**\n * @author mikecat\n * @copyright Crown Copyright 2022\n * @license Apache-2.0\n */\n\nimport Operation from \"../Operatio"
},
{
"path": "src/core/operations/AESKeyWrap.mjs",
"chars": 3885,
"preview": "/**\n * @author mikecat\n * @copyright Crown Copyright 2022\n * @license Apache-2.0\n */\n\nimport Operation from \"../Operatio"
},
{
"path": "src/core/operations/AMFDecode.mjs",
"chars": 1466,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2022\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/AMFEncode.mjs",
"chars": 1459,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2022\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/AND.mjs",
"chars": 1725,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/AddLineNumbers.mjs",
"chars": 1232,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/AddTextToImage.mjs",
"chars": 10326,
"preview": "/**\n * @author j433866 [j433866@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nimport Operati"
},
{
"path": "src/core/operations/Adler32Checksum.mjs",
"chars": 1451,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/AffineCipherDecode.mjs",
"chars": 3175,
"preview": "/**\n * @author Matt C [matt@artemisbot.uk]\n * @copyright Crown Copyright 2018\n * @license Apache-2.0\n */\n\nimport Operati"
},
{
"path": "src/core/operations/AffineCipherEncode.mjs",
"chars": 1921,
"preview": "/**\n * @author Matt C [matt@artemisbot.uk]\n * @copyright Crown Copyright 2018\n * @license Apache-2.0\n */\n\nimport Operati"
},
{
"path": "src/core/operations/AlternatingCaps.mjs",
"chars": 1526,
"preview": "/**\n * @author sw5678\n * @copyright Crown Copyright 2023\n * @license Apache-2.0\n */\n\nimport Operation from \"../Operation"
},
{
"path": "src/core/operations/AnalyseHash.mjs",
"chars": 5269,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/AnalyseUUID.mjs",
"chars": 1162,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2023\n * @license Apache-2.0\n */\n\nimport * as "
},
{
"path": "src/core/operations/Argon2.mjs",
"chars": 3378,
"preview": "/**\n * @author Tan Zhen Yong [tzy@beyondthesprawl.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nim"
},
{
"path": "src/core/operations/Argon2Compare.mjs",
"chars": 1305,
"preview": "/**\n * @author Tan Zhen Yong [tzy@beyondthesprawl.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nim"
},
{
"path": "src/core/operations/AtbashCipher.mjs",
"chars": 1535,
"preview": "/**\n * @author Matt C [matt@artemisbot.uk]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Operati"
},
{
"path": "src/core/operations/AvroToJSON.mjs",
"chars": 2129,
"preview": "/**\n * @author jarrodconnolly [jarrod@nestedquotes.ca]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nim"
},
{
"path": "src/core/operations/BLAKE2b.mjs",
"chars": 2601,
"preview": "/**\n * @author h345983745\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nimport Operation from \"../Opera"
},
{
"path": "src/core/operations/BLAKE2s.mjs",
"chars": 2592,
"preview": "/**\n * @author h345983745\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nimport Operation from \"../Opera"
},
{
"path": "src/core/operations/BLAKE3.mjs",
"chars": 1516,
"preview": "/**\n * @author xumptex [xumptex@outlook.fr]\n * @copyright Crown Copyright 2025\n * @license Apache-2.0\n */\n\nimport Operat"
},
{
"path": "src/core/operations/BSONDeserialise.mjs",
"chars": 1529,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2018\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/BSONSerialise.mjs",
"chars": 1492,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2018\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/BaconCipherDecode.mjs",
"chars": 4746,
"preview": "/**\n * @author Karsten Silkenbäumer [github.com/kassi]\n * @copyright Karsten Silkenbäumer 2019\n * @license Apache-2.0\n *"
},
{
"path": "src/core/operations/BaconCipherEncode.mjs",
"chars": 2988,
"preview": "/**\n * @author Karsten Silkenbäumer [github.com/kassi]\n * @copyright Karsten Silkenbäumer 2019\n * @license Apache-2.0\n *"
},
{
"path": "src/core/operations/Bcrypt.mjs",
"chars": 1714,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/BcryptCompare.mjs",
"chars": 1398,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/BcryptParse.mjs",
"chars": 1198,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/BifidCipherDecode.mjs",
"chars": 3483,
"preview": "/**\n * @author Matt C [matt@artemisbot.uk]\n * @copyright Crown Copyright 2018\n * @license Apache-2.0\n */\n\nimport Operati"
},
{
"path": "src/core/operations/BifidCipherEncode.mjs",
"chars": 3582,
"preview": "/**\n * @author Matt C [matt@artemisbot.uk]\n * @copyright Crown Copyright 2018\n * @license Apache-2.0\n */\n\nimport Operati"
},
{
"path": "src/core/operations/BitShiftLeft.mjs",
"chars": 1699,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/BitShiftRight.mjs",
"chars": 2162,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/BlowfishDecrypt.mjs",
"chars": 3177,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/BlowfishEncrypt.mjs",
"chars": 3069,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/BlurImage.mjs",
"chars": 3133,
"preview": "/**\n * @author j433866 [j433866@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nimport Operati"
},
{
"path": "src/core/operations/Bombe.mjs",
"chars": 8181,
"preview": "/**\n * Emulation of the Bombe machine.\n *\n * Tested against the Bombe Rebuild at Bletchley Park's TNMOC\n * using a varie"
},
{
"path": "src/core/operations/Bzip2Compress.mjs",
"chars": 2340,
"preview": "/**\n * @author Matt C [me@mitt.dev]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nimport Operation from"
},
{
"path": "src/core/operations/Bzip2Decompress.mjs",
"chars": 2166,
"preview": "/**\n * @author Matt C [me@mitt.dev]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nimport Operation from"
},
{
"path": "src/core/operations/CBORDecode.mjs",
"chars": 1158,
"preview": "/**\n * @author Danh4 [dan.h4@ncsc.gov.uk]\n * @copyright Crown Copyright 2020\n * @license Apache-2.0\n */\n\nimport Operatio"
},
{
"path": "src/core/operations/CBOREncode.mjs",
"chars": 1152,
"preview": "/**\n * @author Danh4 [dan.h4@ncsc.gov.uk]\n * @copyright Crown Copyright 2020\n * @license Apache-2.0\n */\n\nimport Operatio"
},
{
"path": "src/core/operations/CMAC.mjs",
"chars": 5145,
"preview": "/**\n * @author mikecat\n * @copyright Crown Copyright 2022\n * @license Apache-2.0\n */\n\nimport Operation from \"../Operatio"
},
{
"path": "src/core/operations/CRCChecksum.mjs",
"chars": 51710,
"preview": "/**\n * @author r4mos [2k95ljkhg@mozmail.com]\n * @copyright Crown Copyright 2025\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/CSSBeautify.mjs",
"chars": 1001,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport vkbea"
},
{
"path": "src/core/operations/CSSMinify.mjs",
"chars": 990,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport vkbea"
},
{
"path": "src/core/operations/CSSSelector.mjs",
"chars": 2508,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/CSVToJSON.mjs",
"chars": 2049,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2018\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/CTPH.mjs",
"chars": 1330,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/CaesarBoxCipher.mjs",
"chars": 1665,
"preview": "/**\n * @author n1073645 [n1073645@gmail.com]\n * @copyright Crown Copyright 2020\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/CaretMdecode.mjs",
"chars": 2953,
"preview": "/**\n * @author tedk [tedk@ted.do]\n * @copyright Crown Copyright 2024\n * @license Apache-2.0\n */\n\nimport Operation from \""
},
{
"path": "src/core/operations/CartesianProduct.mjs",
"chars": 2643,
"preview": "/**\n * @author d98762625 [d98762625@gmail.com]\n * @copyright Crown Copyright 2018\n * @license Apache-2.0\n */\n\nimport Ope"
},
{
"path": "src/core/operations/CetaceanCipherDecode.mjs",
"chars": 1621,
"preview": "/**\n * @author dolphinOnKeys [robin@weird.io]\n * @copyright Crown Copyright 2022\n * @license Apache-2.0\n */\n\nimport Oper"
},
{
"path": "src/core/operations/CetaceanCipherEncode.mjs",
"chars": 1380,
"preview": "/**\n * @author dolphinOnKeys [robin@weird.io]\n * @copyright Crown Copyright 2022\n * @license Apache-2.0\n */\n\nimport Oper"
},
{
"path": "src/core/operations/ChaCha.mjs",
"chars": 7327,
"preview": "/**\n * @author joostrijneveld [joost@joostrijneveld.nl]\n * @copyright Crown Copyright 2022\n * @license Apache-2.0\n */\n\ni"
},
{
"path": "src/core/operations/ChangeIPFormat.mjs",
"chars": 4328,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/ChiSquare.mjs",
"chars": 1240,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2017\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/CipherSaber2Decrypt.mjs",
"chars": 1812,
"preview": "/**\n * @author n1073645 [n1073645@gmail.com]\n * @copyright Crown Copyright 2020\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/CipherSaber2Encrypt.mjs",
"chars": 1954,
"preview": "/**\n * @author n1073645 [n1073645@gmail.com]\n * @copyright Crown Copyright 2020\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/CitrixCTX1Decode.mjs",
"chars": 1720,
"preview": "/**\n * @author bwhitn [brian.m.whitney@gmail.com]\n * @copyright Crown Copyright 2018\n * @license Apache-2.0\n */\n\nimport "
},
{
"path": "src/core/operations/CitrixCTX1Encode.mjs",
"chars": 1251,
"preview": "/**\n * @author bwhitn [brian.m.whitney@gmail.com]\n * @copyright Crown Copyright 2018\n * @license Apache-2.0\n */\n\nimport "
},
{
"path": "src/core/operations/Colossus.mjs",
"chars": 19563,
"preview": "/**\n * Emulation of Colossus.\n *\n * Tested against the Colossus Rebuild at Bletchley Park's TNMOC\n * using a variety of "
},
{
"path": "src/core/operations/Comment.mjs",
"chars": 1190,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2018\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/CompareCTPHHashes.mjs",
"chars": 1461,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/CompareSSDEEPHashes.mjs",
"chars": 1412,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/ConditionalJump.mjs",
"chars": 2560,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2018\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/ContainImage.mjs",
"chars": 4815,
"preview": "/**\n * @author j433866 [j433866@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nimport Operati"
},
{
"path": "src/core/operations/ConvertArea.mjs",
"chars": 3705,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/ConvertCoordinateFormat.mjs",
"chars": 3074,
"preview": "/**\n * @author j433866 [j433866@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nimport Operati"
},
{
"path": "src/core/operations/ConvertDataUnits.mjs",
"chars": 3598,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/ConvertDistance.mjs",
"chars": 3053,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/ConvertImageFormat.mjs",
"chars": 4146,
"preview": "/**\n * @author j433866 [j433866@gmail.com]\n * @copyright Crown Copyright 2019\n * @license Apache-2.0\n */\n\nimport Operati"
},
{
"path": "src/core/operations/ConvertLeetSpeak.mjs",
"chars": 2309,
"preview": "/**\n * @author bartblaze []\n * @copyright Crown Copyright 2025\n * @license Apache-2.0\n */\n\nimport Operation from \"../Ope"
},
{
"path": "src/core/operations/ConvertMass.mjs",
"chars": 5459,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
},
{
"path": "src/core/operations/ConvertSpeed.mjs",
"chars": 3442,
"preview": "/**\n * @author n1474335 [n1474335@gmail.com]\n * @copyright Crown Copyright 2016\n * @license Apache-2.0\n */\n\nimport Opera"
}
]
// ... and 671 more files (download for full content)
About this extraction
This page contains the full source code of the gchq/CyberChef GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 871 files (5.9 MB), approximately 1.6M tokens, and a symbol index with 3366 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.