/* eslint no-console: 0 */ /** * nodeApi.js * * Test node api operations * * Aim of these tests is to ensure each arg type is * handled correctly by the wrapper. * * Generally just checking operations that use external dependencies to ensure * it behaves as expected in Node. * * @author d98762625 [d98762625@gmail.com] * @copyright Crown Copyright 2018 * @license Apache-2.0 */ import assert from "assert"; import it from "../assertionHandler"; import fs from "fs"; import { addLineNumbers, adler32Checksum, AESDecrypt, affineCipherDecode, affineCipherEncode, bifidCipherEncode, bitShiftRight, cartesianProduct, CSSMinify, toBase64, toHex, } from "../../../src/node/index"; import chef from "../../../src/node/index"; import TestRegister from "../../TestRegister"; TestRegister.addApiTests([ it("ADD: toggleString argument", () => { const result = chef.ADD("sample input", { key: { string: "some key", option: "Hex" } }); assert.equal(result.toString(), "aO[^ZS\u000eW\\^cb"); }), it("addLineNumbers: No arguments", () => { const result = addLineNumbers("sample input"); assert.equal(result.toString(), "1 sample input"); }), it("adler32Checksum: No args", () => { const result = adler32Checksum("sample input"); assert.equal(result.toString(), "1f2304d3"); }), it("AES decrypt: toggleString and option", () => { const result = AESDecrypt("812c34ae6af353244a63c6ce23b7c34286b60be28ea4645523d4494700e7", { key: { string: "some longer key1", option: "utf8", }, iv: { string: "some iv", option: "utf8", }, mode: "OFB", }); assert.equal(result.toString(), "a slightly longer sampleinput?"); }), it("AffineCipherDecode: number input", () => { const result = affineCipherDecode("some input", { a: 7, b: 4 }); assert.strictEqual(result.toString(), "cuqa ifjgr"); }), it("affineCipherEncode: number input", () => { const result = affineCipherEncode("some input", { a: 11, b: 6 }); assert.strictEqual(result.toString(), "weiy qtpsh"); }), it("analyzeHash", () => { const result = chef.analyseHash(chef.MD5("some input")); const expected = `Hash length: 32 Byte length: 16 Bit length: 128 Based on the length, this hash could have been generated by one of the following hashing functions: MD5 MD4 MD2 HAVAL-128 RIPEMD-128 Snefru Tiger-128`; assert.strictEqual(result.toString(), expected); }), it("AND", () => { const result = chef.AND("Scot-free", { key: "Raining Cats and Dogs", }); assert.strictEqual(result.toString(), ".\"M$(D E."); }), it("atBash Cipher", () => { const result = chef.atbashCipher("Happy as a Clam"); assert.strictEqual(result.toString(), "Szkkb zh z Xozn"); }), it("Bcrypt", () => { const result = chef.bcrypt("Put a Sock In It"); assert.strictEqual(result.toString(), "$2a$10$ODeP1.6fMsb.ENk2ngPUCO7qTGVPyHA9TqDVcyupyed8FjsiF65L6"); }), it("bcryptCompare", () => { const result = chef.bcryptCompare("Put a Sock In It", { hash: "$2a$10$2rT4a3XnIecBsd1H33dMTuyYE1HJ1n9F.V2rjQtAH73rh1qvOf/ae", }); assert.strictEqual(result.toString(), "Match: Put a Sock In It"); }), it("Bcrypt Parse", () => { const result = chef.bcryptParse("$2a$10$ODeP1.6fMsb.ENk2ngPUCO7qTGVPyHA9TqDVcyupyed8FjsiF65L6"); const expected = `Rounds: 10 Salt: $2a$10$ODeP1.6fMsb.ENk2ngPUCO Password hash: 7qTGVPyHA9TqDVcyupyed8FjsiF65L6 Full hash: $2a$10$ODeP1.6fMsb.ENk2ngPUCO7qTGVPyHA9TqDVcyupyed8FjsiF65L6`; assert.strictEqual(result.toString(), expected); }), it("bifid cipher decode", () => { const result = chef.bifidCipherDecode("Vhef Qnte Ke Xfhz Mxon Bmgf", { keyword: "Alpha", }); assert.strictEqual(result.toString(), "What Goes Up Must Come Down"); }), it("bifid cipher encode: string option", () => { const result = bifidCipherEncode("some input", { keyword: "mykeyword", }); assert.strictEqual(result.toString(), "nmhs zmsdo"); }), it("bit shift left", () => { const result = chef.bitShiftLeft("Keep Your Eyes Peeled"); assert.strictEqual(result.toString(), ".ÊÊà@²Þêä@.òÊæ@ ÊÊØÊÈ"); }), it("bitShiftRight: number and option", () => { const result = bitShiftRight("some bits to shift", { type: "Arithmetic shift", amount: 1, }); assert.strictEqual(result.toString(), "9762\u001014:9\u0010:7\u00109443:"); }), it("Blowfish encrypt", () => { const result = chef.blowfishEncrypt("Fool's Gold", { key: { string: "One", option: "hex", }, iv: { string: "Two", option: "utf8" } }); assert.strictEqual(result.toString(), "8999b513bf2ff064b2977dea7e05f1b5"); }), it("Blowfish decrypt", () => { const result = chef.blowfishDecrypt("8999b513bf2ff064b2977dea7e05f1b5", { key: { string: "One", option: "hex", }, iv: { string: "Two", option: "utf8", } }); assert.strictEqual(result.toString(), "Fool's Gold"); }), it("BSON Deserialise", () => { const result = chef.BSONDeserialise("....phrase.....Mouth-watering.."); assert.strictEqual(result.toString(), "{\"phrase\": \"Mouth-watering\"}"); }), it("BSON Serialise", () => { const result = chef.BSONSerialise({"phrase": "Mouth-watering"}); assert.strictEqual(result.toString(), " ....phrase.....Mouth-watering.."); }), it("Bzip2 Decompress", () => { const result = chef.bzip2Decompress(chef.fromBase64("QlpoOTFBWSZTWUdQlt0AAAIVgEAAAQAmJAwAIAAxBkxA0A2pTL6U2CozxdyRThQkEdQlt0A=")); assert.strictEqual(result.toString(), "Fit as a Fiddle"); }), it("cartesianProduct: binary string", () => { const result = cartesianProduct("1:2\\n\\n3:4", { itemDelimiter: ":", }); assert.strictEqual(result.toString(), "(1,3):(1,4):(2,3):(2,4)"); }), it("Change IP format", () => { const result = chef.changeIPFormat("172.20.23.54", { inputFormat: "Dotted Decimal", outputFormat: "Hex", }); assert.strictEqual(result.toString(), "ac141736"); }), it("Chi square", () => { const result = chef.chiSquare("Burst Your Bubble"); assert.strictEqual(result.toString(), "433.55399816176475"); }), it("Compare CTPH Hashes", () => { const result = chef.compareCTPHHashes("1234\n3456"); assert.strictEqual(result.toString(), "0"); }), it("Compare SSDEEPHashes", () => { const result = chef.compareCTPHHashes("1234\n3456"); assert.strictEqual(result.toString(), "0"); }), it("Convert area", () => { const result = chef.convertArea("12345", { inputUnits: "Square metre (sq m)", outputUnits: "Isle of Wight" }); assert.strictEqual(result.toString(), "0.00003248684210526316"); }), it("Convert data units", () => { const result = chef.convertDataUnits("12345", { inputUnits: "Bits (b)", outputUnits: "Kilobytes (KB)", }); assert.strictEqual(result.toString(), "1.543125"); }), it("Convert distance", () => { const result = chef.convertDistance("1234567", { inputUnits: "Nanometres (nm)", outputUnits: "Furlongs (fur)", }); assert.strictEqual(result.toString(), "0.00000613699494949495"); }), it("Convert mass", () => { const result = chef.convertMass("123", { inputUnits: "Earth mass (M⊕)", outputUnits: "Great Pyramid of Giza (6,000,000 tonnes)", }); assert.strictEqual(result.toString(), "122429895000000000"); }), it("Convert speed", () => { const result = chef.convertSpeed("123", { inputUnits: "Lunar escape velocity", outputUnits: "Jet airliner cruising speed", }); assert.strictEqual(result.toString(), "1168.5"); }), it("Count occurrences", () => { const result = chef.countOccurrences("Talk the Talk", { searchString: { string: "Tal", option: "Simple string", } }); assert.strictEqual(result.toString(), "2"); }), it("CRC16 Checksum", () => { const result = chef.CRC16Checksum("Rain on Your Parade"); assert.strictEqual(result.toString(), "db1c"); }), it("CRC32 Checksum", () => { const result = chef.CRC32Checksum("Rain on Your Parade"); assert.strictEqual(result.toString(), "e902f76c"); }), it("CSS Beautify", () => { const result = chef.CSSBeautify("header {color:black;padding:3rem;}"); const expected = `header { \\tcolor:black; \\tpadding:3rem; } `; assert.strictEqual(result.toString(), expected); }), it("CSS minify: boolean", () => { const input = `header { // comment width: 100%; color: white; }`; const result = CSSMinify(input, { preserveComments: true, }); assert.strictEqual(result.toString(), "header {// comment width: 100%;color: white;}"); }), it("CSS Selector", () => { const result = chef.CSSSelector("

Hello

", { cssSelector: "h1", }); assert.strictEqual(result.toString(), "

Hello

"); }), it("CTPH", () => { const result = chef.CTPH("If You Can't Stand the Heat, Get Out of the Kitchen"); assert.strictEqual(result.toString(), "A:+EgFgBKAA0V0UFfClEs6:+Qk0gUFse"); }), it("Decode NetBIOS Name", () => { assert.strictEqual(chef.decodeNetBIOSName("EBGMGMCAEHHCGFGFGLCAFEGPCAENGFCA").toString(), "All Greek To Me"); }), it("Decode text", () => { const encoded = chef.encodeText("Ugly Duckling", { encoding: "UTF16LE (1200)", }); const result = chef.decodeText(encoded, { encoding: "UTF16LE (1200)", }); assert.strictEqual(result.toString(), "Ugly Duckling"); }), it("Derive EVP Key", () => { const result = chef.deriveEVPKey("", { passphrase: { string: "46 6c 65 61 20 4d 61 72 6b 65 74", option: "Hex", }, salt: { string: "Market", option: "Hex", }, }); assert.strictEqual(result.toString(), "7c21a9f5063a4d62fb1050068245c181"); }), it("Derive PBKDF2 Key", () => { const result = chef.derivePBKDF2Key("", { passphrase: { string: "Jack of All Trades Master of None", option: "utf8", }, keySize: 256, iterations: 2, hashingFunction: "md5", salt: { string: "fruit", option: "utf8" } }); assert.strictEqual(result.toString(), "728a885b209e8b19cbd7430ca32608ff09190f7ccb7ded204e1d4c50f87c47bf"); }), it("DES Decrypt", () => { const result = chef.DESDecrypt("713081c66db781c323965ba8f166fd8c230c3bb48504a913", { key: { string: "onetwoth", option: "utf8", }, iv: { string: "threetwo", option: "Hex", }, mode: "ECB", }); assert.strictEqual(result.toString(), "Put a Sock In It"); }), it("DES Encrypt", () => { const result = chef.DESEncrypt("Put a Sock In It", { key: { string: "onetwoth", option: "utf8", }, iv: { string: "threetwo", option: "Hex", }, mode: "ECB", }); assert.strictEqual(result.toString(), "713081c66db781c323965ba8f166fd8c230c3bb48504a913"); }), it("Diff", () => { const result = chef.diff("one two\\n\\none two three"); assert.strictEqual(result.toString(), "one two three"); }), it("Disassemble x86", () => { const result = chef.disassembleX86(chef.toBase64("one two three")); const expected = `0000000000000000 0000 ADD BYTE PTR [RAX],AL\r 0000000000000002 0B250000000B OR ESP,DWORD PTR [000000000B000008]\r `; assert.strictEqual(result.toString(), expected); }), it("Divide", () => { assert.strictEqual(chef.divide("4\n7").toString(), "0.57142857142857142857"); }), it("Drop bytes", () => { assert.strictEqual(chef.dropBytes("There's No I in Team").toString(), "'s No I in Team"); }), it("Entropy", () => { const result = chef.entropy("Ride Him, Cowboy!"); assert.strictEqual(result.toString(), "3.734521664779752"); }), it("Escape string", () => { const result = chef.escapeString("Know the Ropes", { escapeLevel: "Everything", JSONCompatible: false, ES6Compatible: true, uppercaseHex: true, }); assert.strictEqual(result.toString(), "\\x4B\\x6E\\x6F\\x77\\x20\\x74\\x68\\x65\\x20\\x52\\x6F\\x70\\x65\\x73"); }), it("Escape unicode characters", () => { assert.strictEqual(chef.escapeUnicodeCharacters("σου").toString(), "\\u03C3\\u03BF\\u03C5"); }), it("Expand alphabet range", () => { assert.strictEqual( chef.expandAlphabetRange("Fight Fire With Fire", {delimiter: "t"}).toString(), "Ftitgthttt tFtitrtet tWtitttht tFtitrte"); }), it("Extract dates", () => { assert.strictEqual(chef.extractDates("Don't Look a Gift Horse In The Mouth 01/02/1992").toString(), "01/02/1992\n"); }), it("Filter", () => { const result = chef.filter( `I Smell a Rat Every Cloud Has a Silver Lining Top Drawer`, { regex: "Every", }); const expected = "Every Cloud Has a Silver Lining"; assert.strictEqual(result.toString(), expected); }), it("Find / Replace", () => { assert.strictEqual( chef.findReplace( "Curiosity Killed The Cat", { find: { string: "l", option: "Regex", }, replace: "s", }).toString(), "Curiosity Kissed The Cat"); }), it("Fletcher8 Checksum", () => { assert.strictEqual(chef.fletcher8Checksum("Keep Your Eyes Peeled").toString(), "48"); }), it("Format MAC addresses", () => { const result = chef.formatMACAddresses("00-01-02-03-04-05"); const expected = `000102030405 000102030405 00-01-02-03-04-05 00-01-02-03-04-05 00:01:02:03:04:05 00:01:02:03:04:05 `; assert.strictEqual(result.toString(), expected); }), it("Frequency distribution", () => { const result = chef.frequencyDistribution("Don't Count Your Chickens Before They Hatch"); const expected = "{\"dataLength\":43,\"percentages\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13.953488372093023,0,0,0,0,0,0,2.3255813953488373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.3255813953488373,4.651162790697675,2.3255813953488373,0,0,0,2.3255813953488373,0,0,0,0,0,0,0,0,0,0,0,2.3255813953488373,0,0,0,0,2.3255813953488373,0,0,0,0,0,0,0,2.3255813953488373,0,4.651162790697675,0,9.30232558139535,2.3255813953488373,0,6.976744186046512,2.3255813953488373,0,2.3255813953488373,0,0,6.976744186046512,9.30232558139535,0,0,4.651162790697675,2.3255813953488373,6.976744186046512,4.651162790697675,0,0,0,2.3255813953488373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"distribution\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,4,1,0,3,1,0,1,0,0,3,4,0,0,2,1,3,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"bytesRepresented\":22}"; assert.strictEqual(result.toString(), expected); }), it("From base", () => { assert.strictEqual(chef.fromBase("11", {radix: 13}).toString(), "14"); }), it("From BCD", () => { assert.strictEqual(chef.fromBCD("1143", { inputFormat: "Raw", scheme: "7 4 2 1"}).toString(), "31313433"); }), it("From binary", () => { assert.strictEqual(chef.fromBinary("010101011100101101011010").toString(), "UËZ"); }), it("From Charcode", () => { assert.strictEqual(chef.fromCharcode("4c 6f 6e 67 20 49 6e 20 54 68 65 20 54 6f 6f 74 68 0a").toString(), "Long In The Tooth\n"); }), it("From decimal", () => { assert.strictEqual(chef.fromDecimal("72 101 108 108 111").toString(), "Hello"); }), it("From hex", () => { assert.strictEqual(chef.fromHex("52 69 6e 67 20 41 6e 79 20 42 65 6c 6c 73 3f").toString(), "Ring Any Bells?"); }), it("From hex content", () => { assert.strictEqual(chef.fromHexContent("foo|3d|bar").toString(), "foo=bar"); }), it("To and From hex dump", () => { assert.strictEqual(chef.fromHexdump(chef.toHexdump("Elephant in the Room")).toString(), "Elephant in the Room"); }), it("From HTML entity", () => { assert.strictEqual(chef.fromHTMLEntity("&").toString(), "&"); }), it("To and From morse code", () => { assert.strictEqual(chef.fromMorseCode(chef.toMorseCode("Put a Sock In It")).toString(), "PUT A SOCK IN IT"); }), it("From octal", () => { assert.strictEqual(chef.fromOctal("113 156 157 167 40 164 150 145 40 122 157 160 145 163").toString(), "Know the Ropes"); }), it("To, From punycode", () => { assert.strictEqual(chef.fromPunycode(chef.toPunycode("münchen")).toString(), "münchen"); }), it("From unix timestamp", () => { assert.strictEqual(chef.fromUNIXTimestamp("978346800").toString(), "Mon 1 January 2001 11:00:00 UTC"); }), it("Generate HOTP", () => { const result = chef.generateHOTP("Cut The Mustard", { name: "colonel", }); const expected = `URI: otpauth://hotp/colonel?secret=IN2XIICUNBSSATLVON2GC4TE Password: 034148`; assert.strictEqual(result.toString(), expected); }), it("Generate PGP Key Pair", () => { const result = chef.generatePGPKeyPair("Back To the Drawing Board", { keyType: "ECC-256", }); const expected = `-----BEGIN PGP PRIVATE KEY BLOCK----- Version: Keybase OpenPGP v2.0.77 Comment: https://keybase.io/crypto xYgEW3KciQEBAK96Lx9G0WZiw1yhC35IogdumoxEJXsLdAVIjmskXeAfABEBAAEA AP4wK+OZu3AqojwtRoyIK1pHKU93OAuam1iaLCOGCwCckQCA5PjU0aLNZqy/eKyX T3rpKQCAxDDT5hHGAUfFPUu73KWABwB/WKpeUp7KwurMSbYVhgr1TijszQDCVAQT AQoAHgUCW3KciQIbLwMLCQcDFQoIAh4BAheAAxYCAQIZAQAKCRD0VeyUMgmpz3OE AP9qsnhhoK85Tnu6VKwKm1iMiJAssDQnFztDaMmmVdrN/MeIBFtynIkBAQDDhjIw fxOprqVMYLk6aC45JyPAA2POzu0Zb/rx0tKeBwARAQABAAD/XAr66oiP9ZORHiT0 XZH4m7vwZt7AHuq4pYtVlMQXk60AgPw2Mno/wStvE/SBa9R7AtsAgMZ2BkJjvNPZ 9YA6cl4lW0UAgI1+kJVLZ5VR9fPENfJR80EtncKDBBgBCgAPBQJbcpyJBQkPCZwA AhsuAEgJEPRV7JQyCanPPSAEGQEKAAYFAltynIkACgkQrewgWMQZ/b2blwD/dbwh /3F9xv+YGAwq8i1mzzswg4qBct6LoSIjGglULT9RIQD/cYd31YfKrEnbSBWD5PLi zcSsxtBGKphwXiPAlQJ1Q5DHiARbcpyJAQEAs8V418lf1T74PpAwdBTiViEUX9jB e+ZrAEVaq5nu1C8AEQEAAQAA/iPWhS23hnRTllealR4/H5OofZRwxvIQrxAJp6z1 ICRxAIDayRpCAbK5EC3DzRU2z4VpAIDSWYSs9inI1VTfamJPMWHXAIC3aaukzCP4 GEGeFobX/thnKhnCgwQYAQoADwUCW3KciQUJA8JnAAIbLgBICRD0VeyUMgmpzz0g BBkBCgAGBQJbcpyJAAoJEB4jzL1hmQIXamUA/0c1M6BSqVtxNowPcOAXKYIxMca1 VFcRWolHnZqdZQ7k/J8A/3HvNLRS3p1HvjQEfXl/qKoRRn843Py09ptDHh+xpGKh =d+Vp -----END PGP PRIVATE KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- Version: Keybase OpenPGP v2.0.77 Comment: https://keybase.io/crypto xi0EW3KciQEBAK96Lx9G0WZiw1yhC35IogdumoxEJXsLdAVIjmskXeAfABEBAAHN AMJUBBMBCgAeBQJbcpyJAhsvAwsJBwMVCggCHgECF4ADFgIBAhkBAAoJEPRV7JQy CanPc4QA/2qyeGGgrzlOe7pUrAqbWIyIkCywNCcXO0NoyaZV2s38zi0EW3KciQEB AMOGMjB/E6mupUxguTpoLjknI8ADY87O7Rlv+vHS0p4HABEBAAHCgwQYAQoADwUC W3KciQUJDwmcAAIbLgBICRD0VeyUMgmpzz0gBBkBCgAGBQJbcpyJAAoJEK3sIFjE Gf29m5cA/3W8If9xfcb/mBgMKvItZs87MIOKgXLei6EiIxoJVC0/USEA/3GHd9WH yqxJ20gVg+Ty4s3ErMbQRiqYcF4jwJUCdUOQzi0EW3KciQEBALPFeNfJX9U++D6Q MHQU4lYhFF/YwXvmawBFWquZ7tQvABEBAAHCgwQYAQoADwUCW3KciQUJA8JnAAIb LgBICRD0VeyUMgmpzz0gBBkBCgAGBQJbcpyJAAoJEB4jzL1hmQIXamUA/0c1M6BS qVtxNowPcOAXKYIxMca1VFcRWolHnZqdZQ7k/J8A/3HvNLRS3p1HvjQEfXl/qKoR Rn843Py09ptDHh+xpGKh =ySwG -----END PGP PUBLIC KEY BLOCK-----`; assert.strictEqual(result.toString(), expected); }), it("Generate UUID", () => { const result = chef.generateUUID(); assert.ok(result.toString()); assert.strictEqual(result.toString().length, 36); }), it("Gzip, Gunzip", () => { assert.strictEqual(chef.gunzip(chef.gzip("Down To The Wire")).toString(), "Down To The Wire"); }), it("Hex to Object Identifier", () => { assert.strictEqual( chef.hexToObjectIdentifier(chef.toHex("You Can't Teach an Old Dog New Tricks")).toString(), "2.9.111.117.32.67.97.110.39.116.32.84.101.97.99.104.32.97.110.32.79.108.100.32.68.111.103.32.78.101.119.32.84.114.105.99.107.115"); }), it("Hex to PEM", () => { const result = chef.hexToPEM(chef.toHex("Yada Yada")); const expected = `-----BEGIN CERTIFICATE-----\r WWFkYSBZYWRh\r -----END CERTIFICATE-----\r\n`; assert.strictEqual(result.toString(), expected); }), it("HMAC", () => { assert.strictEqual(chef.HMAC("On Cloud Nine", {key: "idea"}).toString(), "b128b48ec0d6b0f1a27220c396d0f3e5"); }), it("Javascript beautify", () => { const result = chef.javaScriptBeautify("const b = 2, g = 7;const fun = (a) => {return a*a};"); const expected = `const b = 2, g = 7; const fun = a => { return a * a;' };`; assert.strictEqual(result.toString(), expected); }), it("JavaScript Minify", () => { const result = chef.javaScriptMinify(`const b = 2, g = 7; const fun = a => { return a * a; };`); const expected = "const b = 2, g = 7;const fun = (a) => {return a*a};"; assert.strictEqual(result.toString(), expected); }), it("JavaScript Parse", () => { const result = chef.javaScriptParser("const b = 2;"); const expected = `{ "type": "Program", "body": [ { "type": "VariableDeclaration", "declarations": [ { "type": "VariableDeclarator", "id": { "type": "Identifier", "name": "b" }, "init": { "type": "Literal", "value": 2, "raw": "2" } } ], "kind": "const" } ], "sourceType": "script" }`; assert.strictEqual(result.toString(), expected); }), it("JPathExpression", () => { assert.strictEqual(chef.JPathExpression("{\"key\" : \"value\"}", {query: "$.key"}).toString(), "\"value\""); }), it("JSON Beautify", () => { assert.strictEqual( chef.JSONBeautify("{\"key\" : \"value\"}").toString(), `{ \\t"key": "value" }`); }), it("Keccak", () => { assert.strictEqual(chef.keccak("Flea Market").toString(), "c2a06880b19e453ee5440e8bd4c2024bedc15a6630096aa3f609acfd2b8f15f27cd293e1cc73933e81432269129ce954a6138889ce87831179d55dcff1cc7587"); }), it("MD6", () => { assert.strictEqual(chef.MD6("Head Over Heels", {key: "arty"}).toString(), "d8f7fe4931fbaa37316f76283d5f615f50ddd54afdc794b61da522556aee99ad"); }), it("Parse ASN.1 Hex string", () => { assert.strictEqual(chef.parseASN1HexString(chef.toHex("Mouth-watering")).toString(), "UNKNOWN(4d) 7574682d7761746572696e67\n"); }), it("Parse DateTime", () => { const result = chef.parseDateTime("06/07/2001 01:59:30"); const expected = `Date: Friday 6th July 2001 Time: 01:59:30 Period: AM Timezone: UTC UTC offset: +0000 Daylight Saving Time: false Leap year: false Days in this month: 31 Day of year: 187 Week number: 2001 Quarter: 3`; assert.strictEqual(result.toString(), expected); }), it("Parse IPV6 address", () => { const result = chef.parseIPv6Address("2001:0db8:85a3:0000:0000:8a2e:0370:7334"); const expected = `Longhand: 2001:0db8:85a3:0000:0000:8a2e:0370:7334 Shorthand: 2001:db8:85a3::8a2e:370:7334 This is a documentation IPv6 address. This range should be used whenever an example IPv6 address is given or to model networking scenarios. Corresponds to 192.0.2.0/24, 198.51.100.0/24, and 203.0.113.0/24 in IPv4. Documentation range: 2001:db8::/32`; assert.strictEqual(result.toString(), expected); }), it("Parse URI", () => { const result = chef.parseURI("https://www.google.co.uk/search?q=almonds"); const expected = `Protocol: https: Hostname: www.google.co.uk Path name: /search Arguments: \tq = almonds `; assert.strictEqual(result.toString(), expected); }), it("Parse user agent", () => { const result = chef.parseUserAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0 "); const expected = `Browser Name: Mozilla Version: 5.0 Device Model: unknown Type: unknown Vendor: unknown Engine Name: Gecko Version: 47.0 OS Name: Windows Version: 7 CPU Architecture: amd64`; assert.strictEqual(result.toString(), expected); }), it("PGP Encrypt", () => { const pbkey = `-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 mI0EVWOihAEEALzwFAVWTrD0KiWCH5tX6q6QsGjlRn4IP2uj/xWsJZDNbCKm+JAe 1RvIootpW1+PNNMJlIInwUgtCjtJ9gZbGBpXeqwdSn0oYuj9X86ekXOUnZsRoPCj RwS8kpbrvRVfhWN8hYuXFcXK2J2Ld0ZpVyJzkncpFdpAgzTPMfrO1HS5ABEBAAG0 GmdwZyBuYW1lIChjb21tZW50KSA8ZW1AaWw+iLgEEwECACIFAlVjooQCGwMGCwkI BwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEBg8dTRwi4g5I40D/2+uUuQxa3uMrAeI dXLaJWz3V0cl1rotfBP47apDUGbkm1HVgULJUo8Bo15Ii83ST8TUsyja3XcLutHb IwYSWo41gEV48+NKoN6Oy3HwqBoHfH06bu0If75vdSjnZpB2dO/Ph7L9kz78gc4y tZx4bE64MTlL2AYghZxyYpFyydjXuI0EVWOihAEEANE4UU+4iB2hMAXq93hiBzIh AMtn/DlWbJkpdUgrjKOG6tILs28mrw9rI4PivmT7grkyNW8sa3ATsmWC1xChxGTN T1guyh0Hhbc3Otfng2BFSWcBkPwUoNaOdrVFpP9J51IYrsQHsjbZlY45ghDBzM6t sISfkmmFCsp0l7w/XAcvABEBAAGInwQYAQIACQUCVWOihAIbDAAKCRAYPHU0cIuI OQ2BA/9KWqOhXZW75ac7CuJMfileZR7vRy9CkKyNG21cZtAlqftAX+m8FGdG0duU jKHiPvjXhSfP3lmrQ7brja9LgSzkiBqQzvPW55G67nGQdUC+mqZNJNlRh+8atf9I 5nxg2i8zn6F5cLaNWz7cl27m1/mXKcH3gult1PLR4PiYLiC9aw== =xw3e -----END PGP PUBLIC KEY BLOCK-----`; const result = chef.PGPEncrypt("A Fool and His Money are Soon Parted", { publicKeyOfRecipient: pbkey, }); const expected = `-----BEGIN PGP MESSAGE----- Version: Keybase OpenPGP v2.0.77 Comment: https://keybase.io/crypto wYwDv1kIXPPNwmABA/4syW+oO+S/mfpjdp83/MZJiKh6XNQoPr/N5/1Is/QXYu9V /v8/b+eReOpUVC6cVrJ8U5cB19y1Az3NQWHXLEC0jND2wL3cUM4sv87hlvv2PLhc okv8OHNCitRiweo7NZHVygHGdFvY082G47e1PkyPAuVynvzdD450ta/s/KOxZdJg ARbZIrC6WmjYNLwhbpRYawKD+3N4I5qliRpU2POKRi9UROAW9dth6egy60TTCvyO jmPGsv1elXxVzqs58UZLD2c3vBhGkU2BV6kRKh+lj/EcVrzsFhGCz/7DKxPoDHLS =IBYt -----END PGP MESSAGE----- `; assert.strictEqual(result.toString(), expected); }), it("Raw deflate", () => { assert.strictEqual(chef.rawInflate(chef.rawDeflate("Like Father Like Son", { compressionType: "Fixed Huffman Coding"})).toString(), "Like Father Like Son"); }), it("RC4", () => { assert.strictEqual( chef.RC4("Go Out On a Limb", {passphrase: {string: "Under Your Nose", option: "UTF8"}, inputFormat: "UTF8", outputFormat: "Hex"}).toString(), "7d17e60d9bc94b7f4095851c729e69a2"); }), it("RC4 Drop", () => { assert.strictEqual( chef.RC4Drop("Go Out On a Limb", {passphrase: {string: "Under Your Nose", option: "UTF8"}, inputFormat: "UTF8", outputFormat: "Hex"}).toString(), "8fa5f2751d34476a0c857439f43816cf"); }), it("Regular Expression", () => { assert.strictEqual(chef.regularExpression("Wouldn't Harm a Fly", {regex: "\\'[a-z]"}).toString(), "Wouldn't Harm a Fly"); }), it("Remove EXIF", () => { const picBuffer = fs.readFileSync("test/tests/nodeApi/sampleData/pic.jpg"); const result = chef.removeEXIF(picBuffer); assert.strictEqual(result.toString().length(), 4582); }), it("Scan for embedded files", () => { const result = chef.scanForEmbeddedFiles(fs.readFileSync("test/tests/nodeApi/sampleData/pic.jpg")); const expected = `Scanning data for 'magic bytes' which may indicate embedded files. The following results may be false positives and should not be treat as reliable. Any suffiently long file is likely to contain these magic bytes coincidentally. Offset 0 (0x00): File extension: jpg MIME type: image/jpeg Offset 30 (0x1e): File extension: tif MIME type: image/tiff Offset 212 (0xd4): File extension: txt MIME type: text/plain Description: UTF-8 encoded Unicode byte order mark detected, commonly but not exclusively seen in text files. 16 file types were detected that have common byte sequences. These are likely to be false positives. Run this operation with the 'Ignore common byte sequences' option unchecked to see details.`; assert.strictEqual(result.toString(), expected); }), it("Scrypt", () => { assert.strictEqual( chef.scrypt("Playing For Keeps", {salt: {string: "salty", option: "Hex"}}).toString(), "5446b6d86d88515894a163201765bceed0bc39610b1506cdc4d939ffc638bc46e051bce756e2865165d89d955a43a7eb5504502567dea8bfc9e7d49aaa894c07"); }), it("SHA3", () => { assert.strictEqual( chef.SHA3("benign gravel").toString(), "2b1e36e0dbe151a89887be08da3bad141908cce62327f678161bcf058627e87abe57e3c5fce6581678714e6705a207acbd5c1f37f7a812280bc2cc558f00bed9"); }), it("Shake", () => { assert.strictEqual( chef.shake("murderous bloodshed").toString(), "b79b3bb88099330bc6a15122f8dfaededf57a33b51c748d5a94e8122ff18d21e12f83412926b7e4a77a85ba6f36aa4841685e78296036337175e40096b5ac000"); }), it("Snefru", () => { assert.strictEqual( chef.snefru("demeaning milestone").toString(), "a671b48770fe073ce49e9259cc2f47d345a53712639f8ae23c5ad3fec19540a5"); }), it("SQL Beautify", () => { const result = chef.SQLBeautify(`SELECT MONTH, ID, RAIN_I, TEMP_F FROM STATS;`); const expected = `SELECT MONTH, ID, RAIN_I, TEMP_F FROM STATS;`; assert.strictEqual(result.toString(), expected); }), it("SSDEEP", () => { assert.strictEqual( chef.SSDEEP("shotgun tyranny snugly").toString(), "3:DLIXzMQCJc:XERKc"); }), it("strings", () => { const result = chef.strings("smothering ampersand abreast"); const expected = `Total found: 1 smothering ampersand abreast `; assert.strictEqual(result.toString(), expected); }), it("toBase64: editableOption", () => { const result = toBase64("some input", { alphabet: { value: "0-9A-W" }, }); assert.strictEqual(result.toString(), "SPI1R1T0"); }), it("toBase64: editableOptions key is value", () => { const result = toBase64("some input", { alphabet: "0-9A-W", }); assert.strictEqual(result.toString(), "SPI1R1T0"); }), it("toBase64: editableOptions default", () => { const result = toBase64("some input"); assert.strictEqual(result.toString(), "c29tZSBpbnB1dA=="); }), it("To BCD", () => { assert.strictEqual(chef.toBCD("443").toString(), "0100 0100 0011"); }), it("To CamelCase", () => { assert.strictEqual(chef.toCamelCase("Quickest Wheel").toString(), "quickestWheel"); }), it("toHex: accepts args", () => { const result = toHex("some input", { delimiter: "Colon", }); assert.strictEqual(result.toString(), "73:6f:6d:65:20:69:6e:70:75:74"); }), it("To Kebab case", () => { assert.strictEqual(chef.toKebabCase("Elfin Gold").toString(), "elfin-gold"); }), it("To punycode", () => { assert.strictEqual(chef.toPunycode("♠ ♣ ♥ ♦ ← ↑ ‍ →").toString(), " -m06cw7klao368lfb3aq"); }), it("to snake case", () => { assert.strictEqual(chef.toSnakeCase("Abhorrent Grass").value, "abhorrent_grass"); }), it("to unix timestamp", () => { assert.strictEqual(chef.toUNIXTimestamp("04/01/2001").toString(), "986083200 (Sun 1 April 2001 00:00:00 UTC)"); }), it("Translate DateTime format", () => { assert.strictEqual(chef.translateDateTimeFormat("01/04/1999 22:33:01").toString(), "01/04/1999 22:33:01"); }), it("Triple DES encrypt / decrypt", () => { assert.strictEqual( chef.tripleDESDecrypt( chef.tripleDESEncrypt("Destroy Money", {key: {string: "30 31 2f 30 34 2f 31 39 39 39 20 32 32 3a 33 33 3a 30 3130 31 2f 30 34", option: "Hex"}}), {key: {string: "30 31 2f 30 34 2f 31 39 39 39 20 32 32 3a 33 33 3a 30 3130 31 2f 30 34", option: "Hex"}}).toString(), "Destroy Money"); }), it("UNIX Timestamp to Windows Filetime", () => { assert.strictEqual(chef.UNIXTimestampToWindowsFiletime("2020735").toString(), "116464943350000000"); }), it("XML Beautify", () => { assert.strictEqual( chef.XMLBeautify("abc").toString(), ` \\tabc `); }), it("XPath expression", () => { assert.strictEqual( chef.XPathExpression("abc", {xPath: "contact-info/company"}).toString(), "abc"); }), it("Zlib deflate / inflate", () => { assert.strictEqual(chef.zlibInflate(chef.zlibDeflate("cut homer wile rooky grits dizen")).toString(), "cut homer wile rooky grits dizen"); }), it("Detect file type", () => { assert.strictEqual( chef.detectFileType(fs.readFileSync("test/tests/nodeApi/sampleData/pic.jpg")).toString(), `File extension: jpg MIME type: image/jpeg`); }), it("extract EXIF", () => { assert.strictEqual( chef.extractEXIF(fs.readFileSync("test/tests/nodeApi/sampleData/pic.jpg")).toString(), `Found 7 tags. Orientation: 1 XResolution: 72 YResolution: 72 ResolutionUnit: 2 ColorSpace: 1 ExifImageWidth: 57 ExifImageHeight: 57`); }), ]);