typescript-virtual-container 1.2.3 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -2
- package/biome.json +9 -0
- package/dist/SSHMimic/index.d.ts.map +1 -1
- package/dist/SSHMimic/index.js +17 -1
- package/dist/VirtualShell/index.d.ts.map +1 -1
- package/dist/VirtualShell/index.js +1 -17
- package/dist/VirtualUserManager/index.d.ts +16 -3
- package/dist/VirtualUserManager/index.d.ts.map +1 -1
- package/dist/VirtualUserManager/index.js +50 -21
- package/dist/standalone.js +7 -9
- package/package.json +3 -2
- package/src/SSHMimic/index.ts +28 -1
- package/src/VirtualShell/index.ts +1 -27
- package/src/VirtualUserManager/index.ts +51 -26
- package/src/standalone.ts +12 -9
- package/standalone.js +92 -0
- package/standalone.js.map +7 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["src/commands/adduser.ts", "src/commands/command-helpers.ts", "src/commands/helpers.ts", "src/commands/cat.ts", "src/commands/cd.ts", "src/commands/clear.ts", "src/commands/curl.ts", "src/commands/deluser.ts", "src/commands/set.ts", "src/commands/echo.ts", "src/commands/env.ts", "src/commands/exit.ts", "src/commands/export.ts", "src/commands/grep.ts", "src/commands/help.ts", "src/commands/hostname.ts", "src/commands/htop.ts", "src/commands/ls.ts", "src/commands/mkdir.ts", "src/commands/nano.ts", "src/modules/neofetch.ts", "src/commands/neofetch.ts", "src/commands/passwd.ts", "src/commands/pwd.ts", "src/commands/rm.ts", "src/commands/sh.ts", "src/commands/su.ts", "src/commands/sudo.ts", "src/commands/touch.ts", "src/commands/tree.ts", "src/commands/unset.ts", "src/commands/wget.ts", "src/SSHMimic/loginFormat.ts", "src/commands/who.ts", "src/commands/whoami.ts", "src/VirtualShell/shellParser.ts", "src/SSHMimic/executor.ts", "src/commands/index.ts", "node_modules/asn1/lib/ber/errors.js", "node_modules/asn1/lib/ber/types.js", "node_modules/safer-buffer/safer.js", "node_modules/asn1/lib/ber/reader.js", "node_modules/asn1/lib/ber/writer.js", "node_modules/asn1/lib/ber/index.js", "node_modules/asn1/lib/index.js", "node_modules/tweetnacl/nacl-fast.js", "node_modules/bcrypt-pbkdf/index.js", "node_modules/ssh2/lib/protocol/constants.js", "node_modules/ssh2/lib/protocol/utils.js", "node_modules/ssh2/lib/protocol/crypto/poly1305.js", "node_modules/ssh2/lib/protocol/crypto.js", "node_modules/ssh2/lib/protocol/keyParser.js", "node_modules/ssh2/lib/agent.js", "node_modules/ssh2/lib/protocol/zlib.js", "node_modules/ssh2/lib/protocol/handlers.misc.js", "node_modules/ssh2/lib/protocol/handlers.js", "node_modules/ssh2/lib/protocol/kex.js", "node_modules/ssh2/package.json", "node_modules/ssh2/lib/protocol/Protocol.js", "node_modules/ssh2/lib/protocol/node-fs-compat.js", "node_modules/ssh2/lib/protocol/SFTP.js", "node_modules/ssh2/lib/Channel.js", "node_modules/ssh2/lib/utils.js", "node_modules/ssh2/lib/client.js", "node_modules/ssh2/lib/http-agents.js", "node_modules/ssh2/lib/server.js", "node_modules/ssh2/lib/keygen.js", "node_modules/ssh2/lib/index.js", "src/utils/perfLogger.ts", "src/Honeypot/index.ts", "src/SSHClient/index.ts", "src/SSHMimic/index.ts", "src/VirtualShell/index.ts", "src/VirtualFileSystem/index.ts", "src/VirtualFileSystem/path.ts", "src/VirtualUserManager/index.ts", "src/VirtualShell/shell.ts", "src/modules/shellInteractive.ts", "src/modules/shellRuntime.ts", "src/SSHMimic/prompt.ts", "src/SSHMimic/exec.ts", "src/SSHMimic/hostKey.ts", "src/SSHMimic/sftp.ts", "src/index.ts", "src/standalone.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ShellModule } from \"../types/commands\";\n\nexport const adduserCommand: ShellModule = {\n\tname: \"adduser\",\n\tparams: [\"<username> <password>\"],\n\trun: async ({ authUser, shell, args }) => {\n\t\tif (authUser !== \"root\") {\n\t\t\treturn { stderr: \"adduser: permission denied\", exitCode: 1 };\n\t\t}\n\n\t\tconst [username, password] = args;\n\t\tif (!username || !password) {\n\t\t\treturn {\n\t\t\t\tstderr: \"adduser: usage: adduser <username> <password>\",\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\n\t\tawait shell.users.addUser(username, password);\n\t\treturn { stdout: `adduser: user '${username}' created`, exitCode: 0 };\n\t},\n};\n", "type ArgParseOptions = {\n\tflags?: string[];\n\tflagsWithValue?: string[];\n};\n\nfunction toFlagList(flags: string | string[]): string[] {\n\treturn Array.isArray(flags) ? flags : [flags];\n}\n\nfunction matchFlagToken(\n\ttoken: string,\n\tflag: string,\n): { matched: boolean; inlineValue: string | null } {\n\tif (token === flag) {\n\t\treturn { matched: true, inlineValue: null };\n\t}\n\n\tconst prefix = `${flag}=`;\n\tif (token.startsWith(prefix)) {\n\t\treturn { matched: true, inlineValue: token.slice(prefix.length) };\n\t}\n\n\treturn { matched: false, inlineValue: null };\n}\n\nfunction collectPositionals(\n\targs: string[],\n\toptions: ArgParseOptions = {},\n): string[] {\n\tconst boolFlags = new Set(options.flags ?? []);\n\tconst valueFlags = new Set(options.flagsWithValue ?? []);\n\tconst positionals: string[] = [];\n\tlet passthrough = false;\n\n\tfor (let index = 0; index < args.length; index += 1) {\n\t\tconst arg = args[index]!;\n\n\t\tif (passthrough) {\n\t\t\tpositionals.push(arg);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === \"--\") {\n\t\t\tpassthrough = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet consumed = false;\n\n\t\tfor (const flag of boolFlags) {\n\t\t\tconst { matched } = matchFlagToken(arg, flag);\n\t\t\tif (matched) {\n\t\t\t\tconsumed = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (consumed) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (const flag of valueFlags) {\n\t\t\tconst match = matchFlagToken(arg, flag);\n\t\t\tif (!match.matched) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconsumed = true;\n\t\t\tif (match.inlineValue === null && index + 1 < args.length) {\n\t\t\t\tindex += 1;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\tif (!consumed) {\n\t\t\tpositionals.push(arg);\n\t\t}\n\t}\n\n\treturn positionals;\n}\n\nexport function ifFlag(args: string[], flags: string | string[]): boolean {\n\tconst allFlags = toFlagList(flags);\n\n\tfor (const arg of args) {\n\t\tfor (const flag of allFlags) {\n\t\t\tif (matchFlagToken(arg, flag).matched) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function getFlag(\n\targs: string[],\n\tflags: string | string[],\n): string | true | undefined {\n\tconst allFlags = toFlagList(flags);\n\n\tfor (let index = 0; index < args.length; index += 1) {\n\t\tconst arg = args[index]!;\n\n\t\tfor (const flag of allFlags) {\n\t\t\tconst match = matchFlagToken(arg, flag);\n\t\t\tif (!match.matched) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (match.inlineValue !== null) {\n\t\t\t\treturn match.inlineValue;\n\t\t\t}\n\n\t\t\tconst next = args[index + 1];\n\t\t\tif (next !== undefined && next !== \"--\") {\n\t\t\t\treturn next;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nexport function getArg(\n\targs: string[],\n\tindex: number,\n\toptions: ArgParseOptions = {},\n): string | undefined {\n\tconst positionals = collectPositionals(args, options);\n\treturn positionals[index];\n}\n\n/**\n * Parse arguments into flags, flags with values, and positionals.\n * @param args - Array of arguments to parse.\n * @param options - Parsing options for flags and flags with values.\n * @returns Parsed arguments as { flags, flagsWithValues, positionals }.\n */\nexport function parseArgs(\n\targs: string[],\n\toptions: { flags?: string[]; flagsWithValue?: string[] } = {},\n): {\n\tflags: Set<string>;\n\tflagsWithValues: Map<string, string>;\n\tpositionals: string[];\n} {\n\tconst flags = new Set<string>();\n\tconst flagsWithValues = new Map<string, string>();\n\tconst positionals: string[] = [];\n\tconst boolFlags = new Set(options.flags ?? []);\n\tconst valueFlags = new Set(options.flagsWithValue ?? []);\n\tlet passthrough = false;\n\n\tfor (let index = 0; index < args.length; index += 1) {\n\t\tconst arg = args[index]!;\n\n\t\tif (passthrough) {\n\t\t\tpositionals.push(arg);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (arg === \"--\") {\n\t\t\tpassthrough = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (boolFlags.has(arg)) {\n\t\t\tflags.add(arg);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (valueFlags.has(arg)) {\n\t\t\tconst next = args[index + 1];\n\t\t\tif (next && !next.startsWith(\"-\")) {\n\t\t\t\tflagsWithValues.set(arg, next);\n\t\t\t\tindex += 1;\n\t\t\t} else {\n\t\t\t\tflagsWithValues.set(arg, \"\");\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst inlineFlag = Array.from(valueFlags).find((flag) =>\n\t\t\targ.startsWith(`${flag}=`),\n\t\t);\n\t\tif (inlineFlag) {\n\t\t\tflagsWithValues.set(inlineFlag, arg.slice(inlineFlag.length + 1));\n\t\t\tcontinue;\n\t\t}\n\n\t\tpositionals.push(arg);\n\t}\n\n\treturn { flags, flagsWithValues, positionals };\n}\n", "import { spawn } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport type VirtualFileSystem from \"../VirtualFileSystem\";\n\nconst PROTECTED_PREFIXES = [\"/virtual-env-js/.auth\"] as const;\n\nfunction normalizeFetchUrl(input: string): string {\n\tif (/^[a-zA-Z][a-zA-Z\\d+\\-.]*:/.test(input)) {\n\t\treturn input;\n\t}\n\n\treturn `http://${input}`;\n}\n\nexport function normalizeTerminalOutput(text: string): string {\n\treturn text\n\t\t.replace(/\\r\\n/g, \"\\n\")\n\t\t.replace(/\\r/g, \"\\n\")\n\t\t.replace(/\\t/g, \" \")\n\t\t.split(\"\\n\")\n\t\t.map((line) =>\n\t\t\tline.replace(/^[ \\u00A0]{8,}/, \" \").replace(/[ \\u00A0]{3,}/g, \" \"),\n\t\t)\n\t\t.join(\"\\n\")\n\t\t.replace(/\\n{3,}/g, \"\\n\\n\")\n\t\t.trimEnd();\n}\n\nexport function resolvePath(cwd: string, inputPath: string): string {\n\tif (!inputPath || inputPath.trim() === \"\") {\n\t\treturn cwd;\n\t}\n\treturn inputPath.startsWith(\"/\")\n\t\t? path.posix.normalize(inputPath)\n\t\t: path.posix.normalize(path.posix.join(cwd, inputPath));\n}\n\nfunction isProtectedPath(targetPath: string): boolean {\n\tconst normalized = targetPath.startsWith(\"/\")\n\t\t? path.posix.normalize(targetPath)\n\t\t: path.posix.normalize(`/${targetPath}`);\n\n\treturn PROTECTED_PREFIXES.some(\n\t\t(prefix) => normalized === prefix || normalized.startsWith(`${prefix}/`),\n\t);\n}\n\nexport function assertPathAccess(\n\tauthUser: string,\n\ttargetPath: string,\n\toperation: string,\n): void {\n\tif (authUser === \"root\") {\n\t\treturn;\n\t}\n\n\tif (isProtectedPath(targetPath)) {\n\t\tthrow new Error(`${operation}: permission denied: ${targetPath}`);\n\t}\n}\n\nexport function stripUrlFilename(url: string): string {\n\tconst cleaned = url.split(\"?\")[0]?.split(\"#\")[0] ?? url;\n\tconst lastPart = cleaned.split(\"/\").filter(Boolean).pop();\n\treturn lastPart && lastPart.length > 0 ? lastPart : \"index.html\";\n}\n\nexport async function fetchResource(\n\turl: string,\n): Promise<{ text: string; status: number; contentType: string | null }> {\n\tconst response = await fetch(normalizeFetchUrl(url));\n\tconst contentType = response.headers.get(\"content-type\");\n\treturn {\n\t\ttext: await response.text(),\n\t\tstatus: response.status,\n\t\tcontentType,\n\t};\n}\n\n/**\n * Run a host command like curl or wget and capture its output.\n * @param binary - The binary to execute (e.g., \"curl\", \"wget\").\n * @param args - Arguments to pass to the binary.\n * @returns Promise resolving with stdout, stderr, and exit code.\n */\nexport function runHostCommand(\n\tbinary: string,\n\targs: string[],\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n\treturn new Promise((resolve) => {\n\t\tlet childProcess: ReturnType<typeof spawn>;\n\n\t\ttry {\n\t\t\tchildProcess = spawn(binary, args, {\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tresolve({\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: `${binary}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\texitCode: 1,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tconst stdoutStream = childProcess.stdout;\n\t\tconst stderrStream = childProcess.stderr;\n\n\t\tif (!stdoutStream || !stderrStream) {\n\t\t\tresolve({\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: `${binary}: failed to capture process output`,\n\t\t\t\texitCode: 1,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tstdoutStream.setEncoding(\"utf8\");\n\t\tstderrStream.setEncoding(\"utf8\");\n\n\t\tstdoutStream.on(\"data\", (chunk: string) => {\n\t\t\tstdout += chunk;\n\t\t});\n\n\t\tstderrStream.on(\"data\", (chunk: string) => {\n\t\t\tstderr += chunk;\n\t\t});\n\n\t\tchildProcess.on(\"error\", (error) => {\n\t\t\tconst errorCode =\n\t\t\t\terror instanceof Error && \"code\" in error\n\t\t\t\t\t? String((error as NodeJS.ErrnoException).code ?? \"\")\n\t\t\t\t\t: \"\";\n\t\t\tresolve({\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: `${binary}: ${error.message}`,\n\t\t\t\texitCode: errorCode === \"ENOENT\" ? 127 : 1,\n\t\t\t});\n\t\t});\n\n\t\tchildProcess.on(\"close\", (code) => {\n\t\t\tresolve({\n\t\t\t\tstdout,\n\t\t\t\tstderr,\n\t\t\t\texitCode: code ?? 1,\n\t\t\t});\n\t\t});\n\t});\n}\n\nfunction levenshtein(a: string, b: string): number {\n\tconst dp: number[][] = Array.from({ length: a.length + 1 }, () =>\n\t\tArray<number>(b.length + 1).fill(0),\n\t);\n\n\tfor (let i = 0; i <= a.length; i += 1) {\n\t\tdp[i]![0] = i;\n\t}\n\tfor (let j = 0; j <= b.length; j += 1) {\n\t\tdp[0]![j] = j;\n\t}\n\n\tfor (let i = 1; i <= a.length; i += 1) {\n\t\tfor (let j = 1; j <= b.length; j += 1) {\n\t\t\tconst cost = a[i - 1] === b[j - 1] ? 0 : 1;\n\t\t\tdp[i]![j] = Math.min(\n\t\t\t\tdp[i - 1]![j]! + 1,\n\t\t\t\tdp[i]![j - 1]! + 1,\n\t\t\t\tdp[i - 1]![j - 1]! + cost,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn dp[a.length]![b.length]!;\n}\n\nexport function resolveReadablePath(\n\tvfs: VirtualFileSystem,\n\tcwd: string,\n\tinputPath: string,\n): string {\n\tconst exactPath = resolvePath(cwd, inputPath);\n\tif (vfs.exists(exactPath)) {\n\t\treturn exactPath;\n\t}\n\n\tconst parent = path.posix.dirname(exactPath);\n\tconst fileName = path.posix.basename(exactPath);\n\tconst siblings = vfs.list(parent);\n\n\tconst caseInsensitive = siblings.filter(\n\t\t(name) => name.toLowerCase() === fileName.toLowerCase(),\n\t);\n\tif (caseInsensitive.length === 1) {\n\t\treturn path.posix.join(parent, caseInsensitive[0]!);\n\t}\n\n\tconst near = siblings.filter(\n\t\t(name) => levenshtein(name.toLowerCase(), fileName.toLowerCase()) <= 1,\n\t);\n\tif (near.length === 1) {\n\t\treturn path.posix.join(parent, near[0]!);\n\t}\n\n\treturn exactPath;\n}\n\nexport function joinListWithType(\n\tcwd: string,\n\titems: string[],\n\tstatAt: (p: string) => { type: \"file\" | \"directory\" },\n): string {\n\treturn items\n\t\t.map((name) => {\n\t\t\tconst childPath = resolvePath(cwd, name);\n\t\t\tconst stats = statAt(childPath);\n\t\t\treturn stats.type === \"directory\" ? `${name}/` : name;\n\t\t})\n\t\t.join(\" \");\n}\n", "import type { ShellModule } from \"../types/commands\";\nimport { getArg } from \"./command-helpers\";\nimport { assertPathAccess, resolveReadablePath } from \"./helpers\";\n\nexport const catCommand: ShellModule = {\n\tname: \"cat\",\n\tparams: [\"<file>\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tconst fileArg = getArg(args, 0);\n\t\tif (!fileArg) {\n\t\t\treturn { stderr: \"cat: missing file operand\", exitCode: 1 };\n\t\t}\n\n\t\tconst target = resolveReadablePath(shell.vfs, cwd, fileArg);\n\t\tassertPathAccess(authUser, target, \"cat\");\n\t\treturn { stdout: shell.vfs.readFile(target), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const cdCommand: ShellModule = {\n\tname: \"cd\",\n\tparams: [\"[path]\"],\n\trun: ({ authUser, shell, cwd, args, mode }) => {\n\t\tconst target = resolvePath(cwd, args[0] ?? \"/virtual-env-js\");\n\t\tassertPathAccess(authUser, target, \"cd\");\n\t\tconst stats = shell.vfs.stat(target);\n\t\tif (stats.type !== \"directory\") {\n\t\t\treturn { stderr: `cd: not a directory: ${target}`, exitCode: 1 };\n\t\t}\n\n\t\tif (mode === \"exec\") {\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\n\t\treturn { nextCwd: target, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const clearCommand: ShellModule = {\n\tname: \"clear\",\n\tparams: [],\n\trun: () => ({ clearScreen: true, exitCode: 0 }),\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { parseArgs } from \"./command-helpers\";\nimport {\n\tassertPathAccess,\n\tnormalizeTerminalOutput,\n\tresolvePath,\n\trunHostCommand,\n} from \"./helpers\";\n\nexport const curlCommand: ShellModule = {\n\tname: \"curl\",\n\tparams: [\"[-o file] <url>\"],\n\trun: async ({ authUser, cwd, args, shell }) => {\n\t\tconst { flagsWithValues, positionals } = parseArgs(args, {\n\t\t\tflagsWithValue: [\"-o\", \"--output\"],\n\t\t});\n\t\tconst outputPath =\n\t\t\tflagsWithValues.get(\"-o\") || flagsWithValues.get(\"--output\") || null;\n\t\tconst url = positionals[0];\n\n\t\tif (!url) {\n\t\t\treturn { stderr: \"curl: missing URL\", exitCode: 1 };\n\t\t}\n\n\t\tconst passthroughArgs = outputPath\n\t\t\t? [...positionals, \"-o\", \"-\"]\n\t\t\t: positionals;\n\t\tconst result = await runHostCommand(\"curl\", passthroughArgs);\n\n\t\tif (result.exitCode !== 0) {\n\t\t\treturn {\n\t\t\t\tstderr: normalizeTerminalOutput(\n\t\t\t\t\tresult.stderr || `curl: exited with code ${result.exitCode}`,\n\t\t\t\t),\n\t\t\t\texitCode: result.exitCode,\n\t\t\t};\n\t\t}\n\n\t\tif (outputPath) {\n\t\t\tconst target = resolvePath(cwd, outputPath);\n\t\t\tassertPathAccess(authUser, target, \"curl\");\n\t\t\tshell.writeFileAsUser(authUser, target, result.stdout);\n\t\t\treturn {\n\t\t\t\tstderr: result.stderr\n\t\t\t\t\t? normalizeTerminalOutput(result.stderr)\n\t\t\t\t\t: undefined,\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tstdout: result.stdout,\n\t\t\tstderr: result.stderr\n\t\t\t\t? normalizeTerminalOutput(result.stderr)\n\t\t\t\t: undefined,\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const deluserCommand: ShellModule = {\n\tname: \"deluser\",\n\tparams: [\"<username>\"],\n\trun: async ({ authUser, args, shell }) => {\n\t\tif (authUser !== \"root\") {\n\t\t\treturn { stderr: \"deluser: permission denied\", exitCode: 1 };\n\t\t}\n\n\t\tconst [username] = args;\n\t\tif (!username) {\n\t\t\treturn { stderr: \"deluser: usage: deluser <username>\", exitCode: 1 };\n\t\t}\n\n\t\tawait shell.users.deleteUser(username);\n\t\treturn { stdout: `deluser: user '${username}' deleted`, exitCode: 0 };\n\t},\n};\n", "/** biome-ignore-all lint/style/useNamingConvention: env variables */\nimport type { ShellModule } from \"../types/commands\";\nimport { getArg } from \"./command-helpers\";\n\n// Simple in-memory environment variables store\n// In a real implementation, this would be per-session/per-user\nconst envVars: Record<string, string> = {\n\tPATH: \"/usr/local/bin:/usr/bin:/bin\",\n\tHOME: \"/home/user\",\n\tSHELL: \"/bin/sh\",\n\tTERM: \"xterm-256color\",\n\tUSER: \"user\",\n};\n\nexport function getEnvVar(name: string): string | undefined {\n\treturn envVars[name];\n}\n\nexport function setEnvVar(name: string, value: string): void {\n\tenvVars[name] = value;\n}\n\nexport function getAllEnvVars(authUser: string): Record<string, string> {\n\tenvVars.USER = authUser;\n\tenvVars.HOME = `/home/${authUser}`;\n\treturn { ...envVars };\n}\n\nexport const setCommand: ShellModule = {\n\tname: \"set\",\n\tparams: [\"[VAR=value]\"],\n\trun: ({ args }) => {\n\t\t// No arguments: display all environment variables\n\t\tif (args.length === 0) {\n\t\t\tconst output = Object.entries(envVars)\n\t\t\t\t.map(([key, value]) => `${key}=${value}`)\n\t\t\t\t.sort()\n\t\t\t\t.join(\"\\n\");\n\n\t\t\treturn { stdout: output, exitCode: 0 };\n\t\t}\n\n\t\t// Parse VAR=value format\n\t\tconst assignments: string[] = [];\n\t\tfor (let index = 0; ; index += 1) {\n\t\t\tconst arg = getArg(args, index);\n\t\t\tif (!arg) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (arg.includes(\"=\")) {\n\t\t\t\tconst [varName, varValue] = arg.split(\"=\", 2);\n\t\t\t\tif (varName && varValue !== undefined) {\n\t\t\t\t\tsetEnvVar(varName, varValue);\n\t\t\t\t\tassignments.push(arg);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If no '=' present, display that specific variable\n\t\t\t\tconst value = getEnvVar(arg);\n\t\t\t\tif (value !== undefined) {\n\t\t\t\t\tassignments.push(`${arg}=${value}`);\n\t\t\t\t} else {\n\t\t\t\t\tassignments.push(`${arg}: not set`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tstdout: assignments.length > 0 ? assignments.join(\"\\n\") : \"\",\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { parseArgs } from \"./command-helpers\";\nimport { getAllEnvVars } from \"./set\";\n\nfunction expandEnvVars(input: string, env: Record<string, string>): string {\n\treturn input.replace(/\\$([A-Za-z_][A-Za-z0-9_]*)/g, (_, name: string) => {\n\t\treturn env[name] ?? \"\";\n\t});\n}\n\nexport const echoCommand: ShellModule = {\n\tname: \"echo\",\n\tparams: [\"[options] [text...]\"],\n\trun: ({ args, authUser, stdin }) => {\n\t\tconst { flags, positionals } = parseArgs(args, { flags: [\"-n\"] });\n\t\tconst newline = !flags.has(\"-n\");\n\t\tconst rawText =\n\t\t\tpositionals.length > 0 ? positionals.join(\" \") : (stdin ?? \"\");\n\t\tconst env = getAllEnvVars(authUser);\n\t\tconst text = expandEnvVars(rawText, env);\n\n\t\treturn {\n\t\t\tstdout: newline ? text : text.trimEnd(),\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getAllEnvVars } from \"./set\";\n\nexport const envCommand: ShellModule = {\n\tname: \"env\",\n\tparams: [\"[VAR=value...] [command]\"],\n\trun: ({ authUser }) => {\n\t\t// For now, just display all environment variables\n\t\t// In a full implementation, this would also handle running commands with modified env\n\n\t\tconst allVars = getAllEnvVars(authUser);\n\t\tconst envVarsOutput = Object.entries(allVars)\n\t\t\t.map(([key, value]) => `${key}=${value}`)\n\t\t\t.sort()\n\t\t\t.join(\"\\n\");\n\n\t\treturn {\n\t\t\tstdout: envVarsOutput,\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const exitCommand: ShellModule = {\n\tname: \"exit\",\n\taliases: [\"bye\"],\n\tparams: [],\n\trun: () => ({ closeSession: true, exitCode: 0 }),\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getArg } from \"./command-helpers\";\nimport { getEnvVar, setEnvVar } from \"./set\";\n\nexport const exportCommand: ShellModule = {\n\tname: \"export\",\n\tparams: [\"[VAR=value]\"],\n\trun: ({ args }) => {\n\t\t// export VAR=value or export VAR (to make it available to child processes)\n\t\tif (args.length === 0) {\n\t\t\t// List all exported variables\n\t\t\treturn {\n\t\t\t\tstdout: \"# export command - sets variables for child processes\",\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\t// Parse VAR=value format\n\t\tfor (let index = 0; ; index += 1) {\n\t\t\tconst arg = getArg(args, index);\n\t\t\tif (!arg) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (arg.includes(\"=\")) {\n\t\t\t\tconst [varName, varValue] = arg.split(\"=\", 2);\n\t\t\t\tif (varName && varValue !== undefined) {\n\t\t\t\t\tsetEnvVar(varName, varValue);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// export VAR_NAME makes it available but we just set it\n\t\t\t\tsetEnvVar(arg, getEnvVar(arg) || \"\");\n\t\t\t}\n\t\t}\n\n\t\treturn { exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { parseArgs } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const grepCommand: ShellModule = {\n\tname: \"grep\",\n\tparams: [\"[-i] [-v] <pattern> [file...]\"],\n\trun: ({ authUser, shell, cwd, args, stdin }) => {\n\t\tconst { flags, positionals } = parseArgs(args, { flags: [\"-i\", \"-v\"] });\n\t\tconst caseInsensitive = flags.has(\"-i\");\n\t\tconst invertMatch = flags.has(\"-v\");\n\t\tconst pattern = positionals[0];\n\t\tconst files = positionals.slice(1);\n\n\t\tif (!pattern) {\n\t\t\treturn { stderr: \"grep: no pattern specified\", exitCode: 1 };\n\t\t}\n\n\t\tlet regex: RegExp;\n\t\ttry {\n\t\t\tconst flags = caseInsensitive ? \"gmi\" : \"gm\";\n\t\t\tregex = new RegExp(pattern, flags);\n\t\t} catch {\n\t\t\treturn { stderr: `grep: invalid regex: ${pattern}`, exitCode: 1 };\n\t\t}\n\n\t\tconst results: string[] = [];\n\n\t\tif (files.length === 0) {\n\t\t\tif (!stdin) {\n\t\t\t\treturn { stdout: \"\", exitCode: 1 };\n\t\t\t}\n\n\t\t\tconst lines = stdin.split(\"\\n\");\n\t\t\tfor (const line of lines) {\n\t\t\t\tregex.lastIndex = 0;\n\t\t\t\tconst matches = regex.test(line);\n\t\t\t\tconst shouldInclude = invertMatch ? !matches : matches;\n\n\t\t\t\tif (shouldInclude) {\n\t\t\t\t\tresults.push(line);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstdout: results.length > 0 ? results.join(\"\\n\") : \"\",\n\t\t\t\texitCode: results.length > 0 ? 0 : 1,\n\t\t\t};\n\t\t}\n\n\t\tfor (const file of files) {\n\t\t\tconst target = resolvePath(cwd, file);\n\t\t\ttry {\n\t\t\t\tassertPathAccess(authUser, target, \"grep\");\n\t\t\t\tconst content = shell.vfs.readFile(target);\n\t\t\t\tconst lines = content.split(\"\\n\");\n\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\tregex.lastIndex = 0;\n\t\t\t\t\tconst matches = regex.test(line);\n\t\t\t\t\tconst shouldInclude = invertMatch ? !matches : matches;\n\n\t\t\t\t\tif (shouldInclude) {\n\t\t\t\t\t\tresults.push(line);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `grep: ${file}: No such file or directory`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tstdout: results.length > 0 ? results.join(\"\\n\") : \"\",\n\t\t\texitCode: results.length > 0 ? 0 : 1,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport function createHelpCommand(getNames: () => string[]): ShellModule {\n\treturn {\n\t\tname: \"help\",\n\t\tparams: [],\n\t\trun: () => ({ stdout: `Builtins: ${getNames().join(\" \")}`, exitCode: 0 }),\n\t};\n}\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const hostnameCommand: ShellModule = {\n\tname: \"hostname\",\n\tparams: [],\n\trun: ({ hostname }) => ({ stdout: hostname, exitCode: 0 }),\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const htopCommand: ShellModule = {\n\tname: \"htop\",\n\tparams: [],\n\trun: ({ mode }) => {\n\t\tif (mode === \"exec\") {\n\t\t\treturn { stderr: \"htop: interactive terminal required\", exitCode: 1 };\n\t\t}\n\n\t\treturn { openHtop: true, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getArg, ifFlag } from \"./command-helpers\";\nimport { assertPathAccess, joinListWithType, resolvePath } from \"./helpers\";\n\nfunction formatPermissions(mode: number, isDirectory: boolean): string {\n\tconst fileType = isDirectory ? \"d\" : \"-\";\n\tconst permissionBits = [\n\t\t[0o400, \"r\"],\n\t\t[0o200, \"w\"],\n\t\t[0o100, \"x\"],\n\t\t[0o040, \"r\"],\n\t\t[0o020, \"w\"],\n\t\t[0o010, \"x\"],\n\t\t[0o004, \"r\"],\n\t\t[0o002, \"w\"],\n\t\t[0o001, \"x\"],\n\t] as const;\n\tconst permissions = permissionBits\n\t\t.map(([bit, symbol]) => (mode & bit ? symbol : \"-\"))\n\t\t.join(\"\");\n\n\treturn `${fileType}${permissions}`;\n}\n\nfunction formatDate(date: Date): string {\n\treturn date.toISOString().replace(\"T\", \" \").slice(0, 16);\n}\n\nexport const lsCommand: ShellModule = {\n\tname: \"ls\",\n\tparams: [\"[path]\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tconst longFormat = ifFlag(args, [\"-l\", \"--long\"]);\n\t\tconst targetArg = getArg(args, 0, { flags: [\"-l\", \"--long\"] });\n\t\tconst target = resolvePath(cwd, targetArg ?? cwd);\n\t\tassertPathAccess(authUser, target, \"ls\");\n\t\tconst items = shell.vfs\n\t\t\t.list(target)\n\t\t\t.filter((name) => !name.startsWith(\".\"));\n\t\tconst rendered = longFormat\n\t\t\t? items\n\t\t\t\t\t.map((name) => {\n\t\t\t\t\t\tconst childPath = resolvePath(target, name);\n\t\t\t\t\t\tconst stat = shell.vfs.stat(childPath);\n\t\t\t\t\t\tconst size = stat.type === \"file\" ? stat.size : stat.childrenCount;\n\t\t\t\t\t\treturn `${formatPermissions(stat.mode, stat.type === \"directory\")} 1 ${size} ${formatDate(stat.updatedAt)} ${name}${stat.type === \"directory\" ? \"/\" : \"\"}`;\n\t\t\t\t\t})\n\t\t\t\t\t.join(\"\\n\")\n\t\t\t: joinListWithType(target, items, (p) => shell.vfs.stat(p));\n\t\treturn { stdout: rendered, exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getArg } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const mkdirCommand: ShellModule = {\n\tname: \"mkdir\",\n\tparams: [\"<dir>\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tif (args.length === 0) {\n\t\t\treturn { stderr: \"mkdir: missing operand\", exitCode: 1 };\n\t\t}\n\n\t\tfor (let index = 0; index < args.length; index++) {\n\t\t\tconst dir = getArg(args, index);\n\t\t\tif (!dir) {\n\t\t\t\treturn { stderr: \"mkdir: missing operand\", exitCode: 1 };\n\t\t\t}\n\t\t\tconst target = resolvePath(cwd, dir);\n\t\t\tassertPathAccess(authUser, target, \"mkdir\");\n\t\t\tshell.vfs.mkdir(target);\n\t\t}\n\t\treturn { exitCode: 0 };\n\t},\n};\n", "import * as path from \"node:path\";\nimport type { ShellModule } from \"../types/commands\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const nanoCommand: ShellModule = {\n\tname: \"nano\",\n\tparams: [\"<file>\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tconst fileArg = args[0];\n\t\tif (!fileArg) {\n\t\t\treturn { stderr: \"nano: missing file operand\", exitCode: 1 };\n\t\t}\n\n\t\tconst targetPath = resolvePath(cwd, fileArg);\n\t\tassertPathAccess(authUser, targetPath, \"nano\");\n\t\tconst initialContent = shell.vfs.exists(targetPath)\n\t\t\t? shell.vfs.readFile(targetPath)\n\t\t\t: \"\";\n\t\tconst safeName = path.posix.basename(targetPath) || \"buffer\";\n\t\tconst tempPath = `/tmp/sshmimic-nano-${Date.now()}-${safeName}.tmp`;\n\n\t\treturn {\n\t\t\topenEditor: {\n\t\t\t\ttargetPath,\n\t\t\t\ttempPath,\n\t\t\t\tinitialContent,\n\t\t\t},\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ShellProperties } from \"../VirtualShell\";\n\nfunction formatUptime(seconds: number): string {\n\tconst totalMinutes = Math.max(1, Math.floor(seconds / 60));\n\tconst days = Math.floor(totalMinutes / (24 * 60));\n\tconst hours = Math.floor((totalMinutes % (24 * 60)) / 60);\n\tconst minutes = totalMinutes % 60;\n\n\tconst parts: string[] = [];\n\tif (days > 0) {\n\t\tparts.push(`${days} day${days > 1 ? \"s\" : \"\"}`);\n\t}\n\tif (hours > 0) {\n\t\tparts.push(`${hours} hour${hours > 1 ? \"s\" : \"\"}`);\n\t}\n\tif (minutes > 0 || parts.length === 0) {\n\t\tparts.push(`${minutes} min${minutes > 1 ? \"s\" : \"\"}`);\n\t}\n\n\treturn parts.join(\", \");\n}\n\nfunction colorBlock(code: number): string {\n\treturn `\\u001b[${code}m \\u001b[0m`;\n}\n\nfunction buildColorBars(): string[] {\n\tconst normal = [40, 41, 42, 43, 44, 45, 46, 47].map(colorBlock).join(\"\");\n\tconst bright = [100, 101, 102, 103, 104, 105, 106, 107]\n\t\t.map(colorBlock)\n\t\t.join(\"\");\n\treturn [normal, bright];\n}\n\nfunction colorizeLogoLine(line: string, index: number, total: number): string {\n\tif (line.trim().length === 0) {\n\t\treturn line;\n\t}\n\n\tconst start = { r: 255, g: 255, b: 255 };\n\tconst end = { r: 168, g: 85, b: 247 };\n\tconst ratio = total <= 1 ? 0 : index / (total - 1);\n\n\tconst r = Math.round(start.r + (end.r - start.r) * ratio);\n\tconst g = Math.round(start.g + (end.g - start.g) * ratio);\n\tconst b = Math.round(start.b + (end.b - start.b) * ratio);\n\n\treturn `\\u001b[38;2;${r};${g};${b}m${line}\\u001b[0m`;\n}\n\nfunction colorizeDetailLine(line: string): string {\n\tif (line.trim().length === 0) {\n\t\treturn line;\n\t}\n\n\tconst colonIndex = line.indexOf(\":\");\n\n\tif (colonIndex === -1) {\n\t\t// Pas de ':', chercher '@' pour identifier user@host\n\t\tif (line.includes(\"@\")) {\n\t\t\t// C'est user@host, appliquer d\u00E9grad\u00E9 horizontal\n\t\t\treturn applyHorizontalGradient(line);\n\t\t}\n\t\t// Sinon c'est un separator ou autre, laisser tel quel\n\t\treturn line;\n\t}\n\n\t// Il y a un ':', c'est titre: valeur\n\tconst title = line.substring(0, colonIndex + 1);\n\tconst value = line.substring(colonIndex + 1);\n\n\t// Appliquer le d\u00E9grad\u00E9 seulement au titre\n\tconst colorized = applyHorizontalGradient(title);\n\treturn colorized + value;\n}\n\nfunction applyHorizontalGradient(text: string): string {\n\t// Nettoyer les codes ANSI existants\n\tconst ansiRegex = new RegExp(`${String.fromCharCode(27)}\\\\[[\\\\d;]*m`, \"g\");\n\tconst cleaned = text.replace(ansiRegex, \"\");\n\n\tif (cleaned.trim().length === 0) {\n\t\treturn text;\n\t}\n\n\tconst start = { r: 255, g: 255, b: 255 };\n\tconst end = { r: 168, g: 85, b: 247 };\n\tlet result = \"\";\n\n\tfor (let i = 0; i < cleaned.length; i += 1) {\n\t\tconst ratio = cleaned.length <= 1 ? 0 : i / (cleaned.length - 1);\n\n\t\tconst r = Math.round(start.r + (end.r - start.r) * ratio);\n\t\tconst g = Math.round(start.g + (end.g - start.g) * ratio);\n\t\tconst b = Math.round(start.b + (end.b - start.b) * ratio);\n\n\t\tresult += `\\u001b[38;2;${r};${g};${b}m${cleaned[i]}\\u001b[0m`;\n\t}\n\n\treturn result;\n}\n\nexport interface NeofetchInfo {\n\tuser: string;\n\thost: string;\n\tosName?: string;\n\tkernel?: string;\n\tuptimeSeconds?: number;\n\tpackages?: string;\n\tshell?: string;\n\tshellProps?: ShellProperties;\n\tresolution?: string;\n\tterminal?: string;\n\tcpu?: string;\n\tgpu?: string;\n\tmemoryUsedMiB?: number;\n\tmemoryTotalMiB?: number;\n}\n\nfunction toMiB(bytes: number): number {\n\treturn Math.max(0, Math.round(bytes / (1024 * 1024)));\n}\n\nfunction readOsPrettyName(): string | undefined {\n\ttry {\n\t\tconst data = readFileSync(\"/etc/os-release\", \"utf8\");\n\t\tfor (const line of data.split(\"\\n\")) {\n\t\t\tif (!line.startsWith(\"PRETTY_NAME=\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst value = line.slice(\"PRETTY_NAME=\".length).trim();\n\t\t\treturn value.replace(/^\"|\"$/g, \"\");\n\t\t}\n\t} catch {\n\t\treturn undefined;\n\t}\n\n\treturn undefined;\n}\n\nfunction readFirstLine(filePath: string): string | undefined {\n\ttry {\n\t\tconst data = readFileSync(filePath, \"utf8\").split(\"\\n\")[0]?.trim();\n\t\tif (!data || data.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn data;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction resolveHostLabel(fallback: string): string {\n\tconst vendor = readFirstLine(\"/sys/devices/virtual/dmi/id/sys_vendor\");\n\tconst product = readFirstLine(\"/sys/devices/virtual/dmi/id/product_name\");\n\n\tif (vendor && product) {\n\t\treturn `${vendor} ${product}`;\n\t}\n\tif (product) {\n\t\treturn product;\n\t}\n\n\treturn fallback;\n}\n\nfunction countDpkgPackages(): number | undefined {\n\tconst candidates = [\"/var/lib/dpkg/status\", \"/usr/local/var/lib/dpkg/status\"];\n\n\tfor (const filePath of candidates) {\n\t\tif (!existsSync(filePath)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tconst data = readFileSync(filePath, \"utf8\");\n\t\t\tconst matches = data.match(/^Package:\\s+/gm);\n\t\t\treturn matches?.length ?? 0;\n\t\t} catch {}\n\t}\n\n\treturn undefined;\n}\n\nfunction countSnapPackages(): number | undefined {\n\tconst candidates = [\"/snap\", \"/var/lib/snapd/snaps\"];\n\n\tfor (const dirPath of candidates) {\n\t\tif (!existsSync(dirPath)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tconst entries = readdirSync(dirPath, { withFileTypes: true });\n\t\t\tconst count = entries.filter((entry) => entry.isDirectory()).length;\n\t\t\treturn count;\n\t\t} catch {}\n\t}\n\n\treturn undefined;\n}\n\nfunction resolvePackagesLabel(): string {\n\tconst dpkgCount = countDpkgPackages();\n\tconst snapCount = countSnapPackages();\n\n\tif (dpkgCount !== undefined && snapCount !== undefined) {\n\t\treturn `${dpkgCount} (dpkg), ${snapCount} (snap)`;\n\t}\n\tif (dpkgCount !== undefined) {\n\t\treturn `${dpkgCount} (dpkg)`;\n\t}\n\tif (snapCount !== undefined) {\n\t\treturn `${snapCount} (snap)`;\n\t}\n\n\treturn \"n/a\";\n}\n\nfunction resolveCpuLabel(): string {\n\tconst cpus = os.cpus();\n\tif (cpus.length === 0) {\n\t\treturn \"unknown\";\n\t}\n\n\tconst first = cpus[0];\n\tif (!first) {\n\t\treturn \"unknown\";\n\t}\n\n\tconst ghz = (first.speed / 1000).toFixed(2);\n\treturn `${first.model} (${cpus.length}) @ ${ghz}GHz`;\n}\n\nfunction resolveShellLabel(shell?: string): string {\n\tif (!shell || shell.trim().length === 0) {\n\t\treturn \"unknown\";\n\t}\n\n\treturn path.posix.basename(shell.trim());\n}\n\nfunction resolveDefaults(info: NeofetchInfo): Required<NeofetchInfo> {\n\tconst totalMem = os.totalmem();\n\tconst freeMem = os.freemem();\n\tconst usedMem = Math.max(0, totalMem - freeMem);\n\tconst shellProps = info.shellProps;\n\n\tconst processUptime = process.uptime();\n\tif (info.uptimeSeconds === undefined) {\n\t\tinfo.uptimeSeconds = Math.round(processUptime);\n\t}\n\n\treturn {\n\t\tuser: info.user,\n\t\thost: info.host,\n\t\tosName:\n\t\t\tshellProps?.os ??\n\t\t\tinfo.osName ??\n\t\t\t`${readOsPrettyName() ?? os.type()} ${os.arch()}`,\n\t\tkernel: shellProps?.kernel ?? info.kernel ?? os.release(),\n\t\tuptimeSeconds: info.uptimeSeconds ?? os.uptime(),\n\t\tpackages: info.packages ?? resolvePackagesLabel(),\n\t\tshell: resolveShellLabel(info.shell),\n\t\tshellProps: (info.shellProps as ShellProperties) ?? {\n\t\t\tkernel: info.kernel ?? os.release(),\n\t\t\tos: info.osName ?? `${readOsPrettyName() ?? os.type()} ${os.arch()}`,\n\t\t\tarch: os.arch(),\n\t\t},\n\t\tresolution: info.resolution ?? \"n/a (ssh)\",\n\t\tterminal: info.terminal ?? \"unknown\",\n\t\tcpu: info.cpu ?? resolveCpuLabel(),\n\t\tgpu: info.gpu ?? \"n/a\",\n\t\tmemoryUsedMiB: info.memoryUsedMiB ?? toMiB(usedMem),\n\t\tmemoryTotalMiB: info.memoryTotalMiB ?? toMiB(totalMem),\n\t};\n}\n\nexport function buildNeofetchOutput(info: NeofetchInfo): string {\n\tconst fields = resolveDefaults(info);\n\tconst uptime = formatUptime(fields.uptimeSeconds);\n\tconst colorBars = buildColorBars();\n\n\tconst distroLogo = [\n\t\t\" .. .:. \",\n\t\t\" .::.. .. .. \",\n\t\t\". .... ... .. \",\n\t\t\": .... .:. .. \",\n\t\t\": .:.:........:. .. \",\n\t\t\": .. \",\n\t\t\". : \",\n\t\t\". : \",\n\t\t\".. : \",\n\t\t\" :. .. \",\n\t\t\" .. .. \",\n\t\t\" :-. :: \",\n\t\t\" .:. :. \",\n\t\t\" ..: ... \",\n\t\t\" ..: :.. \",\n\t\t\" :... :....\",\n\t\t\" .. ....\",\n\t\t\" . .. \",\n\t\t\" .:. .: \",\n\t\t\" :. .. \",\n\t\t\" ::. .. \",\n\t\t\"..... ..:... \",\n\t\t\"...:. .. \",\n\t\t\".:...:. ::. .. \",\n\t\t\" ... ..:::::.. ..:::::::.. \",\n\t];\n\n\tconst details = [\n\t\t`${fields.user}@${fields.host}`,\n\t\t\"-------------------------\",\n\t\t`OS: ${fields.osName}`,\n\t\t`Host: ${resolveHostLabel(fields.host)}`,\n\t\t`Kernel: ${fields.kernel}`,\n\t\t`Uptime: ${uptime}`,\n\t\t// `Packages: ${fields.packages}`,\n\t\t`Shell: ${fields.shell}`,\n\t\t// `Shell Props: ${fields.shellProps}`,\n\t\t`Resolution: ${fields.resolution}`,\n\t\t`Terminal: ${fields.terminal}`,\n\t\t`CPU: ${fields.cpu}`,\n\t\t`GPU: ${fields.gpu}`,\n\t\t`Memory: ${fields.memoryUsedMiB}MiB / ${fields.memoryTotalMiB}MiB`,\n\t\t\"\",\n\t\tcolorBars[0],\n\t\tcolorBars[1],\n\t];\n\n\tconst width = Math.max(distroLogo.length, details.length);\n\tconst lines: string[] = [];\n\n\tfor (let i = 0; i < width; i += 1) {\n\t\tconst rawLeft = distroLogo[i] ?? \"\";\n\t\tconst right = details[i] ?? \"\";\n\t\tif (right.length > 0) {\n\t\t\tconst left = colorizeLogoLine(\n\t\t\t\trawLeft.padEnd(31, \" \"),\n\t\t\t\ti,\n\t\t\t\tdistroLogo.length,\n\t\t\t);\n\t\t\tconst coloredRight = colorizeDetailLine(right);\n\t\t\tlines.push(`${left} ${coloredRight}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tlines.push(colorizeLogoLine(rawLeft, i, distroLogo.length));\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n", "import { buildNeofetchOutput } from \"../modules/neofetch\";\nimport type { ShellModule } from \"../types/commands\";\nimport { ifFlag } from \"./command-helpers\";\nimport { getAllEnvVars } from \"./set\";\n\nexport const neofetchCommand: ShellModule = {\n\tname: \"neofetch\",\n\tparams: [\"[--off]\"],\n\trun: ({ args, authUser, hostname, shell }) => {\n\t\tconst env = getAllEnvVars(authUser);\n\n\t\tif (ifFlag(args, \"--help\")) {\n\t\t\treturn {\n\t\t\t\tstdout: \"Usage: neofetch [--off]\",\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\tif (ifFlag(args, \"--off\")) {\n\t\t\treturn {\n\t\t\t\tstdout: `${authUser}@${hostname}`,\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tstdout: buildNeofetchOutput({\n\t\t\t\tuser: authUser,\n\t\t\t\thost: hostname,\n\t\t\t\tshell: env.SHELL,\n\t\t\t\tshellProps: shell.properties,\n\t\t\t\tterminal: env.TERM,\n\t\t\t}),\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const passwdCommand: ShellModule = {\n\tname: \"passwd\",\n\tparams: [\"<username> <password>\"],\n\trun: async ({ authUser, args, shell }) => {\n\t\tconst [username, password] = args;\n\t\tif (!username || !password) {\n\t\t\treturn {\n\t\t\t\tstderr: \"passwd: usage: passwd <username> <password>\",\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\n\t\tif (authUser !== \"root\" && authUser !== username) {\n\t\t\treturn { stderr: \"passwd: permission denied\", exitCode: 1 };\n\t\t}\n\n\t\tawait shell.users.setPassword(username, password);\n\t\treturn {\n\t\t\tstdout: `passwd: password updated for '${username}'`,\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const pwdCommand: ShellModule = {\n\tname: \"pwd\",\n\tparams: [],\n\trun: ({ cwd }) => ({ stdout: cwd, exitCode: 0 }),\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getArg, ifFlag } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const rmCommand: ShellModule = {\n\tname: \"rm\",\n\tparams: [\"[-r|-rf] <path>\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tif (args.length === 0) {\n\t\t\treturn { stderr: \"rm: missing operand\", exitCode: 1 };\n\t\t}\n\n\t\tconst recursive = ifFlag(args, [\"-r\", \"-rf\", \"-fr\"]);\n\t\tconst targets: string[] = [];\n\t\tfor (let index = 0; ; index += 1) {\n\t\t\tconst target = getArg(args, index, { flags: [\"-r\", \"-rf\", \"-fr\"] });\n\t\t\tif (!target) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttargets.push(target);\n\t\t}\n\n\t\tif (targets.length === 0) {\n\t\t\treturn { stderr: \"rm: missing operand\", exitCode: 1 };\n\t\t}\n\n\t\tfor (const target of targets) {\n\t\t\tconst resolvedTarget = resolvePath(cwd, target);\n\t\t\tassertPathAccess(authUser, resolvedTarget, \"rm\");\n\t\t\tshell.vfs.remove(resolvedTarget, { recursive });\n\t\t}\n\n\t\treturn { exitCode: 0 };\n\t},\n};\n", "import type { CommandContext, ShellModule } from \"../types/commands\";\nimport { getArg, getFlag } from \"./command-helpers\";\nimport { runCommand } from \"./index\";\n\n/** Simple shell script executor with basic variable support */\nexport const shCommand: ShellModule = {\n\tname: \"sh\",\n\tparams: [\"-c <script>\", \"[<file>]\"],\n\taliases: [\"bash\"],\n\trun: async (ctx: CommandContext) => {\n\t\tconst { args, authUser, hostname, mode, cwd } = ctx;\n\t\t// Handle -c option: sh -c \"command\"\n\t\tif (getFlag(args, \"-c\") && args.length >= 2) {\n\t\t\tconst script = getArg(args, 1) ?? \"\";\n\t\t\tif (!script) {\n\t\t\t\treturn { stderr: \"sh: -c requires a script\", exitCode: 1 };\n\t\t\t}\n\t\t\tconst scriptArgs = args.slice(2);\n\n\t\t\t// Split by semicolon and newline\n\t\t\tconst lines = script\n\t\t\t\t.split(/[;\\n]/)\n\t\t\t\t.map((line) => line.trim())\n\t\t\t\t.filter((line) => line && !line.startsWith(\"#\"));\n\n\t\t\tlet output = \"\";\n\t\t\tconst exitCode = 0;\n\n\t\t\tfor (const line of lines) {\n\t\t\t\t// Simple variable substitution\n\t\t\t\tlet command = line;\n\t\t\t\tfor (let i = 0; i < scriptArgs.length; i++) {\n\t\t\t\t\tconst arg = scriptArgs[i] ?? \"\";\n\t\t\t\t\tcommand = command.replaceAll(`$${i}`, arg);\n\t\t\t\t}\n\t\t\t\tcommand = command.replaceAll(\"$@\", scriptArgs.join(\" \"));\n\n\t\t\t\t// Execute the command\n\t\t\t\tconst result = await Promise.resolve(\n\t\t\t\t\trunCommand(command, authUser, hostname, mode, cwd, ctx.shell),\n\t\t\t\t);\n\n\t\t\t\tif (result.stdout) {\n\t\t\t\t\toutput += `${result.stdout}\\n`;\n\t\t\t\t}\n\n\t\t\t\tif (result.stderr) {\n\t\t\t\t\treturn { stderr: result.stderr, exitCode: result.exitCode ?? 1 };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { stdout: output.trim(), exitCode };\n\t\t}\n\n\t\treturn { stderr: \"sh: invalid usage\", exitCode: 1 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getArg } from \"./command-helpers\";\n\nexport const suCommand: ShellModule = {\n\tname: \"su\",\n\tparams: [\"- <username>\"],\n\trun: ({ authUser, shell, args }) => {\n\t\tconst users = shell.users!;\n\t\tconst targetUser = getArg(args, 0, { flags: [\"-\"] });\n\n\t\tif (!targetUser) {\n\t\t\treturn { stderr: \"su: missing username\", exitCode: 1 };\n\t\t}\n\n\t\tif (!users.isSudoer(authUser) && authUser !== \"root\") {\n\t\t\treturn { stderr: \"su: permission denied\", exitCode: 1 };\n\t\t}\n\n\t\tif (\n\t\t\t!users.verifyPassword(targetUser, getArg(args, 1) ?? \"\") &&\n\t\t\tauthUser !== \"root\"\n\t\t) {\n\t\t\treturn { stderr: \"su: authentication failure\", exitCode: 1 };\n\t\t}\n\n\t\treturn {\n\t\t\tswitchUser: targetUser,\n\t\t\tnextCwd: `/home/${targetUser}`,\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { parseArgs } from \"./command-helpers\";\nimport { runCommand } from \"./index\";\n\nfunction parseSudoArgs(args: string[]): {\n\ttargetUser: string;\n\tloginShell: boolean;\n\tcommandLine: string | null;\n} {\n\tconst { flags, flagsWithValues, positionals } = parseArgs(args, {\n\t\tflags: [\"-i\", \"-S\"],\n\t\tflagsWithValue: [\"-u\", \"--user\"],\n\t});\n\n\tconst loginShell = flags.has(\"-i\");\n\tconst targetUser =\n\t\tflagsWithValues.get(\"-u\") || flagsWithValues.get(\"--user\") || \"root\";\n\tconst commandLine = positionals.length > 0 ? positionals.join(\" \") : null;\n\n\treturn { targetUser, loginShell, commandLine };\n}\nexport const sudoCommand: ShellModule = {\n\tname: \"sudo\",\n\tparams: [\"<command...>\"],\n\trun: async ({ authUser, hostname, mode, cwd, shell, args }) => {\n\t\tconst { targetUser, loginShell, commandLine } = parseSudoArgs(args);\n\n\t\tif (authUser !== \"root\" && !shell.users.isSudoer(authUser)) {\n\t\t\treturn { stderr: \"sudo: permission denied\", exitCode: 1 };\n\t\t}\n\n\t\tconst effectiveUser = targetUser || \"root\";\n\t\tconst prompt = `[sudo] password for ${authUser}: `;\n\n\t\tif (authUser === \"root\") {\n\t\t\tif (!commandLine && loginShell) {\n\t\t\t\treturn {\n\t\t\t\t\tswitchUser: effectiveUser,\n\t\t\t\t\tnextCwd: `/home/${effectiveUser}`,\n\t\t\t\t\texitCode: 0,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!commandLine) {\n\t\t\t\treturn { stderr: \"sudo: missing command\", exitCode: 1 };\n\t\t\t}\n\n\t\t\treturn runCommand(\n\t\t\t\tcommandLine,\n\t\t\t\teffectiveUser,\n\t\t\t\thostname,\n\t\t\t\tmode,\n\t\t\t\tloginShell ? `/home/${effectiveUser}` : cwd,\n\t\t\t\tshell,\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tsudoChallenge: {\n\t\t\t\tusername: authUser,\n\t\t\t\ttargetUser: effectiveUser,\n\t\t\t\tcommandLine,\n\t\t\t\tloginShell,\n\t\t\t\tprompt,\n\t\t\t},\n\t\t\texitCode: 0,\n\t\t};\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const touchCommand: ShellModule = {\n\tname: \"touch\",\n\tparams: [\"<file>\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tif (args.length === 0) {\n\t\t\treturn { stderr: \"touch: missing file operand\", exitCode: 1 };\n\t\t}\n\n\t\tfor (const file of args) {\n\t\t\tconst target = resolvePath(cwd, file);\n\t\t\tassertPathAccess(authUser, target, \"touch\");\n\t\t\tif (!shell.vfs.exists(target)) {\n\t\t\t\tshell.writeFileAsUser(authUser, target, \"\");\n\t\t\t}\n\t\t}\n\t\treturn { exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { getArg } from \"./command-helpers\";\nimport { assertPathAccess, resolvePath } from \"./helpers\";\n\nexport const treeCommand: ShellModule = {\n\tname: \"tree\",\n\tparams: [\"[path]\"],\n\trun: ({ authUser, shell, cwd, args }) => {\n\t\tconst target = resolvePath(cwd, getArg(args, 0) ?? cwd);\n\t\tassertPathAccess(authUser, target, \"tree\");\n\t\treturn { stdout: shell.vfs.tree(target), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\nimport { setEnvVar } from \"./set\";\n\nexport const unsetCommand: ShellModule = {\n\tname: \"unset\",\n\tparams: [\"<VAR...>\"],\n\trun: ({ args }) => {\n\t\tif (args.length === 0) {\n\t\t\treturn { stderr: \"unset: missing variable name\", exitCode: 1 };\n\t\t}\n\n\t\t// Unset (remove) all specified variables\n\t\tfor (const varName of args) {\n\t\t\tsetEnvVar(varName, \"\");\n\t\t}\n\n\t\treturn { exitCode: 0 };\n\t},\n};\n", "import { spawn } from \"node:child_process\";\nimport { mkdtemp, readFile, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ShellModule } from \"../types/commands\";\nimport { ifFlag, parseArgs } from \"./command-helpers\";\nimport {\n\tassertPathAccess,\n\tnormalizeTerminalOutput,\n\tresolvePath,\n\trunHostCommand,\n\tstripUrlFilename,\n} from \"./helpers\";\n\nfunction runHostWget(args: string[]): Promise<{\n\tstdout: string;\n\tstderr: string;\n\texitCode: number;\n}> {\n\treturn new Promise((resolve) => {\n\t\tlet childProcess: ReturnType<typeof spawn>;\n\n\t\ttry {\n\t\t\tchildProcess = spawn(\"wget\", args, {\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tresolve({\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: `wget: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\texitCode: 1,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tconst stdoutStream = childProcess.stdout;\n\t\tconst stderrStream = childProcess.stderr;\n\n\t\tif (!stdoutStream || !stderrStream) {\n\t\t\tresolve({\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: \"wget: failed to capture process output\",\n\t\t\t\texitCode: 1,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tstdoutStream.setEncoding(\"utf8\");\n\t\tstderrStream.setEncoding(\"utf8\");\n\n\t\tstdoutStream.on(\"data\", (chunk: string) => {\n\t\t\tstdout += chunk;\n\t\t});\n\n\t\tstderrStream.on(\"data\", (chunk: string) => {\n\t\t\tstderr += chunk;\n\t\t});\n\n\t\tchildProcess.on(\"error\", (error) => {\n\t\t\tconst errorCode =\n\t\t\t\terror instanceof Error && \"code\" in error\n\t\t\t\t\t? String((error as NodeJS.ErrnoException).code ?? \"\")\n\t\t\t\t\t: \"\";\n\t\t\tresolve({\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: `wget: ${error.message}`,\n\t\t\t\texitCode: errorCode === \"ENOENT\" ? 127 : 1,\n\t\t\t});\n\t\t});\n\n\t\tchildProcess.on(\"close\", (code) => {\n\t\t\tresolve({\n\t\t\t\tstdout,\n\t\t\t\tstderr,\n\t\t\t\texitCode: code ?? 1,\n\t\t\t});\n\t\t});\n\t});\n}\n\nexport const wgetCommand: ShellModule = {\n\tname: \"wget\",\n\tparams: [\"[url]\"],\n\trun: async ({ authUser, cwd, args, shell }) => {\n\t\tconst { flagsWithValues, positionals } = parseArgs(args, {\n\t\t\tflagsWithValue: [\"-o\", \"-O\", \"--output\", \"--output-document\"],\n\t\t});\n\t\tconst outputPath =\n\t\t\tflagsWithValues.get(\"-o\") ||\n\t\t\tflagsWithValues.get(\"-O\") ||\n\t\t\tflagsWithValues.get(\"--output\") ||\n\t\t\tflagsWithValues.get(\"--output-document\") ||\n\t\t\tnull;\n\t\tconst url = positionals[0];\n\n\t\tif (!url) {\n\t\t\treturn { stderr: \"wget: missing URL\", exitCode: 1 };\n\t\t}\n\n\t\tconst isHelpLike = ifFlag(args, [\"-h\", \"--help\", \"-V\", \"--version\"]);\n\n\t\tif (isHelpLike) {\n\t\t\tconst result = await runHostWget(args);\n\t\t\treturn {\n\t\t\t\tstdout: normalizeTerminalOutput(result.stdout),\n\t\t\t\tstderr: result.stderr\n\t\t\t\t\t? normalizeTerminalOutput(result.stderr)\n\t\t\t\t\t: undefined,\n\t\t\t\texitCode: result.exitCode,\n\t\t\t};\n\t\t}\n\n\t\tconst tempDir = await mkdtemp(join(tmpdir(), \"virtual-env-js-wget-\"));\n\t\tconst tempFile = join(tempDir, \"download\");\n\n\t\ttry {\n\t\t\tconst hostArgs = [...positionals, \"-O\", tempFile];\n\t\t\tconst result = await runHostCommand(\"wget\", hostArgs);\n\n\t\t\tif (result.exitCode !== 0) {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: normalizeTerminalOutput(\n\t\t\t\t\t\tresult.stderr || `wget: exited with code ${result.exitCode}`,\n\t\t\t\t\t),\n\t\t\t\t\texitCode: result.exitCode,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst content = await readFile(tempFile, \"utf8\");\n\t\t\tconst target = resolvePath(cwd, outputPath || stripUrlFilename(url));\n\t\t\tassertPathAccess(authUser, target, \"wget\");\n\t\t\tshell.writeFileAsUser(authUser, target, content);\n\n\t\t\treturn {\n\t\t\t\tstdout: `saved ${target}`,\n\t\t\t\texitCode: 0,\n\t\t\t};\n\t\t} finally {\n\t\t\tawait rm(tempDir, { recursive: true, force: true });\n\t\t}\n\t},\n};\n", "export function formatLoginDate(date: Date): string {\n\tconst weekday = date.toLocaleString(\"en-US\", { weekday: \"short\" });\n\tconst month = date.toLocaleString(\"en-US\", { month: \"short\" });\n\tconst day = date.getDate().toString().padStart(2, \"0\");\n\tconst hh = date.getHours().toString().padStart(2, \"0\");\n\tconst mm = date.getMinutes().toString().padStart(2, \"0\");\n\tconst ss = date.getSeconds().toString().padStart(2, \"0\");\n\tconst year = date.getFullYear();\n\treturn `${weekday} ${month} ${day} ${hh}:${mm}:${ss} ${year}`;\n}\n", "import { formatLoginDate } from \"../SSHMimic/loginFormat\";\nimport type { ShellModule } from \"../types/commands\";\n\nexport const whoCommand: ShellModule = {\n\tname: \"who\",\n\tparams: [],\n\trun: ({ shell }) => {\n\t\tconst lines = shell.users.listActiveSessions().map((session) => {\n\t\t\tconst loginAt = new Date(session.startedAt);\n\t\t\tconst displayDate = Number.isNaN(loginAt.getTime())\n\t\t\t\t? session.startedAt\n\t\t\t\t: formatLoginDate(loginAt);\n\t\t\treturn `${session.username} ${session.tty} ${displayDate} (${session.remoteAddress || \"unknown\"})`;\n\t\t});\n\n\t\treturn { stdout: lines.join(\"\\n\"), exitCode: 0 };\n\t},\n};\n", "import type { ShellModule } from \"../types/commands\";\n\nexport const whoamiCommand: ShellModule = {\n\tname: \"whoami\",\n\tparams: [],\n\trun: ({ authUser }) => ({ stdout: authUser, exitCode: 0 }),\n};\n", "import type { Pipeline, PipelineCommand } from \"../types/pipeline\";\n\n/** Parse a shell command line into a structured pipeline */\nexport function parseShellPipeline(rawInput: string): Pipeline {\n\tconst trimmed = rawInput.trim();\n\n\tif (!trimmed) {\n\t\treturn { commands: [], isValid: true };\n\t}\n\n\tconst commands: PipelineCommand[] = [];\n\tconst tokenized = tokenizePipeline(trimmed);\n\tif (tokenized.error) {\n\t\treturn {\n\t\t\tcommands: [],\n\t\t\tisValid: false,\n\t\t\terror: tokenized.error,\n\t\t};\n\t}\n\n\tconst pipeTokens = tokenized.tokens;\n\n\tfor (const token of pipeTokens) {\n\t\tconst cmd = parseCommandWithRedirections(token);\n\t\tif (!cmd.isValid) {\n\t\t\treturn {\n\t\t\t\tcommands: [],\n\t\t\t\tisValid: false,\n\t\t\t\terror: cmd.error,\n\t\t\t};\n\t\t}\n\t\tif (cmd.command) {\n\t\t\tcommands.push(cmd.command);\n\t\t}\n\t}\n\n\treturn { commands, isValid: true };\n}\n\n/** Tokenize input by pipes, respecting quoted strings */\nfunction tokenizePipeline(input: string): { tokens: string[]; error?: string } {\n\tconst tokens: string[] = [];\n\tlet current = \"\";\n\tlet inQuotes = false;\n\tlet quoteChar = \"\";\n\tlet i = 0;\n\n\twhile (i < input.length) {\n\t\tconst ch = input[i];\n\n\t\tif ((ch === '\"' || ch === \"'\") && (i === 0 || input[i - 1] !== \"\\\\\")) {\n\t\t\tif (!inQuotes) {\n\t\t\t\tinQuotes = true;\n\t\t\t\tquoteChar = ch;\n\t\t\t} else if (ch === quoteChar) {\n\t\t\t\tinQuotes = false;\n\t\t\t}\n\t\t\tcurrent += ch;\n\t\t\ti++;\n\t\t} else if (ch === \"|\" && !inQuotes) {\n\t\t\tif (!current.trim()) {\n\t\t\t\treturn {\n\t\t\t\t\ttokens: [],\n\t\t\t\t\terror: \"Syntax error near unexpected token '|'\",\n\t\t\t\t};\n\t\t\t}\n\t\t\ttokens.push(current.trim());\n\t\t\tcurrent = \"\";\n\t\t\ti++;\n\t\t} else {\n\t\t\tcurrent += ch;\n\t\t\ti++;\n\t\t}\n\t}\n\n\tif (inQuotes) {\n\t\treturn {\n\t\t\ttokens: [],\n\t\t\terror: \"Syntax error: unterminated quote\",\n\t\t};\n\t}\n\n\tif (!current.trim()) {\n\t\treturn {\n\t\t\ttokens: [],\n\t\t\terror: \"Syntax error near unexpected token '|'\",\n\t\t};\n\t}\n\n\ttokens.push(current.trim());\n\n\treturn { tokens };\n}\n\ninterface ParseResult {\n\tcommand?: PipelineCommand;\n\tisValid: boolean;\n\terror?: string;\n}\n\n/** Parse a single command with its redirections (>, >>, <) */\nfunction parseCommandWithRedirections(token: string): ParseResult {\n\tconst parts = tokenizeCommand(token);\n\n\tif (parts.length === 0) {\n\t\treturn { isValid: true };\n\t}\n\n\tconst cmdParts: string[] = [];\n\tlet inputFile: string | undefined;\n\tlet outputFile: string | undefined;\n\tlet appendOutput = false;\n\n\tlet i = 0;\n\twhile (i < parts.length) {\n\t\tconst part = parts[i] as string;\n\n\t\tif (part === \"<\") {\n\t\t\ti++;\n\t\t\tif (i >= parts.length) {\n\t\t\t\treturn {\n\t\t\t\t\tisValid: false,\n\t\t\t\t\terror: \"Syntax error: expected filename after <\",\n\t\t\t\t};\n\t\t\t}\n\t\t\tinputFile = parts[i];\n\t\t\ti++;\n\t\t} else if (part === \">>\") {\n\t\t\ti++;\n\t\t\tif (i >= parts.length) {\n\t\t\t\treturn {\n\t\t\t\t\tisValid: false,\n\t\t\t\t\terror: \"Syntax error: expected filename after >>\",\n\t\t\t\t};\n\t\t\t}\n\t\t\toutputFile = parts[i];\n\t\t\tappendOutput = true;\n\t\t\ti++;\n\t\t} else if (part === \">\") {\n\t\t\ti++;\n\t\t\tif (i >= parts.length) {\n\t\t\t\treturn {\n\t\t\t\t\tisValid: false,\n\t\t\t\t\terror: \"Syntax error: expected filename after >\",\n\t\t\t\t};\n\t\t\t}\n\t\t\toutputFile = parts[i];\n\t\t\tappendOutput = false;\n\t\t\ti++;\n\t\t} else {\n\t\t\tcmdParts.push(part);\n\t\t\ti++;\n\t\t}\n\t}\n\n\tif (cmdParts.length === 0) {\n\t\treturn { isValid: true };\n\t}\n\n\tconst name = (cmdParts[0] as string).toLowerCase();\n\tconst args = cmdParts.slice(1);\n\n\treturn {\n\t\tcommand: {\n\t\t\tname,\n\t\t\targs,\n\t\t\tinputFile,\n\t\t\toutputFile,\n\t\t\tappendOutput,\n\t\t},\n\t\tisValid: true,\n\t};\n}\n\n/** Tokenize a command, respecting quotes and handling >> vs > */\nfunction tokenizeCommand(input: string): string[] {\n\tconst tokens: string[] = [];\n\tlet current = \"\";\n\tlet inQuotes = false;\n\tlet quoteChar = \"\";\n\tlet i = 0;\n\n\twhile (i < input.length) {\n\t\tconst ch = input[i];\n\t\tconst next = input[i + 1];\n\n\t\t// Handle quotes\n\t\tif ((ch === '\"' || ch === \"'\") && (i === 0 || input[i - 1] !== \"\\\\\")) {\n\t\t\tif (!inQuotes) {\n\t\t\t\tinQuotes = true;\n\t\t\t\tquoteChar = ch;\n\t\t\t} else if (ch === quoteChar) {\n\t\t\t\tinQuotes = false;\n\t\t\t\tquoteChar = \"\";\n\t\t\t} else {\n\t\t\t\tcurrent += ch;\n\t\t\t}\n\t\t\ti++;\n\t\t} else if (ch === \" \" && !inQuotes) {\n\t\t\tif (current) {\n\t\t\t\ttokens.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\ti++;\n\t\t} else if ((ch === \">\" || ch === \"<\") && !inQuotes) {\n\t\t\tif (current) {\n\t\t\t\ttokens.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\tif (ch === \">\" && next === \">\") {\n\t\t\t\ttokens.push(\">>\");\n\t\t\t\ti += 2;\n\t\t\t} else {\n\t\t\t\ttokens.push(ch);\n\t\t\t\ti++;\n\t\t\t}\n\t\t} else {\n\t\t\tcurrent += ch;\n\t\t\ti++;\n\t\t}\n\t}\n\n\tif (current) {\n\t\ttokens.push(current);\n\t}\n\n\treturn tokens;\n}\n", "import { runCommand as runSingleCommand } from \"../commands\";\nimport { resolvePath } from \"../commands/helpers\";\nimport type { CommandMode, CommandResult } from \"../types/commands\";\nimport type { Pipeline, PipelineCommand } from \"../types/pipeline\";\nimport type { VirtualShell } from \"../VirtualShell\";\n\n/**\n * Execute a parsed pipeline, chaining commands and handling redirections.\n * Manages stdout/stderr flow between commands and file I/O.\n */\nexport async function executePipeline(\n\tpipeline: Pipeline,\n\tauthUser: string,\n\thostname: string,\n\tmode: CommandMode,\n\tcwd: string,\n\tshell: VirtualShell,\n): Promise<CommandResult> {\n\tif (pipeline.commands.length === 0) {\n\t\treturn { exitCode: 0 };\n\t}\n\n\tif (pipeline.commands.length === 1) {\n\t\t// Single command with possible redirections\n\t\treturn executeSingleCommandWithRedirections(\n\t\t\tpipeline.commands[0] as PipelineCommand,\n\t\t\tauthUser,\n\t\t\thostname,\n\t\t\tmode,\n\t\t\tcwd,\n\t\t\tshell,\n\t\t);\n\t}\n\n\t// Multiple commands in a pipeline\n\treturn executePipelineChain(\n\t\tpipeline.commands as PipelineCommand[],\n\t\tauthUser,\n\t\thostname,\n\t\tmode,\n\t\tcwd,\n\t\tshell,\n\t);\n}\n\n/**\n * Execute a single command with input/output redirections\n */\nasync function executeSingleCommandWithRedirections(\n\tcmd: PipelineCommand,\n\tauthUser: string,\n\thostname: string,\n\tmode: CommandMode,\n\tcwd: string,\n\tshell: VirtualShell,\n): Promise<CommandResult> {\n\t// Prepare input if input file specified\n\tlet stdin: string | undefined;\n\tif (cmd.inputFile) {\n\t\tconst inputPath = resolvePath(cwd, cmd.inputFile);\n\t\ttry {\n\t\t\tstdin = shell.vfs.readFile(inputPath);\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tstderr: `cat: ${cmd.inputFile}: No such file or directory`,\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\t}\n\n\t// Build raw input for the command\n\tconst rawInput = [cmd.name, ...cmd.args].join(\" \");\n\n\t// Run the command with potential input\n\tconst result = await runSingleCommand(\n\t\trawInput,\n\t\tauthUser,\n\t\thostname,\n\t\tmode,\n\t\tcwd,\n\t\tshell,\n\t\tstdin,\n\t);\n\n\t// Handle output redirection\n\tif (cmd.outputFile) {\n\t\tconst outputPath = resolvePath(cwd, cmd.outputFile);\n\t\tconst output = result.stdout || \"\";\n\t\ttry {\n\t\t\tif (cmd.appendOutput) {\n\t\t\t\ttry {\n\t\t\t\t\tconst existing = shell.vfs.readFile(outputPath);\n\t\t\t\t\tshell.writeFileAsUser(authUser, outputPath, existing + output);\n\t\t\t\t} catch {\n\t\t\t\t\tshell.writeFileAsUser(authUser, outputPath, output);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tshell.writeFileAsUser(authUser, outputPath, output);\n\t\t\t}\n\t\t\treturn { ...result, stdout: \"\" };\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\t...result,\n\t\t\t\tstderr: `Failed to write to ${cmd.outputFile}`,\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Execute a chain of commands connected by pipes\n */\nasync function executePipelineChain(\n\tcommands: PipelineCommand[],\n\tauthUser: string,\n\thostname: string,\n\tmode: CommandMode,\n\tcwd: string,\n\tshell: VirtualShell,\n): Promise<CommandResult> {\n\tlet currentOutput = \"\";\n\tlet exitCode = 0;\n\n\tfor (let i = 0; i < commands.length; i++) {\n\t\tconst cmd = commands[i] as PipelineCommand;\n\n\t\t// Handle input file for first command\n\t\tif (i === 0 && cmd.inputFile) {\n\t\t\tconst inputPath = resolvePath(cwd, cmd.inputFile);\n\t\t\ttry {\n\t\t\t\tcurrentOutput = shell.vfs.readFile(inputPath);\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `cat: ${cmd.inputFile}: No such file or directory`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// Build raw input\n\t\tconst rawInput = [cmd.name, ...cmd.args].join(\" \");\n\n\t\t// Create a modified context that might accept stdin\n\t\t// For now, we'll append input as an additional arg for commands that support it\n\t\tconst result = await runSingleCommand(\n\t\t\trawInput,\n\t\t\tauthUser,\n\t\t\thostname,\n\t\t\tmode,\n\t\t\tcwd,\n\t\t\tshell,\n\t\t\tcurrentOutput,\n\t\t);\n\n\t\texitCode = result.exitCode ?? 0;\n\n\t\t// Handle output redirection (only for last command)\n\t\tif (i === commands.length - 1 && cmd.outputFile) {\n\t\t\tconst outputPath = resolvePath(cwd, cmd.outputFile);\n\t\t\tconst output = result.stdout || \"\";\n\t\t\ttry {\n\t\t\t\tif (cmd.appendOutput) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst existing = shell.vfs.readFile(outputPath);\n\t\t\t\t\t\tshell.writeFileAsUser(authUser, outputPath, existing + output);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tshell.writeFileAsUser(authUser, outputPath, output);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tshell.writeFileAsUser(authUser, outputPath, output);\n\t\t\t\t}\n\t\t\t\tcurrentOutput = \"\";\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tstderr: `Failed to write to ${cmd.outputFile}`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t};\n\t\t\t}\n\t\t} else {\n\t\t\t// Pass output to next command\n\t\t\tcurrentOutput = result.stdout || \"\";\n\t\t}\n\n\t\tif (result.stderr && exitCode !== 0) {\n\t\t\treturn { stderr: result.stderr, exitCode };\n\t\t}\n\t}\n\n\treturn { stdout: currentOutput, exitCode };\n}\n", "import type { VirtualShell } from \"../VirtualShell\";\nimport type {\n\tCommandContext,\n\tCommandMode,\n\tCommandResult,\n\tShellModule,\n} from \"../types/commands\";\nimport { adduserCommand } from \"./adduser\";\nimport { catCommand } from \"./cat\";\nimport { cdCommand } from \"./cd\";\nimport { clearCommand } from \"./clear\";\nimport { curlCommand } from \"./curl\";\nimport { deluserCommand } from \"./deluser\";\nimport { echoCommand } from \"./echo\";\nimport { envCommand } from \"./env\";\nimport { exitCommand } from \"./exit\";\nimport { exportCommand } from \"./export\";\nimport { grepCommand } from \"./grep\";\nimport { createHelpCommand } from \"./help\";\nimport { hostnameCommand } from \"./hostname\";\nimport { htopCommand } from \"./htop\";\nimport { lsCommand } from \"./ls\";\nimport { mkdirCommand } from \"./mkdir\";\nimport { nanoCommand } from \"./nano\";\nimport { neofetchCommand } from \"./neofetch\";\nimport { passwdCommand } from \"./passwd\";\nimport { pwdCommand } from \"./pwd\";\nimport { rmCommand } from \"./rm\";\nimport { setCommand } from \"./set\";\nimport { shCommand } from \"./sh\";\nimport { suCommand } from \"./su\";\nimport { sudoCommand } from \"./sudo\";\nimport { touchCommand } from \"./touch\";\nimport { treeCommand } from \"./tree\";\nimport { unsetCommand } from \"./unset\";\nimport { wgetCommand } from \"./wget\";\nimport { whoCommand } from \"./who\";\nimport { whoamiCommand } from \"./whoami\";\n\nconst BASE_COMMANDS: ShellModule[] = [\n\tpwdCommand,\n\twhoamiCommand,\n\twhoCommand,\n\thostnameCommand,\n\tlsCommand,\n\tcdCommand,\n\tcatCommand,\n\techoCommand,\n\tmkdirCommand,\n\ttouchCommand,\n\trmCommand,\n\ttreeCommand,\n\tnanoCommand,\n\tneofetchCommand,\n\thtopCommand,\n\tadduserCommand,\n\tpasswdCommand,\n\tdeluserCommand,\n\tsudoCommand,\n\tsuCommand,\n\tcurlCommand,\n\tenvCommand,\n\twgetCommand,\n\tgrepCommand,\n\texportCommand,\n\tsetCommand,\n\tunsetCommand,\n\tshCommand,\n\tclearCommand,\n\texitCommand,\n];\n\nconst customCommands: ShellModule[] = [];\n\nconst helpCommand = createHelpCommand(() =>\n\tgetCommandModules().map((cmd) => cmd.name),\n);\n\nconst commandRegistry = new Map<string, ShellModule>();\nlet cachedCommandNames: string[] | null = null;\n\nfunction buildCache(): void {\n\tfor (const mod of getCommandModules()) {\n\t\tcommandRegistry.set(mod.name, mod);\n\t\tfor (const alias of mod.aliases ?? []) {\n\t\t\tcommandRegistry.set(alias, mod);\n\t\t}\n\t}\n\tcachedCommandNames = Array.from(commandRegistry.keys()).sort();\n}\n\nfunction getCommandModules(): ShellModule[] {\n\t// console.log(\"Loading command modules...\");\n\t// console.log(\n\t// \t`Base commands: ${BASE_COMMANDS.map((cmd) => cmd.name).join(\", \")}`,\n\t// );\n\t// console.log(\n\t// \t`Custom commands: ${customCommands.map((cmd) => cmd.name).join(\", \")}`,\n\t// );\n\treturn [...BASE_COMMANDS, ...customCommands, helpCommand];\n}\n\nexport function registerCommand(module: ShellModule): void {\n\tconst normalized: ShellModule = {\n\t\t...module,\n\t\tname: module.name.trim().toLowerCase(),\n\t\taliases: module.aliases?.map((alias) => alias.trim().toLowerCase()),\n\t};\n\n\tconst names = [normalized.name, ...(normalized.aliases ?? [])];\n\tif (names.some((name) => name.length === 0 || /\\s/.test(name))) {\n\t\tthrow new Error(\n\t\t\t\"Command names and aliases must be non-empty and contain no spaces\",\n\t\t);\n\t}\n\n\tfor (const name of names) {\n\t\tif (commandRegistry.has(name)) {\n\t\t\tthrow new Error(`Command '${name}' already exists`);\n\t\t}\n\t\tcommandRegistry.set(name, normalized);\n\t}\n\n\tbuildCache();\n}\n\nexport function createCustomCommand(\n\tname: string,\n\tparams: string[],\n\trun: (ctx: CommandContext) => CommandResult | Promise<CommandResult>,\n): ShellModule {\n\treturn {\n\t\tname,\n\t\tparams,\n\t\trun,\n\t};\n}\n\nexport function getCommandNames(): string[] {\n\tif (!cachedCommandNames) {\n\t\tbuildCache();\n\t}\n\treturn cachedCommandNames!;\n}\n\nexport function resolveModule(name: string): ShellModule | undefined {\n\tif (!cachedCommandNames) {\n\t\tbuildCache();\n\t}\n\treturn commandRegistry.get(name.toLowerCase());\n}\n\nfunction splitArgsRespectingQuotes(input: string): string[] {\n\tconst tokens: string[] = [];\n\tlet current = \"\";\n\tlet inQuotes = false;\n\tlet quoteChar = \"\";\n\n\tfor (let i = 0; i < input.length; i += 1) {\n\t\tconst ch = input[i] || \"\";\n\t\tconst prev = i > 0 ? input[i - 1] : \"\";\n\n\t\tif ((ch === '\"' || ch === \"'\") && prev !== \"\\\\\") {\n\t\t\tif (!inQuotes) {\n\t\t\t\tinQuotes = true;\n\t\t\t\tquoteChar = ch;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ch === quoteChar) {\n\t\t\t\tinQuotes = false;\n\t\t\t\tquoteChar = \"\";\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (/\\s/.test(ch) && !inQuotes) {\n\t\t\tif (current.length > 0) {\n\t\t\t\ttokens.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcurrent += ch;\n\t}\n\n\tif (current.length > 0) {\n\t\ttokens.push(current);\n\t}\n\n\treturn tokens;\n}\n\nfunction parseInput(rawInput: string): { commandName: string; args: string[] } {\n\tconst parts = splitArgsRespectingQuotes(rawInput.trim());\n\treturn {\n\t\tcommandName: parts[0]?.toLowerCase() ?? \"\",\n\t\targs: parts.slice(1),\n\t};\n}\n\n// Internal async function for pipeline execution\n\nexport async function runCommand(\n\trawInput: string,\n\tauthUser: string,\n\thostname: string,\n\tmode: CommandMode,\n\tcwd: string,\n\tshell: VirtualShell,\n\tstdin?: string,\n): Promise<CommandResult> {\n\tconst trimmed = rawInput.trim();\n\n\tif (trimmed.length === 0) {\n\t\treturn { exitCode: 0 };\n\t}\n\n\tif (trimmed.includes(\"|\") || trimmed.includes(\">\") || trimmed.includes(\"<\")) {\n\t\tconst { parseShellPipeline } = await import(\"../VirtualShell/shellParser\");\n\t\tconst { executePipeline } = await import(\"../SSHMimic/executor\");\n\n\t\tconst pipeline = parseShellPipeline(trimmed);\n\t\tif (!pipeline.isValid) {\n\t\t\treturn {\n\t\t\t\tstderr: pipeline.error || \"Syntax error\",\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\treturn await executePipeline(\n\t\t\t\tpipeline,\n\t\t\t\tauthUser,\n\t\t\t\thostname,\n\t\t\t\tmode,\n\t\t\t\tcwd,\n\t\t\t\tshell,\n\t\t\t);\n\t\t} catch (error: unknown) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : \"Pipeline execution failed\";\n\t\t\treturn { stderr: message, exitCode: 1 };\n\t\t}\n\t}\n\n\tconst { commandName, args } = parseInput(trimmed);\n\tconst mod = resolveModule(commandName);\n\n\tif (!mod) {\n\t\treturn {\n\t\t\tstderr: `Command '${trimmed}' not found`,\n\t\t\texitCode: 127,\n\t\t};\n\t}\n\n\ttry {\n\t\treturn await mod.run({\n\t\t\tauthUser,\n\t\t\thostname,\n\t\t\tactiveSessions: shell.users.listActiveSessions(),\n\t\t\trawInput: trimmed,\n\t\t\tmode,\n\t\t\targs,\n\t\t\tstdin,\n\t\t\tcwd,\n\t\t\tshell,\n\t\t});\n\t} catch (error: unknown) {\n\t\tconst message = error instanceof Error ? error.message : \"Command failed\";\n\t\treturn { stderr: message, exitCode: 1 };\n\t}\n}\n", "// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\n\nmodule.exports = {\n\n newInvalidAsn1Error: function (msg) {\n var e = new Error();\n e.name = 'InvalidAsn1Error';\n e.message = msg || '';\n return e;\n }\n\n};\n", "// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\n\nmodule.exports = {\n EOC: 0,\n Boolean: 1,\n Integer: 2,\n BitString: 3,\n OctetString: 4,\n Null: 5,\n OID: 6,\n ObjectDescriptor: 7,\n External: 8,\n Real: 9, // float\n Enumeration: 10,\n PDV: 11,\n Utf8String: 12,\n RelativeOID: 13,\n Sequence: 16,\n Set: 17,\n NumericString: 18,\n PrintableString: 19,\n T61String: 20,\n VideotexString: 21,\n IA5String: 22,\n UTCTime: 23,\n GeneralizedTime: 24,\n GraphicString: 25,\n VisibleString: 26,\n GeneralString: 28,\n UniversalString: 29,\n CharacterString: 30,\n BMPString: 31,\n Constructor: 32,\n Context: 128\n};\n", "/* eslint-disable node/no-deprecated-api */\n\n'use strict'\n\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\nvar safer = {}\n\nvar key\n\nfor (key in buffer) {\n if (!buffer.hasOwnProperty(key)) continue\n if (key === 'SlowBuffer' || key === 'Buffer') continue\n safer[key] = buffer[key]\n}\n\nvar Safer = safer.Buffer = {}\nfor (key in Buffer) {\n if (!Buffer.hasOwnProperty(key)) continue\n if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue\n Safer[key] = Buffer[key]\n}\n\nsafer.Buffer.prototype = Buffer.prototype\n\nif (!Safer.from || Safer.from === Uint8Array.from) {\n Safer.from = function (value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('The \"value\" argument must not be of type number. Received type ' + typeof value)\n }\n if (value && typeof value.length === 'undefined') {\n throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value)\n }\n return Buffer(value, encodingOrOffset, length)\n }\n}\n\nif (!Safer.alloc) {\n Safer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('The \"size\" argument must be of type number. Received type ' + typeof size)\n }\n if (size < 0 || size >= 2 * (1 << 30)) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n var buf = Buffer(size)\n if (!fill || fill.length === 0) {\n buf.fill(0)\n } else if (typeof encoding === 'string') {\n buf.fill(fill, encoding)\n } else {\n buf.fill(fill)\n }\n return buf\n }\n}\n\nif (!safer.kStringMaxLength) {\n try {\n safer.kStringMaxLength = process.binding('buffer').kStringMaxLength\n } catch (e) {\n // we can't determine kStringMaxLength in environments where process.binding\n // is unsupported, so let's not set it\n }\n}\n\nif (!safer.constants) {\n safer.constants = {\n MAX_LENGTH: safer.kMaxLength\n }\n if (safer.kStringMaxLength) {\n safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength\n }\n}\n\nmodule.exports = safer\n", "// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\nvar assert = require('assert');\nvar Buffer = require('safer-buffer').Buffer;\n\nvar ASN1 = require('./types');\nvar errors = require('./errors');\n\n\n// --- Globals\n\nvar newInvalidAsn1Error = errors.newInvalidAsn1Error;\n\n\n\n// --- API\n\nfunction Reader(data) {\n if (!data || !Buffer.isBuffer(data))\n throw new TypeError('data must be a node Buffer');\n\n this._buf = data;\n this._size = data.length;\n\n // These hold the \"current\" state\n this._len = 0;\n this._offset = 0;\n}\n\nObject.defineProperty(Reader.prototype, 'length', {\n enumerable: true,\n get: function () { return (this._len); }\n});\n\nObject.defineProperty(Reader.prototype, 'offset', {\n enumerable: true,\n get: function () { return (this._offset); }\n});\n\nObject.defineProperty(Reader.prototype, 'remain', {\n get: function () { return (this._size - this._offset); }\n});\n\nObject.defineProperty(Reader.prototype, 'buffer', {\n get: function () { return (this._buf.slice(this._offset)); }\n});\n\n\n/**\n * Reads a single byte and advances offset; you can pass in `true` to make this\n * a \"peek\" operation (i.e., get the byte, but don't advance the offset).\n *\n * @param {Boolean} peek true means don't move offset.\n * @return {Number} the next byte, null if not enough data.\n */\nReader.prototype.readByte = function (peek) {\n if (this._size - this._offset < 1)\n return null;\n\n var b = this._buf[this._offset] & 0xff;\n\n if (!peek)\n this._offset += 1;\n\n return b;\n};\n\n\nReader.prototype.peek = function () {\n return this.readByte(true);\n};\n\n\n/**\n * Reads a (potentially) variable length off the BER buffer. This call is\n * not really meant to be called directly, as callers have to manipulate\n * the internal buffer afterwards.\n *\n * As a result of this call, you can call `Reader.length`, until the\n * next thing called that does a readLength.\n *\n * @return {Number} the amount of offset to advance the buffer.\n * @throws {InvalidAsn1Error} on bad ASN.1\n */\nReader.prototype.readLength = function (offset) {\n if (offset === undefined)\n offset = this._offset;\n\n if (offset >= this._size)\n return null;\n\n var lenB = this._buf[offset++] & 0xff;\n if (lenB === null)\n return null;\n\n if ((lenB & 0x80) === 0x80) {\n lenB &= 0x7f;\n\n if (lenB === 0)\n throw newInvalidAsn1Error('Indefinite length not supported');\n\n if (lenB > 4)\n throw newInvalidAsn1Error('encoding too long');\n\n if (this._size - offset < lenB)\n return null;\n\n this._len = 0;\n for (var i = 0; i < lenB; i++)\n this._len = (this._len << 8) + (this._buf[offset++] & 0xff);\n\n } else {\n // Wasn't a variable length\n this._len = lenB;\n }\n\n return offset;\n};\n\n\n/**\n * Parses the next sequence in this BER buffer.\n *\n * To get the length of the sequence, call `Reader.length`.\n *\n * @return {Number} the sequence's tag.\n */\nReader.prototype.readSequence = function (tag) {\n var seq = this.peek();\n if (seq === null)\n return null;\n if (tag !== undefined && tag !== seq)\n throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +\n ': got 0x' + seq.toString(16));\n\n var o = this.readLength(this._offset + 1); // stored in `length`\n if (o === null)\n return null;\n\n this._offset = o;\n return seq;\n};\n\n\nReader.prototype.readInt = function () {\n return this._readTag(ASN1.Integer);\n};\n\n\nReader.prototype.readBoolean = function () {\n return (this._readTag(ASN1.Boolean) === 0 ? false : true);\n};\n\n\nReader.prototype.readEnumeration = function () {\n return this._readTag(ASN1.Enumeration);\n};\n\n\nReader.prototype.readString = function (tag, retbuf) {\n if (!tag)\n tag = ASN1.OctetString;\n\n var b = this.peek();\n if (b === null)\n return null;\n\n if (b !== tag)\n throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +\n ': got 0x' + b.toString(16));\n\n var o = this.readLength(this._offset + 1); // stored in `length`\n\n if (o === null)\n return null;\n\n if (this.length > this._size - o)\n return null;\n\n this._offset = o;\n\n if (this.length === 0)\n return retbuf ? Buffer.alloc(0) : '';\n\n var str = this._buf.slice(this._offset, this._offset + this.length);\n this._offset += this.length;\n\n return retbuf ? str : str.toString('utf8');\n};\n\nReader.prototype.readOID = function (tag) {\n if (!tag)\n tag = ASN1.OID;\n\n var b = this.readString(tag, true);\n if (b === null)\n return null;\n\n var values = [];\n var value = 0;\n\n for (var i = 0; i < b.length; i++) {\n var byte = b[i] & 0xff;\n\n value <<= 7;\n value += byte & 0x7f;\n if ((byte & 0x80) === 0) {\n values.push(value);\n value = 0;\n }\n }\n\n value = values.shift();\n values.unshift(value % 40);\n values.unshift((value / 40) >> 0);\n\n return values.join('.');\n};\n\n\nReader.prototype._readTag = function (tag) {\n assert.ok(tag !== undefined);\n\n var b = this.peek();\n\n if (b === null)\n return null;\n\n if (b !== tag)\n throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +\n ': got 0x' + b.toString(16));\n\n var o = this.readLength(this._offset + 1); // stored in `length`\n if (o === null)\n return null;\n\n if (this.length > 4)\n throw newInvalidAsn1Error('Integer too long: ' + this.length);\n\n if (this.length > this._size - o)\n return null;\n this._offset = o;\n\n var fb = this._buf[this._offset];\n var value = 0;\n\n for (var i = 0; i < this.length; i++) {\n value <<= 8;\n value |= (this._buf[this._offset++] & 0xff);\n }\n\n if ((fb & 0x80) === 0x80 && i !== 4)\n value -= (1 << (i * 8));\n\n return value >> 0;\n};\n\n\n\n// --- Exported API\n\nmodule.exports = Reader;\n", "// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\nvar assert = require('assert');\nvar Buffer = require('safer-buffer').Buffer;\nvar ASN1 = require('./types');\nvar errors = require('./errors');\n\n\n// --- Globals\n\nvar newInvalidAsn1Error = errors.newInvalidAsn1Error;\n\nvar DEFAULT_OPTS = {\n size: 1024,\n growthFactor: 8\n};\n\n\n// --- Helpers\n\nfunction merge(from, to) {\n assert.ok(from);\n assert.equal(typeof (from), 'object');\n assert.ok(to);\n assert.equal(typeof (to), 'object');\n\n var keys = Object.getOwnPropertyNames(from);\n keys.forEach(function (key) {\n if (to[key])\n return;\n\n var value = Object.getOwnPropertyDescriptor(from, key);\n Object.defineProperty(to, key, value);\n });\n\n return to;\n}\n\n\n\n// --- API\n\nfunction Writer(options) {\n options = merge(DEFAULT_OPTS, options || {});\n\n this._buf = Buffer.alloc(options.size || 1024);\n this._size = this._buf.length;\n this._offset = 0;\n this._options = options;\n\n // A list of offsets in the buffer where we need to insert\n // sequence tag/len pairs.\n this._seq = [];\n}\n\nObject.defineProperty(Writer.prototype, 'buffer', {\n get: function () {\n if (this._seq.length)\n throw newInvalidAsn1Error(this._seq.length + ' unended sequence(s)');\n\n return (this._buf.slice(0, this._offset));\n }\n});\n\nWriter.prototype.writeByte = function (b) {\n if (typeof (b) !== 'number')\n throw new TypeError('argument must be a Number');\n\n this._ensure(1);\n this._buf[this._offset++] = b;\n};\n\n\nWriter.prototype.writeInt = function (i, tag) {\n if (typeof (i) !== 'number')\n throw new TypeError('argument must be a Number');\n if (typeof (tag) !== 'number')\n tag = ASN1.Integer;\n\n var sz = 4;\n\n while ((((i & 0xff800000) === 0) || ((i & 0xff800000) === 0xff800000 >> 0)) &&\n (sz > 1)) {\n sz--;\n i <<= 8;\n }\n\n if (sz > 4)\n throw newInvalidAsn1Error('BER ints cannot be > 0xffffffff');\n\n this._ensure(2 + sz);\n this._buf[this._offset++] = tag;\n this._buf[this._offset++] = sz;\n\n while (sz-- > 0) {\n this._buf[this._offset++] = ((i & 0xff000000) >>> 24);\n i <<= 8;\n }\n\n};\n\n\nWriter.prototype.writeNull = function () {\n this.writeByte(ASN1.Null);\n this.writeByte(0x00);\n};\n\n\nWriter.prototype.writeEnumeration = function (i, tag) {\n if (typeof (i) !== 'number')\n throw new TypeError('argument must be a Number');\n if (typeof (tag) !== 'number')\n tag = ASN1.Enumeration;\n\n return this.writeInt(i, tag);\n};\n\n\nWriter.prototype.writeBoolean = function (b, tag) {\n if (typeof (b) !== 'boolean')\n throw new TypeError('argument must be a Boolean');\n if (typeof (tag) !== 'number')\n tag = ASN1.Boolean;\n\n this._ensure(3);\n this._buf[this._offset++] = tag;\n this._buf[this._offset++] = 0x01;\n this._buf[this._offset++] = b ? 0xff : 0x00;\n};\n\n\nWriter.prototype.writeString = function (s, tag) {\n if (typeof (s) !== 'string')\n throw new TypeError('argument must be a string (was: ' + typeof (s) + ')');\n if (typeof (tag) !== 'number')\n tag = ASN1.OctetString;\n\n var len = Buffer.byteLength(s);\n this.writeByte(tag);\n this.writeLength(len);\n if (len) {\n this._ensure(len);\n this._buf.write(s, this._offset);\n this._offset += len;\n }\n};\n\n\nWriter.prototype.writeBuffer = function (buf, tag) {\n if (typeof (tag) !== 'number')\n throw new TypeError('tag must be a number');\n if (!Buffer.isBuffer(buf))\n throw new TypeError('argument must be a buffer');\n\n this.writeByte(tag);\n this.writeLength(buf.length);\n this._ensure(buf.length);\n buf.copy(this._buf, this._offset, 0, buf.length);\n this._offset += buf.length;\n};\n\n\nWriter.prototype.writeStringArray = function (strings) {\n if ((!strings instanceof Array))\n throw new TypeError('argument must be an Array[String]');\n\n var self = this;\n strings.forEach(function (s) {\n self.writeString(s);\n });\n};\n\n// This is really to solve DER cases, but whatever for now\nWriter.prototype.writeOID = function (s, tag) {\n if (typeof (s) !== 'string')\n throw new TypeError('argument must be a string');\n if (typeof (tag) !== 'number')\n tag = ASN1.OID;\n\n if (!/^([0-9]+\\.){3,}[0-9]+$/.test(s))\n throw new Error('argument is not a valid OID string');\n\n function encodeOctet(bytes, octet) {\n if (octet < 128) {\n bytes.push(octet);\n } else if (octet < 16384) {\n bytes.push((octet >>> 7) | 0x80);\n bytes.push(octet & 0x7F);\n } else if (octet < 2097152) {\n bytes.push((octet >>> 14) | 0x80);\n bytes.push(((octet >>> 7) | 0x80) & 0xFF);\n bytes.push(octet & 0x7F);\n } else if (octet < 268435456) {\n bytes.push((octet >>> 21) | 0x80);\n bytes.push(((octet >>> 14) | 0x80) & 0xFF);\n bytes.push(((octet >>> 7) | 0x80) & 0xFF);\n bytes.push(octet & 0x7F);\n } else {\n bytes.push(((octet >>> 28) | 0x80) & 0xFF);\n bytes.push(((octet >>> 21) | 0x80) & 0xFF);\n bytes.push(((octet >>> 14) | 0x80) & 0xFF);\n bytes.push(((octet >>> 7) | 0x80) & 0xFF);\n bytes.push(octet & 0x7F);\n }\n }\n\n var tmp = s.split('.');\n var bytes = [];\n bytes.push(parseInt(tmp[0], 10) * 40 + parseInt(tmp[1], 10));\n tmp.slice(2).forEach(function (b) {\n encodeOctet(bytes, parseInt(b, 10));\n });\n\n var self = this;\n this._ensure(2 + bytes.length);\n this.writeByte(tag);\n this.writeLength(bytes.length);\n bytes.forEach(function (b) {\n self.writeByte(b);\n });\n};\n\n\nWriter.prototype.writeLength = function (len) {\n if (typeof (len) !== 'number')\n throw new TypeError('argument must be a Number');\n\n this._ensure(4);\n\n if (len <= 0x7f) {\n this._buf[this._offset++] = len;\n } else if (len <= 0xff) {\n this._buf[this._offset++] = 0x81;\n this._buf[this._offset++] = len;\n } else if (len <= 0xffff) {\n this._buf[this._offset++] = 0x82;\n this._buf[this._offset++] = len >> 8;\n this._buf[this._offset++] = len;\n } else if (len <= 0xffffff) {\n this._buf[this._offset++] = 0x83;\n this._buf[this._offset++] = len >> 16;\n this._buf[this._offset++] = len >> 8;\n this._buf[this._offset++] = len;\n } else {\n throw newInvalidAsn1Error('Length too long (> 4 bytes)');\n }\n};\n\nWriter.prototype.startSequence = function (tag) {\n if (typeof (tag) !== 'number')\n tag = ASN1.Sequence | ASN1.Constructor;\n\n this.writeByte(tag);\n this._seq.push(this._offset);\n this._ensure(3);\n this._offset += 3;\n};\n\n\nWriter.prototype.endSequence = function () {\n var seq = this._seq.pop();\n var start = seq + 3;\n var len = this._offset - start;\n\n if (len <= 0x7f) {\n this._shift(start, len, -2);\n this._buf[seq] = len;\n } else if (len <= 0xff) {\n this._shift(start, len, -1);\n this._buf[seq] = 0x81;\n this._buf[seq + 1] = len;\n } else if (len <= 0xffff) {\n this._buf[seq] = 0x82;\n this._buf[seq + 1] = len >> 8;\n this._buf[seq + 2] = len;\n } else if (len <= 0xffffff) {\n this._shift(start, len, 1);\n this._buf[seq] = 0x83;\n this._buf[seq + 1] = len >> 16;\n this._buf[seq + 2] = len >> 8;\n this._buf[seq + 3] = len;\n } else {\n throw newInvalidAsn1Error('Sequence too long');\n }\n};\n\n\nWriter.prototype._shift = function (start, len, shift) {\n assert.ok(start !== undefined);\n assert.ok(len !== undefined);\n assert.ok(shift);\n\n this._buf.copy(this._buf, start + shift, start, start + len);\n this._offset += shift;\n};\n\nWriter.prototype._ensure = function (len) {\n assert.ok(len);\n\n if (this._size - this._offset < len) {\n var sz = this._size * this._options.growthFactor;\n if (sz - this._offset < len)\n sz += len;\n\n var buf = Buffer.alloc(sz);\n\n this._buf.copy(buf, 0, 0, this._offset);\n this._buf = buf;\n this._size = sz;\n }\n};\n\n\n\n// --- Exported API\n\nmodule.exports = Writer;\n", "// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\nvar errors = require('./errors');\nvar types = require('./types');\n\nvar Reader = require('./reader');\nvar Writer = require('./writer');\n\n\n// --- Exports\n\nmodule.exports = {\n\n Reader: Reader,\n\n Writer: Writer\n\n};\n\nfor (var t in types) {\n if (types.hasOwnProperty(t))\n module.exports[t] = types[t];\n}\nfor (var e in errors) {\n if (errors.hasOwnProperty(e))\n module.exports[e] = errors[e];\n}\n", "// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\n// If you have no idea what ASN.1 or BER is, see this:\n// ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc\n\nvar Ber = require('./ber/index');\n\n\n\n// --- Exported API\n\nmodule.exports = {\n\n Ber: Ber,\n\n BerReader: Ber.Reader,\n\n BerWriter: Ber.Writer\n\n};\n", "(function(nacl) {\n'use strict';\n\n// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri.\n// Public domain.\n//\n// Implementation derived from TweetNaCl version 20140427.\n// See for details: http://tweetnacl.cr.yp.to/\n\nvar gf = function(init) {\n var i, r = new Float64Array(16);\n if (init) for (i = 0; i < init.length; i++) r[i] = init[i];\n return r;\n};\n\n// Pluggable, initialized in high-level API below.\nvar randombytes = function(/* x, n */) { throw new Error('no PRNG'); };\n\nvar _0 = new Uint8Array(16);\nvar _9 = new Uint8Array(32); _9[0] = 9;\n\nvar gf0 = gf(),\n gf1 = gf([1]),\n _121665 = gf([0xdb41, 1]),\n D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]),\n D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]),\n X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]),\n Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]),\n I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);\n\nfunction ts64(x, i, h, l) {\n x[i] = (h >> 24) & 0xff;\n x[i+1] = (h >> 16) & 0xff;\n x[i+2] = (h >> 8) & 0xff;\n x[i+3] = h & 0xff;\n x[i+4] = (l >> 24) & 0xff;\n x[i+5] = (l >> 16) & 0xff;\n x[i+6] = (l >> 8) & 0xff;\n x[i+7] = l & 0xff;\n}\n\nfunction vn(x, xi, y, yi, n) {\n var i,d = 0;\n for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i];\n return (1 & ((d - 1) >>> 8)) - 1;\n}\n\nfunction crypto_verify_16(x, xi, y, yi) {\n return vn(x,xi,y,yi,16);\n}\n\nfunction crypto_verify_32(x, xi, y, yi) {\n return vn(x,xi,y,yi,32);\n}\n\nfunction core_salsa20(o, p, k, c) {\n var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,\n j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,\n j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,\n j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,\n j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,\n j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,\n j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,\n j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,\n j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,\n j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,\n j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,\n j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,\n j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,\n j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,\n j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,\n j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;\n\n var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,\n x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,\n x15 = j15, u;\n\n for (var i = 0; i < 20; i += 2) {\n u = x0 + x12 | 0;\n x4 ^= u<<7 | u>>>(32-7);\n u = x4 + x0 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x4 | 0;\n x12 ^= u<<13 | u>>>(32-13);\n u = x12 + x8 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x1 | 0;\n x9 ^= u<<7 | u>>>(32-7);\n u = x9 + x5 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x9 | 0;\n x1 ^= u<<13 | u>>>(32-13);\n u = x1 + x13 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x6 | 0;\n x14 ^= u<<7 | u>>>(32-7);\n u = x14 + x10 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x14 | 0;\n x6 ^= u<<13 | u>>>(32-13);\n u = x6 + x2 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x11 | 0;\n x3 ^= u<<7 | u>>>(32-7);\n u = x3 + x15 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x3 | 0;\n x11 ^= u<<13 | u>>>(32-13);\n u = x11 + x7 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n\n u = x0 + x3 | 0;\n x1 ^= u<<7 | u>>>(32-7);\n u = x1 + x0 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x1 | 0;\n x3 ^= u<<13 | u>>>(32-13);\n u = x3 + x2 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x4 | 0;\n x6 ^= u<<7 | u>>>(32-7);\n u = x6 + x5 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x6 | 0;\n x4 ^= u<<13 | u>>>(32-13);\n u = x4 + x7 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x9 | 0;\n x11 ^= u<<7 | u>>>(32-7);\n u = x11 + x10 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x11 | 0;\n x9 ^= u<<13 | u>>>(32-13);\n u = x9 + x8 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x14 | 0;\n x12 ^= u<<7 | u>>>(32-7);\n u = x12 + x15 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x12 | 0;\n x14 ^= u<<13 | u>>>(32-13);\n u = x14 + x13 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n }\n x0 = x0 + j0 | 0;\n x1 = x1 + j1 | 0;\n x2 = x2 + j2 | 0;\n x3 = x3 + j3 | 0;\n x4 = x4 + j4 | 0;\n x5 = x5 + j5 | 0;\n x6 = x6 + j6 | 0;\n x7 = x7 + j7 | 0;\n x8 = x8 + j8 | 0;\n x9 = x9 + j9 | 0;\n x10 = x10 + j10 | 0;\n x11 = x11 + j11 | 0;\n x12 = x12 + j12 | 0;\n x13 = x13 + j13 | 0;\n x14 = x14 + j14 | 0;\n x15 = x15 + j15 | 0;\n\n o[ 0] = x0 >>> 0 & 0xff;\n o[ 1] = x0 >>> 8 & 0xff;\n o[ 2] = x0 >>> 16 & 0xff;\n o[ 3] = x0 >>> 24 & 0xff;\n\n o[ 4] = x1 >>> 0 & 0xff;\n o[ 5] = x1 >>> 8 & 0xff;\n o[ 6] = x1 >>> 16 & 0xff;\n o[ 7] = x1 >>> 24 & 0xff;\n\n o[ 8] = x2 >>> 0 & 0xff;\n o[ 9] = x2 >>> 8 & 0xff;\n o[10] = x2 >>> 16 & 0xff;\n o[11] = x2 >>> 24 & 0xff;\n\n o[12] = x3 >>> 0 & 0xff;\n o[13] = x3 >>> 8 & 0xff;\n o[14] = x3 >>> 16 & 0xff;\n o[15] = x3 >>> 24 & 0xff;\n\n o[16] = x4 >>> 0 & 0xff;\n o[17] = x4 >>> 8 & 0xff;\n o[18] = x4 >>> 16 & 0xff;\n o[19] = x4 >>> 24 & 0xff;\n\n o[20] = x5 >>> 0 & 0xff;\n o[21] = x5 >>> 8 & 0xff;\n o[22] = x5 >>> 16 & 0xff;\n o[23] = x5 >>> 24 & 0xff;\n\n o[24] = x6 >>> 0 & 0xff;\n o[25] = x6 >>> 8 & 0xff;\n o[26] = x6 >>> 16 & 0xff;\n o[27] = x6 >>> 24 & 0xff;\n\n o[28] = x7 >>> 0 & 0xff;\n o[29] = x7 >>> 8 & 0xff;\n o[30] = x7 >>> 16 & 0xff;\n o[31] = x7 >>> 24 & 0xff;\n\n o[32] = x8 >>> 0 & 0xff;\n o[33] = x8 >>> 8 & 0xff;\n o[34] = x8 >>> 16 & 0xff;\n o[35] = x8 >>> 24 & 0xff;\n\n o[36] = x9 >>> 0 & 0xff;\n o[37] = x9 >>> 8 & 0xff;\n o[38] = x9 >>> 16 & 0xff;\n o[39] = x9 >>> 24 & 0xff;\n\n o[40] = x10 >>> 0 & 0xff;\n o[41] = x10 >>> 8 & 0xff;\n o[42] = x10 >>> 16 & 0xff;\n o[43] = x10 >>> 24 & 0xff;\n\n o[44] = x11 >>> 0 & 0xff;\n o[45] = x11 >>> 8 & 0xff;\n o[46] = x11 >>> 16 & 0xff;\n o[47] = x11 >>> 24 & 0xff;\n\n o[48] = x12 >>> 0 & 0xff;\n o[49] = x12 >>> 8 & 0xff;\n o[50] = x12 >>> 16 & 0xff;\n o[51] = x12 >>> 24 & 0xff;\n\n o[52] = x13 >>> 0 & 0xff;\n o[53] = x13 >>> 8 & 0xff;\n o[54] = x13 >>> 16 & 0xff;\n o[55] = x13 >>> 24 & 0xff;\n\n o[56] = x14 >>> 0 & 0xff;\n o[57] = x14 >>> 8 & 0xff;\n o[58] = x14 >>> 16 & 0xff;\n o[59] = x14 >>> 24 & 0xff;\n\n o[60] = x15 >>> 0 & 0xff;\n o[61] = x15 >>> 8 & 0xff;\n o[62] = x15 >>> 16 & 0xff;\n o[63] = x15 >>> 24 & 0xff;\n}\n\nfunction core_hsalsa20(o,p,k,c) {\n var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,\n j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,\n j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,\n j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,\n j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,\n j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,\n j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,\n j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,\n j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,\n j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,\n j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,\n j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,\n j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,\n j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,\n j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,\n j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;\n\n var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,\n x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,\n x15 = j15, u;\n\n for (var i = 0; i < 20; i += 2) {\n u = x0 + x12 | 0;\n x4 ^= u<<7 | u>>>(32-7);\n u = x4 + x0 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x4 | 0;\n x12 ^= u<<13 | u>>>(32-13);\n u = x12 + x8 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x1 | 0;\n x9 ^= u<<7 | u>>>(32-7);\n u = x9 + x5 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x9 | 0;\n x1 ^= u<<13 | u>>>(32-13);\n u = x1 + x13 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x6 | 0;\n x14 ^= u<<7 | u>>>(32-7);\n u = x14 + x10 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x14 | 0;\n x6 ^= u<<13 | u>>>(32-13);\n u = x6 + x2 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x11 | 0;\n x3 ^= u<<7 | u>>>(32-7);\n u = x3 + x15 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x3 | 0;\n x11 ^= u<<13 | u>>>(32-13);\n u = x11 + x7 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n\n u = x0 + x3 | 0;\n x1 ^= u<<7 | u>>>(32-7);\n u = x1 + x0 | 0;\n x2 ^= u<<9 | u>>>(32-9);\n u = x2 + x1 | 0;\n x3 ^= u<<13 | u>>>(32-13);\n u = x3 + x2 | 0;\n x0 ^= u<<18 | u>>>(32-18);\n\n u = x5 + x4 | 0;\n x6 ^= u<<7 | u>>>(32-7);\n u = x6 + x5 | 0;\n x7 ^= u<<9 | u>>>(32-9);\n u = x7 + x6 | 0;\n x4 ^= u<<13 | u>>>(32-13);\n u = x4 + x7 | 0;\n x5 ^= u<<18 | u>>>(32-18);\n\n u = x10 + x9 | 0;\n x11 ^= u<<7 | u>>>(32-7);\n u = x11 + x10 | 0;\n x8 ^= u<<9 | u>>>(32-9);\n u = x8 + x11 | 0;\n x9 ^= u<<13 | u>>>(32-13);\n u = x9 + x8 | 0;\n x10 ^= u<<18 | u>>>(32-18);\n\n u = x15 + x14 | 0;\n x12 ^= u<<7 | u>>>(32-7);\n u = x12 + x15 | 0;\n x13 ^= u<<9 | u>>>(32-9);\n u = x13 + x12 | 0;\n x14 ^= u<<13 | u>>>(32-13);\n u = x14 + x13 | 0;\n x15 ^= u<<18 | u>>>(32-18);\n }\n\n o[ 0] = x0 >>> 0 & 0xff;\n o[ 1] = x0 >>> 8 & 0xff;\n o[ 2] = x0 >>> 16 & 0xff;\n o[ 3] = x0 >>> 24 & 0xff;\n\n o[ 4] = x5 >>> 0 & 0xff;\n o[ 5] = x5 >>> 8 & 0xff;\n o[ 6] = x5 >>> 16 & 0xff;\n o[ 7] = x5 >>> 24 & 0xff;\n\n o[ 8] = x10 >>> 0 & 0xff;\n o[ 9] = x10 >>> 8 & 0xff;\n o[10] = x10 >>> 16 & 0xff;\n o[11] = x10 >>> 24 & 0xff;\n\n o[12] = x15 >>> 0 & 0xff;\n o[13] = x15 >>> 8 & 0xff;\n o[14] = x15 >>> 16 & 0xff;\n o[15] = x15 >>> 24 & 0xff;\n\n o[16] = x6 >>> 0 & 0xff;\n o[17] = x6 >>> 8 & 0xff;\n o[18] = x6 >>> 16 & 0xff;\n o[19] = x6 >>> 24 & 0xff;\n\n o[20] = x7 >>> 0 & 0xff;\n o[21] = x7 >>> 8 & 0xff;\n o[22] = x7 >>> 16 & 0xff;\n o[23] = x7 >>> 24 & 0xff;\n\n o[24] = x8 >>> 0 & 0xff;\n o[25] = x8 >>> 8 & 0xff;\n o[26] = x8 >>> 16 & 0xff;\n o[27] = x8 >>> 24 & 0xff;\n\n o[28] = x9 >>> 0 & 0xff;\n o[29] = x9 >>> 8 & 0xff;\n o[30] = x9 >>> 16 & 0xff;\n o[31] = x9 >>> 24 & 0xff;\n}\n\nfunction crypto_core_salsa20(out,inp,k,c) {\n core_salsa20(out,inp,k,c);\n}\n\nfunction crypto_core_hsalsa20(out,inp,k,c) {\n core_hsalsa20(out,inp,k,c);\n}\n\nvar sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);\n // \"expand 32-byte k\"\n\nfunction crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) {\n var z = new Uint8Array(16), x = new Uint8Array(64);\n var u, i;\n for (i = 0; i < 16; i++) z[i] = 0;\n for (i = 0; i < 8; i++) z[i] = n[i];\n while (b >= 64) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < 64; i++) c[cpos+i] = m[mpos+i] ^ x[i];\n u = 1;\n for (i = 8; i < 16; i++) {\n u = u + (z[i] & 0xff) | 0;\n z[i] = u & 0xff;\n u >>>= 8;\n }\n b -= 64;\n cpos += 64;\n mpos += 64;\n }\n if (b > 0) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < b; i++) c[cpos+i] = m[mpos+i] ^ x[i];\n }\n return 0;\n}\n\nfunction crypto_stream_salsa20(c,cpos,b,n,k) {\n var z = new Uint8Array(16), x = new Uint8Array(64);\n var u, i;\n for (i = 0; i < 16; i++) z[i] = 0;\n for (i = 0; i < 8; i++) z[i] = n[i];\n while (b >= 64) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < 64; i++) c[cpos+i] = x[i];\n u = 1;\n for (i = 8; i < 16; i++) {\n u = u + (z[i] & 0xff) | 0;\n z[i] = u & 0xff;\n u >>>= 8;\n }\n b -= 64;\n cpos += 64;\n }\n if (b > 0) {\n crypto_core_salsa20(x,z,k,sigma);\n for (i = 0; i < b; i++) c[cpos+i] = x[i];\n }\n return 0;\n}\n\nfunction crypto_stream(c,cpos,d,n,k) {\n var s = new Uint8Array(32);\n crypto_core_hsalsa20(s,n,k,sigma);\n var sn = new Uint8Array(8);\n for (var i = 0; i < 8; i++) sn[i] = n[i+16];\n return crypto_stream_salsa20(c,cpos,d,sn,s);\n}\n\nfunction crypto_stream_xor(c,cpos,m,mpos,d,n,k) {\n var s = new Uint8Array(32);\n crypto_core_hsalsa20(s,n,k,sigma);\n var sn = new Uint8Array(8);\n for (var i = 0; i < 8; i++) sn[i] = n[i+16];\n return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,sn,s);\n}\n\n/*\n* Port of Andrew Moon's Poly1305-donna-16. Public domain.\n* https://github.com/floodyberry/poly1305-donna\n*/\n\nvar poly1305 = function(key) {\n this.buffer = new Uint8Array(16);\n this.r = new Uint16Array(10);\n this.h = new Uint16Array(10);\n this.pad = new Uint16Array(8);\n this.leftover = 0;\n this.fin = 0;\n\n var t0, t1, t2, t3, t4, t5, t6, t7;\n\n t0 = key[ 0] & 0xff | (key[ 1] & 0xff) << 8; this.r[0] = ( t0 ) & 0x1fff;\n t1 = key[ 2] & 0xff | (key[ 3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n t2 = key[ 4] & 0xff | (key[ 5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03;\n t3 = key[ 6] & 0xff | (key[ 7] & 0xff) << 8; this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n t4 = key[ 8] & 0xff | (key[ 9] & 0xff) << 8; this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff;\n this.r[5] = ((t4 >>> 1)) & 0x1ffe;\n t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81;\n t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n this.r[9] = ((t7 >>> 5)) & 0x007f;\n\n this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8;\n this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8;\n this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8;\n this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8;\n this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8;\n this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8;\n this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8;\n this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8;\n};\n\npoly1305.prototype.blocks = function(m, mpos, bytes) {\n var hibit = this.fin ? 0 : (1 << 11);\n var t0, t1, t2, t3, t4, t5, t6, t7, c;\n var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9;\n\n var h0 = this.h[0],\n h1 = this.h[1],\n h2 = this.h[2],\n h3 = this.h[3],\n h4 = this.h[4],\n h5 = this.h[5],\n h6 = this.h[6],\n h7 = this.h[7],\n h8 = this.h[8],\n h9 = this.h[9];\n\n var r0 = this.r[0],\n r1 = this.r[1],\n r2 = this.r[2],\n r3 = this.r[3],\n r4 = this.r[4],\n r5 = this.r[5],\n r6 = this.r[6],\n r7 = this.r[7],\n r8 = this.r[8],\n r9 = this.r[9];\n\n while (bytes >= 16) {\n t0 = m[mpos+ 0] & 0xff | (m[mpos+ 1] & 0xff) << 8; h0 += ( t0 ) & 0x1fff;\n t1 = m[mpos+ 2] & 0xff | (m[mpos+ 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff;\n t2 = m[mpos+ 4] & 0xff | (m[mpos+ 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff;\n t3 = m[mpos+ 6] & 0xff | (m[mpos+ 7] & 0xff) << 8; h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff;\n t4 = m[mpos+ 8] & 0xff | (m[mpos+ 9] & 0xff) << 8; h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff;\n h5 += ((t4 >>> 1)) & 0x1fff;\n t5 = m[mpos+10] & 0xff | (m[mpos+11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff;\n t6 = m[mpos+12] & 0xff | (m[mpos+13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff;\n t7 = m[mpos+14] & 0xff | (m[mpos+15] & 0xff) << 8; h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff;\n h9 += ((t7 >>> 5)) | hibit;\n\n c = 0;\n\n d0 = c;\n d0 += h0 * r0;\n d0 += h1 * (5 * r9);\n d0 += h2 * (5 * r8);\n d0 += h3 * (5 * r7);\n d0 += h4 * (5 * r6);\n c = (d0 >>> 13); d0 &= 0x1fff;\n d0 += h5 * (5 * r5);\n d0 += h6 * (5 * r4);\n d0 += h7 * (5 * r3);\n d0 += h8 * (5 * r2);\n d0 += h9 * (5 * r1);\n c += (d0 >>> 13); d0 &= 0x1fff;\n\n d1 = c;\n d1 += h0 * r1;\n d1 += h1 * r0;\n d1 += h2 * (5 * r9);\n d1 += h3 * (5 * r8);\n d1 += h4 * (5 * r7);\n c = (d1 >>> 13); d1 &= 0x1fff;\n d1 += h5 * (5 * r6);\n d1 += h6 * (5 * r5);\n d1 += h7 * (5 * r4);\n d1 += h8 * (5 * r3);\n d1 += h9 * (5 * r2);\n c += (d1 >>> 13); d1 &= 0x1fff;\n\n d2 = c;\n d2 += h0 * r2;\n d2 += h1 * r1;\n d2 += h2 * r0;\n d2 += h3 * (5 * r9);\n d2 += h4 * (5 * r8);\n c = (d2 >>> 13); d2 &= 0x1fff;\n d2 += h5 * (5 * r7);\n d2 += h6 * (5 * r6);\n d2 += h7 * (5 * r5);\n d2 += h8 * (5 * r4);\n d2 += h9 * (5 * r3);\n c += (d2 >>> 13); d2 &= 0x1fff;\n\n d3 = c;\n d3 += h0 * r3;\n d3 += h1 * r2;\n d3 += h2 * r1;\n d3 += h3 * r0;\n d3 += h4 * (5 * r9);\n c = (d3 >>> 13); d3 &= 0x1fff;\n d3 += h5 * (5 * r8);\n d3 += h6 * (5 * r7);\n d3 += h7 * (5 * r6);\n d3 += h8 * (5 * r5);\n d3 += h9 * (5 * r4);\n c += (d3 >>> 13); d3 &= 0x1fff;\n\n d4 = c;\n d4 += h0 * r4;\n d4 += h1 * r3;\n d4 += h2 * r2;\n d4 += h3 * r1;\n d4 += h4 * r0;\n c = (d4 >>> 13); d4 &= 0x1fff;\n d4 += h5 * (5 * r9);\n d4 += h6 * (5 * r8);\n d4 += h7 * (5 * r7);\n d4 += h8 * (5 * r6);\n d4 += h9 * (5 * r5);\n c += (d4 >>> 13); d4 &= 0x1fff;\n\n d5 = c;\n d5 += h0 * r5;\n d5 += h1 * r4;\n d5 += h2 * r3;\n d5 += h3 * r2;\n d5 += h4 * r1;\n c = (d5 >>> 13); d5 &= 0x1fff;\n d5 += h5 * r0;\n d5 += h6 * (5 * r9);\n d5 += h7 * (5 * r8);\n d5 += h8 * (5 * r7);\n d5 += h9 * (5 * r6);\n c += (d5 >>> 13); d5 &= 0x1fff;\n\n d6 = c;\n d6 += h0 * r6;\n d6 += h1 * r5;\n d6 += h2 * r4;\n d6 += h3 * r3;\n d6 += h4 * r2;\n c = (d6 >>> 13); d6 &= 0x1fff;\n d6 += h5 * r1;\n d6 += h6 * r0;\n d6 += h7 * (5 * r9);\n d6 += h8 * (5 * r8);\n d6 += h9 * (5 * r7);\n c += (d6 >>> 13); d6 &= 0x1fff;\n\n d7 = c;\n d7 += h0 * r7;\n d7 += h1 * r6;\n d7 += h2 * r5;\n d7 += h3 * r4;\n d7 += h4 * r3;\n c = (d7 >>> 13); d7 &= 0x1fff;\n d7 += h5 * r2;\n d7 += h6 * r1;\n d7 += h7 * r0;\n d7 += h8 * (5 * r9);\n d7 += h9 * (5 * r8);\n c += (d7 >>> 13); d7 &= 0x1fff;\n\n d8 = c;\n d8 += h0 * r8;\n d8 += h1 * r7;\n d8 += h2 * r6;\n d8 += h3 * r5;\n d8 += h4 * r4;\n c = (d8 >>> 13); d8 &= 0x1fff;\n d8 += h5 * r3;\n d8 += h6 * r2;\n d8 += h7 * r1;\n d8 += h8 * r0;\n d8 += h9 * (5 * r9);\n c += (d8 >>> 13); d8 &= 0x1fff;\n\n d9 = c;\n d9 += h0 * r9;\n d9 += h1 * r8;\n d9 += h2 * r7;\n d9 += h3 * r6;\n d9 += h4 * r5;\n c = (d9 >>> 13); d9 &= 0x1fff;\n d9 += h5 * r4;\n d9 += h6 * r3;\n d9 += h7 * r2;\n d9 += h8 * r1;\n d9 += h9 * r0;\n c += (d9 >>> 13); d9 &= 0x1fff;\n\n c = (((c << 2) + c)) | 0;\n c = (c + d0) | 0;\n d0 = c & 0x1fff;\n c = (c >>> 13);\n d1 += c;\n\n h0 = d0;\n h1 = d1;\n h2 = d2;\n h3 = d3;\n h4 = d4;\n h5 = d5;\n h6 = d6;\n h7 = d7;\n h8 = d8;\n h9 = d9;\n\n mpos += 16;\n bytes -= 16;\n }\n this.h[0] = h0;\n this.h[1] = h1;\n this.h[2] = h2;\n this.h[3] = h3;\n this.h[4] = h4;\n this.h[5] = h5;\n this.h[6] = h6;\n this.h[7] = h7;\n this.h[8] = h8;\n this.h[9] = h9;\n};\n\npoly1305.prototype.finish = function(mac, macpos) {\n var g = new Uint16Array(10);\n var c, mask, f, i;\n\n if (this.leftover) {\n i = this.leftover;\n this.buffer[i++] = 1;\n for (; i < 16; i++) this.buffer[i] = 0;\n this.fin = 1;\n this.blocks(this.buffer, 0, 16);\n }\n\n c = this.h[1] >>> 13;\n this.h[1] &= 0x1fff;\n for (i = 2; i < 10; i++) {\n this.h[i] += c;\n c = this.h[i] >>> 13;\n this.h[i] &= 0x1fff;\n }\n this.h[0] += (c * 5);\n c = this.h[0] >>> 13;\n this.h[0] &= 0x1fff;\n this.h[1] += c;\n c = this.h[1] >>> 13;\n this.h[1] &= 0x1fff;\n this.h[2] += c;\n\n g[0] = this.h[0] + 5;\n c = g[0] >>> 13;\n g[0] &= 0x1fff;\n for (i = 1; i < 10; i++) {\n g[i] = this.h[i] + c;\n c = g[i] >>> 13;\n g[i] &= 0x1fff;\n }\n g[9] -= (1 << 13);\n\n mask = (c ^ 1) - 1;\n for (i = 0; i < 10; i++) g[i] &= mask;\n mask = ~mask;\n for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i];\n\n this.h[0] = ((this.h[0] ) | (this.h[1] << 13) ) & 0xffff;\n this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10) ) & 0xffff;\n this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7) ) & 0xffff;\n this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4) ) & 0xffff;\n this.h[4] = ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff;\n this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11) ) & 0xffff;\n this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8) ) & 0xffff;\n this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5) ) & 0xffff;\n\n f = this.h[0] + this.pad[0];\n this.h[0] = f & 0xffff;\n for (i = 1; i < 8; i++) {\n f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0;\n this.h[i] = f & 0xffff;\n }\n\n mac[macpos+ 0] = (this.h[0] >>> 0) & 0xff;\n mac[macpos+ 1] = (this.h[0] >>> 8) & 0xff;\n mac[macpos+ 2] = (this.h[1] >>> 0) & 0xff;\n mac[macpos+ 3] = (this.h[1] >>> 8) & 0xff;\n mac[macpos+ 4] = (this.h[2] >>> 0) & 0xff;\n mac[macpos+ 5] = (this.h[2] >>> 8) & 0xff;\n mac[macpos+ 6] = (this.h[3] >>> 0) & 0xff;\n mac[macpos+ 7] = (this.h[3] >>> 8) & 0xff;\n mac[macpos+ 8] = (this.h[4] >>> 0) & 0xff;\n mac[macpos+ 9] = (this.h[4] >>> 8) & 0xff;\n mac[macpos+10] = (this.h[5] >>> 0) & 0xff;\n mac[macpos+11] = (this.h[5] >>> 8) & 0xff;\n mac[macpos+12] = (this.h[6] >>> 0) & 0xff;\n mac[macpos+13] = (this.h[6] >>> 8) & 0xff;\n mac[macpos+14] = (this.h[7] >>> 0) & 0xff;\n mac[macpos+15] = (this.h[7] >>> 8) & 0xff;\n};\n\npoly1305.prototype.update = function(m, mpos, bytes) {\n var i, want;\n\n if (this.leftover) {\n want = (16 - this.leftover);\n if (want > bytes)\n want = bytes;\n for (i = 0; i < want; i++)\n this.buffer[this.leftover + i] = m[mpos+i];\n bytes -= want;\n mpos += want;\n this.leftover += want;\n if (this.leftover < 16)\n return;\n this.blocks(this.buffer, 0, 16);\n this.leftover = 0;\n }\n\n if (bytes >= 16) {\n want = bytes - (bytes % 16);\n this.blocks(m, mpos, want);\n mpos += want;\n bytes -= want;\n }\n\n if (bytes) {\n for (i = 0; i < bytes; i++)\n this.buffer[this.leftover + i] = m[mpos+i];\n this.leftover += bytes;\n }\n};\n\nfunction crypto_onetimeauth(out, outpos, m, mpos, n, k) {\n var s = new poly1305(k);\n s.update(m, mpos, n);\n s.finish(out, outpos);\n return 0;\n}\n\nfunction crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) {\n var x = new Uint8Array(16);\n crypto_onetimeauth(x,0,m,mpos,n,k);\n return crypto_verify_16(h,hpos,x,0);\n}\n\nfunction crypto_secretbox(c,m,d,n,k) {\n var i;\n if (d < 32) return -1;\n crypto_stream_xor(c,0,m,0,d,n,k);\n crypto_onetimeauth(c, 16, c, 32, d - 32, c);\n for (i = 0; i < 16; i++) c[i] = 0;\n return 0;\n}\n\nfunction crypto_secretbox_open(m,c,d,n,k) {\n var i;\n var x = new Uint8Array(32);\n if (d < 32) return -1;\n crypto_stream(x,0,32,n,k);\n if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1;\n crypto_stream_xor(m,0,c,0,d,n,k);\n for (i = 0; i < 32; i++) m[i] = 0;\n return 0;\n}\n\nfunction set25519(r, a) {\n var i;\n for (i = 0; i < 16; i++) r[i] = a[i]|0;\n}\n\nfunction car25519(o) {\n var i, v, c = 1;\n for (i = 0; i < 16; i++) {\n v = o[i] + c + 65535;\n c = Math.floor(v / 65536);\n o[i] = v - c * 65536;\n }\n o[0] += c-1 + 37 * (c-1);\n}\n\nfunction sel25519(p, q, b) {\n var t, c = ~(b-1);\n for (var i = 0; i < 16; i++) {\n t = c & (p[i] ^ q[i]);\n p[i] ^= t;\n q[i] ^= t;\n }\n}\n\nfunction pack25519(o, n) {\n var i, j, b;\n var m = gf(), t = gf();\n for (i = 0; i < 16; i++) t[i] = n[i];\n car25519(t);\n car25519(t);\n car25519(t);\n for (j = 0; j < 2; j++) {\n m[0] = t[0] - 0xffed;\n for (i = 1; i < 15; i++) {\n m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1);\n m[i-1] &= 0xffff;\n }\n m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1);\n b = (m[15]>>16) & 1;\n m[14] &= 0xffff;\n sel25519(t, m, 1-b);\n }\n for (i = 0; i < 16; i++) {\n o[2*i] = t[i] & 0xff;\n o[2*i+1] = t[i]>>8;\n }\n}\n\nfunction neq25519(a, b) {\n var c = new Uint8Array(32), d = new Uint8Array(32);\n pack25519(c, a);\n pack25519(d, b);\n return crypto_verify_32(c, 0, d, 0);\n}\n\nfunction par25519(a) {\n var d = new Uint8Array(32);\n pack25519(d, a);\n return d[0] & 1;\n}\n\nfunction unpack25519(o, n) {\n var i;\n for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8);\n o[15] &= 0x7fff;\n}\n\nfunction A(o, a, b) {\n for (var i = 0; i < 16; i++) o[i] = a[i] + b[i];\n}\n\nfunction Z(o, a, b) {\n for (var i = 0; i < 16; i++) o[i] = a[i] - b[i];\n}\n\nfunction M(o, a, b) {\n var v, c,\n t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0,\n t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0,\n t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0,\n t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0,\n b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7],\n b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11],\n b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n\n v = a[0];\n t0 += v * b0;\n t1 += v * b1;\n t2 += v * b2;\n t3 += v * b3;\n t4 += v * b4;\n t5 += v * b5;\n t6 += v * b6;\n t7 += v * b7;\n t8 += v * b8;\n t9 += v * b9;\n t10 += v * b10;\n t11 += v * b11;\n t12 += v * b12;\n t13 += v * b13;\n t14 += v * b14;\n t15 += v * b15;\n v = a[1];\n t1 += v * b0;\n t2 += v * b1;\n t3 += v * b2;\n t4 += v * b3;\n t5 += v * b4;\n t6 += v * b5;\n t7 += v * b6;\n t8 += v * b7;\n t9 += v * b8;\n t10 += v * b9;\n t11 += v * b10;\n t12 += v * b11;\n t13 += v * b12;\n t14 += v * b13;\n t15 += v * b14;\n t16 += v * b15;\n v = a[2];\n t2 += v * b0;\n t3 += v * b1;\n t4 += v * b2;\n t5 += v * b3;\n t6 += v * b4;\n t7 += v * b5;\n t8 += v * b6;\n t9 += v * b7;\n t10 += v * b8;\n t11 += v * b9;\n t12 += v * b10;\n t13 += v * b11;\n t14 += v * b12;\n t15 += v * b13;\n t16 += v * b14;\n t17 += v * b15;\n v = a[3];\n t3 += v * b0;\n t4 += v * b1;\n t5 += v * b2;\n t6 += v * b3;\n t7 += v * b4;\n t8 += v * b5;\n t9 += v * b6;\n t10 += v * b7;\n t11 += v * b8;\n t12 += v * b9;\n t13 += v * b10;\n t14 += v * b11;\n t15 += v * b12;\n t16 += v * b13;\n t17 += v * b14;\n t18 += v * b15;\n v = a[4];\n t4 += v * b0;\n t5 += v * b1;\n t6 += v * b2;\n t7 += v * b3;\n t8 += v * b4;\n t9 += v * b5;\n t10 += v * b6;\n t11 += v * b7;\n t12 += v * b8;\n t13 += v * b9;\n t14 += v * b10;\n t15 += v * b11;\n t16 += v * b12;\n t17 += v * b13;\n t18 += v * b14;\n t19 += v * b15;\n v = a[5];\n t5 += v * b0;\n t6 += v * b1;\n t7 += v * b2;\n t8 += v * b3;\n t9 += v * b4;\n t10 += v * b5;\n t11 += v * b6;\n t12 += v * b7;\n t13 += v * b8;\n t14 += v * b9;\n t15 += v * b10;\n t16 += v * b11;\n t17 += v * b12;\n t18 += v * b13;\n t19 += v * b14;\n t20 += v * b15;\n v = a[6];\n t6 += v * b0;\n t7 += v * b1;\n t8 += v * b2;\n t9 += v * b3;\n t10 += v * b4;\n t11 += v * b5;\n t12 += v * b6;\n t13 += v * b7;\n t14 += v * b8;\n t15 += v * b9;\n t16 += v * b10;\n t17 += v * b11;\n t18 += v * b12;\n t19 += v * b13;\n t20 += v * b14;\n t21 += v * b15;\n v = a[7];\n t7 += v * b0;\n t8 += v * b1;\n t9 += v * b2;\n t10 += v * b3;\n t11 += v * b4;\n t12 += v * b5;\n t13 += v * b6;\n t14 += v * b7;\n t15 += v * b8;\n t16 += v * b9;\n t17 += v * b10;\n t18 += v * b11;\n t19 += v * b12;\n t20 += v * b13;\n t21 += v * b14;\n t22 += v * b15;\n v = a[8];\n t8 += v * b0;\n t9 += v * b1;\n t10 += v * b2;\n t11 += v * b3;\n t12 += v * b4;\n t13 += v * b5;\n t14 += v * b6;\n t15 += v * b7;\n t16 += v * b8;\n t17 += v * b9;\n t18 += v * b10;\n t19 += v * b11;\n t20 += v * b12;\n t21 += v * b13;\n t22 += v * b14;\n t23 += v * b15;\n v = a[9];\n t9 += v * b0;\n t10 += v * b1;\n t11 += v * b2;\n t12 += v * b3;\n t13 += v * b4;\n t14 += v * b5;\n t15 += v * b6;\n t16 += v * b7;\n t17 += v * b8;\n t18 += v * b9;\n t19 += v * b10;\n t20 += v * b11;\n t21 += v * b12;\n t22 += v * b13;\n t23 += v * b14;\n t24 += v * b15;\n v = a[10];\n t10 += v * b0;\n t11 += v * b1;\n t12 += v * b2;\n t13 += v * b3;\n t14 += v * b4;\n t15 += v * b5;\n t16 += v * b6;\n t17 += v * b7;\n t18 += v * b8;\n t19 += v * b9;\n t20 += v * b10;\n t21 += v * b11;\n t22 += v * b12;\n t23 += v * b13;\n t24 += v * b14;\n t25 += v * b15;\n v = a[11];\n t11 += v * b0;\n t12 += v * b1;\n t13 += v * b2;\n t14 += v * b3;\n t15 += v * b4;\n t16 += v * b5;\n t17 += v * b6;\n t18 += v * b7;\n t19 += v * b8;\n t20 += v * b9;\n t21 += v * b10;\n t22 += v * b11;\n t23 += v * b12;\n t24 += v * b13;\n t25 += v * b14;\n t26 += v * b15;\n v = a[12];\n t12 += v * b0;\n t13 += v * b1;\n t14 += v * b2;\n t15 += v * b3;\n t16 += v * b4;\n t17 += v * b5;\n t18 += v * b6;\n t19 += v * b7;\n t20 += v * b8;\n t21 += v * b9;\n t22 += v * b10;\n t23 += v * b11;\n t24 += v * b12;\n t25 += v * b13;\n t26 += v * b14;\n t27 += v * b15;\n v = a[13];\n t13 += v * b0;\n t14 += v * b1;\n t15 += v * b2;\n t16 += v * b3;\n t17 += v * b4;\n t18 += v * b5;\n t19 += v * b6;\n t20 += v * b7;\n t21 += v * b8;\n t22 += v * b9;\n t23 += v * b10;\n t24 += v * b11;\n t25 += v * b12;\n t26 += v * b13;\n t27 += v * b14;\n t28 += v * b15;\n v = a[14];\n t14 += v * b0;\n t15 += v * b1;\n t16 += v * b2;\n t17 += v * b3;\n t18 += v * b4;\n t19 += v * b5;\n t20 += v * b6;\n t21 += v * b7;\n t22 += v * b8;\n t23 += v * b9;\n t24 += v * b10;\n t25 += v * b11;\n t26 += v * b12;\n t27 += v * b13;\n t28 += v * b14;\n t29 += v * b15;\n v = a[15];\n t15 += v * b0;\n t16 += v * b1;\n t17 += v * b2;\n t18 += v * b3;\n t19 += v * b4;\n t20 += v * b5;\n t21 += v * b6;\n t22 += v * b7;\n t23 += v * b8;\n t24 += v * b9;\n t25 += v * b10;\n t26 += v * b11;\n t27 += v * b12;\n t28 += v * b13;\n t29 += v * b14;\n t30 += v * b15;\n\n t0 += 38 * t16;\n t1 += 38 * t17;\n t2 += 38 * t18;\n t3 += 38 * t19;\n t4 += 38 * t20;\n t5 += 38 * t21;\n t6 += 38 * t22;\n t7 += 38 * t23;\n t8 += 38 * t24;\n t9 += 38 * t25;\n t10 += 38 * t26;\n t11 += 38 * t27;\n t12 += 38 * t28;\n t13 += 38 * t29;\n t14 += 38 * t30;\n // t15 left as is\n\n // first car\n c = 1;\n v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536;\n v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536;\n v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536;\n v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536;\n v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536;\n v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536;\n v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536;\n v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536;\n v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536;\n v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536;\n v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n t0 += c-1 + 37 * (c-1);\n\n // second car\n c = 1;\n v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536;\n v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536;\n v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536;\n v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536;\n v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536;\n v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536;\n v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536;\n v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536;\n v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536;\n v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536;\n v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n t0 += c-1 + 37 * (c-1);\n\n o[ 0] = t0;\n o[ 1] = t1;\n o[ 2] = t2;\n o[ 3] = t3;\n o[ 4] = t4;\n o[ 5] = t5;\n o[ 6] = t6;\n o[ 7] = t7;\n o[ 8] = t8;\n o[ 9] = t9;\n o[10] = t10;\n o[11] = t11;\n o[12] = t12;\n o[13] = t13;\n o[14] = t14;\n o[15] = t15;\n}\n\nfunction S(o, a) {\n M(o, a, a);\n}\n\nfunction inv25519(o, i) {\n var c = gf();\n var a;\n for (a = 0; a < 16; a++) c[a] = i[a];\n for (a = 253; a >= 0; a--) {\n S(c, c);\n if(a !== 2 && a !== 4) M(c, c, i);\n }\n for (a = 0; a < 16; a++) o[a] = c[a];\n}\n\nfunction pow2523(o, i) {\n var c = gf();\n var a;\n for (a = 0; a < 16; a++) c[a] = i[a];\n for (a = 250; a >= 0; a--) {\n S(c, c);\n if(a !== 1) M(c, c, i);\n }\n for (a = 0; a < 16; a++) o[a] = c[a];\n}\n\nfunction crypto_scalarmult(q, n, p) {\n var z = new Uint8Array(32);\n var x = new Float64Array(80), r, i;\n var a = gf(), b = gf(), c = gf(),\n d = gf(), e = gf(), f = gf();\n for (i = 0; i < 31; i++) z[i] = n[i];\n z[31]=(n[31]&127)|64;\n z[0]&=248;\n unpack25519(x,p);\n for (i = 0; i < 16; i++) {\n b[i]=x[i];\n d[i]=a[i]=c[i]=0;\n }\n a[0]=d[0]=1;\n for (i=254; i>=0; --i) {\n r=(z[i>>>3]>>>(i&7))&1;\n sel25519(a,b,r);\n sel25519(c,d,r);\n A(e,a,c);\n Z(a,a,c);\n A(c,b,d);\n Z(b,b,d);\n S(d,e);\n S(f,a);\n M(a,c,a);\n M(c,b,e);\n A(e,a,c);\n Z(a,a,c);\n S(b,a);\n Z(c,d,f);\n M(a,c,_121665);\n A(a,a,d);\n M(c,c,a);\n M(a,d,f);\n M(d,b,x);\n S(b,e);\n sel25519(a,b,r);\n sel25519(c,d,r);\n }\n for (i = 0; i < 16; i++) {\n x[i+16]=a[i];\n x[i+32]=c[i];\n x[i+48]=b[i];\n x[i+64]=d[i];\n }\n var x32 = x.subarray(32);\n var x16 = x.subarray(16);\n inv25519(x32,x32);\n M(x16,x16,x32);\n pack25519(q,x16);\n return 0;\n}\n\nfunction crypto_scalarmult_base(q, n) {\n return crypto_scalarmult(q, n, _9);\n}\n\nfunction crypto_box_keypair(y, x) {\n randombytes(x, 32);\n return crypto_scalarmult_base(y, x);\n}\n\nfunction crypto_box_beforenm(k, y, x) {\n var s = new Uint8Array(32);\n crypto_scalarmult(s, x, y);\n return crypto_core_hsalsa20(k, _0, s, sigma);\n}\n\nvar crypto_box_afternm = crypto_secretbox;\nvar crypto_box_open_afternm = crypto_secretbox_open;\n\nfunction crypto_box(c, m, d, n, y, x) {\n var k = new Uint8Array(32);\n crypto_box_beforenm(k, y, x);\n return crypto_box_afternm(c, m, d, n, k);\n}\n\nfunction crypto_box_open(m, c, d, n, y, x) {\n var k = new Uint8Array(32);\n crypto_box_beforenm(k, y, x);\n return crypto_box_open_afternm(m, c, d, n, k);\n}\n\nvar K = [\n 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,\n 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,\n 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,\n 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,\n 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,\n 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,\n 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,\n 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,\n 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,\n 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,\n 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,\n 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,\n 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,\n 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,\n 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,\n 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,\n 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,\n 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,\n 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,\n 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,\n 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,\n 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,\n 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,\n 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,\n 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,\n 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,\n 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,\n 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,\n 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,\n 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,\n 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,\n 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,\n 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,\n 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,\n 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,\n 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,\n 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,\n 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,\n 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,\n 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817\n];\n\nfunction crypto_hashblocks_hl(hh, hl, m, n) {\n var wh = new Int32Array(16), wl = new Int32Array(16),\n bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7,\n bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7,\n th, tl, i, j, h, l, a, b, c, d;\n\n var ah0 = hh[0],\n ah1 = hh[1],\n ah2 = hh[2],\n ah3 = hh[3],\n ah4 = hh[4],\n ah5 = hh[5],\n ah6 = hh[6],\n ah7 = hh[7],\n\n al0 = hl[0],\n al1 = hl[1],\n al2 = hl[2],\n al3 = hl[3],\n al4 = hl[4],\n al5 = hl[5],\n al6 = hl[6],\n al7 = hl[7];\n\n var pos = 0;\n while (n >= 128) {\n for (i = 0; i < 16; i++) {\n j = 8 * i + pos;\n wh[i] = (m[j+0] << 24) | (m[j+1] << 16) | (m[j+2] << 8) | m[j+3];\n wl[i] = (m[j+4] << 24) | (m[j+5] << 16) | (m[j+6] << 8) | m[j+7];\n }\n for (i = 0; i < 80; i++) {\n bh0 = ah0;\n bh1 = ah1;\n bh2 = ah2;\n bh3 = ah3;\n bh4 = ah4;\n bh5 = ah5;\n bh6 = ah6;\n bh7 = ah7;\n\n bl0 = al0;\n bl1 = al1;\n bl2 = al2;\n bl3 = al3;\n bl4 = al4;\n bl5 = al5;\n bl6 = al6;\n bl7 = al7;\n\n // add\n h = ah7;\n l = al7;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n // Sigma1\n h = ((ah4 >>> 14) | (al4 << (32-14))) ^ ((ah4 >>> 18) | (al4 << (32-18))) ^ ((al4 >>> (41-32)) | (ah4 << (32-(41-32))));\n l = ((al4 >>> 14) | (ah4 << (32-14))) ^ ((al4 >>> 18) | (ah4 << (32-18))) ^ ((ah4 >>> (41-32)) | (al4 << (32-(41-32))));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // Ch\n h = (ah4 & ah5) ^ (~ah4 & ah6);\n l = (al4 & al5) ^ (~al4 & al6);\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // K\n h = K[i*2];\n l = K[i*2+1];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // w\n h = wh[i%16];\n l = wl[i%16];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n th = c & 0xffff | d << 16;\n tl = a & 0xffff | b << 16;\n\n // add\n h = th;\n l = tl;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n // Sigma0\n h = ((ah0 >>> 28) | (al0 << (32-28))) ^ ((al0 >>> (34-32)) | (ah0 << (32-(34-32)))) ^ ((al0 >>> (39-32)) | (ah0 << (32-(39-32))));\n l = ((al0 >>> 28) | (ah0 << (32-28))) ^ ((ah0 >>> (34-32)) | (al0 << (32-(34-32)))) ^ ((ah0 >>> (39-32)) | (al0 << (32-(39-32))));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // Maj\n h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2);\n l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2);\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n bh7 = (c & 0xffff) | (d << 16);\n bl7 = (a & 0xffff) | (b << 16);\n\n // add\n h = bh3;\n l = bl3;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = th;\n l = tl;\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n bh3 = (c & 0xffff) | (d << 16);\n bl3 = (a & 0xffff) | (b << 16);\n\n ah1 = bh0;\n ah2 = bh1;\n ah3 = bh2;\n ah4 = bh3;\n ah5 = bh4;\n ah6 = bh5;\n ah7 = bh6;\n ah0 = bh7;\n\n al1 = bl0;\n al2 = bl1;\n al3 = bl2;\n al4 = bl3;\n al5 = bl4;\n al6 = bl5;\n al7 = bl6;\n al0 = bl7;\n\n if (i%16 === 15) {\n for (j = 0; j < 16; j++) {\n // add\n h = wh[j];\n l = wl[j];\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = wh[(j+9)%16];\n l = wl[(j+9)%16];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // sigma0\n th = wh[(j+1)%16];\n tl = wl[(j+1)%16];\n h = ((th >>> 1) | (tl << (32-1))) ^ ((th >>> 8) | (tl << (32-8))) ^ (th >>> 7);\n l = ((tl >>> 1) | (th << (32-1))) ^ ((tl >>> 8) | (th << (32-8))) ^ ((tl >>> 7) | (th << (32-7)));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n // sigma1\n th = wh[(j+14)%16];\n tl = wl[(j+14)%16];\n h = ((th >>> 19) | (tl << (32-19))) ^ ((tl >>> (61-32)) | (th << (32-(61-32)))) ^ (th >>> 6);\n l = ((tl >>> 19) | (th << (32-19))) ^ ((th >>> (61-32)) | (tl << (32-(61-32)))) ^ ((tl >>> 6) | (th << (32-6)));\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n wh[j] = (c & 0xffff) | (d << 16);\n wl[j] = (a & 0xffff) | (b << 16);\n }\n }\n }\n\n // add\n h = ah0;\n l = al0;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[0];\n l = hl[0];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[0] = ah0 = (c & 0xffff) | (d << 16);\n hl[0] = al0 = (a & 0xffff) | (b << 16);\n\n h = ah1;\n l = al1;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[1];\n l = hl[1];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[1] = ah1 = (c & 0xffff) | (d << 16);\n hl[1] = al1 = (a & 0xffff) | (b << 16);\n\n h = ah2;\n l = al2;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[2];\n l = hl[2];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[2] = ah2 = (c & 0xffff) | (d << 16);\n hl[2] = al2 = (a & 0xffff) | (b << 16);\n\n h = ah3;\n l = al3;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[3];\n l = hl[3];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[3] = ah3 = (c & 0xffff) | (d << 16);\n hl[3] = al3 = (a & 0xffff) | (b << 16);\n\n h = ah4;\n l = al4;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[4];\n l = hl[4];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[4] = ah4 = (c & 0xffff) | (d << 16);\n hl[4] = al4 = (a & 0xffff) | (b << 16);\n\n h = ah5;\n l = al5;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[5];\n l = hl[5];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[5] = ah5 = (c & 0xffff) | (d << 16);\n hl[5] = al5 = (a & 0xffff) | (b << 16);\n\n h = ah6;\n l = al6;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[6];\n l = hl[6];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[6] = ah6 = (c & 0xffff) | (d << 16);\n hl[6] = al6 = (a & 0xffff) | (b << 16);\n\n h = ah7;\n l = al7;\n\n a = l & 0xffff; b = l >>> 16;\n c = h & 0xffff; d = h >>> 16;\n\n h = hh[7];\n l = hl[7];\n\n a += l & 0xffff; b += l >>> 16;\n c += h & 0xffff; d += h >>> 16;\n\n b += a >>> 16;\n c += b >>> 16;\n d += c >>> 16;\n\n hh[7] = ah7 = (c & 0xffff) | (d << 16);\n hl[7] = al7 = (a & 0xffff) | (b << 16);\n\n pos += 128;\n n -= 128;\n }\n\n return n;\n}\n\nfunction crypto_hash(out, m, n) {\n var hh = new Int32Array(8),\n hl = new Int32Array(8),\n x = new Uint8Array(256),\n i, b = n;\n\n hh[0] = 0x6a09e667;\n hh[1] = 0xbb67ae85;\n hh[2] = 0x3c6ef372;\n hh[3] = 0xa54ff53a;\n hh[4] = 0x510e527f;\n hh[5] = 0x9b05688c;\n hh[6] = 0x1f83d9ab;\n hh[7] = 0x5be0cd19;\n\n hl[0] = 0xf3bcc908;\n hl[1] = 0x84caa73b;\n hl[2] = 0xfe94f82b;\n hl[3] = 0x5f1d36f1;\n hl[4] = 0xade682d1;\n hl[5] = 0x2b3e6c1f;\n hl[6] = 0xfb41bd6b;\n hl[7] = 0x137e2179;\n\n crypto_hashblocks_hl(hh, hl, m, n);\n n %= 128;\n\n for (i = 0; i < n; i++) x[i] = m[b-n+i];\n x[n] = 128;\n\n n = 256-128*(n<112?1:0);\n x[n-9] = 0;\n ts64(x, n-8, (b / 0x20000000) | 0, b << 3);\n crypto_hashblocks_hl(hh, hl, x, n);\n\n for (i = 0; i < 8; i++) ts64(out, 8*i, hh[i], hl[i]);\n\n return 0;\n}\n\nfunction add(p, q) {\n var a = gf(), b = gf(), c = gf(),\n d = gf(), e = gf(), f = gf(),\n g = gf(), h = gf(), t = gf();\n\n Z(a, p[1], p[0]);\n Z(t, q[1], q[0]);\n M(a, a, t);\n A(b, p[0], p[1]);\n A(t, q[0], q[1]);\n M(b, b, t);\n M(c, p[3], q[3]);\n M(c, c, D2);\n M(d, p[2], q[2]);\n A(d, d, d);\n Z(e, b, a);\n Z(f, d, c);\n A(g, d, c);\n A(h, b, a);\n\n M(p[0], e, f);\n M(p[1], h, g);\n M(p[2], g, f);\n M(p[3], e, h);\n}\n\nfunction cswap(p, q, b) {\n var i;\n for (i = 0; i < 4; i++) {\n sel25519(p[i], q[i], b);\n }\n}\n\nfunction pack(r, p) {\n var tx = gf(), ty = gf(), zi = gf();\n inv25519(zi, p[2]);\n M(tx, p[0], zi);\n M(ty, p[1], zi);\n pack25519(r, ty);\n r[31] ^= par25519(tx) << 7;\n}\n\nfunction scalarmult(p, q, s) {\n var b, i;\n set25519(p[0], gf0);\n set25519(p[1], gf1);\n set25519(p[2], gf1);\n set25519(p[3], gf0);\n for (i = 255; i >= 0; --i) {\n b = (s[(i/8)|0] >> (i&7)) & 1;\n cswap(p, q, b);\n add(q, p);\n add(p, p);\n cswap(p, q, b);\n }\n}\n\nfunction scalarbase(p, s) {\n var q = [gf(), gf(), gf(), gf()];\n set25519(q[0], X);\n set25519(q[1], Y);\n set25519(q[2], gf1);\n M(q[3], X, Y);\n scalarmult(p, q, s);\n}\n\nfunction crypto_sign_keypair(pk, sk, seeded) {\n var d = new Uint8Array(64);\n var p = [gf(), gf(), gf(), gf()];\n var i;\n\n if (!seeded) randombytes(sk, 32);\n crypto_hash(d, sk, 32);\n d[0] &= 248;\n d[31] &= 127;\n d[31] |= 64;\n\n scalarbase(p, d);\n pack(pk, p);\n\n for (i = 0; i < 32; i++) sk[i+32] = pk[i];\n return 0;\n}\n\nvar L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);\n\nfunction modL(r, x) {\n var carry, i, j, k;\n for (i = 63; i >= 32; --i) {\n carry = 0;\n for (j = i - 32, k = i - 12; j < k; ++j) {\n x[j] += carry - 16 * x[i] * L[j - (i - 32)];\n carry = (x[j] + 128) >> 8;\n x[j] -= carry * 256;\n }\n x[j] += carry;\n x[i] = 0;\n }\n carry = 0;\n for (j = 0; j < 32; j++) {\n x[j] += carry - (x[31] >> 4) * L[j];\n carry = x[j] >> 8;\n x[j] &= 255;\n }\n for (j = 0; j < 32; j++) x[j] -= carry * L[j];\n for (i = 0; i < 32; i++) {\n x[i+1] += x[i] >> 8;\n r[i] = x[i] & 255;\n }\n}\n\nfunction reduce(r) {\n var x = new Float64Array(64), i;\n for (i = 0; i < 64; i++) x[i] = r[i];\n for (i = 0; i < 64; i++) r[i] = 0;\n modL(r, x);\n}\n\n// Note: difference from C - smlen returned, not passed as argument.\nfunction crypto_sign(sm, m, n, sk) {\n var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64);\n var i, j, x = new Float64Array(64);\n var p = [gf(), gf(), gf(), gf()];\n\n crypto_hash(d, sk, 32);\n d[0] &= 248;\n d[31] &= 127;\n d[31] |= 64;\n\n var smlen = n + 64;\n for (i = 0; i < n; i++) sm[64 + i] = m[i];\n for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i];\n\n crypto_hash(r, sm.subarray(32), n+32);\n reduce(r);\n scalarbase(p, r);\n pack(sm, p);\n\n for (i = 32; i < 64; i++) sm[i] = sk[i];\n crypto_hash(h, sm, n + 64);\n reduce(h);\n\n for (i = 0; i < 64; i++) x[i] = 0;\n for (i = 0; i < 32; i++) x[i] = r[i];\n for (i = 0; i < 32; i++) {\n for (j = 0; j < 32; j++) {\n x[i+j] += h[i] * d[j];\n }\n }\n\n modL(sm.subarray(32), x);\n return smlen;\n}\n\nfunction unpackneg(r, p) {\n var t = gf(), chk = gf(), num = gf(),\n den = gf(), den2 = gf(), den4 = gf(),\n den6 = gf();\n\n set25519(r[2], gf1);\n unpack25519(r[1], p);\n S(num, r[1]);\n M(den, num, D);\n Z(num, num, r[2]);\n A(den, r[2], den);\n\n S(den2, den);\n S(den4, den2);\n M(den6, den4, den2);\n M(t, den6, num);\n M(t, t, den);\n\n pow2523(t, t);\n M(t, t, num);\n M(t, t, den);\n M(t, t, den);\n M(r[0], t, den);\n\n S(chk, r[0]);\n M(chk, chk, den);\n if (neq25519(chk, num)) M(r[0], r[0], I);\n\n S(chk, r[0]);\n M(chk, chk, den);\n if (neq25519(chk, num)) return -1;\n\n if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]);\n\n M(r[3], r[0], r[1]);\n return 0;\n}\n\nfunction crypto_sign_open(m, sm, n, pk) {\n var i, mlen;\n var t = new Uint8Array(32), h = new Uint8Array(64);\n var p = [gf(), gf(), gf(), gf()],\n q = [gf(), gf(), gf(), gf()];\n\n mlen = -1;\n if (n < 64) return -1;\n\n if (unpackneg(q, pk)) return -1;\n\n for (i = 0; i < n; i++) m[i] = sm[i];\n for (i = 0; i < 32; i++) m[i+32] = pk[i];\n crypto_hash(h, m, n);\n reduce(h);\n scalarmult(p, q, h);\n\n scalarbase(q, sm.subarray(32));\n add(p, q);\n pack(t, p);\n\n n -= 64;\n if (crypto_verify_32(sm, 0, t, 0)) {\n for (i = 0; i < n; i++) m[i] = 0;\n return -1;\n }\n\n for (i = 0; i < n; i++) m[i] = sm[i + 64];\n mlen = n;\n return mlen;\n}\n\nvar crypto_secretbox_KEYBYTES = 32,\n crypto_secretbox_NONCEBYTES = 24,\n crypto_secretbox_ZEROBYTES = 32,\n crypto_secretbox_BOXZEROBYTES = 16,\n crypto_scalarmult_BYTES = 32,\n crypto_scalarmult_SCALARBYTES = 32,\n crypto_box_PUBLICKEYBYTES = 32,\n crypto_box_SECRETKEYBYTES = 32,\n crypto_box_BEFORENMBYTES = 32,\n crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES,\n crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES,\n crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES,\n crypto_sign_BYTES = 64,\n crypto_sign_PUBLICKEYBYTES = 32,\n crypto_sign_SECRETKEYBYTES = 64,\n crypto_sign_SEEDBYTES = 32,\n crypto_hash_BYTES = 64;\n\nnacl.lowlevel = {\n crypto_core_hsalsa20: crypto_core_hsalsa20,\n crypto_stream_xor: crypto_stream_xor,\n crypto_stream: crypto_stream,\n crypto_stream_salsa20_xor: crypto_stream_salsa20_xor,\n crypto_stream_salsa20: crypto_stream_salsa20,\n crypto_onetimeauth: crypto_onetimeauth,\n crypto_onetimeauth_verify: crypto_onetimeauth_verify,\n crypto_verify_16: crypto_verify_16,\n crypto_verify_32: crypto_verify_32,\n crypto_secretbox: crypto_secretbox,\n crypto_secretbox_open: crypto_secretbox_open,\n crypto_scalarmult: crypto_scalarmult,\n crypto_scalarmult_base: crypto_scalarmult_base,\n crypto_box_beforenm: crypto_box_beforenm,\n crypto_box_afternm: crypto_box_afternm,\n crypto_box: crypto_box,\n crypto_box_open: crypto_box_open,\n crypto_box_keypair: crypto_box_keypair,\n crypto_hash: crypto_hash,\n crypto_sign: crypto_sign,\n crypto_sign_keypair: crypto_sign_keypair,\n crypto_sign_open: crypto_sign_open,\n\n crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES,\n crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES,\n crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES,\n crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES,\n crypto_scalarmult_BYTES: crypto_scalarmult_BYTES,\n crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES,\n crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES,\n crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES,\n crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES,\n crypto_box_NONCEBYTES: crypto_box_NONCEBYTES,\n crypto_box_ZEROBYTES: crypto_box_ZEROBYTES,\n crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES,\n crypto_sign_BYTES: crypto_sign_BYTES,\n crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES,\n crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES,\n crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES,\n crypto_hash_BYTES: crypto_hash_BYTES\n};\n\n/* High-level API */\n\nfunction checkLengths(k, n) {\n if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size');\n if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size');\n}\n\nfunction checkBoxLengths(pk, sk) {\n if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size');\n if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size');\n}\n\nfunction checkArrayTypes() {\n var t, i;\n for (i = 0; i < arguments.length; i++) {\n if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]')\n throw new TypeError('unexpected type ' + t + ', use Uint8Array');\n }\n}\n\nfunction cleanup(arr) {\n for (var i = 0; i < arr.length; i++) arr[i] = 0;\n}\n\n// TODO: Completely remove this in v0.15.\nif (!nacl.util) {\n nacl.util = {};\n nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() {\n throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js');\n };\n}\n\nnacl.randomBytes = function(n) {\n var b = new Uint8Array(n);\n randombytes(b, n);\n return b;\n};\n\nnacl.secretbox = function(msg, nonce, key) {\n checkArrayTypes(msg, nonce, key);\n checkLengths(key, nonce);\n var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length);\n var c = new Uint8Array(m.length);\n for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i];\n crypto_secretbox(c, m, m.length, nonce, key);\n return c.subarray(crypto_secretbox_BOXZEROBYTES);\n};\n\nnacl.secretbox.open = function(box, nonce, key) {\n checkArrayTypes(box, nonce, key);\n checkLengths(key, nonce);\n var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length);\n var m = new Uint8Array(c.length);\n for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i];\n if (c.length < 32) return false;\n if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false;\n return m.subarray(crypto_secretbox_ZEROBYTES);\n};\n\nnacl.secretbox.keyLength = crypto_secretbox_KEYBYTES;\nnacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES;\nnacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES;\n\nnacl.scalarMult = function(n, p) {\n checkArrayTypes(n, p);\n if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');\n if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size');\n var q = new Uint8Array(crypto_scalarmult_BYTES);\n crypto_scalarmult(q, n, p);\n return q;\n};\n\nnacl.scalarMult.base = function(n) {\n checkArrayTypes(n);\n if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');\n var q = new Uint8Array(crypto_scalarmult_BYTES);\n crypto_scalarmult_base(q, n);\n return q;\n};\n\nnacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES;\nnacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES;\n\nnacl.box = function(msg, nonce, publicKey, secretKey) {\n var k = nacl.box.before(publicKey, secretKey);\n return nacl.secretbox(msg, nonce, k);\n};\n\nnacl.box.before = function(publicKey, secretKey) {\n checkArrayTypes(publicKey, secretKey);\n checkBoxLengths(publicKey, secretKey);\n var k = new Uint8Array(crypto_box_BEFORENMBYTES);\n crypto_box_beforenm(k, publicKey, secretKey);\n return k;\n};\n\nnacl.box.after = nacl.secretbox;\n\nnacl.box.open = function(msg, nonce, publicKey, secretKey) {\n var k = nacl.box.before(publicKey, secretKey);\n return nacl.secretbox.open(msg, nonce, k);\n};\n\nnacl.box.open.after = nacl.secretbox.open;\n\nnacl.box.keyPair = function() {\n var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);\n var sk = new Uint8Array(crypto_box_SECRETKEYBYTES);\n crypto_box_keypair(pk, sk);\n return {publicKey: pk, secretKey: sk};\n};\n\nnacl.box.keyPair.fromSecretKey = function(secretKey) {\n checkArrayTypes(secretKey);\n if (secretKey.length !== crypto_box_SECRETKEYBYTES)\n throw new Error('bad secret key size');\n var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);\n crypto_scalarmult_base(pk, secretKey);\n return {publicKey: pk, secretKey: new Uint8Array(secretKey)};\n};\n\nnacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES;\nnacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES;\nnacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES;\nnacl.box.nonceLength = crypto_box_NONCEBYTES;\nnacl.box.overheadLength = nacl.secretbox.overheadLength;\n\nnacl.sign = function(msg, secretKey) {\n checkArrayTypes(msg, secretKey);\n if (secretKey.length !== crypto_sign_SECRETKEYBYTES)\n throw new Error('bad secret key size');\n var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length);\n crypto_sign(signedMsg, msg, msg.length, secretKey);\n return signedMsg;\n};\n\nnacl.sign.open = function(signedMsg, publicKey) {\n if (arguments.length !== 2)\n throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?');\n checkArrayTypes(signedMsg, publicKey);\n if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)\n throw new Error('bad public key size');\n var tmp = new Uint8Array(signedMsg.length);\n var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey);\n if (mlen < 0) return null;\n var m = new Uint8Array(mlen);\n for (var i = 0; i < m.length; i++) m[i] = tmp[i];\n return m;\n};\n\nnacl.sign.detached = function(msg, secretKey) {\n var signedMsg = nacl.sign(msg, secretKey);\n var sig = new Uint8Array(crypto_sign_BYTES);\n for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];\n return sig;\n};\n\nnacl.sign.detached.verify = function(msg, sig, publicKey) {\n checkArrayTypes(msg, sig, publicKey);\n if (sig.length !== crypto_sign_BYTES)\n throw new Error('bad signature size');\n if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)\n throw new Error('bad public key size');\n var sm = new Uint8Array(crypto_sign_BYTES + msg.length);\n var m = new Uint8Array(crypto_sign_BYTES + msg.length);\n var i;\n for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i];\n for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i];\n return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0);\n};\n\nnacl.sign.keyPair = function() {\n var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);\n crypto_sign_keypair(pk, sk);\n return {publicKey: pk, secretKey: sk};\n};\n\nnacl.sign.keyPair.fromSecretKey = function(secretKey) {\n checkArrayTypes(secretKey);\n if (secretKey.length !== crypto_sign_SECRETKEYBYTES)\n throw new Error('bad secret key size');\n var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i];\n return {publicKey: pk, secretKey: new Uint8Array(secretKey)};\n};\n\nnacl.sign.keyPair.fromSeed = function(seed) {\n checkArrayTypes(seed);\n if (seed.length !== crypto_sign_SEEDBYTES)\n throw new Error('bad seed size');\n var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);\n for (var i = 0; i < 32; i++) sk[i] = seed[i];\n crypto_sign_keypair(pk, sk, true);\n return {publicKey: pk, secretKey: sk};\n};\n\nnacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES;\nnacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES;\nnacl.sign.seedLength = crypto_sign_SEEDBYTES;\nnacl.sign.signatureLength = crypto_sign_BYTES;\n\nnacl.hash = function(msg) {\n checkArrayTypes(msg);\n var h = new Uint8Array(crypto_hash_BYTES);\n crypto_hash(h, msg, msg.length);\n return h;\n};\n\nnacl.hash.hashLength = crypto_hash_BYTES;\n\nnacl.verify = function(x, y) {\n checkArrayTypes(x, y);\n // Zero length arguments are considered not equal.\n if (x.length === 0 || y.length === 0) return false;\n if (x.length !== y.length) return false;\n return (vn(x, 0, y, 0, x.length) === 0) ? true : false;\n};\n\nnacl.setPRNG = function(fn) {\n randombytes = fn;\n};\n\n(function() {\n // Initialize PRNG if environment provides CSPRNG.\n // If not, methods calling randombytes will throw.\n var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null;\n if (crypto && crypto.getRandomValues) {\n // Browsers.\n var QUOTA = 65536;\n nacl.setPRNG(function(x, n) {\n var i, v = new Uint8Array(n);\n for (i = 0; i < n; i += QUOTA) {\n crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));\n }\n for (i = 0; i < n; i++) x[i] = v[i];\n cleanup(v);\n });\n } else if (typeof require !== 'undefined') {\n // Node.js.\n crypto = require('crypto');\n if (crypto && crypto.randomBytes) {\n nacl.setPRNG(function(x, n) {\n var i, v = crypto.randomBytes(n);\n for (i = 0; i < n; i++) x[i] = v[i];\n cleanup(v);\n });\n }\n }\n})();\n\n})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {}));\n", "'use strict';\n\nvar crypto_hash_sha512 = require('tweetnacl').lowlevel.crypto_hash;\n\n/*\n * This file is a 1:1 port from the OpenBSD blowfish.c and bcrypt_pbkdf.c. As a\n * result, it retains the original copyright and license. The two files are\n * under slightly different (but compatible) licenses, and are here combined in\n * one file.\n *\n * Credit for the actual porting work goes to:\n * Devi Mandiri <me@devi.web.id>\n */\n\n/*\n * The Blowfish portions are under the following license:\n *\n * Blowfish block cipher for OpenBSD\n * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>\n * All rights reserved.\n *\n * Implementation advice by David Mazieres <dm@lcs.mit.edu>.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * The bcrypt_pbkdf portions are under the following license:\n *\n * Copyright (c) 2013 Ted Unangst <tedu@openbsd.org>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n/*\n * Performance improvements (Javascript-specific):\n *\n * Copyright 2016, Joyent Inc\n * Author: Alex Wilson <alex.wilson@joyent.com>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n// Ported from OpenBSD bcrypt_pbkdf.c v1.9\n\nvar BLF_J = 0;\n\nvar Blowfish = function() {\n this.S = [\n new Uint32Array([\n 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,\n 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,\n 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,\n 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,\n 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,\n 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,\n 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,\n 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,\n 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,\n 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,\n 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,\n 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,\n 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,\n 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,\n 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,\n 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,\n 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,\n 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,\n 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,\n 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,\n 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,\n 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,\n 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,\n 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,\n 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,\n 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,\n 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,\n 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,\n 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,\n 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,\n 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,\n 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,\n 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,\n 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,\n 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,\n 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,\n 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,\n 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,\n 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,\n 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,\n 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,\n 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,\n 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,\n 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,\n 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,\n 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,\n 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,\n 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,\n 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,\n 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,\n 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,\n 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,\n 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,\n 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,\n 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,\n 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,\n 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,\n 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,\n 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,\n 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,\n 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,\n 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,\n 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,\n 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a]),\n new Uint32Array([\n 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,\n 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,\n 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,\n 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,\n 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,\n 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,\n 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,\n 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,\n 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,\n 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,\n 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,\n 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,\n 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,\n 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,\n 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,\n 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,\n 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,\n 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,\n 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,\n 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,\n 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,\n 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,\n 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,\n 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,\n 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,\n 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,\n 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,\n 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,\n 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,\n 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,\n 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,\n 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,\n 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,\n 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,\n 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,\n 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,\n 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,\n 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,\n 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,\n 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,\n 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,\n 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,\n 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,\n 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,\n 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,\n 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,\n 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,\n 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,\n 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,\n 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,\n 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,\n 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,\n 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,\n 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,\n 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,\n 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,\n 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,\n 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,\n 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,\n 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,\n 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,\n 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,\n 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,\n 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7]),\n new Uint32Array([\n 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,\n 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,\n 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,\n 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,\n 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,\n 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,\n 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,\n 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,\n 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,\n 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,\n 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,\n 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,\n 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,\n 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,\n 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,\n 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,\n 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,\n 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,\n 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,\n 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,\n 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,\n 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,\n 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,\n 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,\n 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,\n 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,\n 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,\n 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,\n 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,\n 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,\n 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,\n 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,\n 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,\n 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,\n 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,\n 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,\n 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,\n 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,\n 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,\n 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,\n 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,\n 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,\n 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,\n 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,\n 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,\n 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,\n 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,\n 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,\n 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,\n 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,\n 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,\n 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,\n 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,\n 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,\n 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,\n 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,\n 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,\n 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,\n 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,\n 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,\n 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,\n 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,\n 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,\n 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0]),\n new Uint32Array([\n 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,\n 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,\n 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,\n 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,\n 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,\n 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,\n 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,\n 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,\n 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,\n 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,\n 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,\n 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,\n 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,\n 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,\n 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,\n 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,\n 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,\n 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,\n 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,\n 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,\n 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,\n 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,\n 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,\n 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,\n 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,\n 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,\n 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,\n 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,\n 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,\n 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,\n 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,\n 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,\n 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,\n 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,\n 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,\n 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,\n 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,\n 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,\n 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,\n 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,\n 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,\n 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,\n 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,\n 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,\n 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,\n 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,\n 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,\n 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,\n 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,\n 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,\n 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,\n 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,\n 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,\n 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,\n 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,\n 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,\n 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,\n 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,\n 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,\n 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,\n 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,\n 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,\n 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,\n 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6])\n ];\n this.P = new Uint32Array([\n 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,\n 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,\n 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,\n 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,\n 0x9216d5d9, 0x8979fb1b]);\n};\n\nfunction F(S, x8, i) {\n return (((S[0][x8[i+3]] +\n S[1][x8[i+2]]) ^\n S[2][x8[i+1]]) +\n S[3][x8[i]]);\n};\n\nBlowfish.prototype.encipher = function(x, x8) {\n if (x8 === undefined) {\n x8 = new Uint8Array(x.buffer);\n if (x.byteOffset !== 0)\n x8 = x8.subarray(x.byteOffset);\n }\n x[0] ^= this.P[0];\n for (var i = 1; i < 16; i += 2) {\n x[1] ^= F(this.S, x8, 0) ^ this.P[i];\n x[0] ^= F(this.S, x8, 4) ^ this.P[i+1];\n }\n var t = x[0];\n x[0] = x[1] ^ this.P[17];\n x[1] = t;\n};\n\nBlowfish.prototype.decipher = function(x) {\n var x8 = new Uint8Array(x.buffer);\n if (x.byteOffset !== 0)\n x8 = x8.subarray(x.byteOffset);\n x[0] ^= this.P[17];\n for (var i = 16; i > 0; i -= 2) {\n x[1] ^= F(this.S, x8, 0) ^ this.P[i];\n x[0] ^= F(this.S, x8, 4) ^ this.P[i-1];\n }\n var t = x[0];\n x[0] = x[1] ^ this.P[0];\n x[1] = t;\n};\n\nfunction stream2word(data, databytes){\n var i, temp = 0;\n for (i = 0; i < 4; i++, BLF_J++) {\n if (BLF_J >= databytes) BLF_J = 0;\n temp = (temp << 8) | data[BLF_J];\n }\n return temp;\n};\n\nBlowfish.prototype.expand0state = function(key, keybytes) {\n var d = new Uint32Array(2), i, k;\n var d8 = new Uint8Array(d.buffer);\n\n for (i = 0, BLF_J = 0; i < 18; i++) {\n this.P[i] ^= stream2word(key, keybytes);\n }\n BLF_J = 0;\n\n for (i = 0; i < 18; i += 2) {\n this.encipher(d, d8);\n this.P[i] = d[0];\n this.P[i+1] = d[1];\n }\n\n for (i = 0; i < 4; i++) {\n for (k = 0; k < 256; k += 2) {\n this.encipher(d, d8);\n this.S[i][k] = d[0];\n this.S[i][k+1] = d[1];\n }\n }\n};\n\nBlowfish.prototype.expandstate = function(data, databytes, key, keybytes) {\n var d = new Uint32Array(2), i, k;\n\n for (i = 0, BLF_J = 0; i < 18; i++) {\n this.P[i] ^= stream2word(key, keybytes);\n }\n\n for (i = 0, BLF_J = 0; i < 18; i += 2) {\n d[0] ^= stream2word(data, databytes);\n d[1] ^= stream2word(data, databytes);\n this.encipher(d);\n this.P[i] = d[0];\n this.P[i+1] = d[1];\n }\n\n for (i = 0; i < 4; i++) {\n for (k = 0; k < 256; k += 2) {\n d[0] ^= stream2word(data, databytes);\n d[1] ^= stream2word(data, databytes);\n this.encipher(d);\n this.S[i][k] = d[0];\n this.S[i][k+1] = d[1];\n }\n }\n BLF_J = 0;\n};\n\nBlowfish.prototype.enc = function(data, blocks) {\n for (var i = 0; i < blocks; i++) {\n this.encipher(data.subarray(i*2));\n }\n};\n\nBlowfish.prototype.dec = function(data, blocks) {\n for (var i = 0; i < blocks; i++) {\n this.decipher(data.subarray(i*2));\n }\n};\n\nvar BCRYPT_BLOCKS = 8,\n BCRYPT_HASHSIZE = 32;\n\nfunction bcrypt_hash(sha2pass, sha2salt, out) {\n var state = new Blowfish(),\n cdata = new Uint32Array(BCRYPT_BLOCKS), i,\n ciphertext = new Uint8Array([79,120,121,99,104,114,111,109,97,116,105,\n 99,66,108,111,119,102,105,115,104,83,119,97,116,68,121,110,97,109,\n 105,116,101]); //\"OxychromaticBlowfishSwatDynamite\"\n\n state.expandstate(sha2salt, 64, sha2pass, 64);\n for (i = 0; i < 64; i++) {\n state.expand0state(sha2salt, 64);\n state.expand0state(sha2pass, 64);\n }\n\n for (i = 0; i < BCRYPT_BLOCKS; i++)\n cdata[i] = stream2word(ciphertext, ciphertext.byteLength);\n for (i = 0; i < 64; i++)\n state.enc(cdata, cdata.byteLength / 8);\n\n for (i = 0; i < BCRYPT_BLOCKS; i++) {\n out[4*i+3] = cdata[i] >>> 24;\n out[4*i+2] = cdata[i] >>> 16;\n out[4*i+1] = cdata[i] >>> 8;\n out[4*i+0] = cdata[i];\n }\n};\n\nfunction bcrypt_pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds) {\n var sha2pass = new Uint8Array(64),\n sha2salt = new Uint8Array(64),\n out = new Uint8Array(BCRYPT_HASHSIZE),\n tmpout = new Uint8Array(BCRYPT_HASHSIZE),\n countsalt = new Uint8Array(saltlen+4),\n i, j, amt, stride, dest, count,\n origkeylen = keylen;\n\n if (rounds < 1)\n return -1;\n if (passlen === 0 || saltlen === 0 || keylen === 0 ||\n keylen > (out.byteLength * out.byteLength) || saltlen > (1<<20))\n return -1;\n\n stride = Math.floor((keylen + out.byteLength - 1) / out.byteLength);\n amt = Math.floor((keylen + stride - 1) / stride);\n\n for (i = 0; i < saltlen; i++)\n countsalt[i] = salt[i];\n\n crypto_hash_sha512(sha2pass, pass, passlen);\n\n for (count = 1; keylen > 0; count++) {\n countsalt[saltlen+0] = count >>> 24;\n countsalt[saltlen+1] = count >>> 16;\n countsalt[saltlen+2] = count >>> 8;\n countsalt[saltlen+3] = count;\n\n crypto_hash_sha512(sha2salt, countsalt, saltlen + 4);\n bcrypt_hash(sha2pass, sha2salt, tmpout);\n for (i = out.byteLength; i--;)\n out[i] = tmpout[i];\n\n for (i = 1; i < rounds; i++) {\n crypto_hash_sha512(sha2salt, tmpout, tmpout.byteLength);\n bcrypt_hash(sha2pass, sha2salt, tmpout);\n for (j = 0; j < out.byteLength; j++)\n out[j] ^= tmpout[j];\n }\n\n amt = Math.min(amt, keylen);\n for (i = 0; i < amt; i++) {\n dest = i * stride + (count - 1);\n if (dest >= origkeylen)\n break;\n key[dest] = out[i];\n }\n keylen -= i;\n }\n\n return 0;\n};\n\nmodule.exports = {\n BLOCKS: BCRYPT_BLOCKS,\n HASHSIZE: BCRYPT_HASHSIZE,\n hash: bcrypt_hash,\n pbkdf: bcrypt_pbkdf\n};\n", "'use strict';\n\nconst crypto = require('crypto');\n\nlet cpuInfo;\ntry {\n cpuInfo = require('cpu-features')();\n} catch {}\n\nconst { bindingAvailable, CIPHER_INFO, MAC_INFO } = require('./crypto.js');\n\nconst eddsaSupported = (() => {\n if (typeof crypto.sign === 'function'\n && typeof crypto.verify === 'function') {\n const key =\n '-----BEGIN PRIVATE KEY-----\\r\\nMC4CAQAwBQYDK2VwBCIEIHKj+sVa9WcD'\n + '/q2DJUJaf43Kptc8xYuUQA4bOFj9vC8T\\r\\n-----END PRIVATE KEY-----';\n const data = Buffer.from('a');\n let sig;\n let verified;\n try {\n sig = crypto.sign(null, data, key);\n verified = crypto.verify(null, data, key, sig);\n } catch {}\n return (Buffer.isBuffer(sig) && sig.length === 64 && verified === true);\n }\n\n return false;\n})();\n\nconst curve25519Supported = (typeof crypto.diffieHellman === 'function'\n && typeof crypto.generateKeyPairSync === 'function'\n && typeof crypto.createPublicKey === 'function');\n\nconst DEFAULT_KEX = [\n // https://tools.ietf.org/html/rfc5656#section-10.1\n 'ecdh-sha2-nistp256',\n 'ecdh-sha2-nistp384',\n 'ecdh-sha2-nistp521',\n\n // https://tools.ietf.org/html/rfc4419#section-4\n 'diffie-hellman-group-exchange-sha256',\n\n // https://tools.ietf.org/html/rfc8268\n 'diffie-hellman-group14-sha256',\n 'diffie-hellman-group15-sha512',\n 'diffie-hellman-group16-sha512',\n 'diffie-hellman-group17-sha512',\n 'diffie-hellman-group18-sha512',\n];\nif (curve25519Supported) {\n DEFAULT_KEX.unshift('curve25519-sha256');\n DEFAULT_KEX.unshift('curve25519-sha256@libssh.org');\n}\nconst SUPPORTED_KEX = DEFAULT_KEX.concat([\n // https://tools.ietf.org/html/rfc4419#section-4\n 'diffie-hellman-group-exchange-sha1',\n\n 'diffie-hellman-group14-sha1', // REQUIRED\n 'diffie-hellman-group1-sha1', // REQUIRED\n]);\n\n\nconst DEFAULT_SERVER_HOST_KEY = [\n 'ecdsa-sha2-nistp256',\n 'ecdsa-sha2-nistp384',\n 'ecdsa-sha2-nistp521',\n 'rsa-sha2-512', // RFC 8332\n 'rsa-sha2-256', // RFC 8332\n 'ssh-rsa',\n];\nif (eddsaSupported)\n DEFAULT_SERVER_HOST_KEY.unshift('ssh-ed25519');\nconst SUPPORTED_SERVER_HOST_KEY = DEFAULT_SERVER_HOST_KEY.concat([\n 'ssh-dss',\n]);\n\n\nconst canUseCipher = (() => {\n const ciphers = crypto.getCiphers();\n return (name) => ciphers.includes(CIPHER_INFO[name].sslName);\n})();\nlet DEFAULT_CIPHER = [\n // http://tools.ietf.org/html/rfc5647\n 'aes128-gcm@openssh.com',\n 'aes256-gcm@openssh.com',\n\n // http://tools.ietf.org/html/rfc4344#section-4\n 'aes128-ctr',\n 'aes192-ctr',\n 'aes256-ctr',\n];\nif (cpuInfo && cpuInfo.flags && !cpuInfo.flags.aes) {\n // We know for sure the CPU does not support AES acceleration\n if (bindingAvailable)\n DEFAULT_CIPHER.unshift('chacha20-poly1305@openssh.com');\n else\n DEFAULT_CIPHER.push('chacha20-poly1305@openssh.com');\n} else if (bindingAvailable && cpuInfo && cpuInfo.arch === 'x86') {\n // Places chacha20-poly1305 immediately after GCM ciphers since GCM ciphers\n // seem to outperform it on x86, but it seems to be faster than CTR ciphers\n DEFAULT_CIPHER.splice(4, 0, 'chacha20-poly1305@openssh.com');\n} else {\n DEFAULT_CIPHER.push('chacha20-poly1305@openssh.com');\n}\nDEFAULT_CIPHER = DEFAULT_CIPHER.filter(canUseCipher);\nconst SUPPORTED_CIPHER = DEFAULT_CIPHER.concat([\n 'aes256-cbc',\n 'aes192-cbc',\n 'aes128-cbc',\n 'blowfish-cbc',\n '3des-cbc',\n 'aes128-gcm',\n 'aes256-gcm',\n\n // http://tools.ietf.org/html/rfc4345#section-4:\n 'arcfour256',\n 'arcfour128',\n\n 'cast128-cbc',\n 'arcfour',\n].filter(canUseCipher));\n\n\nconst canUseMAC = (() => {\n const hashes = crypto.getHashes();\n return (name) => hashes.includes(MAC_INFO[name].sslName);\n})();\nconst DEFAULT_MAC = [\n 'hmac-sha2-256-etm@openssh.com',\n 'hmac-sha2-512-etm@openssh.com',\n 'hmac-sha1-etm@openssh.com',\n 'hmac-sha2-256',\n 'hmac-sha2-512',\n 'hmac-sha1',\n].filter(canUseMAC);\nconst SUPPORTED_MAC = DEFAULT_MAC.concat([\n 'hmac-md5',\n 'hmac-sha2-256-96', // first 96 bits of HMAC-SHA256\n 'hmac-sha2-512-96', // first 96 bits of HMAC-SHA512\n 'hmac-ripemd160',\n 'hmac-sha1-96', // first 96 bits of HMAC-SHA1\n 'hmac-md5-96', // first 96 bits of HMAC-MD5\n].filter(canUseMAC));\n\nconst DEFAULT_COMPRESSION = [\n 'none',\n 'zlib@openssh.com', // ZLIB (LZ77) compression, except\n // compression/decompression does not start until after\n // successful user authentication\n 'zlib', // ZLIB (LZ77) compression\n];\nconst SUPPORTED_COMPRESSION = DEFAULT_COMPRESSION.concat([\n]);\n\n\nconst COMPAT = {\n BAD_DHGEX: 1 << 0,\n OLD_EXIT: 1 << 1,\n DYN_RPORT_BUG: 1 << 2,\n BUG_DHGEX_LARGE: 1 << 3,\n IMPLY_RSA_SHA2_SIGALGS: 1 << 4,\n};\n\nmodule.exports = {\n MESSAGE: {\n // Transport layer protocol -- generic (1-19)\n DISCONNECT: 1,\n IGNORE: 2,\n UNIMPLEMENTED: 3,\n DEBUG: 4,\n SERVICE_REQUEST: 5,\n SERVICE_ACCEPT: 6,\n EXT_INFO: 7, // RFC 8308\n\n // Transport layer protocol -- algorithm negotiation (20-29)\n KEXINIT: 20,\n NEWKEYS: 21,\n\n // Transport layer protocol -- key exchange method-specific (30-49)\n KEXDH_INIT: 30,\n KEXDH_REPLY: 31,\n\n KEXDH_GEX_GROUP: 31,\n KEXDH_GEX_INIT: 32,\n KEXDH_GEX_REPLY: 33,\n KEXDH_GEX_REQUEST: 34,\n\n KEXECDH_INIT: 30,\n KEXECDH_REPLY: 31,\n\n // User auth protocol -- generic (50-59)\n USERAUTH_REQUEST: 50,\n USERAUTH_FAILURE: 51,\n USERAUTH_SUCCESS: 52,\n USERAUTH_BANNER: 53,\n\n // User auth protocol -- user auth method-specific (60-79)\n USERAUTH_PASSWD_CHANGEREQ: 60,\n\n USERAUTH_PK_OK: 60,\n\n USERAUTH_INFO_REQUEST: 60,\n USERAUTH_INFO_RESPONSE: 61,\n\n // Connection protocol -- generic (80-89)\n GLOBAL_REQUEST: 80,\n REQUEST_SUCCESS: 81,\n REQUEST_FAILURE: 82,\n\n // Connection protocol -- channel-related (90-127)\n CHANNEL_OPEN: 90,\n CHANNEL_OPEN_CONFIRMATION: 91,\n CHANNEL_OPEN_FAILURE: 92,\n CHANNEL_WINDOW_ADJUST: 93,\n CHANNEL_DATA: 94,\n CHANNEL_EXTENDED_DATA: 95,\n CHANNEL_EOF: 96,\n CHANNEL_CLOSE: 97,\n CHANNEL_REQUEST: 98,\n CHANNEL_SUCCESS: 99,\n CHANNEL_FAILURE: 100\n\n // Reserved for client protocols (128-191)\n\n // Local extensions (192-155)\n },\n DISCONNECT_REASON: {\n HOST_NOT_ALLOWED_TO_CONNECT: 1,\n PROTOCOL_ERROR: 2,\n KEY_EXCHANGE_FAILED: 3,\n RESERVED: 4,\n MAC_ERROR: 5,\n COMPRESSION_ERROR: 6,\n SERVICE_NOT_AVAILABLE: 7,\n PROTOCOL_VERSION_NOT_SUPPORTED: 8,\n HOST_KEY_NOT_VERIFIABLE: 9,\n CONNECTION_LOST: 10,\n BY_APPLICATION: 11,\n TOO_MANY_CONNECTIONS: 12,\n AUTH_CANCELED_BY_USER: 13,\n NO_MORE_AUTH_METHODS_AVAILABLE: 14,\n ILLEGAL_USER_NAME: 15,\n },\n DISCONNECT_REASON_STR: undefined,\n CHANNEL_OPEN_FAILURE: {\n ADMINISTRATIVELY_PROHIBITED: 1,\n CONNECT_FAILED: 2,\n UNKNOWN_CHANNEL_TYPE: 3,\n RESOURCE_SHORTAGE: 4\n },\n TERMINAL_MODE: {\n TTY_OP_END: 0, // Indicates end of options.\n VINTR: 1, // Interrupt character; 255 if none. Similarly for the\n // other characters. Not all of these characters are\n // supported on all systems.\n VQUIT: 2, // The quit character (sends SIGQUIT signal on POSIX\n // systems).\n VERASE: 3, // Erase the character to left of the cursor.\n VKILL: 4, // Kill the current input line.\n VEOF: 5, // End-of-file character (sends EOF from the\n // terminal).\n VEOL: 6, // End-of-line character in addition to carriage\n // return and/or linefeed.\n VEOL2: 7, // Additional end-of-line character.\n VSTART: 8, // Continues paused output (normally control-Q).\n VSTOP: 9, // Pauses output (normally control-S).\n VSUSP: 10, // Suspends the current program.\n VDSUSP: 11, // Another suspend character.\n VREPRINT: 12, // Reprints the current input line.\n VWERASE: 13, // Erases a word left of cursor.\n VLNEXT: 14, // Enter the next character typed literally, even if\n // it is a special character\n VFLUSH: 15, // Character to flush output.\n VSWTCH: 16, // Switch to a different shell layer.\n VSTATUS: 17, // Prints system status line (load, command, pid,\n // etc).\n VDISCARD: 18, // Toggles the flushing of terminal output.\n IGNPAR: 30, // The ignore parity flag. The parameter SHOULD be 0\n // if this flag is FALSE, and 1 if it is TRUE.\n PARMRK: 31, // Mark parity and framing errors.\n INPCK: 32, // Enable checking of parity errors.\n ISTRIP: 33, // Strip 8th bit off characters.\n INLCR: 34, // Map NL into CR on input.\n IGNCR: 35, // Ignore CR on input.\n ICRNL: 36, // Map CR to NL on input.\n IUCLC: 37, // Translate uppercase characters to lowercase.\n IXON: 38, // Enable output flow control.\n IXANY: 39, // Any char will restart after stop.\n IXOFF: 40, // Enable input flow control.\n IMAXBEL: 41, // Ring bell on input queue full.\n ISIG: 50, // Enable signals INTR, QUIT, [D]SUSP.\n ICANON: 51, // Canonicalize input lines.\n XCASE: 52, // Enable input and output of uppercase characters by\n // preceding their lowercase equivalents with \"\\\".\n ECHO: 53, // Enable echoing.\n ECHOE: 54, // Visually erase chars.\n ECHOK: 55, // Kill character discards current line.\n ECHONL: 56, // Echo NL even if ECHO is off.\n NOFLSH: 57, // Don't flush after interrupt.\n TOSTOP: 58, // Stop background jobs from output.\n IEXTEN: 59, // Enable extensions.\n ECHOCTL: 60, // Echo control characters as ^(Char).\n ECHOKE: 61, // Visual erase for line kill.\n PENDIN: 62, // Retype pending input.\n OPOST: 70, // Enable output processing.\n OLCUC: 71, // Convert lowercase to uppercase.\n ONLCR: 72, // Map NL to CR-NL.\n OCRNL: 73, // Translate carriage return to newline (output).\n ONOCR: 74, // Translate newline to carriage return-newline\n // (output).\n ONLRET: 75, // Newline performs a carriage return (output).\n CS7: 90, // 7 bit mode.\n CS8: 91, // 8 bit mode.\n PARENB: 92, // Parity enable.\n PARODD: 93, // Odd parity, else even.\n TTY_OP_ISPEED: 128, // Specifies the input baud rate in bits per second.\n TTY_OP_OSPEED: 129, // Specifies the output baud rate in bits per second.\n },\n CHANNEL_EXTENDED_DATATYPE: {\n STDERR: 1,\n },\n\n SIGNALS: [\n 'ABRT', 'ALRM', 'FPE', 'HUP', 'ILL', 'INT', 'QUIT', 'SEGV', 'TERM', 'USR1',\n 'USR2', 'KILL', 'PIPE'\n ].reduce((cur, val) => ({ ...cur, [val]: 1 }), {}),\n\n COMPAT,\n COMPAT_CHECKS: [\n [ 'Cisco-1.25', COMPAT.BAD_DHGEX ],\n [ /^Cisco-1[.]/, COMPAT.BUG_DHGEX_LARGE ],\n [ /^[0-9.]+$/, COMPAT.OLD_EXIT ], // old SSH.com implementations\n [ /^OpenSSH_5[.][0-9]+/, COMPAT.DYN_RPORT_BUG ],\n [ /^OpenSSH_7[.]4/, COMPAT.IMPLY_RSA_SHA2_SIGALGS ],\n ],\n\n // KEX proposal-related\n DEFAULT_KEX,\n SUPPORTED_KEX,\n DEFAULT_SERVER_HOST_KEY,\n SUPPORTED_SERVER_HOST_KEY,\n DEFAULT_CIPHER,\n SUPPORTED_CIPHER,\n DEFAULT_MAC,\n SUPPORTED_MAC,\n DEFAULT_COMPRESSION,\n SUPPORTED_COMPRESSION,\n\n curve25519Supported,\n eddsaSupported,\n};\n\nmodule.exports.DISCONNECT_REASON_BY_VALUE =\n Array.from(Object.entries(module.exports.DISCONNECT_REASON))\n .reduce((obj, [key, value]) => ({ ...obj, [value]: key }), {});\n", "'use strict';\n\nconst Ber = require('asn1').Ber;\n\nlet DISCONNECT_REASON;\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TypedArrayFill = Object.getPrototypeOf(Uint8Array.prototype).fill;\n\nfunction readUInt32BE(buf, offset) {\n return (buf[offset++] * 16777216)\n + (buf[offset++] * 65536)\n + (buf[offset++] * 256)\n + buf[offset];\n}\n\nfunction bufferCopy(src, dest, srcStart, srcEnd, destStart) {\n if (!destStart)\n destStart = 0;\n if (srcEnd > src.length)\n srcEnd = src.length;\n let nb = srcEnd - srcStart;\n const destLeft = (dest.length - destStart);\n if (nb > destLeft)\n nb = destLeft;\n dest.set(new Uint8Array(src.buffer, src.byteOffset + srcStart, nb),\n destStart);\n return nb;\n}\n\nfunction bufferSlice(buf, start, end) {\n if (end === undefined)\n end = buf.length;\n return new FastBuffer(buf.buffer, buf.byteOffset + start, end - start);\n}\n\nfunction makeBufferParser() {\n let pos = 0;\n let buffer;\n\n const self = {\n init: (buf, start) => {\n buffer = buf;\n pos = (typeof start === 'number' ? start : 0);\n },\n pos: () => pos,\n length: () => (buffer ? buffer.length : 0),\n avail: () => (buffer && pos < buffer.length ? buffer.length - pos : 0),\n clear: () => {\n buffer = undefined;\n },\n readUInt32BE: () => {\n if (!buffer || pos + 3 >= buffer.length)\n return;\n return (buffer[pos++] * 16777216)\n + (buffer[pos++] * 65536)\n + (buffer[pos++] * 256)\n + buffer[pos++];\n },\n readUInt64BE: (behavior) => {\n if (!buffer || pos + 7 >= buffer.length)\n return;\n switch (behavior) {\n case 'always':\n return BigInt(`0x${buffer.hexSlice(pos, pos += 8)}`);\n case 'maybe':\n if (buffer[pos] > 0x1F)\n return BigInt(`0x${buffer.hexSlice(pos, pos += 8)}`);\n // FALLTHROUGH\n default:\n return (buffer[pos++] * 72057594037927940)\n + (buffer[pos++] * 281474976710656)\n + (buffer[pos++] * 1099511627776)\n + (buffer[pos++] * 4294967296)\n + (buffer[pos++] * 16777216)\n + (buffer[pos++] * 65536)\n + (buffer[pos++] * 256)\n + buffer[pos++];\n }\n },\n skip: (n) => {\n if (buffer && n > 0)\n pos += n;\n },\n skipString: () => {\n const len = self.readUInt32BE();\n if (len === undefined)\n return;\n pos += len;\n return (pos <= buffer.length ? len : undefined);\n },\n readByte: () => {\n if (buffer && pos < buffer.length)\n return buffer[pos++];\n },\n readBool: () => {\n if (buffer && pos < buffer.length)\n return !!buffer[pos++];\n },\n readList: () => {\n const list = self.readString(true);\n if (list === undefined)\n return;\n return (list ? list.split(',') : []);\n },\n readString: (dest, maxLen) => {\n if (typeof dest === 'number') {\n maxLen = dest;\n dest = undefined;\n }\n\n const len = self.readUInt32BE();\n if (len === undefined)\n return;\n\n if ((buffer.length - pos) < len\n || (typeof maxLen === 'number' && len > maxLen)) {\n return;\n }\n\n if (dest) {\n if (Buffer.isBuffer(dest))\n return bufferCopy(buffer, dest, pos, pos += len);\n return buffer.utf8Slice(pos, pos += len);\n }\n return bufferSlice(buffer, pos, pos += len);\n },\n readRaw: (len) => {\n if (!buffer)\n return;\n if (typeof len !== 'number')\n return bufferSlice(buffer, pos, pos += (buffer.length - pos));\n if ((buffer.length - pos) >= len)\n return bufferSlice(buffer, pos, pos += len);\n },\n };\n\n return self;\n}\n\nfunction makeError(msg, level, fatal) {\n const err = new Error(msg);\n if (typeof level === 'boolean') {\n fatal = level;\n err.level = 'protocol';\n } else {\n err.level = level || 'protocol';\n }\n err.fatal = !!fatal;\n return err;\n}\n\nfunction writeUInt32BE(buf, value, offset) {\n buf[offset++] = (value >>> 24);\n buf[offset++] = (value >>> 16);\n buf[offset++] = (value >>> 8);\n buf[offset++] = value;\n return offset;\n}\n\nconst utilBufferParser = makeBufferParser();\n\nmodule.exports = {\n bufferCopy,\n bufferSlice,\n FastBuffer,\n bufferFill: (buf, value, start, end) => {\n return TypedArrayFill.call(buf, value, start, end);\n },\n makeError,\n doFatalError: (protocol, msg, level, reason) => {\n let err;\n if (DISCONNECT_REASON === undefined)\n ({ DISCONNECT_REASON } = require('./constants.js'));\n if (msg instanceof Error) {\n // doFatalError(protocol, err[, reason])\n err = msg;\n if (typeof level !== 'number')\n reason = DISCONNECT_REASON.PROTOCOL_ERROR;\n else\n reason = level;\n } else {\n // doFatalError(protocol, msg[, level[, reason]])\n err = makeError(msg, level, true);\n }\n if (typeof reason !== 'number')\n reason = DISCONNECT_REASON.PROTOCOL_ERROR;\n protocol.disconnect(reason);\n protocol._destruct();\n protocol._onError(err);\n return Infinity;\n },\n readUInt32BE,\n writeUInt32BE,\n writeUInt32LE: (buf, value, offset) => {\n buf[offset++] = value;\n buf[offset++] = (value >>> 8);\n buf[offset++] = (value >>> 16);\n buf[offset++] = (value >>> 24);\n return offset;\n },\n makeBufferParser,\n bufferParser: makeBufferParser(),\n readString: (buffer, start, dest, maxLen) => {\n if (typeof dest === 'number') {\n maxLen = dest;\n dest = undefined;\n }\n\n if (start === undefined)\n start = 0;\n\n const left = (buffer.length - start);\n if (start < 0 || start >= buffer.length || left < 4)\n return;\n\n const len = readUInt32BE(buffer, start);\n if (left < (4 + len) || (typeof maxLen === 'number' && len > maxLen))\n return;\n\n start += 4;\n const end = start + len;\n buffer._pos = end;\n\n if (dest) {\n if (Buffer.isBuffer(dest))\n return bufferCopy(buffer, dest, start, end);\n return buffer.utf8Slice(start, end);\n }\n return bufferSlice(buffer, start, end);\n },\n sigSSHToASN1: (sig, type) => {\n switch (type) {\n case 'ssh-dss': {\n if (sig.length > 40)\n return sig;\n // Change bare signature r and s values to ASN.1 BER values for OpenSSL\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n let r = sig.slice(0, 20);\n let s = sig.slice(20);\n if (r[0] & 0x80) {\n const rNew = Buffer.allocUnsafe(21);\n rNew[0] = 0x00;\n r.copy(rNew, 1);\n r = rNew;\n } else if (r[0] === 0x00 && !(r[1] & 0x80)) {\n r = r.slice(1);\n }\n if (s[0] & 0x80) {\n const sNew = Buffer.allocUnsafe(21);\n sNew[0] = 0x00;\n s.copy(sNew, 1);\n s = sNew;\n } else if (s[0] === 0x00 && !(s[1] & 0x80)) {\n s = s.slice(1);\n }\n asnWriter.writeBuffer(r, Ber.Integer);\n asnWriter.writeBuffer(s, Ber.Integer);\n asnWriter.endSequence();\n return asnWriter.buffer;\n }\n case 'ecdsa-sha2-nistp256':\n case 'ecdsa-sha2-nistp384':\n case 'ecdsa-sha2-nistp521': {\n utilBufferParser.init(sig, 0);\n const r = utilBufferParser.readString();\n const s = utilBufferParser.readString();\n utilBufferParser.clear();\n if (r === undefined || s === undefined)\n return;\n\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n asnWriter.writeBuffer(r, Ber.Integer);\n asnWriter.writeBuffer(s, Ber.Integer);\n asnWriter.endSequence();\n return asnWriter.buffer;\n }\n default:\n return sig;\n }\n },\n convertSignature: (signature, keyType) => {\n switch (keyType) {\n case 'ssh-dss': {\n if (signature.length <= 40)\n return signature;\n // This is a quick and dirty way to get from BER encoded r and s that\n // OpenSSL gives us, to just the bare values back to back (40 bytes\n // total) like OpenSSH (and possibly others) are expecting\n const asnReader = new Ber.Reader(signature);\n asnReader.readSequence();\n let r = asnReader.readString(Ber.Integer, true);\n let s = asnReader.readString(Ber.Integer, true);\n let rOffset = 0;\n let sOffset = 0;\n if (r.length < 20) {\n const rNew = Buffer.allocUnsafe(20);\n rNew.set(r, 1);\n r = rNew;\n r[0] = 0;\n }\n if (s.length < 20) {\n const sNew = Buffer.allocUnsafe(20);\n sNew.set(s, 1);\n s = sNew;\n s[0] = 0;\n }\n if (r.length > 20 && r[0] === 0)\n rOffset = 1;\n if (s.length > 20 && s[0] === 0)\n sOffset = 1;\n const newSig =\n Buffer.allocUnsafe((r.length - rOffset) + (s.length - sOffset));\n bufferCopy(r, newSig, rOffset, r.length, 0);\n bufferCopy(s, newSig, sOffset, s.length, r.length - rOffset);\n return newSig;\n }\n case 'ecdsa-sha2-nistp256':\n case 'ecdsa-sha2-nistp384':\n case 'ecdsa-sha2-nistp521': {\n if (signature[0] === 0)\n return signature;\n // Convert SSH signature parameters to ASN.1 BER values for OpenSSL\n const asnReader = new Ber.Reader(signature);\n asnReader.readSequence();\n const r = asnReader.readString(Ber.Integer, true);\n const s = asnReader.readString(Ber.Integer, true);\n if (r === null || s === null)\n return;\n const newSig = Buffer.allocUnsafe(4 + r.length + 4 + s.length);\n writeUInt32BE(newSig, r.length, 0);\n newSig.set(r, 4);\n writeUInt32BE(newSig, s.length, 4 + r.length);\n newSig.set(s, 4 + 4 + r.length);\n return newSig;\n }\n }\n\n return signature;\n },\n sendPacket: (proto, packet, bypass) => {\n if (!bypass && proto._kexinit !== undefined) {\n // We're currently in the middle of a handshake\n\n if (proto._queue === undefined)\n proto._queue = [];\n proto._queue.push(packet);\n proto._debug && proto._debug('Outbound: ... packet queued');\n return false;\n }\n proto._cipher.encrypt(packet);\n return true;\n },\n};\n", "\nvar createPoly1305 = (function() {\n var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;\n if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;\n return (\nfunction(createPoly1305) {\n createPoly1305 = createPoly1305 || {};\n\n\nvar b;b||(b=typeof createPoly1305 !== 'undefined' ? createPoly1305 : {});var q,r;b.ready=new Promise(function(a,c){q=a;r=c});var u={},w;for(w in b)b.hasOwnProperty(w)&&(u[w]=b[w]);var x=\"object\"===typeof window,y=\"function\"===typeof importScripts,z=\"object\"===typeof process&&\"object\"===typeof process.versions&&\"string\"===typeof process.versions.node,B=\"\",C,D,E,F,G;\nif(z)B=y?require(\"path\").dirname(B)+\"/\":__dirname+\"/\",C=function(a,c){var d=H(a);if(d)return c?d:d.toString();F||(F=require(\"fs\"));G||(G=require(\"path\"));a=G.normalize(a);return F.readFileSync(a,c?null:\"utf8\")},E=function(a){a=C(a,!0);a.buffer||(a=new Uint8Array(a));assert(a.buffer);return a},D=function(a,c,d){var e=H(a);e&&c(e);F||(F=require(\"fs\"));G||(G=require(\"path\"));a=G.normalize(a);F.readFile(a,function(f,l){f?d(f):c(l.buffer)})},1<process.argv.length&&process.argv[1].replace(/\\\\/g,\"/\"),process.argv.slice(2),\nb.inspect=function(){return\"[Emscripten Module object]\"};else if(x||y)y?B=self.location.href:\"undefined\"!==typeof document&&document.currentScript&&(B=document.currentScript.src),_scriptDir&&(B=_scriptDir),0!==B.indexOf(\"blob:\")?B=B.substr(0,B.lastIndexOf(\"/\")+1):B=\"\",C=function(a){try{var c=new XMLHttpRequest;c.open(\"GET\",a,!1);c.send(null);return c.responseText}catch(f){if(a=H(a)){c=[];for(var d=0;d<a.length;d++){var e=a[d];255<e&&(ba&&assert(!1,\"Character code \"+e+\" (\"+String.fromCharCode(e)+\") at offset \"+\nd+\" not in 0x00-0xFF.\"),e&=255);c.push(String.fromCharCode(e))}return c.join(\"\")}throw f;}},y&&(E=function(a){try{var c=new XMLHttpRequest;c.open(\"GET\",a,!1);c.responseType=\"arraybuffer\";c.send(null);return new Uint8Array(c.response)}catch(d){if(a=H(a))return a;throw d;}}),D=function(a,c,d){var e=new XMLHttpRequest;e.open(\"GET\",a,!0);e.responseType=\"arraybuffer\";e.onload=function(){if(200==e.status||0==e.status&&e.response)c(e.response);else{var f=H(a);f?c(f.buffer):d()}};e.onerror=d;e.send(null)};\nb.print||console.log.bind(console);var I=b.printErr||console.warn.bind(console);for(w in u)u.hasOwnProperty(w)&&(b[w]=u[w]);u=null;var J;b.wasmBinary&&(J=b.wasmBinary);var noExitRuntime=b.noExitRuntime||!0;\"object\"!==typeof WebAssembly&&K(\"no native wasm support detected\");var L,M=!1;function assert(a,c){a||K(\"Assertion failed: \"+c)}function N(a){var c=b[\"_\"+a];assert(c,\"Cannot call unknown function \"+a+\", make sure it is exported\");return c}\nfunction ca(a,c,d,e){var f={string:function(g){var p=0;if(null!==g&&void 0!==g&&0!==g){var n=(g.length<<2)+1;p=O(n);var k=p,h=P;if(0<n){n=k+n-1;for(var v=0;v<g.length;++v){var m=g.charCodeAt(v);if(55296<=m&&57343>=m){var oa=g.charCodeAt(++v);m=65536+((m&1023)<<10)|oa&1023}if(127>=m){if(k>=n)break;h[k++]=m}else{if(2047>=m){if(k+1>=n)break;h[k++]=192|m>>6}else{if(65535>=m){if(k+2>=n)break;h[k++]=224|m>>12}else{if(k+3>=n)break;h[k++]=240|m>>18;h[k++]=128|m>>12&63}h[k++]=128|m>>6&63}h[k++]=128|m&63}}h[k]=\n0}}return p},array:function(g){var p=O(g.length);Q.set(g,p);return p}},l=N(a),A=[];a=0;if(e)for(var t=0;t<e.length;t++){var aa=f[d[t]];aa?(0===a&&(a=da()),A[t]=aa(e[t])):A[t]=e[t]}d=l.apply(null,A);d=function(g){if(\"string\"===c)if(g){for(var p=P,n=g+NaN,k=g;p[k]&&!(k>=n);)++k;if(16<k-g&&p.subarray&&ea)g=ea.decode(p.subarray(g,k));else{for(n=\"\";g<k;){var h=p[g++];if(h&128){var v=p[g++]&63;if(192==(h&224))n+=String.fromCharCode((h&31)<<6|v);else{var m=p[g++]&63;h=224==(h&240)?(h&15)<<12|v<<6|m:(h&7)<<\n18|v<<12|m<<6|p[g++]&63;65536>h?n+=String.fromCharCode(h):(h-=65536,n+=String.fromCharCode(55296|h>>10,56320|h&1023))}}else n+=String.fromCharCode(h)}g=n}}else g=\"\";else g=\"boolean\"===c?!!g:g;return g}(d);0!==a&&fa(a);return d}var ea=\"undefined\"!==typeof TextDecoder?new TextDecoder(\"utf8\"):void 0,ha,Q,P;\nfunction ia(){var a=L.buffer;ha=a;b.HEAP8=Q=new Int8Array(a);b.HEAP16=new Int16Array(a);b.HEAP32=new Int32Array(a);b.HEAPU8=P=new Uint8Array(a);b.HEAPU16=new Uint16Array(a);b.HEAPU32=new Uint32Array(a);b.HEAPF32=new Float32Array(a);b.HEAPF64=new Float64Array(a)}var R,ja=[],ka=[],la=[];function ma(){var a=b.preRun.shift();ja.unshift(a)}var S=0,T=null,U=null;b.preloadedImages={};b.preloadedAudios={};\nfunction K(a){if(b.onAbort)b.onAbort(a);I(a);M=!0;a=new WebAssembly.RuntimeError(\"abort(\"+a+\"). Build with -s ASSERTIONS=1 for more info.\");r(a);throw a;}var V=\"data:application/octet-stream;base64,\",W;W=\"data:application/octet-stream;base64,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\";if(!W.startsWith(V)){var na=W;W=b.locateFile?b.locateFile(na,B):B+na}function pa(){var a=W;try{if(a==W&&J)return new Uint8Array(J);var c=H(a);if(c)return c;if(E)return E(a);throw\"both async and sync fetching of the wasm failed\";}catch(d){K(d)}}\nfunction qa(){if(!J&&(x||y)){if(\"function\"===typeof fetch&&!W.startsWith(\"file://\"))return fetch(W,{credentials:\"same-origin\"}).then(function(a){if(!a.ok)throw\"failed to load wasm binary file at '\"+W+\"'\";return a.arrayBuffer()}).catch(function(){return pa()});if(D)return new Promise(function(a,c){D(W,function(d){a(new Uint8Array(d))},c)})}return Promise.resolve().then(function(){return pa()})}\nfunction X(a){for(;0<a.length;){var c=a.shift();if(\"function\"==typeof c)c(b);else{var d=c.m;\"number\"===typeof d?void 0===c.l?R.get(d)():R.get(d)(c.l):d(void 0===c.l?null:c.l)}}}\nvar ba=!1,ra=\"function\"===typeof atob?atob:function(a){var c=\"\",d=0;a=a.replace(/[^A-Za-z0-9\\+\\/=]/g,\"\");do{var e=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(d++));var f=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(d++));var l=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(d++));var A=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(a.charAt(d++));e=e<<\n2|f>>4;f=(f&15)<<4|l>>2;var t=(l&3)<<6|A;c+=String.fromCharCode(e);64!==l&&(c+=String.fromCharCode(f));64!==A&&(c+=String.fromCharCode(t))}while(d<a.length);return c};\nfunction H(a){if(a.startsWith(V)){a=a.slice(V.length);if(\"boolean\"===typeof z&&z){var c=Buffer.from(a,\"base64\");c=new Uint8Array(c.buffer,c.byteOffset,c.byteLength)}else try{var d=ra(a),e=new Uint8Array(d.length);for(a=0;a<d.length;++a)e[a]=d.charCodeAt(a);c=e}catch(f){throw Error(\"Converting base64 string to bytes failed.\");}return c}}\nvar sa={a:function(a){var c=P.length;a>>>=0;if(2147483648<a)return!1;for(var d=1;4>=d;d*=2){var e=c*(1+.2/d);e=Math.min(e,a+100663296);e=Math.max(a,e);0<e%65536&&(e+=65536-e%65536);a:{try{L.grow(Math.min(2147483648,e)-ha.byteLength+65535>>>16);ia();var f=1;break a}catch(l){}f=void 0}if(f)return!0}return!1}};\n(function(){function a(f){b.asm=f.exports;L=b.asm.b;ia();R=b.asm.j;ka.unshift(b.asm.c);S--;b.monitorRunDependencies&&b.monitorRunDependencies(S);0==S&&(null!==T&&(clearInterval(T),T=null),U&&(f=U,U=null,f()))}function c(f){a(f.instance)}function d(f){return qa().then(function(l){return WebAssembly.instantiate(l,e)}).then(f,function(l){I(\"failed to asynchronously prepare wasm: \"+l);K(l)})}var e={a:sa};S++;b.monitorRunDependencies&&b.monitorRunDependencies(S);if(b.instantiateWasm)try{return b.instantiateWasm(e,\na)}catch(f){return I(\"Module.instantiateWasm callback failed with error: \"+f),!1}(function(){return J||\"function\"!==typeof WebAssembly.instantiateStreaming||W.startsWith(V)||W.startsWith(\"file://\")||\"function\"!==typeof fetch?d(c):fetch(W,{credentials:\"same-origin\"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(c,function(l){I(\"wasm streaming compile failed: \"+l);I(\"falling back to ArrayBuffer instantiation\");return d(c)})})})().catch(r);return{}})();\nb.___wasm_call_ctors=function(){return(b.___wasm_call_ctors=b.asm.c).apply(null,arguments)};b._poly1305_auth=function(){return(b._poly1305_auth=b.asm.d).apply(null,arguments)};var da=b.stackSave=function(){return(da=b.stackSave=b.asm.e).apply(null,arguments)},fa=b.stackRestore=function(){return(fa=b.stackRestore=b.asm.f).apply(null,arguments)},O=b.stackAlloc=function(){return(O=b.stackAlloc=b.asm.g).apply(null,arguments)};b._malloc=function(){return(b._malloc=b.asm.h).apply(null,arguments)};\nb._free=function(){return(b._free=b.asm.i).apply(null,arguments)};b.cwrap=function(a,c,d,e){d=d||[];var f=d.every(function(l){return\"number\"===l});return\"string\"!==c&&f&&!e?N(a):function(){return ca(a,c,d,arguments)}};var Y;U=function ta(){Y||Z();Y||(U=ta)};\nfunction Z(){function a(){if(!Y&&(Y=!0,b.calledRun=!0,!M)){X(ka);q(b);if(b.onRuntimeInitialized)b.onRuntimeInitialized();if(b.postRun)for(\"function\"==typeof b.postRun&&(b.postRun=[b.postRun]);b.postRun.length;){var c=b.postRun.shift();la.unshift(c)}X(la)}}if(!(0<S)){if(b.preRun)for(\"function\"==typeof b.preRun&&(b.preRun=[b.preRun]);b.preRun.length;)ma();X(ja);0<S||(b.setStatus?(b.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){b.setStatus(\"\")},1);a()},1)):a())}}b.run=Z;\nif(b.preInit)for(\"function\"==typeof b.preInit&&(b.preInit=[b.preInit]);0<b.preInit.length;)b.preInit.pop()();Z();\n\n\n return createPoly1305.ready\n}\n);\n})();\nif (typeof exports === 'object' && typeof module === 'object')\n module.exports = createPoly1305;\nelse if (typeof define === 'function' && define['amd'])\n define([], function() { return createPoly1305; });\nelse if (typeof exports === 'object')\n exports[\"createPoly1305\"] = createPoly1305;\n", "// TODO:\n// * make max packet size configurable\n// * if decompression is enabled, use `._packet` in decipher instances as\n// input to (sync) zlib inflater with appropriate offset and length to\n// avoid an additional copy of payload data before inflation\n// * factor decompression status into packet length checks\n'use strict';\n\nconst {\n createCipheriv, createDecipheriv, createHmac, randomFillSync, timingSafeEqual\n} = require('crypto');\n\nconst { readUInt32BE, writeUInt32BE } = require('./utils.js');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst MAX_SEQNO = 2 ** 32 - 1;\nconst EMPTY_BUFFER = Buffer.alloc(0);\nconst BUF_INT = Buffer.alloc(4);\nconst DISCARD_CACHE = new Map();\nconst MAX_PACKET_SIZE = 35000;\n\nlet binding;\nlet AESGCMCipher;\nlet ChaChaPolyCipher;\nlet GenericCipher;\nlet AESGCMDecipher;\nlet ChaChaPolyDecipher;\nlet GenericDecipher;\ntry {\n binding = require('./crypto/build/Release/sshcrypto.node');\n ({ AESGCMCipher, ChaChaPolyCipher, GenericCipher,\n AESGCMDecipher, ChaChaPolyDecipher, GenericDecipher } = binding);\n} catch {}\n\nconst CIPHER_STREAM = 1 << 0;\nconst CIPHER_INFO = (() => {\n function info(sslName, blockLen, keyLen, ivLen, authLen, discardLen, flags) {\n return {\n sslName,\n blockLen,\n keyLen,\n ivLen: (ivLen !== 0 || (flags & CIPHER_STREAM)\n ? ivLen\n : blockLen),\n authLen,\n discardLen,\n stream: !!(flags & CIPHER_STREAM),\n };\n }\n\n return {\n 'chacha20-poly1305@openssh.com':\n info('chacha20', 8, 64, 0, 16, 0, CIPHER_STREAM),\n\n 'aes128-gcm': info('aes-128-gcm', 16, 16, 12, 16, 0, CIPHER_STREAM),\n 'aes256-gcm': info('aes-256-gcm', 16, 32, 12, 16, 0, CIPHER_STREAM),\n 'aes128-gcm@openssh.com':\n info('aes-128-gcm', 16, 16, 12, 16, 0, CIPHER_STREAM),\n 'aes256-gcm@openssh.com':\n info('aes-256-gcm', 16, 32, 12, 16, 0, CIPHER_STREAM),\n\n 'aes128-cbc': info('aes-128-cbc', 16, 16, 0, 0, 0, 0),\n 'aes192-cbc': info('aes-192-cbc', 16, 24, 0, 0, 0, 0),\n 'aes256-cbc': info('aes-256-cbc', 16, 32, 0, 0, 0, 0),\n 'rijndael-cbc@lysator.liu.se': info('aes-256-cbc', 16, 32, 0, 0, 0, 0),\n '3des-cbc': info('des-ede3-cbc', 8, 24, 0, 0, 0, 0),\n 'blowfish-cbc': info('bf-cbc', 8, 16, 0, 0, 0, 0),\n 'idea-cbc': info('idea-cbc', 8, 16, 0, 0, 0, 0),\n 'cast128-cbc': info('cast-cbc', 8, 16, 0, 0, 0, 0),\n\n 'aes128-ctr': info('aes-128-ctr', 16, 16, 16, 0, 0, CIPHER_STREAM),\n 'aes192-ctr': info('aes-192-ctr', 16, 24, 16, 0, 0, CIPHER_STREAM),\n 'aes256-ctr': info('aes-256-ctr', 16, 32, 16, 0, 0, CIPHER_STREAM),\n '3des-ctr': info('des-ede3', 8, 24, 8, 0, 0, CIPHER_STREAM),\n 'blowfish-ctr': info('bf-ecb', 8, 16, 8, 0, 0, CIPHER_STREAM),\n 'cast128-ctr': info('cast5-ecb', 8, 16, 8, 0, 0, CIPHER_STREAM),\n\n /* The \"arcfour128\" algorithm is the RC4 cipher, as described in\n [SCHNEIER], using a 128-bit key. The first 1536 bytes of keystream\n generated by the cipher MUST be discarded, and the first byte of the\n first encrypted packet MUST be encrypted using the 1537th byte of\n keystream.\n\n -- http://tools.ietf.org/html/rfc4345#section-4 */\n 'arcfour': info('rc4', 8, 16, 0, 0, 1536, CIPHER_STREAM),\n 'arcfour128': info('rc4', 8, 16, 0, 0, 1536, CIPHER_STREAM),\n 'arcfour256': info('rc4', 8, 32, 0, 0, 1536, CIPHER_STREAM),\n 'arcfour512': info('rc4', 8, 64, 0, 0, 1536, CIPHER_STREAM),\n };\n})();\n\nconst MAC_INFO = (() => {\n function info(sslName, len, actualLen, isETM) {\n return {\n sslName,\n len,\n actualLen,\n isETM,\n };\n }\n\n return {\n 'hmac-md5': info('md5', 16, 16, false),\n 'hmac-md5-96': info('md5', 16, 12, false),\n 'hmac-ripemd160': info('ripemd160', 20, 20, false),\n 'hmac-sha1': info('sha1', 20, 20, false),\n 'hmac-sha1-etm@openssh.com': info('sha1', 20, 20, true),\n 'hmac-sha1-96': info('sha1', 20, 12, false),\n 'hmac-sha2-256': info('sha256', 32, 32, false),\n 'hmac-sha2-256-etm@openssh.com': info('sha256', 32, 32, true),\n 'hmac-sha2-256-96': info('sha256', 32, 12, false),\n 'hmac-sha2-512': info('sha512', 64, 64, false),\n 'hmac-sha2-512-etm@openssh.com': info('sha512', 64, 64, true),\n 'hmac-sha2-512-96': info('sha512', 64, 12, false),\n };\n})();\n\n\n// Should only_be used during the initial handshake\nclass NullCipher {\n constructor(seqno, onWrite) {\n this.outSeqno = seqno;\n this._onWrite = onWrite;\n this._dead = false;\n }\n free() {\n this._dead = true;\n }\n allocPacket(payloadLen) {\n let pktLen = 4 + 1 + payloadLen;\n let padLen = 8 - (pktLen & (8 - 1));\n if (padLen < 4)\n padLen += 8;\n pktLen += padLen;\n\n const packet = Buffer.allocUnsafe(pktLen);\n\n writeUInt32BE(packet, pktLen - 4, 0);\n packet[4] = padLen;\n\n randomFillSync(packet, 5 + payloadLen, padLen);\n\n return packet;\n }\n encrypt(packet) {\n // `packet` === unencrypted packet\n\n if (this._dead)\n return;\n\n this._onWrite(packet);\n\n this.outSeqno = (this.outSeqno + 1) >>> 0;\n }\n}\n\n\nconst POLY1305_ZEROS = Buffer.alloc(32);\nconst POLY1305_OUT_COMPUTE = Buffer.alloc(16);\nlet POLY1305_WASM_MODULE;\nlet POLY1305_RESULT_MALLOC;\nlet poly1305_auth;\nclass ChaChaPolyCipherNative {\n constructor(config) {\n const enc = config.outbound;\n this.outSeqno = enc.seqno;\n this._onWrite = enc.onWrite;\n this._encKeyMain = enc.cipherKey.slice(0, 32);\n this._encKeyPktLen = enc.cipherKey.slice(32);\n this._dead = false;\n }\n free() {\n this._dead = true;\n }\n allocPacket(payloadLen) {\n let pktLen = 4 + 1 + payloadLen;\n let padLen = 8 - ((pktLen - 4) & (8 - 1));\n if (padLen < 4)\n padLen += 8;\n pktLen += padLen;\n\n const packet = Buffer.allocUnsafe(pktLen);\n\n writeUInt32BE(packet, pktLen - 4, 0);\n packet[4] = padLen;\n\n randomFillSync(packet, 5 + payloadLen, padLen);\n\n return packet;\n }\n encrypt(packet) {\n // `packet` === unencrypted packet\n\n if (this._dead)\n return;\n\n // Generate Poly1305 key\n POLY1305_OUT_COMPUTE[0] = 0; // Set counter to 0 (little endian)\n writeUInt32BE(POLY1305_OUT_COMPUTE, this.outSeqno, 12);\n const polyKey =\n createCipheriv('chacha20', this._encKeyMain, POLY1305_OUT_COMPUTE)\n .update(POLY1305_ZEROS);\n\n // Encrypt packet length\n const pktLenEnc =\n createCipheriv('chacha20', this._encKeyPktLen, POLY1305_OUT_COMPUTE)\n .update(packet.slice(0, 4));\n this._onWrite(pktLenEnc);\n\n // Encrypt rest of packet\n POLY1305_OUT_COMPUTE[0] = 1; // Set counter to 1 (little endian)\n const payloadEnc =\n createCipheriv('chacha20', this._encKeyMain, POLY1305_OUT_COMPUTE)\n .update(packet.slice(4));\n this._onWrite(payloadEnc);\n\n // Calculate Poly1305 MAC\n poly1305_auth(POLY1305_RESULT_MALLOC,\n pktLenEnc,\n pktLenEnc.length,\n payloadEnc,\n payloadEnc.length,\n polyKey);\n const mac = Buffer.allocUnsafe(16);\n mac.set(\n new Uint8Array(POLY1305_WASM_MODULE.HEAPU8.buffer,\n POLY1305_RESULT_MALLOC,\n 16),\n 0\n );\n this._onWrite(mac);\n\n this.outSeqno = (this.outSeqno + 1) >>> 0;\n }\n}\n\nclass ChaChaPolyCipherBinding {\n constructor(config) {\n const enc = config.outbound;\n this.outSeqno = enc.seqno;\n this._onWrite = enc.onWrite;\n this._instance = new ChaChaPolyCipher(enc.cipherKey);\n this._dead = false;\n }\n free() {\n this._dead = true;\n this._instance.free();\n }\n allocPacket(payloadLen) {\n let pktLen = 4 + 1 + payloadLen;\n let padLen = 8 - ((pktLen - 4) & (8 - 1));\n if (padLen < 4)\n padLen += 8;\n pktLen += padLen;\n\n const packet = Buffer.allocUnsafe(pktLen + 16/* MAC */);\n\n writeUInt32BE(packet, pktLen - 4, 0);\n packet[4] = padLen;\n\n randomFillSync(packet, 5 + payloadLen, padLen);\n\n return packet;\n }\n encrypt(packet) {\n // `packet` === unencrypted packet\n\n if (this._dead)\n return;\n\n // Encrypts in-place\n this._instance.encrypt(packet, this.outSeqno);\n\n this._onWrite(packet);\n\n this.outSeqno = (this.outSeqno + 1) >>> 0;\n }\n}\n\n\nclass AESGCMCipherNative {\n constructor(config) {\n const enc = config.outbound;\n this.outSeqno = enc.seqno;\n this._onWrite = enc.onWrite;\n this._encSSLName = enc.cipherInfo.sslName;\n this._encKey = enc.cipherKey;\n this._encIV = enc.cipherIV;\n this._dead = false;\n }\n free() {\n this._dead = true;\n }\n allocPacket(payloadLen) {\n let pktLen = 4 + 1 + payloadLen;\n let padLen = 16 - ((pktLen - 4) & (16 - 1));\n if (padLen < 4)\n padLen += 16;\n pktLen += padLen;\n\n const packet = Buffer.allocUnsafe(pktLen);\n\n writeUInt32BE(packet, pktLen - 4, 0);\n packet[4] = padLen;\n\n randomFillSync(packet, 5 + payloadLen, padLen);\n\n return packet;\n }\n encrypt(packet) {\n // `packet` === unencrypted packet\n\n if (this._dead)\n return;\n\n const cipher = createCipheriv(this._encSSLName, this._encKey, this._encIV);\n cipher.setAutoPadding(false);\n\n const lenData = packet.slice(0, 4);\n cipher.setAAD(lenData);\n this._onWrite(lenData);\n\n // Encrypt pad length, payload, and padding\n const encrypted = cipher.update(packet.slice(4));\n this._onWrite(encrypted);\n const final = cipher.final();\n // XXX: final.length === 0 always?\n if (final.length)\n this._onWrite(final);\n\n // Generate MAC\n const tag = cipher.getAuthTag();\n this._onWrite(tag);\n\n // Increment counter in IV by 1 for next packet\n ivIncrement(this._encIV);\n\n this.outSeqno = (this.outSeqno + 1) >>> 0;\n }\n}\n\nclass AESGCMCipherBinding {\n constructor(config) {\n const enc = config.outbound;\n this.outSeqno = enc.seqno;\n this._onWrite = enc.onWrite;\n this._instance = new AESGCMCipher(enc.cipherInfo.sslName,\n enc.cipherKey,\n enc.cipherIV);\n this._dead = false;\n }\n free() {\n this._dead = true;\n this._instance.free();\n }\n allocPacket(payloadLen) {\n let pktLen = 4 + 1 + payloadLen;\n let padLen = 16 - ((pktLen - 4) & (16 - 1));\n if (padLen < 4)\n padLen += 16;\n pktLen += padLen;\n\n const packet = Buffer.allocUnsafe(pktLen + 16/* authTag */);\n\n writeUInt32BE(packet, pktLen - 4, 0);\n packet[4] = padLen;\n\n randomFillSync(packet, 5 + payloadLen, padLen);\n\n return packet;\n }\n encrypt(packet) {\n // `packet` === unencrypted packet\n\n if (this._dead)\n return;\n\n // Encrypts in-place\n this._instance.encrypt(packet);\n\n this._onWrite(packet);\n\n this.outSeqno = (this.outSeqno + 1) >>> 0;\n }\n}\n\n\nclass GenericCipherNative {\n constructor(config) {\n const enc = config.outbound;\n this.outSeqno = enc.seqno;\n this._onWrite = enc.onWrite;\n this._encBlockLen = enc.cipherInfo.blockLen;\n this._cipherInstance = createCipheriv(enc.cipherInfo.sslName,\n enc.cipherKey,\n enc.cipherIV);\n this._macSSLName = enc.macInfo.sslName;\n this._macKey = enc.macKey;\n this._macActualLen = enc.macInfo.actualLen;\n this._macETM = enc.macInfo.isETM;\n this._aadLen = (this._macETM ? 4 : 0);\n this._dead = false;\n\n const discardLen = enc.cipherInfo.discardLen;\n if (discardLen) {\n let discard = DISCARD_CACHE.get(discardLen);\n if (discard === undefined) {\n discard = Buffer.alloc(discardLen);\n DISCARD_CACHE.set(discardLen, discard);\n }\n this._cipherInstance.update(discard);\n }\n }\n free() {\n this._dead = true;\n }\n allocPacket(payloadLen) {\n const blockLen = this._encBlockLen;\n\n let pktLen = 4 + 1 + payloadLen;\n let padLen = blockLen - ((pktLen - this._aadLen) & (blockLen - 1));\n if (padLen < 4)\n padLen += blockLen;\n pktLen += padLen;\n\n const packet = Buffer.allocUnsafe(pktLen);\n\n writeUInt32BE(packet, pktLen - 4, 0);\n packet[4] = padLen;\n\n randomFillSync(packet, 5 + payloadLen, padLen);\n\n return packet;\n }\n encrypt(packet) {\n // `packet` === unencrypted packet\n\n if (this._dead)\n return;\n\n let mac;\n if (this._macETM) {\n // Encrypt pad length, payload, and padding\n const lenBytes = new Uint8Array(packet.buffer, packet.byteOffset, 4);\n const encrypted = this._cipherInstance.update(\n new Uint8Array(packet.buffer,\n packet.byteOffset + 4,\n packet.length - 4)\n );\n\n this._onWrite(lenBytes);\n this._onWrite(encrypted);\n\n // TODO: look into storing seqno as 4-byte buffer and incrementing like we\n // do for AES-GCM IVs to avoid having to (re)write all 4 bytes every time\n mac = createHmac(this._macSSLName, this._macKey);\n writeUInt32BE(BUF_INT, this.outSeqno, 0);\n mac.update(BUF_INT);\n mac.update(lenBytes);\n mac.update(encrypted);\n } else {\n // Encrypt length field, pad length, payload, and padding\n const encrypted = this._cipherInstance.update(packet);\n this._onWrite(encrypted);\n\n // TODO: look into storing seqno as 4-byte buffer and incrementing like we\n // do for AES-GCM IVs to avoid having to (re)write all 4 bytes every time\n mac = createHmac(this._macSSLName, this._macKey);\n writeUInt32BE(BUF_INT, this.outSeqno, 0);\n mac.update(BUF_INT);\n mac.update(packet);\n }\n\n let digest = mac.digest();\n if (digest.length > this._macActualLen)\n digest = digest.slice(0, this._macActualLen);\n this._onWrite(digest);\n\n this.outSeqno = (this.outSeqno + 1) >>> 0;\n }\n}\n\nclass GenericCipherBinding {\n constructor(config) {\n const enc = config.outbound;\n this.outSeqno = enc.seqno;\n this._onWrite = enc.onWrite;\n this._encBlockLen = enc.cipherInfo.blockLen;\n this._macLen = enc.macInfo.len;\n this._macActualLen = enc.macInfo.actualLen;\n this._aadLen = (enc.macInfo.isETM ? 4 : 0);\n this._instance = new GenericCipher(enc.cipherInfo.sslName,\n enc.cipherKey,\n enc.cipherIV,\n enc.macInfo.sslName,\n enc.macKey,\n enc.macInfo.isETM);\n this._dead = false;\n }\n free() {\n this._dead = true;\n this._instance.free();\n }\n allocPacket(payloadLen) {\n const blockLen = this._encBlockLen;\n\n let pktLen = 4 + 1 + payloadLen;\n let padLen = blockLen - ((pktLen - this._aadLen) & (blockLen - 1));\n if (padLen < 4)\n padLen += blockLen;\n pktLen += padLen;\n\n const packet = Buffer.allocUnsafe(pktLen + this._macLen);\n\n writeUInt32BE(packet, pktLen - 4, 0);\n packet[4] = padLen;\n\n randomFillSync(packet, 5 + payloadLen, padLen);\n\n return packet;\n }\n encrypt(packet) {\n // `packet` === unencrypted packet\n\n if (this._dead)\n return;\n\n // Encrypts in-place\n this._instance.encrypt(packet, this.outSeqno);\n\n if (this._macActualLen < this._macLen) {\n packet = new FastBuffer(packet.buffer,\n packet.byteOffset,\n (packet.length\n - (this._macLen - this._macActualLen)));\n }\n this._onWrite(packet);\n\n this.outSeqno = (this.outSeqno + 1) >>> 0;\n }\n}\n\n\nclass NullDecipher {\n constructor(seqno, onPayload) {\n this.inSeqno = seqno;\n this._onPayload = onPayload;\n this._len = 0;\n this._lenBytes = 0;\n this._packet = null;\n this._packetPos = 0;\n }\n free() {}\n decrypt(data, p, dataLen) {\n while (p < dataLen) {\n // Read packet length\n if (this._lenBytes < 4) {\n let nb = Math.min(4 - this._lenBytes, dataLen - p);\n\n this._lenBytes += nb;\n while (nb--)\n this._len = (this._len << 8) + data[p++];\n\n if (this._lenBytes < 4)\n return;\n\n if (this._len > MAX_PACKET_SIZE\n || this._len < 8\n || (4 + this._len & 7) !== 0) {\n throw new Error('Bad packet length');\n }\n if (p >= dataLen)\n return;\n }\n\n // Read padding length, payload, and padding\n if (this._packetPos < this._len) {\n const nb = Math.min(this._len - this._packetPos, dataLen - p);\n let chunk;\n if (p !== 0 || nb !== dataLen)\n chunk = new Uint8Array(data.buffer, data.byteOffset + p, nb);\n else\n chunk = data;\n if (nb === this._len) {\n this._packet = chunk;\n } else {\n if (!this._packet)\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(chunk, this._packetPos);\n }\n p += nb;\n this._packetPos += nb;\n if (this._packetPos < this._len)\n return;\n }\n\n const payload = (!this._packet\n ? EMPTY_BUFFER\n : new FastBuffer(this._packet.buffer,\n this._packet.byteOffset + 1,\n this._packet.length\n - this._packet[0] - 1));\n\n // Prepare for next packet\n this.inSeqno = (this.inSeqno + 1) >>> 0;\n this._len = 0;\n this._lenBytes = 0;\n this._packet = null;\n this._packetPos = 0;\n\n {\n const ret = this._onPayload(payload);\n if (ret !== undefined)\n return (ret === false ? p : ret);\n }\n }\n }\n}\n\nclass ChaChaPolyDecipherNative {\n constructor(config) {\n const dec = config.inbound;\n this.inSeqno = dec.seqno;\n this._onPayload = dec.onPayload;\n this._decKeyMain = dec.decipherKey.slice(0, 32);\n this._decKeyPktLen = dec.decipherKey.slice(32);\n this._len = 0;\n this._lenBuf = Buffer.alloc(4);\n this._lenPos = 0;\n this._packet = null;\n this._pktLen = 0;\n this._mac = Buffer.allocUnsafe(16);\n this._calcMac = Buffer.allocUnsafe(16);\n this._macPos = 0;\n }\n free() {}\n decrypt(data, p, dataLen) {\n // `data` === encrypted data\n\n while (p < dataLen) {\n // Read packet length\n if (this._lenPos < 4) {\n let nb = Math.min(4 - this._lenPos, dataLen - p);\n while (nb--)\n this._lenBuf[this._lenPos++] = data[p++];\n if (this._lenPos < 4)\n return;\n\n POLY1305_OUT_COMPUTE[0] = 0; // Set counter to 0 (little endian)\n writeUInt32BE(POLY1305_OUT_COMPUTE, this.inSeqno, 12);\n\n const decLenBytes =\n createDecipheriv('chacha20', this._decKeyPktLen, POLY1305_OUT_COMPUTE)\n .update(this._lenBuf);\n this._len = readUInt32BE(decLenBytes, 0);\n\n if (this._len > MAX_PACKET_SIZE\n || this._len < 8\n || (this._len & 7) !== 0) {\n throw new Error('Bad packet length');\n }\n }\n\n // Read padding length, payload, and padding\n if (this._pktLen < this._len) {\n if (p >= dataLen)\n return;\n const nb = Math.min(this._len - this._pktLen, dataLen - p);\n let encrypted;\n if (p !== 0 || nb !== dataLen)\n encrypted = new Uint8Array(data.buffer, data.byteOffset + p, nb);\n else\n encrypted = data;\n if (nb === this._len) {\n this._packet = encrypted;\n } else {\n if (!this._packet)\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(encrypted, this._pktLen);\n }\n p += nb;\n this._pktLen += nb;\n if (this._pktLen < this._len || p >= dataLen)\n return;\n }\n\n // Read Poly1305 MAC\n {\n const nb = Math.min(16 - this._macPos, dataLen - p);\n // TODO: avoid copying if entire MAC is in current chunk\n if (p !== 0 || nb !== dataLen) {\n this._mac.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._macPos\n );\n } else {\n this._mac.set(data, this._macPos);\n }\n p += nb;\n this._macPos += nb;\n if (this._macPos < 16)\n return;\n }\n\n // Generate Poly1305 key\n POLY1305_OUT_COMPUTE[0] = 0; // Set counter to 0 (little endian)\n writeUInt32BE(POLY1305_OUT_COMPUTE, this.inSeqno, 12);\n const polyKey =\n createCipheriv('chacha20', this._decKeyMain, POLY1305_OUT_COMPUTE)\n .update(POLY1305_ZEROS);\n\n // Calculate and compare Poly1305 MACs\n poly1305_auth(POLY1305_RESULT_MALLOC,\n this._lenBuf,\n 4,\n this._packet,\n this._packet.length,\n polyKey);\n\n this._calcMac.set(\n new Uint8Array(POLY1305_WASM_MODULE.HEAPU8.buffer,\n POLY1305_RESULT_MALLOC,\n 16),\n 0\n );\n if (!timingSafeEqual(this._calcMac, this._mac))\n throw new Error('Invalid MAC');\n\n // Decrypt packet\n POLY1305_OUT_COMPUTE[0] = 1; // Set counter to 1 (little endian)\n const packet =\n createDecipheriv('chacha20', this._decKeyMain, POLY1305_OUT_COMPUTE)\n .update(this._packet);\n\n const payload = new FastBuffer(packet.buffer,\n packet.byteOffset + 1,\n packet.length - packet[0] - 1);\n\n // Prepare for next packet\n this.inSeqno = (this.inSeqno + 1) >>> 0;\n this._len = 0;\n this._lenPos = 0;\n this._packet = null;\n this._pktLen = 0;\n this._macPos = 0;\n\n {\n const ret = this._onPayload(payload);\n if (ret !== undefined)\n return (ret === false ? p : ret);\n }\n }\n }\n}\n\nclass ChaChaPolyDecipherBinding {\n constructor(config) {\n const dec = config.inbound;\n this.inSeqno = dec.seqno;\n this._onPayload = dec.onPayload;\n this._instance = new ChaChaPolyDecipher(dec.decipherKey);\n this._len = 0;\n this._lenBuf = Buffer.alloc(4);\n this._lenPos = 0;\n this._packet = null;\n this._pktLen = 0;\n this._mac = Buffer.allocUnsafe(16);\n this._macPos = 0;\n }\n free() {\n this._instance.free();\n }\n decrypt(data, p, dataLen) {\n // `data` === encrypted data\n\n while (p < dataLen) {\n // Read packet length\n if (this._lenPos < 4) {\n let nb = Math.min(4 - this._lenPos, dataLen - p);\n while (nb--)\n this._lenBuf[this._lenPos++] = data[p++];\n if (this._lenPos < 4)\n return;\n\n this._len = this._instance.decryptLen(this._lenBuf, this.inSeqno);\n\n if (this._len > MAX_PACKET_SIZE\n || this._len < 8\n || (this._len & 7) !== 0) {\n throw new Error('Bad packet length');\n }\n\n if (p >= dataLen)\n return;\n }\n\n // Read padding length, payload, and padding\n if (this._pktLen < this._len) {\n const nb = Math.min(this._len - this._pktLen, dataLen - p);\n let encrypted;\n if (p !== 0 || nb !== dataLen)\n encrypted = new Uint8Array(data.buffer, data.byteOffset + p, nb);\n else\n encrypted = data;\n if (nb === this._len) {\n this._packet = encrypted;\n } else {\n if (!this._packet)\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(encrypted, this._pktLen);\n }\n p += nb;\n this._pktLen += nb;\n if (this._pktLen < this._len || p >= dataLen)\n return;\n }\n\n // Read Poly1305 MAC\n {\n const nb = Math.min(16 - this._macPos, dataLen - p);\n // TODO: avoid copying if entire MAC is in current chunk\n if (p !== 0 || nb !== dataLen) {\n this._mac.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._macPos\n );\n } else {\n this._mac.set(data, this._macPos);\n }\n p += nb;\n this._macPos += nb;\n if (this._macPos < 16)\n return;\n }\n\n this._instance.decrypt(this._packet, this._mac, this.inSeqno);\n\n const payload = new FastBuffer(this._packet.buffer,\n this._packet.byteOffset + 1,\n this._packet.length - this._packet[0] - 1);\n\n // Prepare for next packet\n this.inSeqno = (this.inSeqno + 1) >>> 0;\n this._len = 0;\n this._lenPos = 0;\n this._packet = null;\n this._pktLen = 0;\n this._macPos = 0;\n\n {\n const ret = this._onPayload(payload);\n if (ret !== undefined)\n return (ret === false ? p : ret);\n }\n }\n }\n}\n\nclass AESGCMDecipherNative {\n constructor(config) {\n const dec = config.inbound;\n this.inSeqno = dec.seqno;\n this._onPayload = dec.onPayload;\n this._decipherInstance = null;\n this._decipherSSLName = dec.decipherInfo.sslName;\n this._decipherKey = dec.decipherKey;\n this._decipherIV = dec.decipherIV;\n this._len = 0;\n this._lenBytes = 0;\n this._packet = null;\n this._packetPos = 0;\n this._pktLen = 0;\n this._tag = Buffer.allocUnsafe(16);\n this._tagPos = 0;\n }\n free() {}\n decrypt(data, p, dataLen) {\n // `data` === encrypted data\n\n while (p < dataLen) {\n // Read packet length (unencrypted, but AAD)\n if (this._lenBytes < 4) {\n let nb = Math.min(4 - this._lenBytes, dataLen - p);\n this._lenBytes += nb;\n while (nb--)\n this._len = (this._len << 8) + data[p++];\n if (this._lenBytes < 4)\n return;\n\n if ((this._len + 20) > MAX_PACKET_SIZE\n || this._len < 16\n || (this._len & 15) !== 0) {\n throw new Error('Bad packet length');\n }\n\n this._decipherInstance = createDecipheriv(\n this._decipherSSLName,\n this._decipherKey,\n this._decipherIV\n );\n this._decipherInstance.setAutoPadding(false);\n this._decipherInstance.setAAD(intToBytes(this._len));\n }\n\n // Read padding length, payload, and padding\n if (this._pktLen < this._len) {\n if (p >= dataLen)\n return;\n const nb = Math.min(this._len - this._pktLen, dataLen - p);\n let decrypted;\n if (p !== 0 || nb !== dataLen) {\n decrypted = this._decipherInstance.update(\n new Uint8Array(data.buffer, data.byteOffset + p, nb)\n );\n } else {\n decrypted = this._decipherInstance.update(data);\n }\n if (decrypted.length) {\n if (nb === this._len) {\n this._packet = decrypted;\n } else {\n if (!this._packet)\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(decrypted, this._packetPos);\n }\n this._packetPos += decrypted.length;\n }\n p += nb;\n this._pktLen += nb;\n if (this._pktLen < this._len || p >= dataLen)\n return;\n }\n\n // Read authentication tag\n {\n const nb = Math.min(16 - this._tagPos, dataLen - p);\n if (p !== 0 || nb !== dataLen) {\n this._tag.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._tagPos\n );\n } else {\n this._tag.set(data, this._tagPos);\n }\n p += nb;\n this._tagPos += nb;\n if (this._tagPos < 16)\n return;\n }\n\n {\n // Verify authentication tag\n this._decipherInstance.setAuthTag(this._tag);\n\n const decrypted = this._decipherInstance.final();\n\n // XXX: this should never output any data since stream ciphers always\n // return data from .update() and block ciphers must end on a multiple\n // of the block length, which would have caused an exception to be\n // thrown if the total input was not...\n if (decrypted.length) {\n if (this._packet)\n this._packet.set(decrypted, this._packetPos);\n else\n this._packet = decrypted;\n }\n }\n\n const payload = (!this._packet\n ? EMPTY_BUFFER\n : new FastBuffer(this._packet.buffer,\n this._packet.byteOffset + 1,\n this._packet.length\n - this._packet[0] - 1));\n\n // Prepare for next packet\n this.inSeqno = (this.inSeqno + 1) >>> 0;\n ivIncrement(this._decipherIV);\n this._len = 0;\n this._lenBytes = 0;\n this._packet = null;\n this._packetPos = 0;\n this._pktLen = 0;\n this._tagPos = 0;\n\n {\n const ret = this._onPayload(payload);\n if (ret !== undefined)\n return (ret === false ? p : ret);\n }\n }\n }\n}\n\nclass AESGCMDecipherBinding {\n constructor(config) {\n const dec = config.inbound;\n this.inSeqno = dec.seqno;\n this._onPayload = dec.onPayload;\n this._instance = new AESGCMDecipher(dec.decipherInfo.sslName,\n dec.decipherKey,\n dec.decipherIV);\n this._len = 0;\n this._lenBytes = 0;\n this._packet = null;\n this._pktLen = 0;\n this._tag = Buffer.allocUnsafe(16);\n this._tagPos = 0;\n }\n free() {}\n decrypt(data, p, dataLen) {\n // `data` === encrypted data\n\n while (p < dataLen) {\n // Read packet length (unencrypted, but AAD)\n if (this._lenBytes < 4) {\n let nb = Math.min(4 - this._lenBytes, dataLen - p);\n this._lenBytes += nb;\n while (nb--)\n this._len = (this._len << 8) + data[p++];\n if (this._lenBytes < 4)\n return;\n\n if ((this._len + 20) > MAX_PACKET_SIZE\n || this._len < 16\n || (this._len & 15) !== 0) {\n throw new Error(`Bad packet length: ${this._len}`);\n }\n }\n\n // Read padding length, payload, and padding\n if (this._pktLen < this._len) {\n if (p >= dataLen)\n return;\n const nb = Math.min(this._len - this._pktLen, dataLen - p);\n let encrypted;\n if (p !== 0 || nb !== dataLen)\n encrypted = new Uint8Array(data.buffer, data.byteOffset + p, nb);\n else\n encrypted = data;\n if (nb === this._len) {\n this._packet = encrypted;\n } else {\n if (!this._packet)\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(encrypted, this._pktLen);\n }\n p += nb;\n this._pktLen += nb;\n if (this._pktLen < this._len || p >= dataLen)\n return;\n }\n\n // Read authentication tag\n {\n const nb = Math.min(16 - this._tagPos, dataLen - p);\n if (p !== 0 || nb !== dataLen) {\n this._tag.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._tagPos\n );\n } else {\n this._tag.set(data, this._tagPos);\n }\n p += nb;\n this._tagPos += nb;\n if (this._tagPos < 16)\n return;\n }\n\n this._instance.decrypt(this._packet, this._len, this._tag);\n\n const payload = new FastBuffer(this._packet.buffer,\n this._packet.byteOffset + 1,\n this._packet.length - this._packet[0] - 1);\n\n // Prepare for next packet\n this.inSeqno = (this.inSeqno + 1) >>> 0;\n this._len = 0;\n this._lenBytes = 0;\n this._packet = null;\n this._pktLen = 0;\n this._tagPos = 0;\n\n {\n const ret = this._onPayload(payload);\n if (ret !== undefined)\n return (ret === false ? p : ret);\n }\n }\n }\n}\n\n// TODO: test incremental .update()s vs. copying to _packet and doing a single\n// .update() after entire packet read -- a single .update() would allow\n// verifying MAC before decrypting for ETM MACs\nclass GenericDecipherNative {\n constructor(config) {\n const dec = config.inbound;\n this.inSeqno = dec.seqno;\n this._onPayload = dec.onPayload;\n this._decipherInstance = createDecipheriv(dec.decipherInfo.sslName,\n dec.decipherKey,\n dec.decipherIV);\n this._decipherInstance.setAutoPadding(false);\n this._block = Buffer.allocUnsafe(\n dec.macInfo.isETM ? 4 : dec.decipherInfo.blockLen\n );\n this._blockSize = dec.decipherInfo.blockLen;\n this._blockPos = 0;\n this._len = 0;\n this._packet = null;\n this._packetPos = 0;\n this._pktLen = 0;\n this._mac = Buffer.allocUnsafe(dec.macInfo.actualLen);\n this._macPos = 0;\n this._macSSLName = dec.macInfo.sslName;\n this._macKey = dec.macKey;\n this._macActualLen = dec.macInfo.actualLen;\n this._macETM = dec.macInfo.isETM;\n this._macInstance = null;\n\n const discardLen = dec.decipherInfo.discardLen;\n if (discardLen) {\n let discard = DISCARD_CACHE.get(discardLen);\n if (discard === undefined) {\n discard = Buffer.alloc(discardLen);\n DISCARD_CACHE.set(discardLen, discard);\n }\n this._decipherInstance.update(discard);\n }\n }\n free() {}\n decrypt(data, p, dataLen) {\n // `data` === encrypted data\n\n while (p < dataLen) {\n // Read first encrypted block\n if (this._blockPos < this._block.length) {\n const nb = Math.min(this._block.length - this._blockPos, dataLen - p);\n if (p !== 0 || nb !== dataLen || nb < data.length) {\n this._block.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._blockPos\n );\n } else {\n this._block.set(data, this._blockPos);\n }\n\n p += nb;\n this._blockPos += nb;\n if (this._blockPos < this._block.length)\n return;\n\n let decrypted;\n let need;\n if (this._macETM) {\n this._len = need = readUInt32BE(this._block, 0);\n } else {\n // Decrypt first block to get packet length\n decrypted = this._decipherInstance.update(this._block);\n this._len = readUInt32BE(decrypted, 0);\n need = 4 + this._len - this._blockSize;\n }\n\n if (this._len > MAX_PACKET_SIZE\n || this._len < 5\n || (need & (this._blockSize - 1)) !== 0) {\n throw new Error('Bad packet length');\n }\n\n // Create MAC up front to calculate in parallel with decryption\n this._macInstance = createHmac(this._macSSLName, this._macKey);\n\n writeUInt32BE(BUF_INT, this.inSeqno, 0);\n this._macInstance.update(BUF_INT);\n if (this._macETM) {\n this._macInstance.update(this._block);\n } else {\n this._macInstance.update(new Uint8Array(decrypted.buffer,\n decrypted.byteOffset,\n 4));\n this._pktLen = decrypted.length - 4;\n this._packetPos = this._pktLen;\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(\n new Uint8Array(decrypted.buffer,\n decrypted.byteOffset + 4,\n this._packetPos),\n 0\n );\n }\n\n if (p >= dataLen)\n return;\n }\n\n // Read padding length, payload, and padding\n if (this._pktLen < this._len) {\n const nb = Math.min(this._len - this._pktLen, dataLen - p);\n let encrypted;\n if (p !== 0 || nb !== dataLen)\n encrypted = new Uint8Array(data.buffer, data.byteOffset + p, nb);\n else\n encrypted = data;\n if (this._macETM)\n this._macInstance.update(encrypted);\n const decrypted = this._decipherInstance.update(encrypted);\n if (decrypted.length) {\n if (nb === this._len) {\n this._packet = decrypted;\n } else {\n if (!this._packet)\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(decrypted, this._packetPos);\n }\n this._packetPos += decrypted.length;\n }\n p += nb;\n this._pktLen += nb;\n if (this._pktLen < this._len || p >= dataLen)\n return;\n }\n\n // Read MAC\n {\n const nb = Math.min(this._macActualLen - this._macPos, dataLen - p);\n if (p !== 0 || nb !== dataLen) {\n this._mac.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._macPos\n );\n } else {\n this._mac.set(data, this._macPos);\n }\n p += nb;\n this._macPos += nb;\n if (this._macPos < this._macActualLen)\n return;\n }\n\n // Verify MAC\n if (!this._macETM)\n this._macInstance.update(this._packet);\n let calculated = this._macInstance.digest();\n if (this._macActualLen < calculated.length) {\n calculated = new Uint8Array(calculated.buffer,\n calculated.byteOffset,\n this._macActualLen);\n }\n if (!timingSafeEquals(calculated, this._mac))\n throw new Error('Invalid MAC');\n\n const payload = new FastBuffer(this._packet.buffer,\n this._packet.byteOffset + 1,\n this._packet.length - this._packet[0] - 1);\n\n // Prepare for next packet\n this.inSeqno = (this.inSeqno + 1) >>> 0;\n this._blockPos = 0;\n this._len = 0;\n this._packet = null;\n this._packetPos = 0;\n this._pktLen = 0;\n this._macPos = 0;\n this._macInstance = null;\n\n {\n const ret = this._onPayload(payload);\n if (ret !== undefined)\n return (ret === false ? p : ret);\n }\n }\n }\n}\n\nclass GenericDecipherBinding {\n constructor(config) {\n const dec = config.inbound;\n this.inSeqno = dec.seqno;\n this._onPayload = dec.onPayload;\n this._instance = new GenericDecipher(dec.decipherInfo.sslName,\n dec.decipherKey,\n dec.decipherIV,\n dec.macInfo.sslName,\n dec.macKey,\n dec.macInfo.isETM,\n dec.macInfo.actualLen);\n this._block = Buffer.allocUnsafe(\n dec.macInfo.isETM || dec.decipherInfo.stream\n ? 4\n : dec.decipherInfo.blockLen\n );\n this._blockPos = 0;\n this._len = 0;\n this._packet = null;\n this._pktLen = 0;\n this._mac = Buffer.allocUnsafe(dec.macInfo.actualLen);\n this._macPos = 0;\n this._macActualLen = dec.macInfo.actualLen;\n this._macETM = dec.macInfo.isETM;\n }\n free() {\n this._instance.free();\n }\n decrypt(data, p, dataLen) {\n // `data` === encrypted data\n\n while (p < dataLen) {\n // Read first encrypted block\n if (this._blockPos < this._block.length) {\n const nb = Math.min(this._block.length - this._blockPos, dataLen - p);\n if (p !== 0 || nb !== dataLen || nb < data.length) {\n this._block.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._blockPos\n );\n } else {\n this._block.set(data, this._blockPos);\n }\n\n p += nb;\n this._blockPos += nb;\n if (this._blockPos < this._block.length)\n return;\n\n let need;\n if (this._macETM) {\n this._len = need = readUInt32BE(this._block, 0);\n } else {\n // Decrypt first block to get packet length\n this._instance.decryptBlock(this._block);\n this._len = readUInt32BE(this._block, 0);\n need = 4 + this._len - this._block.length;\n }\n\n if (this._len > MAX_PACKET_SIZE\n || this._len < 5\n || (need & (this._block.length - 1)) !== 0) {\n throw new Error('Bad packet length');\n }\n\n if (!this._macETM) {\n this._pktLen = (this._block.length - 4);\n if (this._pktLen) {\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(\n new Uint8Array(this._block.buffer,\n this._block.byteOffset + 4,\n this._pktLen),\n 0\n );\n }\n }\n\n if (p >= dataLen)\n return;\n }\n\n // Read padding length, payload, and padding\n if (this._pktLen < this._len) {\n const nb = Math.min(this._len - this._pktLen, dataLen - p);\n let encrypted;\n if (p !== 0 || nb !== dataLen)\n encrypted = new Uint8Array(data.buffer, data.byteOffset + p, nb);\n else\n encrypted = data;\n if (nb === this._len) {\n this._packet = encrypted;\n } else {\n if (!this._packet)\n this._packet = Buffer.allocUnsafe(this._len);\n this._packet.set(encrypted, this._pktLen);\n }\n p += nb;\n this._pktLen += nb;\n if (this._pktLen < this._len || p >= dataLen)\n return;\n }\n\n // Read MAC\n {\n const nb = Math.min(this._macActualLen - this._macPos, dataLen - p);\n if (p !== 0 || nb !== dataLen) {\n this._mac.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._macPos\n );\n } else {\n this._mac.set(data, this._macPos);\n }\n p += nb;\n this._macPos += nb;\n if (this._macPos < this._macActualLen)\n return;\n }\n\n // Decrypt and verify MAC\n this._instance.decrypt(this._packet,\n this.inSeqno,\n this._block,\n this._mac);\n\n const payload = new FastBuffer(this._packet.buffer,\n this._packet.byteOffset + 1,\n this._packet.length - this._packet[0] - 1);\n\n // Prepare for next packet\n this.inSeqno = (this.inSeqno + 1) >>> 0;\n this._blockPos = 0;\n this._len = 0;\n this._packet = null;\n this._pktLen = 0;\n this._macPos = 0;\n this._macInstance = null;\n\n {\n const ret = this._onPayload(payload);\n if (ret !== undefined)\n return (ret === false ? p : ret);\n }\n }\n }\n}\n\n// Increments unsigned, big endian counter (last 8 bytes) of AES-GCM IV\nfunction ivIncrement(iv) {\n // eslint-disable-next-line no-unused-expressions\n ++iv[11] >>> 8\n && ++iv[10] >>> 8\n && ++iv[9] >>> 8\n && ++iv[8] >>> 8\n && ++iv[7] >>> 8\n && ++iv[6] >>> 8\n && ++iv[5] >>> 8\n && ++iv[4] >>> 8;\n}\n\nconst intToBytes = (() => {\n const ret = Buffer.alloc(4);\n return (n) => {\n ret[0] = (n >>> 24);\n ret[1] = (n >>> 16);\n ret[2] = (n >>> 8);\n ret[3] = n;\n return ret;\n };\n})();\n\nfunction timingSafeEquals(a, b) {\n if (a.length !== b.length) {\n timingSafeEqual(a, a);\n return false;\n }\n return timingSafeEqual(a, b);\n}\n\nfunction createCipher(config) {\n if (typeof config !== 'object' || config === null)\n throw new Error('Invalid config');\n\n if (typeof config.outbound !== 'object' || config.outbound === null)\n throw new Error('Invalid outbound');\n\n const outbound = config.outbound;\n\n if (typeof outbound.onWrite !== 'function')\n throw new Error('Invalid outbound.onWrite');\n\n if (typeof outbound.cipherInfo !== 'object' || outbound.cipherInfo === null)\n throw new Error('Invalid outbound.cipherInfo');\n\n if (!Buffer.isBuffer(outbound.cipherKey)\n || outbound.cipherKey.length !== outbound.cipherInfo.keyLen) {\n throw new Error('Invalid outbound.cipherKey');\n }\n\n if (outbound.cipherInfo.ivLen\n && (!Buffer.isBuffer(outbound.cipherIV)\n || outbound.cipherIV.length !== outbound.cipherInfo.ivLen)) {\n throw new Error('Invalid outbound.cipherIV');\n }\n\n if (typeof outbound.seqno !== 'number'\n || outbound.seqno < 0\n || outbound.seqno > MAX_SEQNO) {\n throw new Error('Invalid outbound.seqno');\n }\n\n const forceNative = !!outbound.forceNative;\n\n switch (outbound.cipherInfo.sslName) {\n case 'aes-128-gcm':\n case 'aes-256-gcm':\n return (AESGCMCipher && !forceNative\n ? new AESGCMCipherBinding(config)\n : new AESGCMCipherNative(config));\n case 'chacha20':\n return (ChaChaPolyCipher && !forceNative\n ? new ChaChaPolyCipherBinding(config)\n : new ChaChaPolyCipherNative(config));\n default: {\n if (typeof outbound.macInfo !== 'object' || outbound.macInfo === null)\n throw new Error('Invalid outbound.macInfo');\n if (!Buffer.isBuffer(outbound.macKey)\n || outbound.macKey.length !== outbound.macInfo.len) {\n throw new Error('Invalid outbound.macKey');\n }\n return (GenericCipher && !forceNative\n ? new GenericCipherBinding(config)\n : new GenericCipherNative(config));\n }\n }\n}\n\nfunction createDecipher(config) {\n if (typeof config !== 'object' || config === null)\n throw new Error('Invalid config');\n\n if (typeof config.inbound !== 'object' || config.inbound === null)\n throw new Error('Invalid inbound');\n\n const inbound = config.inbound;\n\n if (typeof inbound.onPayload !== 'function')\n throw new Error('Invalid inbound.onPayload');\n\n if (typeof inbound.decipherInfo !== 'object'\n || inbound.decipherInfo === null) {\n throw new Error('Invalid inbound.decipherInfo');\n }\n\n if (!Buffer.isBuffer(inbound.decipherKey)\n || inbound.decipherKey.length !== inbound.decipherInfo.keyLen) {\n throw new Error('Invalid inbound.decipherKey');\n }\n\n if (inbound.decipherInfo.ivLen\n && (!Buffer.isBuffer(inbound.decipherIV)\n || inbound.decipherIV.length !== inbound.decipherInfo.ivLen)) {\n throw new Error('Invalid inbound.decipherIV');\n }\n\n if (typeof inbound.seqno !== 'number'\n || inbound.seqno < 0\n || inbound.seqno > MAX_SEQNO) {\n throw new Error('Invalid inbound.seqno');\n }\n\n const forceNative = !!inbound.forceNative;\n\n switch (inbound.decipherInfo.sslName) {\n case 'aes-128-gcm':\n case 'aes-256-gcm':\n return (AESGCMDecipher && !forceNative\n ? new AESGCMDecipherBinding(config)\n : new AESGCMDecipherNative(config));\n case 'chacha20':\n return (ChaChaPolyDecipher && !forceNative\n ? new ChaChaPolyDecipherBinding(config)\n : new ChaChaPolyDecipherNative(config));\n default: {\n if (typeof inbound.macInfo !== 'object' || inbound.macInfo === null)\n throw new Error('Invalid inbound.macInfo');\n if (!Buffer.isBuffer(inbound.macKey)\n || inbound.macKey.length !== inbound.macInfo.len) {\n throw new Error('Invalid inbound.macKey');\n }\n return (GenericDecipher && !forceNative\n ? new GenericDecipherBinding(config)\n : new GenericDecipherNative(config));\n }\n }\n}\n\nmodule.exports = {\n CIPHER_INFO,\n MAC_INFO,\n bindingAvailable: !!binding,\n init: (() => {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n try {\n POLY1305_WASM_MODULE = await require('./crypto/poly1305.js')();\n POLY1305_RESULT_MALLOC = POLY1305_WASM_MODULE._malloc(16);\n poly1305_auth = POLY1305_WASM_MODULE.cwrap(\n 'poly1305_auth',\n null,\n ['number', 'array', 'number', 'array', 'number', 'array']\n );\n } catch (ex) {\n return reject(ex);\n }\n resolve();\n });\n })(),\n\n NullCipher,\n createCipher,\n NullDecipher,\n createDecipher,\n};\n", "// TODO:\n// * utilize `crypto.create(Private|Public)Key()` and `keyObject.export()`\n// * handle multi-line header values (OpenSSH)?\n// * more thorough validation?\n'use strict';\n\nconst {\n createDecipheriv,\n createECDH,\n createHash,\n createHmac,\n createSign,\n createVerify,\n getCiphers,\n sign: sign_,\n verify: verify_,\n} = require('crypto');\nconst supportedOpenSSLCiphers = getCiphers();\n\nconst { Ber } = require('asn1');\nconst bcrypt_pbkdf = require('bcrypt-pbkdf').pbkdf;\n\nconst { CIPHER_INFO } = require('./crypto.js');\nconst { eddsaSupported, SUPPORTED_CIPHER } = require('./constants.js');\nconst {\n bufferSlice,\n makeBufferParser,\n readString,\n readUInt32BE,\n writeUInt32BE,\n} = require('./utils.js');\n\nconst SYM_HASH_ALGO = Symbol('Hash Algorithm');\nconst SYM_PRIV_PEM = Symbol('Private key PEM');\nconst SYM_PUB_PEM = Symbol('Public key PEM');\nconst SYM_PUB_SSH = Symbol('Public key SSH');\nconst SYM_DECRYPTED = Symbol('Decrypted Key');\n\n// Create OpenSSL cipher name -> SSH cipher name conversion table\nconst CIPHER_INFO_OPENSSL = Object.create(null);\n{\n const keys = Object.keys(CIPHER_INFO);\n for (let i = 0; i < keys.length; ++i) {\n const cipherName = CIPHER_INFO[keys[i]].sslName;\n if (!cipherName || CIPHER_INFO_OPENSSL[cipherName])\n continue;\n CIPHER_INFO_OPENSSL[cipherName] = CIPHER_INFO[keys[i]];\n }\n}\n\nconst binaryKeyParser = makeBufferParser();\n\nfunction makePEM(type, data) {\n data = data.base64Slice(0, data.length);\n let formatted = data.replace(/.{64}/g, '$&\\n');\n if (data.length & 63)\n formatted += '\\n';\n return `-----BEGIN ${type} KEY-----\\n${formatted}-----END ${type} KEY-----`;\n}\n\nfunction combineBuffers(buf1, buf2) {\n const result = Buffer.allocUnsafe(buf1.length + buf2.length);\n result.set(buf1, 0);\n result.set(buf2, buf1.length);\n return result;\n}\n\nfunction skipFields(buf, nfields) {\n const bufLen = buf.length;\n let pos = (buf._pos || 0);\n for (let i = 0; i < nfields; ++i) {\n const left = (bufLen - pos);\n if (pos >= bufLen || left < 4)\n return false;\n const len = readUInt32BE(buf, pos);\n if (left < 4 + len)\n return false;\n pos += 4 + len;\n }\n buf._pos = pos;\n return true;\n}\n\nfunction genOpenSSLRSAPub(n, e) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n // algorithm\n asnWriter.startSequence();\n asnWriter.writeOID('1.2.840.113549.1.1.1'); // rsaEncryption\n // algorithm parameters (RSA has none)\n asnWriter.writeNull();\n asnWriter.endSequence();\n\n // subjectPublicKey\n asnWriter.startSequence(Ber.BitString);\n asnWriter.writeByte(0x00);\n asnWriter.startSequence();\n asnWriter.writeBuffer(n, Ber.Integer);\n asnWriter.writeBuffer(e, Ber.Integer);\n asnWriter.endSequence();\n asnWriter.endSequence();\n asnWriter.endSequence();\n return makePEM('PUBLIC', asnWriter.buffer);\n}\n\nfunction genOpenSSHRSAPub(n, e) {\n const publicKey = Buffer.allocUnsafe(4 + 7 + 4 + e.length + 4 + n.length);\n\n writeUInt32BE(publicKey, 7, 0);\n publicKey.utf8Write('ssh-rsa', 4, 7);\n\n let i = 4 + 7;\n writeUInt32BE(publicKey, e.length, i);\n publicKey.set(e, i += 4);\n\n writeUInt32BE(publicKey, n.length, i += e.length);\n publicKey.set(n, i + 4);\n\n return publicKey;\n}\n\nconst genOpenSSLRSAPriv = (() => {\n function genRSAASN1Buf(n, e, d, p, q, dmp1, dmq1, iqmp) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n asnWriter.writeInt(0x00, Ber.Integer);\n asnWriter.writeBuffer(n, Ber.Integer);\n asnWriter.writeBuffer(e, Ber.Integer);\n asnWriter.writeBuffer(d, Ber.Integer);\n asnWriter.writeBuffer(p, Ber.Integer);\n asnWriter.writeBuffer(q, Ber.Integer);\n asnWriter.writeBuffer(dmp1, Ber.Integer);\n asnWriter.writeBuffer(dmq1, Ber.Integer);\n asnWriter.writeBuffer(iqmp, Ber.Integer);\n asnWriter.endSequence();\n return asnWriter.buffer;\n }\n\n function bigIntFromBuffer(buf) {\n return BigInt(`0x${buf.hexSlice(0, buf.length)}`);\n }\n\n function bigIntToBuffer(bn) {\n let hex = bn.toString(16);\n if ((hex.length & 1) !== 0) {\n hex = `0${hex}`;\n } else {\n const sigbit = hex.charCodeAt(0);\n // BER/DER integers require leading zero byte to denote a positive value\n // when first byte >= 0x80\n if (sigbit === 56/* '8' */\n || sigbit === 57/* '9' */\n || (sigbit >= 97/* 'a' */ && sigbit <= 102/* 'f' */)) {\n hex = `00${hex}`;\n }\n }\n return Buffer.from(hex, 'hex');\n }\n\n return function genOpenSSLRSAPriv(n, e, d, iqmp, p, q) {\n const bn_d = bigIntFromBuffer(d);\n const dmp1 = bigIntToBuffer(bn_d % (bigIntFromBuffer(p) - 1n));\n const dmq1 = bigIntToBuffer(bn_d % (bigIntFromBuffer(q) - 1n));\n return makePEM('RSA PRIVATE',\n genRSAASN1Buf(n, e, d, p, q, dmp1, dmq1, iqmp));\n };\n})();\n\nfunction genOpenSSLDSAPub(p, q, g, y) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n // algorithm\n asnWriter.startSequence();\n asnWriter.writeOID('1.2.840.10040.4.1'); // id-dsa\n // algorithm parameters\n asnWriter.startSequence();\n asnWriter.writeBuffer(p, Ber.Integer);\n asnWriter.writeBuffer(q, Ber.Integer);\n asnWriter.writeBuffer(g, Ber.Integer);\n asnWriter.endSequence();\n asnWriter.endSequence();\n\n // subjectPublicKey\n asnWriter.startSequence(Ber.BitString);\n asnWriter.writeByte(0x00);\n asnWriter.writeBuffer(y, Ber.Integer);\n asnWriter.endSequence();\n asnWriter.endSequence();\n return makePEM('PUBLIC', asnWriter.buffer);\n}\n\nfunction genOpenSSHDSAPub(p, q, g, y) {\n const publicKey = Buffer.allocUnsafe(\n 4 + 7 + 4 + p.length + 4 + q.length + 4 + g.length + 4 + y.length\n );\n\n writeUInt32BE(publicKey, 7, 0);\n publicKey.utf8Write('ssh-dss', 4, 7);\n\n let i = 4 + 7;\n writeUInt32BE(publicKey, p.length, i);\n publicKey.set(p, i += 4);\n\n writeUInt32BE(publicKey, q.length, i += p.length);\n publicKey.set(q, i += 4);\n\n writeUInt32BE(publicKey, g.length, i += q.length);\n publicKey.set(g, i += 4);\n\n writeUInt32BE(publicKey, y.length, i += g.length);\n publicKey.set(y, i + 4);\n\n return publicKey;\n}\n\nfunction genOpenSSLDSAPriv(p, q, g, y, x) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n asnWriter.writeInt(0x00, Ber.Integer);\n asnWriter.writeBuffer(p, Ber.Integer);\n asnWriter.writeBuffer(q, Ber.Integer);\n asnWriter.writeBuffer(g, Ber.Integer);\n asnWriter.writeBuffer(y, Ber.Integer);\n asnWriter.writeBuffer(x, Ber.Integer);\n asnWriter.endSequence();\n return makePEM('DSA PRIVATE', asnWriter.buffer);\n}\n\nfunction genOpenSSLEdPub(pub) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n // algorithm\n asnWriter.startSequence();\n asnWriter.writeOID('1.3.101.112'); // id-Ed25519\n asnWriter.endSequence();\n\n // PublicKey\n asnWriter.startSequence(Ber.BitString);\n asnWriter.writeByte(0x00);\n // XXX: hack to write a raw buffer without a tag -- yuck\n asnWriter._ensure(pub.length);\n asnWriter._buf.set(pub, asnWriter._offset);\n asnWriter._offset += pub.length;\n asnWriter.endSequence();\n asnWriter.endSequence();\n return makePEM('PUBLIC', asnWriter.buffer);\n}\n\nfunction genOpenSSHEdPub(pub) {\n const publicKey = Buffer.allocUnsafe(4 + 11 + 4 + pub.length);\n\n writeUInt32BE(publicKey, 11, 0);\n publicKey.utf8Write('ssh-ed25519', 4, 11);\n\n writeUInt32BE(publicKey, pub.length, 15);\n publicKey.set(pub, 19);\n\n return publicKey;\n}\n\nfunction genOpenSSLEdPriv(priv) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n // version\n asnWriter.writeInt(0x00, Ber.Integer);\n\n // algorithm\n asnWriter.startSequence();\n asnWriter.writeOID('1.3.101.112'); // id-Ed25519\n asnWriter.endSequence();\n\n // PrivateKey\n asnWriter.startSequence(Ber.OctetString);\n asnWriter.writeBuffer(priv, Ber.OctetString);\n asnWriter.endSequence();\n asnWriter.endSequence();\n return makePEM('PRIVATE', asnWriter.buffer);\n}\n\nfunction genOpenSSLECDSAPub(oid, Q) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n // algorithm\n asnWriter.startSequence();\n asnWriter.writeOID('1.2.840.10045.2.1'); // id-ecPublicKey\n // algorithm parameters (namedCurve)\n asnWriter.writeOID(oid);\n asnWriter.endSequence();\n\n // subjectPublicKey\n asnWriter.startSequence(Ber.BitString);\n asnWriter.writeByte(0x00);\n // XXX: hack to write a raw buffer without a tag -- yuck\n asnWriter._ensure(Q.length);\n asnWriter._buf.set(Q, asnWriter._offset);\n asnWriter._offset += Q.length;\n // end hack\n asnWriter.endSequence();\n asnWriter.endSequence();\n return makePEM('PUBLIC', asnWriter.buffer);\n}\n\nfunction genOpenSSHECDSAPub(oid, Q) {\n let curveName;\n switch (oid) {\n case '1.2.840.10045.3.1.7':\n // prime256v1/secp256r1\n curveName = 'nistp256';\n break;\n case '1.3.132.0.34':\n // secp384r1\n curveName = 'nistp384';\n break;\n case '1.3.132.0.35':\n // secp521r1\n curveName = 'nistp521';\n break;\n default:\n return;\n }\n\n const publicKey = Buffer.allocUnsafe(4 + 19 + 4 + 8 + 4 + Q.length);\n\n writeUInt32BE(publicKey, 19, 0);\n publicKey.utf8Write(`ecdsa-sha2-${curveName}`, 4, 19);\n\n writeUInt32BE(publicKey, 8, 23);\n publicKey.utf8Write(curveName, 27, 8);\n\n writeUInt32BE(publicKey, Q.length, 35);\n publicKey.set(Q, 39);\n\n return publicKey;\n}\n\nfunction genOpenSSLECDSAPriv(oid, pub, priv) {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n // version\n asnWriter.writeInt(0x01, Ber.Integer);\n // privateKey\n asnWriter.writeBuffer(priv, Ber.OctetString);\n // parameters (optional)\n asnWriter.startSequence(0xA0);\n asnWriter.writeOID(oid);\n asnWriter.endSequence();\n // publicKey (optional)\n asnWriter.startSequence(0xA1);\n asnWriter.startSequence(Ber.BitString);\n asnWriter.writeByte(0x00);\n // XXX: hack to write a raw buffer without a tag -- yuck\n asnWriter._ensure(pub.length);\n asnWriter._buf.set(pub, asnWriter._offset);\n asnWriter._offset += pub.length;\n // end hack\n asnWriter.endSequence();\n asnWriter.endSequence();\n asnWriter.endSequence();\n return makePEM('EC PRIVATE', asnWriter.buffer);\n}\n\nfunction genOpenSSLECDSAPubFromPriv(curveName, priv) {\n const tempECDH = createECDH(curveName);\n tempECDH.setPrivateKey(priv);\n return tempECDH.getPublicKey();\n}\n\nconst BaseKey = {\n sign: (() => {\n if (typeof sign_ === 'function') {\n return function sign(data, algo) {\n const pem = this[SYM_PRIV_PEM];\n if (pem === null)\n return new Error('No private key available');\n if (!algo || typeof algo !== 'string')\n algo = this[SYM_HASH_ALGO];\n try {\n return sign_(algo, data, pem);\n } catch (ex) {\n return ex;\n }\n };\n }\n return function sign(data, algo) {\n const pem = this[SYM_PRIV_PEM];\n if (pem === null)\n return new Error('No private key available');\n if (!algo || typeof algo !== 'string')\n algo = this[SYM_HASH_ALGO];\n const signature = createSign(algo);\n signature.update(data);\n try {\n return signature.sign(pem);\n } catch (ex) {\n return ex;\n }\n };\n })(),\n verify: (() => {\n if (typeof verify_ === 'function') {\n return function verify(data, signature, algo) {\n const pem = this[SYM_PUB_PEM];\n if (pem === null)\n return new Error('No public key available');\n if (!algo || typeof algo !== 'string')\n algo = this[SYM_HASH_ALGO];\n try {\n return verify_(algo, data, pem, signature);\n } catch (ex) {\n return ex;\n }\n };\n }\n return function verify(data, signature, algo) {\n const pem = this[SYM_PUB_PEM];\n if (pem === null)\n return new Error('No public key available');\n if (!algo || typeof algo !== 'string')\n algo = this[SYM_HASH_ALGO];\n const verifier = createVerify(algo);\n verifier.update(data);\n try {\n return verifier.verify(pem, signature);\n } catch (ex) {\n return ex;\n }\n };\n })(),\n isPrivateKey: function isPrivateKey() {\n return (this[SYM_PRIV_PEM] !== null);\n },\n getPrivatePEM: function getPrivatePEM() {\n return this[SYM_PRIV_PEM];\n },\n getPublicPEM: function getPublicPEM() {\n return this[SYM_PUB_PEM];\n },\n getPublicSSH: function getPublicSSH() {\n return this[SYM_PUB_SSH];\n },\n equals: function equals(key) {\n const parsed = parseKey(key);\n if (parsed instanceof Error)\n return false;\n return (\n this.type === parsed.type\n && this[SYM_PRIV_PEM] === parsed[SYM_PRIV_PEM]\n && this[SYM_PUB_PEM] === parsed[SYM_PUB_PEM]\n && this[SYM_PUB_SSH].equals(parsed[SYM_PUB_SSH])\n );\n },\n};\n\n\nfunction OpenSSH_Private(type, comment, privPEM, pubPEM, pubSSH, algo,\n decrypted) {\n this.type = type;\n this.comment = comment;\n this[SYM_PRIV_PEM] = privPEM;\n this[SYM_PUB_PEM] = pubPEM;\n this[SYM_PUB_SSH] = pubSSH;\n this[SYM_HASH_ALGO] = algo;\n this[SYM_DECRYPTED] = decrypted;\n}\nOpenSSH_Private.prototype = BaseKey;\n{\n const regexp = /^-----BEGIN OPENSSH PRIVATE KEY-----(?:\\r\\n|\\n)([\\s\\S]+)(?:\\r\\n|\\n)-----END OPENSSH PRIVATE KEY-----$/;\n OpenSSH_Private.parse = (str, passphrase) => {\n const m = regexp.exec(str);\n if (m === null)\n return null;\n let ret;\n const data = Buffer.from(m[1], 'base64');\n if (data.length < 31) // magic (+ magic null term.) + minimum field lengths\n return new Error('Malformed OpenSSH private key');\n const magic = data.utf8Slice(0, 15);\n if (magic !== 'openssh-key-v1\\0')\n return new Error(`Unsupported OpenSSH key magic: ${magic}`);\n\n const cipherName = readString(data, 15, true);\n if (cipherName === undefined)\n return new Error('Malformed OpenSSH private key');\n if (cipherName !== 'none' && SUPPORTED_CIPHER.indexOf(cipherName) === -1)\n return new Error(`Unsupported cipher for OpenSSH key: ${cipherName}`);\n\n const kdfName = readString(data, data._pos, true);\n if (kdfName === undefined)\n return new Error('Malformed OpenSSH private key');\n if (kdfName !== 'none') {\n if (cipherName === 'none')\n return new Error('Malformed OpenSSH private key');\n if (kdfName !== 'bcrypt')\n return new Error(`Unsupported kdf name for OpenSSH key: ${kdfName}`);\n if (!passphrase) {\n return new Error(\n 'Encrypted private OpenSSH key detected, but no passphrase given'\n );\n }\n } else if (cipherName !== 'none') {\n return new Error('Malformed OpenSSH private key');\n }\n\n let encInfo;\n let cipherKey;\n let cipherIV;\n if (cipherName !== 'none')\n encInfo = CIPHER_INFO[cipherName];\n const kdfOptions = readString(data, data._pos);\n if (kdfOptions === undefined)\n return new Error('Malformed OpenSSH private key');\n if (kdfOptions.length) {\n switch (kdfName) {\n case 'none':\n return new Error('Malformed OpenSSH private key');\n case 'bcrypt': {\n /*\n string salt\n uint32 rounds\n */\n const salt = readString(kdfOptions, 0);\n if (salt === undefined || kdfOptions._pos + 4 > kdfOptions.length)\n return new Error('Malformed OpenSSH private key');\n const rounds = readUInt32BE(kdfOptions, kdfOptions._pos);\n const gen = Buffer.allocUnsafe(encInfo.keyLen + encInfo.ivLen);\n const r = bcrypt_pbkdf(passphrase,\n passphrase.length,\n salt,\n salt.length,\n gen,\n gen.length,\n rounds);\n if (r !== 0)\n return new Error('Failed to generate information to decrypt key');\n cipherKey = bufferSlice(gen, 0, encInfo.keyLen);\n cipherIV = bufferSlice(gen, encInfo.keyLen, gen.length);\n break;\n }\n }\n } else if (kdfName !== 'none') {\n return new Error('Malformed OpenSSH private key');\n }\n\n if (data._pos + 3 >= data.length)\n return new Error('Malformed OpenSSH private key');\n const keyCount = readUInt32BE(data, data._pos);\n data._pos += 4;\n\n if (keyCount > 0) {\n // TODO: place sensible limit on max `keyCount`\n\n // Read public keys first\n for (let i = 0; i < keyCount; ++i) {\n const pubData = readString(data, data._pos);\n if (pubData === undefined)\n return new Error('Malformed OpenSSH private key');\n const type = readString(pubData, 0, true);\n if (type === undefined)\n return new Error('Malformed OpenSSH private key');\n }\n\n let privBlob = readString(data, data._pos);\n if (privBlob === undefined)\n return new Error('Malformed OpenSSH private key');\n\n if (cipherKey !== undefined) {\n // Encrypted private key(s)\n if (privBlob.length < encInfo.blockLen\n || (privBlob.length % encInfo.blockLen) !== 0) {\n return new Error('Malformed OpenSSH private key');\n }\n try {\n const options = { authTagLength: encInfo.authLen };\n const decipher = createDecipheriv(encInfo.sslName,\n cipherKey,\n cipherIV,\n options);\n decipher.setAutoPadding(false);\n if (encInfo.authLen > 0) {\n if (data.length - data._pos < encInfo.authLen)\n return new Error('Malformed OpenSSH private key');\n decipher.setAuthTag(\n bufferSlice(data, data._pos, data._pos += encInfo.authLen)\n );\n }\n privBlob = combineBuffers(decipher.update(privBlob),\n decipher.final());\n } catch (ex) {\n return ex;\n }\n }\n // Nothing should we follow the private key(s), except a possible\n // authentication tag for relevant ciphers\n if (data._pos !== data.length)\n return new Error('Malformed OpenSSH private key');\n\n ret = parseOpenSSHPrivKeys(privBlob, keyCount, cipherKey !== undefined);\n } else {\n ret = [];\n }\n if (ret instanceof Error)\n return ret;\n // This will need to change if/when OpenSSH ever starts storing multiple\n // keys in their key files\n return ret[0];\n };\n\n function parseOpenSSHPrivKeys(data, nkeys, decrypted) {\n const keys = [];\n /*\n uint32 checkint\n uint32 checkint\n string privatekey1\n string comment1\n string privatekey2\n string comment2\n ...\n string privatekeyN\n string commentN\n char 1\n char 2\n char 3\n ...\n char padlen % 255\n */\n if (data.length < 8)\n return new Error('Malformed OpenSSH private key');\n const check1 = readUInt32BE(data, 0);\n const check2 = readUInt32BE(data, 4);\n if (check1 !== check2) {\n if (decrypted) {\n return new Error(\n 'OpenSSH key integrity check failed -- bad passphrase?'\n );\n }\n return new Error('OpenSSH key integrity check failed');\n }\n data._pos = 8;\n let i;\n let oid;\n for (i = 0; i < nkeys; ++i) {\n let algo;\n let privPEM;\n let pubPEM;\n let pubSSH;\n // The OpenSSH documentation for the key format actually lies, the\n // entirety of the private key content is not contained with a string\n // field, it's actually the literal contents of the private key, so to be\n // able to find the end of the key data you need to know the layout/format\n // of each key type ...\n const type = readString(data, data._pos, true);\n if (type === undefined)\n return new Error('Malformed OpenSSH private key');\n\n switch (type) {\n case 'ssh-rsa': {\n /*\n string n -- public\n string e -- public\n string d -- private\n string iqmp -- private\n string p -- private\n string q -- private\n */\n const n = readString(data, data._pos);\n if (n === undefined)\n return new Error('Malformed OpenSSH private key');\n const e = readString(data, data._pos);\n if (e === undefined)\n return new Error('Malformed OpenSSH private key');\n const d = readString(data, data._pos);\n if (d === undefined)\n return new Error('Malformed OpenSSH private key');\n const iqmp = readString(data, data._pos);\n if (iqmp === undefined)\n return new Error('Malformed OpenSSH private key');\n const p = readString(data, data._pos);\n if (p === undefined)\n return new Error('Malformed OpenSSH private key');\n const q = readString(data, data._pos);\n if (q === undefined)\n return new Error('Malformed OpenSSH private key');\n\n pubPEM = genOpenSSLRSAPub(n, e);\n pubSSH = genOpenSSHRSAPub(n, e);\n privPEM = genOpenSSLRSAPriv(n, e, d, iqmp, p, q);\n algo = 'sha1';\n break;\n }\n case 'ssh-dss': {\n /*\n string p -- public\n string q -- public\n string g -- public\n string y -- public\n string x -- private\n */\n const p = readString(data, data._pos);\n if (p === undefined)\n return new Error('Malformed OpenSSH private key');\n const q = readString(data, data._pos);\n if (q === undefined)\n return new Error('Malformed OpenSSH private key');\n const g = readString(data, data._pos);\n if (g === undefined)\n return new Error('Malformed OpenSSH private key');\n const y = readString(data, data._pos);\n if (y === undefined)\n return new Error('Malformed OpenSSH private key');\n const x = readString(data, data._pos);\n if (x === undefined)\n return new Error('Malformed OpenSSH private key');\n\n pubPEM = genOpenSSLDSAPub(p, q, g, y);\n pubSSH = genOpenSSHDSAPub(p, q, g, y);\n privPEM = genOpenSSLDSAPriv(p, q, g, y, x);\n algo = 'sha1';\n break;\n }\n case 'ssh-ed25519': {\n if (!eddsaSupported)\n return new Error(`Unsupported OpenSSH private key type: ${type}`);\n /*\n * string public key\n * string private key + public key\n */\n const edpub = readString(data, data._pos);\n if (edpub === undefined || edpub.length !== 32)\n return new Error('Malformed OpenSSH private key');\n const edpriv = readString(data, data._pos);\n if (edpriv === undefined || edpriv.length !== 64)\n return new Error('Malformed OpenSSH private key');\n\n pubPEM = genOpenSSLEdPub(edpub);\n pubSSH = genOpenSSHEdPub(edpub);\n privPEM = genOpenSSLEdPriv(bufferSlice(edpriv, 0, 32));\n algo = null;\n break;\n }\n case 'ecdsa-sha2-nistp256':\n algo = 'sha256';\n oid = '1.2.840.10045.3.1.7';\n // FALLTHROUGH\n case 'ecdsa-sha2-nistp384':\n if (algo === undefined) {\n algo = 'sha384';\n oid = '1.3.132.0.34';\n }\n // FALLTHROUGH\n case 'ecdsa-sha2-nistp521': {\n if (algo === undefined) {\n algo = 'sha512';\n oid = '1.3.132.0.35';\n }\n /*\n string curve name\n string Q -- public\n string d -- private\n */\n // TODO: validate curve name against type\n if (!skipFields(data, 1)) // Skip curve name\n return new Error('Malformed OpenSSH private key');\n const ecpub = readString(data, data._pos);\n if (ecpub === undefined)\n return new Error('Malformed OpenSSH private key');\n const ecpriv = readString(data, data._pos);\n if (ecpriv === undefined)\n return new Error('Malformed OpenSSH private key');\n\n pubPEM = genOpenSSLECDSAPub(oid, ecpub);\n pubSSH = genOpenSSHECDSAPub(oid, ecpub);\n privPEM = genOpenSSLECDSAPriv(oid, ecpub, ecpriv);\n break;\n }\n default:\n return new Error(`Unsupported OpenSSH private key type: ${type}`);\n }\n\n const privComment = readString(data, data._pos, true);\n if (privComment === undefined)\n return new Error('Malformed OpenSSH private key');\n\n keys.push(\n new OpenSSH_Private(type, privComment, privPEM, pubPEM, pubSSH, algo,\n decrypted)\n );\n }\n let cnt = 0;\n for (i = data._pos; i < data.length; ++i) {\n if (data[i] !== (++cnt % 255))\n return new Error('Malformed OpenSSH private key');\n }\n\n return keys;\n }\n}\n\n\nfunction OpenSSH_Old_Private(type, comment, privPEM, pubPEM, pubSSH, algo,\n decrypted) {\n this.type = type;\n this.comment = comment;\n this[SYM_PRIV_PEM] = privPEM;\n this[SYM_PUB_PEM] = pubPEM;\n this[SYM_PUB_SSH] = pubSSH;\n this[SYM_HASH_ALGO] = algo;\n this[SYM_DECRYPTED] = decrypted;\n}\nOpenSSH_Old_Private.prototype = BaseKey;\n{\n const regexp = /^-----BEGIN (RSA|DSA|EC) PRIVATE KEY-----(?:\\r\\n|\\n)((?:[^:]+:\\s*[\\S].*(?:\\r\\n|\\n))*)([\\s\\S]+)(?:\\r\\n|\\n)-----END (RSA|DSA|EC) PRIVATE KEY-----$/;\n OpenSSH_Old_Private.parse = (str, passphrase) => {\n const m = regexp.exec(str);\n if (m === null)\n return null;\n let privBlob = Buffer.from(m[3], 'base64');\n let headers = m[2];\n let decrypted = false;\n if (headers !== undefined) {\n // encrypted key\n headers = headers.split(/\\r\\n|\\n/g);\n for (let i = 0; i < headers.length; ++i) {\n const header = headers[i];\n let sepIdx = header.indexOf(':');\n if (header.slice(0, sepIdx) === 'DEK-Info') {\n const val = header.slice(sepIdx + 2);\n sepIdx = val.indexOf(',');\n if (sepIdx === -1)\n continue;\n const cipherName = val.slice(0, sepIdx).toLowerCase();\n if (supportedOpenSSLCiphers.indexOf(cipherName) === -1) {\n return new Error(\n `Cipher (${cipherName}) not supported `\n + 'for encrypted OpenSSH private key'\n );\n }\n const encInfo = CIPHER_INFO_OPENSSL[cipherName];\n if (!encInfo) {\n return new Error(\n `Cipher (${cipherName}) not supported `\n + 'for encrypted OpenSSH private key'\n );\n }\n const cipherIV = Buffer.from(val.slice(sepIdx + 1), 'hex');\n if (cipherIV.length !== encInfo.ivLen)\n return new Error('Malformed encrypted OpenSSH private key');\n if (!passphrase) {\n return new Error(\n 'Encrypted OpenSSH private key detected, but no passphrase given'\n );\n }\n const ivSlice = bufferSlice(cipherIV, 0, 8);\n let cipherKey = createHash('md5')\n .update(passphrase)\n .update(ivSlice)\n .digest();\n while (cipherKey.length < encInfo.keyLen) {\n cipherKey = combineBuffers(\n cipherKey,\n createHash('md5')\n .update(cipherKey)\n .update(passphrase)\n .update(ivSlice)\n .digest()\n );\n }\n if (cipherKey.length > encInfo.keyLen)\n cipherKey = bufferSlice(cipherKey, 0, encInfo.keyLen);\n try {\n const decipher = createDecipheriv(cipherName, cipherKey, cipherIV);\n decipher.setAutoPadding(false);\n privBlob = combineBuffers(decipher.update(privBlob),\n decipher.final());\n decrypted = true;\n } catch (ex) {\n return ex;\n }\n }\n }\n }\n\n let type;\n let privPEM;\n let pubPEM;\n let pubSSH;\n let algo;\n let reader;\n let errMsg = 'Malformed OpenSSH private key';\n if (decrypted)\n errMsg += '. Bad passphrase?';\n switch (m[1]) {\n case 'RSA':\n type = 'ssh-rsa';\n privPEM = makePEM('RSA PRIVATE', privBlob);\n try {\n reader = new Ber.Reader(privBlob);\n reader.readSequence();\n reader.readInt(); // skip version\n const n = reader.readString(Ber.Integer, true);\n if (n === null)\n return new Error(errMsg);\n const e = reader.readString(Ber.Integer, true);\n if (e === null)\n return new Error(errMsg);\n pubPEM = genOpenSSLRSAPub(n, e);\n pubSSH = genOpenSSHRSAPub(n, e);\n } catch {\n return new Error(errMsg);\n }\n algo = 'sha1';\n break;\n case 'DSA':\n type = 'ssh-dss';\n privPEM = makePEM('DSA PRIVATE', privBlob);\n try {\n reader = new Ber.Reader(privBlob);\n reader.readSequence();\n reader.readInt(); // skip version\n const p = reader.readString(Ber.Integer, true);\n if (p === null)\n return new Error(errMsg);\n const q = reader.readString(Ber.Integer, true);\n if (q === null)\n return new Error(errMsg);\n const g = reader.readString(Ber.Integer, true);\n if (g === null)\n return new Error(errMsg);\n const y = reader.readString(Ber.Integer, true);\n if (y === null)\n return new Error(errMsg);\n pubPEM = genOpenSSLDSAPub(p, q, g, y);\n pubSSH = genOpenSSHDSAPub(p, q, g, y);\n } catch {\n return new Error(errMsg);\n }\n algo = 'sha1';\n break;\n case 'EC': {\n let ecSSLName;\n let ecPriv;\n let ecOID;\n try {\n reader = new Ber.Reader(privBlob);\n reader.readSequence();\n reader.readInt(); // skip version\n ecPriv = reader.readString(Ber.OctetString, true);\n reader.readByte(); // Skip \"complex\" context type byte\n const offset = reader.readLength(); // Skip context length\n if (offset !== null) {\n reader._offset = offset;\n ecOID = reader.readOID();\n if (ecOID === null)\n return new Error(errMsg);\n switch (ecOID) {\n case '1.2.840.10045.3.1.7':\n // prime256v1/secp256r1\n ecSSLName = 'prime256v1';\n type = 'ecdsa-sha2-nistp256';\n algo = 'sha256';\n break;\n case '1.3.132.0.34':\n // secp384r1\n ecSSLName = 'secp384r1';\n type = 'ecdsa-sha2-nistp384';\n algo = 'sha384';\n break;\n case '1.3.132.0.35':\n // secp521r1\n ecSSLName = 'secp521r1';\n type = 'ecdsa-sha2-nistp521';\n algo = 'sha512';\n break;\n default:\n return new Error(`Unsupported private key EC OID: ${ecOID}`);\n }\n } else {\n return new Error(errMsg);\n }\n } catch {\n return new Error(errMsg);\n }\n privPEM = makePEM('EC PRIVATE', privBlob);\n const pubBlob = genOpenSSLECDSAPubFromPriv(ecSSLName, ecPriv);\n pubPEM = genOpenSSLECDSAPub(ecOID, pubBlob);\n pubSSH = genOpenSSHECDSAPub(ecOID, pubBlob);\n break;\n }\n }\n\n return new OpenSSH_Old_Private(type, '', privPEM, pubPEM, pubSSH, algo,\n decrypted);\n };\n}\n\n\nfunction PPK_Private(type, comment, privPEM, pubPEM, pubSSH, algo, decrypted) {\n this.type = type;\n this.comment = comment;\n this[SYM_PRIV_PEM] = privPEM;\n this[SYM_PUB_PEM] = pubPEM;\n this[SYM_PUB_SSH] = pubSSH;\n this[SYM_HASH_ALGO] = algo;\n this[SYM_DECRYPTED] = decrypted;\n}\nPPK_Private.prototype = BaseKey;\n{\n const EMPTY_PASSPHRASE = Buffer.alloc(0);\n const PPK_IV = Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);\n const PPK_PP1 = Buffer.from([0, 0, 0, 0]);\n const PPK_PP2 = Buffer.from([0, 0, 0, 1]);\n const regexp = /^PuTTY-User-Key-File-2: (ssh-(?:rsa|dss))\\r?\\nEncryption: (aes256-cbc|none)\\r?\\nComment: ([^\\r\\n]*)\\r?\\nPublic-Lines: \\d+\\r?\\n([\\s\\S]+?)\\r?\\nPrivate-Lines: \\d+\\r?\\n([\\s\\S]+?)\\r?\\nPrivate-MAC: ([^\\r\\n]+)/;\n PPK_Private.parse = (str, passphrase) => {\n const m = regexp.exec(str);\n if (m === null)\n return null;\n // m[1] = key type\n // m[2] = encryption type\n // m[3] = comment\n // m[4] = base64-encoded public key data:\n // for \"ssh-rsa\":\n // string \"ssh-rsa\"\n // mpint e (public exponent)\n // mpint n (modulus)\n // for \"ssh-dss\":\n // string \"ssh-dss\"\n // mpint p (modulus)\n // mpint q (prime)\n // mpint g (base number)\n // mpint y (public key parameter: g^x mod p)\n // m[5] = base64-encoded private key data:\n // for \"ssh-rsa\":\n // mpint d (private exponent)\n // mpint p (prime 1)\n // mpint q (prime 2)\n // mpint iqmp ([inverse of q] mod p)\n // for \"ssh-dss\":\n // mpint x (private key parameter)\n // m[6] = SHA1 HMAC over:\n // string name of algorithm (\"ssh-dss\", \"ssh-rsa\")\n // string encryption type\n // string comment\n // string public key data\n // string private-plaintext (including the final padding)\n const cipherName = m[2];\n const encrypted = (cipherName !== 'none');\n if (encrypted && !passphrase) {\n return new Error(\n 'Encrypted PPK private key detected, but no passphrase given'\n );\n }\n\n let privBlob = Buffer.from(m[5], 'base64');\n\n if (encrypted) {\n const encInfo = CIPHER_INFO[cipherName];\n let cipherKey = combineBuffers(\n createHash('sha1').update(PPK_PP1).update(passphrase).digest(),\n createHash('sha1').update(PPK_PP2).update(passphrase).digest()\n );\n if (cipherKey.length > encInfo.keyLen)\n cipherKey = bufferSlice(cipherKey, 0, encInfo.keyLen);\n try {\n const decipher = createDecipheriv(encInfo.sslName, cipherKey, PPK_IV);\n decipher.setAutoPadding(false);\n privBlob = combineBuffers(decipher.update(privBlob),\n decipher.final());\n } catch (ex) {\n return ex;\n }\n }\n\n const type = m[1];\n const comment = m[3];\n const pubBlob = Buffer.from(m[4], 'base64');\n\n const mac = m[6];\n const typeLen = type.length;\n const cipherNameLen = cipherName.length;\n const commentLen = Buffer.byteLength(comment);\n const pubLen = pubBlob.length;\n const privLen = privBlob.length;\n const macData = Buffer.allocUnsafe(4 + typeLen\n + 4 + cipherNameLen\n + 4 + commentLen\n + 4 + pubLen\n + 4 + privLen);\n let p = 0;\n\n writeUInt32BE(macData, typeLen, p);\n macData.utf8Write(type, p += 4, typeLen);\n writeUInt32BE(macData, cipherNameLen, p += typeLen);\n macData.utf8Write(cipherName, p += 4, cipherNameLen);\n writeUInt32BE(macData, commentLen, p += cipherNameLen);\n macData.utf8Write(comment, p += 4, commentLen);\n writeUInt32BE(macData, pubLen, p += commentLen);\n macData.set(pubBlob, p += 4);\n writeUInt32BE(macData, privLen, p += pubLen);\n macData.set(privBlob, p + 4);\n\n if (!passphrase)\n passphrase = EMPTY_PASSPHRASE;\n\n const calcMAC = createHmac(\n 'sha1',\n createHash('sha1')\n .update('putty-private-key-file-mac-key')\n .update(passphrase)\n .digest()\n ).update(macData).digest('hex');\n\n if (calcMAC !== mac) {\n if (encrypted) {\n return new Error(\n 'PPK private key integrity check failed -- bad passphrase?'\n );\n }\n return new Error('PPK private key integrity check failed');\n }\n\n let pubPEM;\n let pubSSH;\n let privPEM;\n pubBlob._pos = 0;\n skipFields(pubBlob, 1); // skip (duplicate) key type\n switch (type) {\n case 'ssh-rsa': {\n const e = readString(pubBlob, pubBlob._pos);\n if (e === undefined)\n return new Error('Malformed PPK public key');\n const n = readString(pubBlob, pubBlob._pos);\n if (n === undefined)\n return new Error('Malformed PPK public key');\n const d = readString(privBlob, 0);\n if (d === undefined)\n return new Error('Malformed PPK private key');\n const p = readString(privBlob, privBlob._pos);\n if (p === undefined)\n return new Error('Malformed PPK private key');\n const q = readString(privBlob, privBlob._pos);\n if (q === undefined)\n return new Error('Malformed PPK private key');\n const iqmp = readString(privBlob, privBlob._pos);\n if (iqmp === undefined)\n return new Error('Malformed PPK private key');\n pubPEM = genOpenSSLRSAPub(n, e);\n pubSSH = genOpenSSHRSAPub(n, e);\n privPEM = genOpenSSLRSAPriv(n, e, d, iqmp, p, q);\n break;\n }\n case 'ssh-dss': {\n const p = readString(pubBlob, pubBlob._pos);\n if (p === undefined)\n return new Error('Malformed PPK public key');\n const q = readString(pubBlob, pubBlob._pos);\n if (q === undefined)\n return new Error('Malformed PPK public key');\n const g = readString(pubBlob, pubBlob._pos);\n if (g === undefined)\n return new Error('Malformed PPK public key');\n const y = readString(pubBlob, pubBlob._pos);\n if (y === undefined)\n return new Error('Malformed PPK public key');\n const x = readString(privBlob, 0);\n if (x === undefined)\n return new Error('Malformed PPK private key');\n\n pubPEM = genOpenSSLDSAPub(p, q, g, y);\n pubSSH = genOpenSSHDSAPub(p, q, g, y);\n privPEM = genOpenSSLDSAPriv(p, q, g, y, x);\n break;\n }\n }\n\n return new PPK_Private(type, comment, privPEM, pubPEM, pubSSH, 'sha1',\n encrypted);\n };\n}\n\n\nfunction OpenSSH_Public(type, comment, pubPEM, pubSSH, algo) {\n this.type = type;\n this.comment = comment;\n this[SYM_PRIV_PEM] = null;\n this[SYM_PUB_PEM] = pubPEM;\n this[SYM_PUB_SSH] = pubSSH;\n this[SYM_HASH_ALGO] = algo;\n this[SYM_DECRYPTED] = false;\n}\nOpenSSH_Public.prototype = BaseKey;\n{\n let regexp;\n if (eddsaSupported)\n regexp = /^(((?:ssh-(?:rsa|dss|ed25519))|ecdsa-sha2-nistp(?:256|384|521))(?:-cert-v0[01]@openssh.com)?) ([A-Z0-9a-z/+=]+)(?:$|\\s+([\\S].*)?)$/;\n else\n regexp = /^(((?:ssh-(?:rsa|dss))|ecdsa-sha2-nistp(?:256|384|521))(?:-cert-v0[01]@openssh.com)?) ([A-Z0-9a-z/+=]+)(?:$|\\s+([\\S].*)?)$/;\n OpenSSH_Public.parse = (str) => {\n const m = regexp.exec(str);\n if (m === null)\n return null;\n // m[1] = full type\n // m[2] = base type\n // m[3] = base64-encoded public key\n // m[4] = comment\n\n const fullType = m[1];\n const baseType = m[2];\n const data = Buffer.from(m[3], 'base64');\n const comment = (m[4] || '');\n\n const type = readString(data, data._pos, true);\n if (type === undefined || type.indexOf(baseType) !== 0)\n return new Error('Malformed OpenSSH public key');\n\n return parseDER(data, baseType, comment, fullType);\n };\n}\n\n\nfunction RFC4716_Public(type, comment, pubPEM, pubSSH, algo) {\n this.type = type;\n this.comment = comment;\n this[SYM_PRIV_PEM] = null;\n this[SYM_PUB_PEM] = pubPEM;\n this[SYM_PUB_SSH] = pubSSH;\n this[SYM_HASH_ALGO] = algo;\n this[SYM_DECRYPTED] = false;\n}\nRFC4716_Public.prototype = BaseKey;\n{\n const regexp = /^---- BEGIN SSH2 PUBLIC KEY ----(?:\\r?\\n)((?:.{0,72}\\r?\\n)+)---- END SSH2 PUBLIC KEY ----$/;\n const RE_DATA = /^[A-Z0-9a-z/+=\\r\\n]+$/;\n const RE_HEADER = /^([\\x21-\\x39\\x3B-\\x7E]{1,64}): ((?:[^\\\\]*\\\\\\r?\\n)*[^\\r\\n]+)\\r?\\n/gm;\n const RE_HEADER_ENDS = /\\\\\\r?\\n/g;\n RFC4716_Public.parse = (str) => {\n let m = regexp.exec(str);\n if (m === null)\n return null;\n\n const body = m[1];\n let dataStart = 0;\n let comment = '';\n\n while (m = RE_HEADER.exec(body)) {\n const headerName = m[1];\n const headerValue = m[2].replace(RE_HEADER_ENDS, '');\n if (headerValue.length > 1024) {\n RE_HEADER.lastIndex = 0;\n return new Error('Malformed RFC4716 public key');\n }\n\n dataStart = RE_HEADER.lastIndex;\n\n if (headerName.toLowerCase() === 'comment') {\n comment = headerValue;\n if (comment.length > 1\n && comment.charCodeAt(0) === 34/* '\"' */\n && comment.charCodeAt(comment.length - 1) === 34/* '\"' */) {\n comment = comment.slice(1, -1);\n }\n }\n }\n\n let data = body.slice(dataStart);\n if (!RE_DATA.test(data))\n return new Error('Malformed RFC4716 public key');\n\n data = Buffer.from(data, 'base64');\n\n const type = readString(data, 0, true);\n if (type === undefined)\n return new Error('Malformed RFC4716 public key');\n\n let pubPEM = null;\n let pubSSH = null;\n switch (type) {\n case 'ssh-rsa': {\n const e = readString(data, data._pos);\n if (e === undefined)\n return new Error('Malformed RFC4716 public key');\n const n = readString(data, data._pos);\n if (n === undefined)\n return new Error('Malformed RFC4716 public key');\n pubPEM = genOpenSSLRSAPub(n, e);\n pubSSH = genOpenSSHRSAPub(n, e);\n break;\n }\n case 'ssh-dss': {\n const p = readString(data, data._pos);\n if (p === undefined)\n return new Error('Malformed RFC4716 public key');\n const q = readString(data, data._pos);\n if (q === undefined)\n return new Error('Malformed RFC4716 public key');\n const g = readString(data, data._pos);\n if (g === undefined)\n return new Error('Malformed RFC4716 public key');\n const y = readString(data, data._pos);\n if (y === undefined)\n return new Error('Malformed RFC4716 public key');\n pubPEM = genOpenSSLDSAPub(p, q, g, y);\n pubSSH = genOpenSSHDSAPub(p, q, g, y);\n break;\n }\n default:\n return new Error('Malformed RFC4716 public key');\n }\n\n return new RFC4716_Public(type, comment, pubPEM, pubSSH, 'sha1');\n };\n}\n\n\nfunction parseDER(data, baseType, comment, fullType) {\n if (!isSupportedKeyType(baseType))\n return new Error(`Unsupported OpenSSH public key type: ${baseType}`);\n\n let algo;\n let oid;\n let pubPEM = null;\n let pubSSH = null;\n\n switch (baseType) {\n case 'ssh-rsa': {\n const e = readString(data, data._pos || 0);\n if (e === undefined)\n return new Error('Malformed OpenSSH public key');\n const n = readString(data, data._pos);\n if (n === undefined)\n return new Error('Malformed OpenSSH public key');\n pubPEM = genOpenSSLRSAPub(n, e);\n pubSSH = genOpenSSHRSAPub(n, e);\n algo = 'sha1';\n break;\n }\n case 'ssh-dss': {\n const p = readString(data, data._pos || 0);\n if (p === undefined)\n return new Error('Malformed OpenSSH public key');\n const q = readString(data, data._pos);\n if (q === undefined)\n return new Error('Malformed OpenSSH public key');\n const g = readString(data, data._pos);\n if (g === undefined)\n return new Error('Malformed OpenSSH public key');\n const y = readString(data, data._pos);\n if (y === undefined)\n return new Error('Malformed OpenSSH public key');\n pubPEM = genOpenSSLDSAPub(p, q, g, y);\n pubSSH = genOpenSSHDSAPub(p, q, g, y);\n algo = 'sha1';\n break;\n }\n case 'ssh-ed25519': {\n const edpub = readString(data, data._pos || 0);\n if (edpub === undefined || edpub.length !== 32)\n return new Error('Malformed OpenSSH public key');\n pubPEM = genOpenSSLEdPub(edpub);\n pubSSH = genOpenSSHEdPub(edpub);\n algo = null;\n break;\n }\n case 'ecdsa-sha2-nistp256':\n algo = 'sha256';\n oid = '1.2.840.10045.3.1.7';\n // FALLTHROUGH\n case 'ecdsa-sha2-nistp384':\n if (algo === undefined) {\n algo = 'sha384';\n oid = '1.3.132.0.34';\n }\n // FALLTHROUGH\n case 'ecdsa-sha2-nistp521': {\n if (algo === undefined) {\n algo = 'sha512';\n oid = '1.3.132.0.35';\n }\n // TODO: validate curve name against type\n if (!skipFields(data, 1)) // Skip curve name\n return new Error('Malformed OpenSSH public key');\n const ecpub = readString(data, data._pos || 0);\n if (ecpub === undefined)\n return new Error('Malformed OpenSSH public key');\n pubPEM = genOpenSSLECDSAPub(oid, ecpub);\n pubSSH = genOpenSSHECDSAPub(oid, ecpub);\n break;\n }\n default:\n return new Error(`Unsupported OpenSSH public key type: ${baseType}`);\n }\n\n return new OpenSSH_Public(fullType, comment, pubPEM, pubSSH, algo);\n}\n\nfunction isSupportedKeyType(type) {\n switch (type) {\n case 'ssh-rsa':\n case 'ssh-dss':\n case 'ecdsa-sha2-nistp256':\n case 'ecdsa-sha2-nistp384':\n case 'ecdsa-sha2-nistp521':\n return true;\n case 'ssh-ed25519':\n if (eddsaSupported)\n return true;\n // FALLTHROUGH\n default:\n return false;\n }\n}\n\nfunction isParsedKey(val) {\n if (!val)\n return false;\n return (typeof val[SYM_DECRYPTED] === 'boolean');\n}\n\nfunction parseKey(data, passphrase) {\n if (isParsedKey(data))\n return data;\n\n let origBuffer;\n if (Buffer.isBuffer(data)) {\n origBuffer = data;\n data = data.utf8Slice(0, data.length).trim();\n } else if (typeof data === 'string') {\n data = data.trim();\n } else {\n return new Error('Key data must be a Buffer or string');\n }\n\n // eslint-disable-next-line eqeqeq\n if (passphrase != undefined) {\n if (typeof passphrase === 'string')\n passphrase = Buffer.from(passphrase);\n else if (!Buffer.isBuffer(passphrase))\n return new Error('Passphrase must be a string or Buffer when supplied');\n }\n\n let ret;\n\n // First try as printable string format (e.g. PEM)\n\n // Private keys\n if ((ret = OpenSSH_Private.parse(data, passphrase)) !== null)\n return ret;\n if ((ret = OpenSSH_Old_Private.parse(data, passphrase)) !== null)\n return ret;\n if ((ret = PPK_Private.parse(data, passphrase)) !== null)\n return ret;\n\n // Public keys\n if ((ret = OpenSSH_Public.parse(data)) !== null)\n return ret;\n if ((ret = RFC4716_Public.parse(data)) !== null)\n return ret;\n\n // Finally try as a binary format if we were originally passed binary data\n if (origBuffer) {\n binaryKeyParser.init(origBuffer, 0);\n const type = binaryKeyParser.readString(true);\n if (type !== undefined) {\n data = binaryKeyParser.readRaw();\n if (data !== undefined) {\n ret = parseDER(data, type, '', type);\n // Ignore potentially useless errors in case the data was not actually\n // in the binary format\n if (ret instanceof Error)\n ret = null;\n }\n }\n binaryKeyParser.clear();\n }\n\n if (ret)\n return ret;\n\n return new Error('Unsupported key format');\n}\n\nmodule.exports = {\n isParsedKey,\n isSupportedKeyType,\n parseDERKey: (data, type) => parseDER(data, type, '', type),\n parseKey,\n};\n", "'use strict';\n\nconst { Socket } = require('net');\nconst { Duplex } = require('stream');\nconst { resolve } = require('path');\nconst { readFile } = require('fs');\nconst { execFile, spawn } = require('child_process');\n\nconst { isParsedKey, parseKey } = require('./protocol/keyParser.js');\n\nconst {\n makeBufferParser,\n readUInt32BE,\n writeUInt32BE,\n writeUInt32LE,\n} = require('./protocol/utils.js');\n\nfunction once(cb) {\n let called = false;\n return (...args) => {\n if (called)\n return;\n called = true;\n cb(...args);\n };\n}\n\nfunction concat(buf1, buf2) {\n const combined = Buffer.allocUnsafe(buf1.length + buf2.length);\n buf1.copy(combined, 0);\n buf2.copy(combined, buf1.length);\n return combined;\n}\n\nfunction noop() {}\n\nconst EMPTY_BUF = Buffer.alloc(0);\n\nconst binaryParser = makeBufferParser();\n\nclass BaseAgent {\n getIdentities(cb) {\n cb(new Error('Missing getIdentities() implementation'));\n }\n sign(pubKey, data, options, cb) {\n if (typeof options === 'function')\n cb = options;\n cb(new Error('Missing sign() implementation'));\n }\n}\n\nclass OpenSSHAgent extends BaseAgent {\n constructor(socketPath) {\n super();\n this.socketPath = socketPath;\n }\n\n getStream(cb) {\n cb = once(cb);\n const sock = new Socket();\n sock.on('connect', () => {\n cb(null, sock);\n });\n sock.on('close', onFail)\n .on('end', onFail)\n .on('error', onFail);\n sock.connect(this.socketPath);\n\n function onFail() {\n try {\n sock.destroy();\n } catch {}\n\n cb(new Error('Failed to connect to agent'));\n }\n }\n\n getIdentities(cb) {\n cb = once(cb);\n this.getStream((err, stream) => {\n function onFail(err) {\n if (stream) {\n try {\n stream.destroy();\n } catch {}\n }\n if (!err)\n err = new Error('Failed to retrieve identities from agent');\n cb(err);\n }\n\n if (err)\n return onFail(err);\n\n const protocol = new AgentProtocol(true);\n protocol.on('error', onFail);\n protocol.pipe(stream).pipe(protocol);\n\n stream.on('close', onFail)\n .on('end', onFail)\n .on('error', onFail);\n\n protocol.getIdentities((err, keys) => {\n if (err)\n return onFail(err);\n try {\n stream.destroy();\n } catch {}\n cb(null, keys);\n });\n });\n }\n\n sign(pubKey, data, options, cb) {\n if (typeof options === 'function') {\n cb = options;\n options = undefined;\n } else if (typeof options !== 'object' || options === null) {\n options = undefined;\n }\n\n cb = once(cb);\n this.getStream((err, stream) => {\n function onFail(err) {\n if (stream) {\n try {\n stream.destroy();\n } catch {}\n }\n if (!err)\n err = new Error('Failed to sign data with agent');\n cb(err);\n }\n\n if (err)\n return onFail(err);\n\n const protocol = new AgentProtocol(true);\n protocol.on('error', onFail);\n protocol.pipe(stream).pipe(protocol);\n\n stream.on('close', onFail)\n .on('end', onFail)\n .on('error', onFail);\n\n protocol.sign(pubKey, data, options, (err, sig) => {\n if (err)\n return onFail(err);\n\n try {\n stream.destroy();\n } catch {}\n\n cb(null, sig);\n });\n });\n }\n}\n\nconst PageantAgent = (() => {\n const RET_ERR_BADARGS = 10;\n const RET_ERR_UNAVAILABLE = 11;\n const RET_ERR_NOMAP = 12;\n const RET_ERR_BINSTDIN = 13;\n const RET_ERR_BINSTDOUT = 14;\n const RET_ERR_BADLEN = 15;\n\n const EXEPATH = resolve(__dirname, '..', 'util/pagent.exe');\n const ERROR = {\n [RET_ERR_BADARGS]: new Error('Invalid pagent.exe arguments'),\n [RET_ERR_UNAVAILABLE]: new Error('Pageant is not running'),\n [RET_ERR_NOMAP]: new Error('pagent.exe could not create an mmap'),\n [RET_ERR_BINSTDIN]: new Error('pagent.exe could not set mode for stdin'),\n [RET_ERR_BINSTDOUT]: new Error('pagent.exe could not set mode for stdout'),\n [RET_ERR_BADLEN]:\n new Error('pagent.exe did not get expected input payload'),\n };\n\n function destroy(stream) {\n stream.buffer = null;\n if (stream.proc) {\n stream.proc.kill();\n stream.proc = undefined;\n }\n }\n\n class PageantSocket extends Duplex {\n constructor() {\n super();\n this.proc = undefined;\n this.buffer = null;\n }\n _read(n) {}\n _write(data, encoding, cb) {\n if (this.buffer === null) {\n this.buffer = data;\n } else {\n const newBuffer = Buffer.allocUnsafe(this.buffer.length + data.length);\n this.buffer.copy(newBuffer, 0);\n data.copy(newBuffer, this.buffer.length);\n this.buffer = newBuffer;\n }\n // Wait for at least all length bytes\n if (this.buffer.length < 4)\n return cb();\n\n const len = readUInt32BE(this.buffer, 0);\n // Make sure we have a full message before querying pageant\n if ((this.buffer.length - 4) < len)\n return cb();\n\n data = this.buffer.slice(0, 4 + len);\n if (this.buffer.length > (4 + len))\n return cb(new Error('Unexpected multiple agent requests'));\n this.buffer = null;\n\n let error;\n const proc = this.proc = spawn(EXEPATH, [ data.length ]);\n proc.stdout.on('data', (data) => {\n this.push(data);\n });\n proc.on('error', (err) => {\n error = err;\n cb(error);\n });\n proc.on('close', (code) => {\n this.proc = undefined;\n if (!error) {\n if (error = ERROR[code])\n return cb(error);\n cb();\n }\n });\n proc.stdin.end(data);\n }\n _final(cb) {\n destroy(this);\n cb();\n }\n _destroy(err, cb) {\n destroy(this);\n cb();\n }\n }\n\n return class PageantAgent extends OpenSSHAgent {\n getStream(cb) {\n cb(null, new PageantSocket());\n }\n };\n})();\n\nconst CygwinAgent = (() => {\n const RE_CYGWIN_SOCK = /^!<socket >(\\d+) s ([A-Z0-9]{8}-[A-Z0-9]{8}-[A-Z0-9]{8}-[A-Z0-9]{8})/;\n\n return class CygwinAgent extends OpenSSHAgent {\n getStream(cb) {\n cb = once(cb);\n\n // The cygwin ssh-agent connection process looks like this:\n // 1. Read the \"socket\" as a file to get the underlying TCP port and a\n // special \"secret\" that must be sent to the TCP server.\n // 2. Connect to the server listening on localhost at the TCP port.\n // 3. Send the \"secret\" to the server.\n // 4. The server sends back the same \"secret\".\n // 5. Send three 32-bit integer values of zero. This is ordinarily the\n // pid, uid, and gid of this process, but cygwin will actually\n // send us the correct values as a response.\n // 6. The server sends back the pid, uid, gid.\n // 7. Disconnect.\n // 8. Repeat steps 2-6, except send the received pid, uid, and gid in\n // step 5 instead of zeroes.\n // 9. Connection is ready to be used.\n\n let socketPath = this.socketPath;\n let triedCygpath = false;\n readFile(socketPath, function readCygsocket(err, data) {\n if (err) {\n if (triedCygpath)\n return cb(new Error('Invalid cygwin unix socket path'));\n\n // Try using `cygpath` to convert a possible *nix-style path to the\n // real Windows path before giving up ...\n execFile('cygpath', ['-w', socketPath], (err, stdout, stderr) => {\n if (err || stdout.length === 0)\n return cb(new Error('Invalid cygwin unix socket path'));\n\n triedCygpath = true;\n socketPath = stdout.toString().replace(/[\\r\\n]/g, '');\n readFile(socketPath, readCygsocket);\n });\n return;\n }\n\n const m = RE_CYGWIN_SOCK.exec(data.toString('ascii'));\n if (!m)\n return cb(new Error('Malformed cygwin unix socket file'));\n\n let state;\n let bc = 0;\n let isRetrying = false;\n const inBuf = [];\n let sock;\n\n // Use 0 for pid, uid, and gid to ensure we get an error and also\n // a valid uid and gid from cygwin so that we don't have to figure it\n // out ourselves\n let credsBuf = Buffer.alloc(12);\n\n // Parse cygwin unix socket file contents\n const port = parseInt(m[1], 10);\n const secret = m[2].replace(/-/g, '');\n const secretBuf = Buffer.allocUnsafe(16);\n for (let i = 0, j = 0; j < 32; ++i, j += 2)\n secretBuf[i] = parseInt(secret.substring(j, j + 2), 16);\n\n // Convert to host order (always LE for Windows)\n for (let i = 0; i < 16; i += 4)\n writeUInt32LE(secretBuf, readUInt32BE(secretBuf, i), i);\n\n tryConnect();\n\n function _onconnect() {\n bc = 0;\n state = 'secret';\n sock.write(secretBuf);\n }\n\n function _ondata(data) {\n bc += data.length;\n\n if (state === 'secret') {\n // The secret we sent is echoed back to us by cygwin, not sure of\n // the reason for that, but we ignore it nonetheless ...\n if (bc === 16) {\n bc = 0;\n state = 'creds';\n sock.write(credsBuf);\n }\n return;\n }\n\n if (state === 'creds') {\n // If this is the first attempt, make sure to gather the valid\n // uid and gid for our next attempt\n if (!isRetrying)\n inBuf.push(data);\n\n if (bc === 12) {\n sock.removeListener('connect', _onconnect);\n sock.removeListener('data', _ondata);\n sock.removeListener('error', onFail);\n sock.removeListener('end', onFail);\n sock.removeListener('close', onFail);\n\n if (isRetrying)\n return cb(null, sock);\n\n isRetrying = true;\n credsBuf = Buffer.concat(inBuf);\n writeUInt32LE(credsBuf, process.pid, 0);\n sock.on('error', () => {});\n sock.destroy();\n\n tryConnect();\n }\n }\n }\n\n function onFail() {\n cb(new Error('Problem negotiating cygwin unix socket security'));\n }\n\n function tryConnect() {\n sock = new Socket();\n sock.on('connect', _onconnect);\n sock.on('data', _ondata);\n sock.on('error', onFail);\n sock.on('end', onFail);\n sock.on('close', onFail);\n sock.connect(port);\n }\n });\n }\n };\n})();\n\n// Format of `//./pipe/ANYTHING`, with forward slashes and backward slashes\n// being interchangeable\nconst WINDOWS_PIPE_REGEX = /^[/\\\\][/\\\\]\\.[/\\\\]pipe[/\\\\].+/;\nfunction createAgent(path) {\n if (process.platform === 'win32' && !WINDOWS_PIPE_REGEX.test(path)) {\n return (path === 'pageant'\n ? new PageantAgent()\n : new CygwinAgent(path));\n }\n return new OpenSSHAgent(path);\n}\n\nconst AgentProtocol = (() => {\n // Client->Server messages\n const SSH_AGENTC_REQUEST_IDENTITIES = 11;\n const SSH_AGENTC_SIGN_REQUEST = 13;\n // const SSH_AGENTC_ADD_IDENTITY = 17;\n // const SSH_AGENTC_REMOVE_IDENTITY = 18;\n // const SSH_AGENTC_REMOVE_ALL_IDENTITIES = 19;\n // const SSH_AGENTC_ADD_SMARTCARD_KEY = 20;\n // const SSH_AGENTC_REMOVE_SMARTCARD_KEY = 21;\n // const SSH_AGENTC_LOCK = 22;\n // const SSH_AGENTC_UNLOCK = 23;\n // const SSH_AGENTC_ADD_ID_CONSTRAINED = 25;\n // const SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED = 26;\n // const SSH_AGENTC_EXTENSION = 27;\n // Server->Client messages\n const SSH_AGENT_FAILURE = 5;\n // const SSH_AGENT_SUCCESS = 6;\n const SSH_AGENT_IDENTITIES_ANSWER = 12;\n const SSH_AGENT_SIGN_RESPONSE = 14;\n // const SSH_AGENT_EXTENSION_FAILURE = 28;\n\n // const SSH_AGENT_CONSTRAIN_LIFETIME = 1;\n // const SSH_AGENT_CONSTRAIN_CONFIRM = 2;\n // const SSH_AGENT_CONSTRAIN_EXTENSION = 255;\n\n const SSH_AGENT_RSA_SHA2_256 = (1 << 1);\n const SSH_AGENT_RSA_SHA2_512 = (1 << 2);\n\n const ROLE_CLIENT = 0;\n const ROLE_SERVER = 1;\n\n // Ensures that responses get sent back in the same order the requests were\n // received\n function processResponses(protocol) {\n let ret;\n while (protocol[SYM_REQS].length) {\n const nextResponse = protocol[SYM_REQS][0][SYM_RESP];\n if (nextResponse === undefined)\n break;\n\n protocol[SYM_REQS].shift();\n ret = protocol.push(nextResponse);\n }\n return ret;\n }\n\n const SYM_TYPE = Symbol('Inbound Request Type');\n const SYM_RESP = Symbol('Inbound Request Response');\n const SYM_CTX = Symbol('Inbound Request Context');\n class AgentInboundRequest {\n constructor(type, ctx) {\n this[SYM_TYPE] = type;\n this[SYM_RESP] = undefined;\n this[SYM_CTX] = ctx;\n }\n hasResponded() {\n return (this[SYM_RESP] !== undefined);\n }\n getType() {\n return this[SYM_TYPE];\n }\n getContext() {\n return this[SYM_CTX];\n }\n }\n function respond(protocol, req, data) {\n req[SYM_RESP] = data;\n return processResponses(protocol);\n }\n\n function cleanup(protocol) {\n protocol[SYM_BUFFER] = null;\n if (protocol[SYM_MODE] === ROLE_CLIENT) {\n const reqs = protocol[SYM_REQS];\n if (reqs && reqs.length) {\n protocol[SYM_REQS] = [];\n for (const req of reqs)\n req.cb(new Error('No reply from server'));\n }\n }\n\n // Node streams hackery to make streams do the \"right thing\"\n try {\n protocol.end();\n } catch {}\n setImmediate(() => {\n if (!protocol[SYM_ENDED])\n protocol.emit('end');\n if (!protocol[SYM_CLOSED])\n protocol.emit('close');\n });\n }\n\n function onClose() {\n this[SYM_CLOSED] = true;\n }\n\n function onEnd() {\n this[SYM_ENDED] = true;\n }\n\n const SYM_REQS = Symbol('Requests');\n const SYM_MODE = Symbol('Agent Protocol Role');\n const SYM_BUFFER = Symbol('Agent Protocol Buffer');\n const SYM_MSGLEN = Symbol('Agent Protocol Current Message Length');\n const SYM_CLOSED = Symbol('Agent Protocol Closed');\n const SYM_ENDED = Symbol('Agent Protocol Ended');\n // Implementation based on:\n // https://tools.ietf.org/html/draft-miller-ssh-agent-04\n return class AgentProtocol extends Duplex {\n /*\n Notes:\n - `constraint` type consists of:\n byte constraint_type\n byte[] constraint_data\n where `constraint_type` is one of:\n * SSH_AGENT_CONSTRAIN_LIFETIME\n - `constraint_data` consists of:\n uint32 seconds\n * SSH_AGENT_CONSTRAIN_CONFIRM\n - `constraint_data` N/A\n * SSH_AGENT_CONSTRAIN_EXTENSION\n - `constraint_data` consists of:\n string extension name\n byte[] extension-specific details\n */\n\n constructor(isClient) {\n super({ autoDestroy: true, emitClose: false });\n this[SYM_MODE] = (isClient ? ROLE_CLIENT : ROLE_SERVER);\n this[SYM_REQS] = [];\n this[SYM_BUFFER] = null;\n this[SYM_MSGLEN] = -1;\n this.once('end', onEnd);\n this.once('close', onClose);\n }\n\n _read(n) {}\n\n _write(data, encoding, cb) {\n /*\n Messages are of the format:\n uint32 message length\n byte message type\n byte[message length - 1] message contents\n */\n if (this[SYM_BUFFER] === null)\n this[SYM_BUFFER] = data;\n else\n this[SYM_BUFFER] = concat(this[SYM_BUFFER], data);\n\n let buffer = this[SYM_BUFFER];\n let bufferLen = buffer.length;\n\n let p = 0;\n while (p < bufferLen) {\n // Wait for length + type\n if (bufferLen < 5)\n break;\n\n if (this[SYM_MSGLEN] === -1)\n this[SYM_MSGLEN] = readUInt32BE(buffer, p);\n\n // Check if we have the entire message\n if (bufferLen < (4 + this[SYM_MSGLEN]))\n break;\n\n const msgType = buffer[p += 4];\n ++p;\n\n if (this[SYM_MODE] === ROLE_CLIENT) {\n if (this[SYM_REQS].length === 0)\n return cb(new Error('Received unexpected message from server'));\n\n const req = this[SYM_REQS].shift();\n\n switch (msgType) {\n case SSH_AGENT_FAILURE:\n req.cb(new Error('Agent responded with failure'));\n break;\n case SSH_AGENT_IDENTITIES_ANSWER: {\n if (req.type !== SSH_AGENTC_REQUEST_IDENTITIES)\n return cb(new Error('Agent responded with wrong message type'));\n\n /*\n byte SSH_AGENT_IDENTITIES_ANSWER\n uint32 nkeys\n\n where `nkeys` is 0 or more of:\n string key blob\n string comment\n */\n\n binaryParser.init(buffer, p);\n\n const numKeys = binaryParser.readUInt32BE();\n\n if (numKeys === undefined) {\n binaryParser.clear();\n return cb(new Error('Malformed agent response'));\n }\n\n const keys = [];\n for (let i = 0; i < numKeys; ++i) {\n let pubKey = binaryParser.readString();\n if (pubKey === undefined) {\n binaryParser.clear();\n return cb(new Error('Malformed agent response'));\n }\n\n const comment = binaryParser.readString(true);\n if (comment === undefined) {\n binaryParser.clear();\n return cb(new Error('Malformed agent response'));\n }\n\n pubKey = parseKey(pubKey);\n // We continue parsing the packet if we encounter an error\n // in case the error is due to the key being an unsupported\n // type\n if (pubKey instanceof Error)\n continue;\n\n pubKey.comment = pubKey.comment || comment;\n\n keys.push(pubKey);\n }\n p = binaryParser.pos();\n binaryParser.clear();\n\n req.cb(null, keys);\n break;\n }\n case SSH_AGENT_SIGN_RESPONSE: {\n if (req.type !== SSH_AGENTC_SIGN_REQUEST)\n return cb(new Error('Agent responded with wrong message type'));\n\n /*\n byte SSH_AGENT_SIGN_RESPONSE\n string signature\n */\n\n binaryParser.init(buffer, p);\n let signature = binaryParser.readString();\n p = binaryParser.pos();\n binaryParser.clear();\n\n if (signature === undefined)\n return cb(new Error('Malformed agent response'));\n\n // We strip the algorithm from OpenSSH's output and assume it's\n // using the algorithm we specified. This makes it easier on\n // custom Agent implementations so they don't have to construct\n // the correct binary format for a (OpenSSH-style) signature.\n\n // TODO: verify signature type based on key and options used\n // during initial sign request\n binaryParser.init(signature, 0);\n binaryParser.readString(true);\n signature = binaryParser.readString();\n binaryParser.clear();\n\n if (signature === undefined)\n return cb(new Error('Malformed OpenSSH signature format'));\n\n req.cb(null, signature);\n break;\n }\n default:\n return cb(\n new Error('Agent responded with unsupported message type')\n );\n }\n } else {\n switch (msgType) {\n case SSH_AGENTC_REQUEST_IDENTITIES: {\n const req = new AgentInboundRequest(msgType);\n this[SYM_REQS].push(req);\n /*\n byte SSH_AGENTC_REQUEST_IDENTITIES\n */\n this.emit('identities', req);\n break;\n }\n case SSH_AGENTC_SIGN_REQUEST: {\n /*\n byte SSH_AGENTC_SIGN_REQUEST\n string key_blob\n string data\n uint32 flags\n */\n binaryParser.init(buffer, p);\n let pubKey = binaryParser.readString();\n const data = binaryParser.readString();\n const flagsVal = binaryParser.readUInt32BE();\n p = binaryParser.pos();\n binaryParser.clear();\n if (flagsVal === undefined) {\n const req = new AgentInboundRequest(msgType);\n this[SYM_REQS].push(req);\n return this.failureReply(req);\n }\n\n pubKey = parseKey(pubKey);\n if (pubKey instanceof Error) {\n const req = new AgentInboundRequest(msgType);\n this[SYM_REQS].push(req);\n return this.failureReply(req);\n }\n\n const flags = {\n hash: undefined,\n };\n let ctx;\n if (pubKey.type === 'ssh-rsa') {\n if (flagsVal & SSH_AGENT_RSA_SHA2_256) {\n ctx = 'rsa-sha2-256';\n flags.hash = 'sha256';\n } else if (flagsVal & SSH_AGENT_RSA_SHA2_512) {\n ctx = 'rsa-sha2-512';\n flags.hash = 'sha512';\n }\n }\n if (ctx === undefined)\n ctx = pubKey.type;\n\n const req = new AgentInboundRequest(msgType, ctx);\n this[SYM_REQS].push(req);\n\n this.emit('sign', req, pubKey, data, flags);\n break;\n }\n default: {\n const req = new AgentInboundRequest(msgType);\n this[SYM_REQS].push(req);\n this.failureReply(req);\n }\n }\n }\n\n // Get ready for next message\n this[SYM_MSGLEN] = -1;\n if (p === bufferLen) {\n // Nothing left to process for now\n this[SYM_BUFFER] = null;\n break;\n } else {\n this[SYM_BUFFER] = buffer = buffer.slice(p);\n bufferLen = buffer.length;\n p = 0;\n }\n }\n\n cb();\n }\n\n _destroy(err, cb) {\n cleanup(this);\n cb();\n }\n\n _final(cb) {\n cleanup(this);\n cb();\n }\n\n // Client->Server messages =================================================\n sign(pubKey, data, options, cb) {\n if (this[SYM_MODE] !== ROLE_CLIENT)\n throw new Error('Client-only method called with server role');\n\n if (typeof options === 'function') {\n cb = options;\n options = undefined;\n } else if (typeof options !== 'object' || options === null) {\n options = undefined;\n }\n\n let flags = 0;\n\n pubKey = parseKey(pubKey);\n if (pubKey instanceof Error)\n throw new Error('Invalid public key argument');\n\n if (pubKey.type === 'ssh-rsa' && options) {\n switch (options.hash) {\n case 'sha256':\n flags = SSH_AGENT_RSA_SHA2_256;\n break;\n case 'sha512':\n flags = SSH_AGENT_RSA_SHA2_512;\n break;\n }\n }\n pubKey = pubKey.getPublicSSH();\n\n /*\n byte SSH_AGENTC_SIGN_REQUEST\n string key_blob\n string data\n uint32 flags\n */\n const type = SSH_AGENTC_SIGN_REQUEST;\n const keyLen = pubKey.length;\n const dataLen = data.length;\n let p = 0;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + keyLen + 4 + dataLen + 4);\n\n writeUInt32BE(buf, buf.length - 4, p);\n\n buf[p += 4] = type;\n\n writeUInt32BE(buf, keyLen, ++p);\n pubKey.copy(buf, p += 4);\n\n writeUInt32BE(buf, dataLen, p += keyLen);\n data.copy(buf, p += 4);\n\n writeUInt32BE(buf, flags, p += dataLen);\n\n if (typeof cb !== 'function')\n cb = noop;\n\n this[SYM_REQS].push({ type, cb });\n\n return this.push(buf);\n }\n getIdentities(cb) {\n if (this[SYM_MODE] !== ROLE_CLIENT)\n throw new Error('Client-only method called with server role');\n\n /*\n byte SSH_AGENTC_REQUEST_IDENTITIES\n */\n const type = SSH_AGENTC_REQUEST_IDENTITIES;\n\n let p = 0;\n const buf = Buffer.allocUnsafe(4 + 1);\n\n writeUInt32BE(buf, buf.length - 4, p);\n\n buf[p += 4] = type;\n\n if (typeof cb !== 'function')\n cb = noop;\n\n this[SYM_REQS].push({ type, cb });\n\n return this.push(buf);\n }\n\n // Server->Client messages =================================================\n failureReply(req) {\n if (this[SYM_MODE] !== ROLE_SERVER)\n throw new Error('Server-only method called with client role');\n\n if (!(req instanceof AgentInboundRequest))\n throw new Error('Wrong request argument');\n\n if (req.hasResponded())\n return true;\n\n let p = 0;\n const buf = Buffer.allocUnsafe(4 + 1);\n\n writeUInt32BE(buf, buf.length - 4, p);\n\n buf[p += 4] = SSH_AGENT_FAILURE;\n\n return respond(this, req, buf);\n }\n getIdentitiesReply(req, keys) {\n if (this[SYM_MODE] !== ROLE_SERVER)\n throw new Error('Server-only method called with client role');\n\n if (!(req instanceof AgentInboundRequest))\n throw new Error('Wrong request argument');\n\n if (req.hasResponded())\n return true;\n\n /*\n byte SSH_AGENT_IDENTITIES_ANSWER\n uint32 nkeys\n\n where `nkeys` is 0 or more of:\n string key blob\n string comment\n */\n\n if (req.getType() !== SSH_AGENTC_REQUEST_IDENTITIES)\n throw new Error('Invalid response to request');\n\n if (!Array.isArray(keys))\n throw new Error('Keys argument must be an array');\n\n let totalKeysLen = 4; // Include `nkeys` size\n\n const newKeys = [];\n for (let i = 0; i < keys.length; ++i) {\n const entry = keys[i];\n if (typeof entry !== 'object' || entry === null)\n throw new Error(`Invalid key entry: ${entry}`);\n\n let pubKey;\n let comment;\n if (isParsedKey(entry)) {\n pubKey = entry;\n } else if (isParsedKey(entry.pubKey)) {\n pubKey = entry.pubKey;\n } else {\n if (typeof entry.pubKey !== 'object' || entry.pubKey === null)\n continue;\n ({ pubKey, comment } = entry.pubKey);\n pubKey = parseKey(pubKey);\n if (pubKey instanceof Error)\n continue; // TODO: add debug output\n }\n comment = pubKey.comment || comment;\n pubKey = pubKey.getPublicSSH();\n\n totalKeysLen += 4 + pubKey.length;\n\n if (comment && typeof comment === 'string')\n comment = Buffer.from(comment);\n else if (!Buffer.isBuffer(comment))\n comment = EMPTY_BUF;\n\n totalKeysLen += 4 + comment.length;\n\n newKeys.push({ pubKey, comment });\n }\n\n let p = 0;\n const buf = Buffer.allocUnsafe(4 + 1 + totalKeysLen);\n\n writeUInt32BE(buf, buf.length - 4, p);\n\n buf[p += 4] = SSH_AGENT_IDENTITIES_ANSWER;\n\n writeUInt32BE(buf, newKeys.length, ++p);\n p += 4;\n for (let i = 0; i < newKeys.length; ++i) {\n const { pubKey, comment } = newKeys[i];\n\n writeUInt32BE(buf, pubKey.length, p);\n pubKey.copy(buf, p += 4);\n\n writeUInt32BE(buf, comment.length, p += pubKey.length);\n p += 4;\n if (comment.length) {\n comment.copy(buf, p);\n p += comment.length;\n }\n }\n\n return respond(this, req, buf);\n }\n signReply(req, signature) {\n if (this[SYM_MODE] !== ROLE_SERVER)\n throw new Error('Server-only method called with client role');\n\n if (!(req instanceof AgentInboundRequest))\n throw new Error('Wrong request argument');\n\n if (req.hasResponded())\n return true;\n\n /*\n byte SSH_AGENT_SIGN_RESPONSE\n string signature\n */\n\n if (req.getType() !== SSH_AGENTC_SIGN_REQUEST)\n throw new Error('Invalid response to request');\n\n if (!Buffer.isBuffer(signature))\n throw new Error('Signature argument must be a Buffer');\n\n if (signature.length === 0)\n throw new Error('Signature argument must be non-empty');\n\n /*\n OpenSSH agent signatures are encoded as:\n\n string signature format identifier (as specified by the\n public key/certificate format)\n byte[n] signature blob in format specific encoding.\n - This is actually a `string` for: rsa, dss, ecdsa, and ed25519\n types\n */\n\n let p = 0;\n const sigFormat = req.getContext();\n const sigFormatLen = Buffer.byteLength(sigFormat);\n const buf = Buffer.allocUnsafe(\n 4 + 1 + 4 + 4 + sigFormatLen + 4 + signature.length\n );\n\n writeUInt32BE(buf, buf.length - 4, p);\n\n buf[p += 4] = SSH_AGENT_SIGN_RESPONSE;\n\n writeUInt32BE(buf, 4 + sigFormatLen + 4 + signature.length, ++p);\n writeUInt32BE(buf, sigFormatLen, p += 4);\n buf.utf8Write(sigFormat, p += 4, sigFormatLen);\n writeUInt32BE(buf, signature.length, p += sigFormatLen);\n signature.copy(buf, p += 4);\n\n return respond(this, req, buf);\n }\n };\n})();\n\nconst SYM_AGENT = Symbol('Agent');\nconst SYM_AGENT_KEYS = Symbol('Agent Keys');\nconst SYM_AGENT_KEYS_IDX = Symbol('Agent Keys Index');\nconst SYM_AGENT_CBS = Symbol('Agent Init Callbacks');\nclass AgentContext {\n constructor(agent) {\n if (typeof agent === 'string')\n agent = createAgent(agent);\n else if (!isAgent(agent))\n throw new Error('Invalid agent argument');\n this[SYM_AGENT] = agent;\n this[SYM_AGENT_KEYS] = null;\n this[SYM_AGENT_KEYS_IDX] = -1;\n this[SYM_AGENT_CBS] = null;\n }\n init(cb) {\n if (typeof cb !== 'function')\n cb = noop;\n\n if (this[SYM_AGENT_KEYS] === null) {\n if (this[SYM_AGENT_CBS] === null) {\n this[SYM_AGENT_CBS] = [cb];\n\n const doCbs = (...args) => {\n process.nextTick(() => {\n const cbs = this[SYM_AGENT_CBS];\n this[SYM_AGENT_CBS] = null;\n for (const cb of cbs)\n cb(...args);\n });\n };\n\n this[SYM_AGENT].getIdentities(once((err, keys) => {\n if (err)\n return doCbs(err);\n\n if (!Array.isArray(keys)) {\n return doCbs(new Error(\n 'Agent implementation failed to provide keys'\n ));\n }\n\n const newKeys = [];\n for (let key of keys) {\n key = parseKey(key);\n if (key instanceof Error) {\n // TODO: add debug output\n continue;\n }\n newKeys.push(key);\n }\n\n this[SYM_AGENT_KEYS] = newKeys;\n this[SYM_AGENT_KEYS_IDX] = -1;\n doCbs();\n }));\n } else {\n this[SYM_AGENT_CBS].push(cb);\n }\n } else {\n process.nextTick(cb);\n }\n }\n nextKey() {\n if (this[SYM_AGENT_KEYS] === null\n || ++this[SYM_AGENT_KEYS_IDX] >= this[SYM_AGENT_KEYS].length) {\n return false;\n }\n\n return this[SYM_AGENT_KEYS][this[SYM_AGENT_KEYS_IDX]];\n }\n currentKey() {\n if (this[SYM_AGENT_KEYS] === null\n || this[SYM_AGENT_KEYS_IDX] >= this[SYM_AGENT_KEYS].length) {\n return null;\n }\n\n return this[SYM_AGENT_KEYS][this[SYM_AGENT_KEYS_IDX]];\n }\n pos() {\n if (this[SYM_AGENT_KEYS] === null\n || this[SYM_AGENT_KEYS_IDX] >= this[SYM_AGENT_KEYS].length) {\n return -1;\n }\n\n return this[SYM_AGENT_KEYS_IDX];\n }\n reset() {\n this[SYM_AGENT_KEYS_IDX] = -1;\n }\n\n sign(...args) {\n this[SYM_AGENT].sign(...args);\n }\n}\n\nfunction isAgent(val) {\n return (val instanceof BaseAgent);\n}\n\nmodule.exports = {\n AgentContext,\n AgentProtocol,\n BaseAgent,\n createAgent,\n CygwinAgent,\n isAgent,\n OpenSSHAgent,\n PageantAgent,\n};\n", "'use strict';\n\nconst { kMaxLength } = require('buffer');\nconst {\n createInflate,\n constants: {\n DEFLATE,\n INFLATE,\n Z_DEFAULT_CHUNK,\n Z_DEFAULT_COMPRESSION,\n Z_DEFAULT_MEMLEVEL,\n Z_DEFAULT_STRATEGY,\n Z_DEFAULT_WINDOWBITS,\n Z_PARTIAL_FLUSH,\n }\n} = require('zlib');\nconst ZlibHandle = createInflate()._handle.constructor;\n\nfunction processCallback() {\n throw new Error('Should not get here');\n}\n\nfunction zlibOnError(message, errno, code) {\n const self = this._owner;\n // There is no way to cleanly recover.\n // Continuing only obscures problems.\n\n const error = new Error(message);\n error.errno = errno;\n error.code = code;\n self._err = error;\n}\n\nfunction _close(engine) {\n // Caller may invoke .close after a zlib error (which will null _handle).\n if (!engine._handle)\n return;\n\n engine._handle.close();\n engine._handle = null;\n}\n\nclass Zlib {\n constructor(mode) {\n const windowBits = Z_DEFAULT_WINDOWBITS;\n const level = Z_DEFAULT_COMPRESSION;\n const memLevel = Z_DEFAULT_MEMLEVEL;\n const strategy = Z_DEFAULT_STRATEGY;\n const dictionary = undefined;\n\n this._err = undefined;\n this._writeState = new Uint32Array(2);\n this._chunkSize = Z_DEFAULT_CHUNK;\n this._maxOutputLength = kMaxLength;\n this._outBuffer = Buffer.allocUnsafe(this._chunkSize);\n this._outOffset = 0;\n\n this._handle = new ZlibHandle(mode);\n this._handle._owner = this;\n this._handle.onerror = zlibOnError;\n this._handle.init(windowBits,\n level,\n memLevel,\n strategy,\n this._writeState,\n processCallback,\n dictionary);\n }\n\n writeSync(chunk, retChunks) {\n const handle = this._handle;\n if (!handle)\n throw new Error('Invalid Zlib instance');\n\n let availInBefore = chunk.length;\n let availOutBefore = this._chunkSize - this._outOffset;\n let inOff = 0;\n let availOutAfter;\n let availInAfter;\n\n let buffers;\n let nread = 0;\n const state = this._writeState;\n let buffer = this._outBuffer;\n let offset = this._outOffset;\n const chunkSize = this._chunkSize;\n\n while (true) {\n handle.writeSync(Z_PARTIAL_FLUSH,\n chunk, // in\n inOff, // in_off\n availInBefore, // in_len\n buffer, // out\n offset, // out_off\n availOutBefore); // out_len\n if (this._err)\n throw this._err;\n\n availOutAfter = state[0];\n availInAfter = state[1];\n\n const inDelta = availInBefore - availInAfter;\n const have = availOutBefore - availOutAfter;\n\n if (have > 0) {\n const out = (offset === 0 && have === buffer.length\n ? buffer\n : buffer.slice(offset, offset + have));\n offset += have;\n if (!buffers)\n buffers = out;\n else if (buffers.push === undefined)\n buffers = [buffers, out];\n else\n buffers.push(out);\n nread += out.byteLength;\n\n if (nread > this._maxOutputLength) {\n _close(this);\n throw new Error(\n `Output length exceeded maximum of ${this._maxOutputLength}`\n );\n }\n } else if (have !== 0) {\n throw new Error('have should not go down');\n }\n\n // Exhausted the output buffer, or used all the input create a new one.\n if (availOutAfter === 0 || offset >= chunkSize) {\n availOutBefore = chunkSize;\n offset = 0;\n buffer = Buffer.allocUnsafe(chunkSize);\n }\n\n if (availOutAfter === 0) {\n // Not actually done. Need to reprocess.\n // Also, update the availInBefore to the availInAfter value,\n // so that if we have to hit it a third (fourth, etc.) time,\n // it'll have the correct byte counts.\n inOff += inDelta;\n availInBefore = availInAfter;\n } else {\n break;\n }\n }\n\n this._outBuffer = buffer;\n this._outOffset = offset;\n\n if (nread === 0)\n buffers = Buffer.alloc(0);\n\n if (retChunks) {\n buffers.totalLen = nread;\n return buffers;\n }\n\n if (buffers.push === undefined)\n return buffers;\n\n const output = Buffer.allocUnsafe(nread);\n for (let i = 0, p = 0; i < buffers.length; ++i) {\n const buf = buffers[i];\n output.set(buf, p);\n p += buf.length;\n }\n return output;\n }\n}\n\nclass ZlibPacketWriter {\n constructor(protocol) {\n this.allocStart = 0;\n this.allocStartKEX = 0;\n this._protocol = protocol;\n this._zlib = new Zlib(DEFLATE);\n }\n\n cleanup() {\n if (this._zlib)\n _close(this._zlib);\n }\n\n alloc(payloadSize, force) {\n return Buffer.allocUnsafe(payloadSize);\n }\n\n finalize(payload, force) {\n if (this._protocol._kexinit === undefined || force) {\n const output = this._zlib.writeSync(payload, true);\n const packet = this._protocol._cipher.allocPacket(output.totalLen);\n if (output.push === undefined) {\n packet.set(output, 5);\n } else {\n for (let i = 0, p = 5; i < output.length; ++i) {\n const chunk = output[i];\n packet.set(chunk, p);\n p += chunk.length;\n }\n }\n return packet;\n }\n return payload;\n }\n}\n\nclass PacketWriter {\n constructor(protocol) {\n this.allocStart = 5;\n this.allocStartKEX = 5;\n this._protocol = protocol;\n }\n\n cleanup() {}\n\n alloc(payloadSize, force) {\n if (this._protocol._kexinit === undefined || force)\n return this._protocol._cipher.allocPacket(payloadSize);\n return Buffer.allocUnsafe(payloadSize);\n }\n\n finalize(packet, force) {\n return packet;\n }\n}\n\nclass ZlibPacketReader {\n constructor() {\n this._zlib = new Zlib(INFLATE);\n }\n\n cleanup() {\n if (this._zlib)\n _close(this._zlib);\n }\n\n read(data) {\n return this._zlib.writeSync(data, false);\n }\n}\n\nclass PacketReader {\n cleanup() {}\n\n read(data) {\n return data;\n }\n}\n\nmodule.exports = {\n PacketReader,\n PacketWriter,\n ZlibPacketReader,\n ZlibPacketWriter,\n};\n", "'use strict';\n\nconst {\n bufferSlice,\n bufferParser,\n doFatalError,\n sigSSHToASN1,\n writeUInt32BE,\n} = require('./utils.js');\n\nconst {\n CHANNEL_OPEN_FAILURE,\n COMPAT,\n MESSAGE,\n TERMINAL_MODE,\n} = require('./constants.js');\n\nconst {\n parseKey,\n} = require('./keyParser.js');\n\nconst TERMINAL_MODE_BY_VALUE =\n Array.from(Object.entries(TERMINAL_MODE))\n .reduce((obj, [key, value]) => ({ ...obj, [key]: value }), {});\n\nmodule.exports = {\n // Transport layer protocol ==================================================\n [MESSAGE.DISCONNECT]: (self, payload) => {\n /*\n byte SSH_MSG_DISCONNECT\n uint32 reason code\n string description in ISO-10646 UTF-8 encoding\n string language tag\n */\n bufferParser.init(payload, 1);\n const reason = bufferParser.readUInt32BE();\n const desc = bufferParser.readString(true);\n const lang = bufferParser.readString();\n bufferParser.clear();\n\n if (lang === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed DISCONNECT packet'\n );\n }\n\n self._debug && self._debug(\n `Inbound: Received DISCONNECT (${reason}, \"${desc}\")`\n );\n\n const handler = self._handlers.DISCONNECT;\n handler && handler(self, reason, desc);\n },\n [MESSAGE.IGNORE]: (self, payload) => {\n /*\n byte SSH_MSG_IGNORE\n string data\n */\n self._debug && self._debug('Inbound: Received IGNORE');\n },\n [MESSAGE.UNIMPLEMENTED]: (self, payload) => {\n /*\n byte SSH_MSG_UNIMPLEMENTED\n uint32 packet sequence number of rejected message\n */\n bufferParser.init(payload, 1);\n const seqno = bufferParser.readUInt32BE();\n bufferParser.clear();\n\n if (seqno === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed UNIMPLEMENTED packet'\n );\n }\n\n self._debug\n && self._debug(`Inbound: Received UNIMPLEMENTED (seqno ${seqno})`);\n },\n [MESSAGE.DEBUG]: (self, payload) => {\n /*\n byte SSH_MSG_DEBUG\n boolean always_display\n string message in ISO-10646 UTF-8 encoding [RFC3629]\n string language tag [RFC3066]\n */\n bufferParser.init(payload, 1);\n const display = bufferParser.readBool();\n const msg = bufferParser.readString(true);\n const lang = bufferParser.readString();\n bufferParser.clear();\n\n if (lang === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed DEBUG packet'\n );\n }\n\n self._debug && self._debug('Inbound: Received DEBUG');\n\n const handler = self._handlers.DEBUG;\n handler && handler(self, display, msg);\n },\n [MESSAGE.SERVICE_REQUEST]: (self, payload) => {\n /*\n byte SSH_MSG_SERVICE_REQUEST\n string service name\n */\n bufferParser.init(payload, 1);\n const name = bufferParser.readString(true);\n bufferParser.clear();\n\n if (name === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed SERVICE_REQUEST packet'\n );\n }\n\n self._debug && self._debug(`Inbound: Received SERVICE_REQUEST (${name})`);\n\n const handler = self._handlers.SERVICE_REQUEST;\n handler && handler(self, name);\n },\n [MESSAGE.SERVICE_ACCEPT]: (self, payload) => {\n // S->C\n /*\n byte SSH_MSG_SERVICE_ACCEPT\n string service name\n */\n bufferParser.init(payload, 1);\n const name = bufferParser.readString(true);\n bufferParser.clear();\n\n if (name === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed SERVICE_ACCEPT packet'\n );\n }\n\n self._debug && self._debug(`Inbound: Received SERVICE_ACCEPT (${name})`);\n\n const handler = self._handlers.SERVICE_ACCEPT;\n handler && handler(self, name);\n },\n [MESSAGE.EXT_INFO]: (self, payload) => {\n /*\n byte SSH_MSG_EXT_INFO\n uint32 nr-extensions\n repeat the following 2 fields \"nr-extensions\" times:\n string extension-name\n string extension-value (binary)\n */\n bufferParser.init(payload, 1);\n const numExts = bufferParser.readUInt32BE();\n let exts;\n if (numExts !== undefined) {\n exts = [];\n for (let i = 0; i < numExts; ++i) {\n const name = bufferParser.readString(true);\n const data = bufferParser.readString();\n if (data !== undefined) {\n switch (name) {\n case 'server-sig-algs': {\n const algs = data.latin1Slice(0, data.length).split(',');\n exts.push({ name, algs });\n continue;\n }\n default:\n continue;\n }\n }\n // Malformed\n exts = undefined;\n break;\n }\n }\n bufferParser.clear();\n\n if (exts === undefined)\n return doFatalError(self, 'Inbound: Malformed EXT_INFO packet');\n\n self._debug && self._debug('Inbound: Received EXT_INFO');\n\n const handler = self._handlers.EXT_INFO;\n handler && handler(self, exts);\n },\n\n // User auth protocol -- generic =============================================\n [MESSAGE.USERAUTH_REQUEST]: (self, payload) => {\n /*\n byte SSH_MSG_USERAUTH_REQUEST\n string user name in ISO-10646 UTF-8 encoding [RFC3629]\n string service name in US-ASCII\n string method name in US-ASCII\n .... method specific fields\n */\n bufferParser.init(payload, 1);\n const user = bufferParser.readString(true);\n const service = bufferParser.readString(true);\n const method = bufferParser.readString(true);\n let methodData;\n let methodDesc;\n switch (method) {\n case 'none':\n methodData = null;\n break;\n case 'password': {\n /*\n boolean <new password follows (old) plaintext password?>\n string plaintext password in ISO-10646 UTF-8 encoding [RFC3629]\n [string new password]\n */\n const isChange = bufferParser.readBool();\n if (isChange !== undefined) {\n methodData = bufferParser.readString(true);\n if (methodData !== undefined && isChange) {\n const newPassword = bufferParser.readString(true);\n if (newPassword !== undefined)\n methodData = { oldPassword: methodData, newPassword };\n else\n methodData = undefined;\n }\n }\n break;\n }\n case 'publickey': {\n /*\n boolean <signature follows public key blob?>\n string public key algorithm name\n string public key blob\n [string signature]\n */\n const hasSig = bufferParser.readBool();\n if (hasSig !== undefined) {\n const keyAlgo = bufferParser.readString(true);\n let realKeyAlgo = keyAlgo;\n const key = bufferParser.readString();\n\n let hashAlgo;\n switch (keyAlgo) {\n case 'rsa-sha2-256':\n realKeyAlgo = 'ssh-rsa';\n hashAlgo = 'sha256';\n break;\n case 'rsa-sha2-512':\n realKeyAlgo = 'ssh-rsa';\n hashAlgo = 'sha512';\n break;\n }\n\n if (hasSig) {\n const blobEnd = bufferParser.pos();\n let signature = bufferParser.readString();\n if (signature !== undefined) {\n if (signature.length > (4 + keyAlgo.length + 4)\n && signature.utf8Slice(4, 4 + keyAlgo.length) === keyAlgo) {\n // Skip algoLen + algo + sigLen\n signature = bufferSlice(signature, 4 + keyAlgo.length + 4);\n }\n\n signature = sigSSHToASN1(signature, realKeyAlgo);\n if (signature) {\n const sessionID = self._kex.sessionID;\n const blob = Buffer.allocUnsafe(4 + sessionID.length + blobEnd);\n writeUInt32BE(blob, sessionID.length, 0);\n blob.set(sessionID, 4);\n blob.set(\n new Uint8Array(payload.buffer, payload.byteOffset, blobEnd),\n 4 + sessionID.length\n );\n methodData = {\n keyAlgo: realKeyAlgo,\n key,\n signature,\n blob,\n hashAlgo,\n };\n }\n }\n } else {\n methodData = { keyAlgo: realKeyAlgo, key, hashAlgo };\n methodDesc = 'publickey -- check';\n }\n }\n break;\n }\n case 'hostbased': {\n /*\n string public key algorithm for host key\n string public host key and certificates for client host\n string client host name expressed as the FQDN in US-ASCII\n string user name on the client host in ISO-10646 UTF-8 encoding\n [RFC3629]\n string signature\n */\n const keyAlgo = bufferParser.readString(true);\n let realKeyAlgo = keyAlgo;\n const key = bufferParser.readString();\n const localHostname = bufferParser.readString(true);\n const localUsername = bufferParser.readString(true);\n\n let hashAlgo;\n switch (keyAlgo) {\n case 'rsa-sha2-256':\n realKeyAlgo = 'ssh-rsa';\n hashAlgo = 'sha256';\n break;\n case 'rsa-sha2-512':\n realKeyAlgo = 'ssh-rsa';\n hashAlgo = 'sha512';\n break;\n }\n\n const blobEnd = bufferParser.pos();\n let signature = bufferParser.readString();\n if (signature !== undefined) {\n if (signature.length > (4 + keyAlgo.length + 4)\n && signature.utf8Slice(4, 4 + keyAlgo.length) === keyAlgo) {\n // Skip algoLen + algo + sigLen\n signature = bufferSlice(signature, 4 + keyAlgo.length + 4);\n }\n\n signature = sigSSHToASN1(signature, realKeyAlgo);\n if (signature !== undefined) {\n const sessionID = self._kex.sessionID;\n const blob = Buffer.allocUnsafe(4 + sessionID.length + blobEnd);\n writeUInt32BE(blob, sessionID.length, 0);\n blob.set(sessionID, 4);\n blob.set(\n new Uint8Array(payload.buffer, payload.byteOffset, blobEnd),\n 4 + sessionID.length\n );\n methodData = {\n keyAlgo: realKeyAlgo,\n key,\n signature,\n blob,\n localHostname,\n localUsername,\n hashAlgo\n };\n }\n }\n break;\n }\n case 'keyboard-interactive':\n /*\n string language tag (as defined in [RFC-3066])\n string submethods (ISO-10646 UTF-8)\n */\n // Skip/ignore language field -- it's deprecated in RFC 4256\n bufferParser.skipString();\n\n methodData = bufferParser.readList();\n break;\n default:\n if (method !== undefined)\n methodData = bufferParser.readRaw();\n }\n bufferParser.clear();\n\n if (methodData === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed USERAUTH_REQUEST packet'\n );\n }\n\n if (methodDesc === undefined)\n methodDesc = method;\n\n self._authsQueue.push(method);\n\n self._debug\n && self._debug(`Inbound: Received USERAUTH_REQUEST (${methodDesc})`);\n\n const handler = self._handlers.USERAUTH_REQUEST;\n handler && handler(self, user, service, method, methodData);\n },\n [MESSAGE.USERAUTH_FAILURE]: (self, payload) => {\n // S->C\n /*\n byte SSH_MSG_USERAUTH_FAILURE\n name-list authentications that can continue\n boolean partial success\n */\n bufferParser.init(payload, 1);\n const authMethods = bufferParser.readList();\n const partialSuccess = bufferParser.readBool();\n bufferParser.clear();\n\n if (partialSuccess === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed USERAUTH_FAILURE packet'\n );\n }\n\n self._debug\n && self._debug(`Inbound: Received USERAUTH_FAILURE (${authMethods})`);\n\n self._authsQueue.shift();\n const handler = self._handlers.USERAUTH_FAILURE;\n handler && handler(self, authMethods, partialSuccess);\n },\n [MESSAGE.USERAUTH_SUCCESS]: (self, payload) => {\n // S->C\n /*\n byte SSH_MSG_USERAUTH_SUCCESS\n */\n self._debug && self._debug('Inbound: Received USERAUTH_SUCCESS');\n\n self._authsQueue.shift();\n const handler = self._handlers.USERAUTH_SUCCESS;\n handler && handler(self);\n },\n [MESSAGE.USERAUTH_BANNER]: (self, payload) => {\n // S->C\n /*\n byte SSH_MSG_USERAUTH_BANNER\n string message in ISO-10646 UTF-8 encoding [RFC3629]\n string language tag [RFC3066]\n */\n bufferParser.init(payload, 1);\n const msg = bufferParser.readString(true);\n const lang = bufferParser.readString();\n bufferParser.clear();\n\n if (lang === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed USERAUTH_BANNER packet'\n );\n }\n\n self._debug && self._debug('Inbound: Received USERAUTH_BANNER');\n\n const handler = self._handlers.USERAUTH_BANNER;\n handler && handler(self, msg);\n },\n\n // User auth protocol -- method-specific =====================================\n 60: (self, payload) => {\n if (!self._authsQueue.length) {\n self._debug\n && self._debug('Inbound: Received payload type 60 without auth');\n return;\n }\n\n switch (self._authsQueue[0]) {\n case 'password': {\n // S->C\n /*\n byte SSH_MSG_USERAUTH_PASSWD_CHANGEREQ\n string prompt in ISO-10646 UTF-8 encoding [RFC3629]\n string language tag [RFC3066]\n */\n bufferParser.init(payload, 1);\n const prompt = bufferParser.readString(true);\n const lang = bufferParser.readString();\n bufferParser.clear();\n\n if (lang === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed USERAUTH_PASSWD_CHANGEREQ packet'\n );\n }\n\n self._debug\n && self._debug('Inbound: Received USERAUTH_PASSWD_CHANGEREQ');\n\n const handler = self._handlers.USERAUTH_PASSWD_CHANGEREQ;\n handler && handler(self, prompt);\n break;\n }\n case 'publickey': {\n // S->C\n /*\n byte SSH_MSG_USERAUTH_PK_OK\n string public key algorithm name from the request\n string public key blob from the request\n */\n bufferParser.init(payload, 1);\n const keyAlgo = bufferParser.readString(true);\n const key = bufferParser.readString();\n bufferParser.clear();\n\n if (key === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed USERAUTH_PK_OK packet'\n );\n }\n\n self._debug && self._debug('Inbound: Received USERAUTH_PK_OK');\n\n self._authsQueue.shift();\n const handler = self._handlers.USERAUTH_PK_OK;\n handler && handler(self, keyAlgo, key);\n break;\n }\n case 'keyboard-interactive': {\n // S->C\n /*\n byte SSH_MSG_USERAUTH_INFO_REQUEST\n string name (ISO-10646 UTF-8)\n string instruction (ISO-10646 UTF-8)\n string language tag (as defined in [RFC-3066])\n int num-prompts\n string prompt[1] (ISO-10646 UTF-8)\n boolean echo[1]\n ...\n string prompt[num-prompts] (ISO-10646 UTF-8)\n boolean echo[num-prompts]\n */\n bufferParser.init(payload, 1);\n const name = bufferParser.readString(true);\n const instructions = bufferParser.readString(true);\n bufferParser.readString(); // skip lang\n const numPrompts = bufferParser.readUInt32BE();\n let prompts;\n if (numPrompts !== undefined) {\n prompts = new Array(numPrompts);\n let i;\n for (i = 0; i < numPrompts; ++i) {\n const prompt = bufferParser.readString(true);\n const echo = bufferParser.readBool();\n if (echo === undefined)\n break;\n prompts[i] = { prompt, echo };\n }\n if (i !== numPrompts)\n prompts = undefined;\n }\n bufferParser.clear();\n\n if (prompts === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed USERAUTH_INFO_REQUEST packet'\n );\n }\n\n self._debug && self._debug('Inbound: Received USERAUTH_INFO_REQUEST');\n\n const handler = self._handlers.USERAUTH_INFO_REQUEST;\n handler && handler(self, name, instructions, prompts);\n break;\n }\n default:\n self._debug\n && self._debug('Inbound: Received unexpected payload type 60');\n }\n },\n 61: (self, payload) => {\n if (!self._authsQueue.length) {\n self._debug\n && self._debug('Inbound: Received payload type 61 without auth');\n return;\n }\n /*\n byte SSH_MSG_USERAUTH_INFO_RESPONSE\n int num-responses\n string response[1] (ISO-10646 UTF-8)\n ...\n string response[num-responses] (ISO-10646 UTF-8)\n */\n if (self._authsQueue[0] !== 'keyboard-interactive') {\n return doFatalError(\n self,\n 'Inbound: Received unexpected payload type 61'\n );\n }\n bufferParser.init(payload, 1);\n const numResponses = bufferParser.readUInt32BE();\n let responses;\n if (numResponses !== undefined) {\n responses = new Array(numResponses);\n let i;\n for (i = 0; i < numResponses; ++i) {\n const response = bufferParser.readString(true);\n if (response === undefined)\n break;\n responses[i] = response;\n }\n if (i !== numResponses)\n responses = undefined;\n }\n bufferParser.clear();\n\n if (responses === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed USERAUTH_INFO_RESPONSE packet'\n );\n }\n\n self._debug && self._debug('Inbound: Received USERAUTH_INFO_RESPONSE');\n\n const handler = self._handlers.USERAUTH_INFO_RESPONSE;\n handler && handler(self, responses);\n },\n\n // Connection protocol -- generic ============================================\n [MESSAGE.GLOBAL_REQUEST]: (self, payload) => {\n /*\n byte SSH_MSG_GLOBAL_REQUEST\n string request name in US-ASCII only\n boolean want reply\n .... request-specific data follows\n */\n bufferParser.init(payload, 1);\n const name = bufferParser.readString(true);\n const wantReply = bufferParser.readBool();\n let data;\n if (wantReply !== undefined) {\n switch (name) {\n case 'tcpip-forward':\n case 'cancel-tcpip-forward': {\n /*\n string address to bind (e.g., \"0.0.0.0\")\n uint32 port number to bind\n */\n const bindAddr = bufferParser.readString(true);\n const bindPort = bufferParser.readUInt32BE();\n if (bindPort !== undefined)\n data = { bindAddr, bindPort };\n break;\n }\n case 'streamlocal-forward@openssh.com':\n case 'cancel-streamlocal-forward@openssh.com': {\n /*\n string socket path\n */\n const socketPath = bufferParser.readString(true);\n if (socketPath !== undefined)\n data = { socketPath };\n break;\n }\n case 'no-more-sessions@openssh.com':\n data = null;\n break;\n case 'hostkeys-00@openssh.com': {\n data = [];\n while (bufferParser.avail() > 0) {\n const keyRaw = bufferParser.readString();\n if (keyRaw === undefined) {\n data = undefined;\n break;\n }\n const key = parseKey(keyRaw);\n if (!(key instanceof Error))\n data.push(key);\n }\n break;\n }\n default:\n data = bufferParser.readRaw();\n }\n }\n bufferParser.clear();\n\n if (data === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed GLOBAL_REQUEST packet'\n );\n }\n\n self._debug && self._debug(`Inbound: GLOBAL_REQUEST (${name})`);\n\n const handler = self._handlers.GLOBAL_REQUEST;\n if (handler)\n handler(self, name, wantReply, data);\n else\n self.requestFailure(); // Auto reject\n },\n [MESSAGE.REQUEST_SUCCESS]: (self, payload) => {\n /*\n byte SSH_MSG_REQUEST_SUCCESS\n .... response specific data\n */\n const data = (payload.length > 1 ? bufferSlice(payload, 1) : null);\n\n self._debug && self._debug('Inbound: REQUEST_SUCCESS');\n\n const handler = self._handlers.REQUEST_SUCCESS;\n handler && handler(self, data);\n },\n [MESSAGE.REQUEST_FAILURE]: (self, payload) => {\n /*\n byte SSH_MSG_REQUEST_FAILURE\n */\n self._debug && self._debug('Inbound: Received REQUEST_FAILURE');\n\n const handler = self._handlers.REQUEST_FAILURE;\n handler && handler(self);\n },\n\n // Connection protocol -- channel-related ====================================\n [MESSAGE.CHANNEL_OPEN]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_OPEN\n string channel type in US-ASCII only\n uint32 sender channel\n uint32 initial window size\n uint32 maximum packet size\n .... channel type specific data follows\n */\n bufferParser.init(payload, 1);\n const type = bufferParser.readString(true);\n const sender = bufferParser.readUInt32BE();\n const window = bufferParser.readUInt32BE();\n const packetSize = bufferParser.readUInt32BE();\n let channelInfo;\n\n switch (type) {\n case 'forwarded-tcpip': // S->C\n case 'direct-tcpip': { // C->S\n /*\n string address that was connected / host to connect\n uint32 port that was connected / port to connect\n string originator IP address\n uint32 originator port\n */\n const destIP = bufferParser.readString(true);\n const destPort = bufferParser.readUInt32BE();\n const srcIP = bufferParser.readString(true);\n const srcPort = bufferParser.readUInt32BE();\n if (srcPort !== undefined) {\n channelInfo = {\n type,\n sender,\n window,\n packetSize,\n data: { destIP, destPort, srcIP, srcPort }\n };\n }\n break;\n }\n case 'forwarded-streamlocal@openssh.com': // S->C\n case 'direct-streamlocal@openssh.com': { // C->S\n /*\n string socket path\n string reserved for future use\n\n (direct-streamlocal@openssh.com additionally has:)\n uint32 reserved\n */\n const socketPath = bufferParser.readString(true);\n if (socketPath !== undefined) {\n channelInfo = {\n type,\n sender,\n window,\n packetSize,\n data: { socketPath }\n };\n }\n break;\n }\n case 'x11': { // S->C\n /*\n string originator address (e.g., \"192.168.7.38\")\n uint32 originator port\n */\n const srcIP = bufferParser.readString(true);\n const srcPort = bufferParser.readUInt32BE();\n if (srcPort !== undefined) {\n channelInfo = {\n type,\n sender,\n window,\n packetSize,\n data: { srcIP, srcPort }\n };\n }\n break;\n }\n default:\n // Includes:\n // 'session' (C->S)\n // 'auth-agent@openssh.com' (S->C)\n channelInfo = {\n type,\n sender,\n window,\n packetSize,\n data: {}\n };\n }\n bufferParser.clear();\n\n if (channelInfo === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_OPEN packet'\n );\n }\n\n self._debug && self._debug(`Inbound: CHANNEL_OPEN (s:${sender}, ${type})`);\n\n const handler = self._handlers.CHANNEL_OPEN;\n if (handler) {\n handler(self, channelInfo);\n } else {\n self.channelOpenFail(\n channelInfo.sender,\n CHANNEL_OPEN_FAILURE.ADMINISTRATIVELY_PROHIBITED,\n '',\n ''\n );\n }\n },\n [MESSAGE.CHANNEL_OPEN_CONFIRMATION]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_OPEN_CONFIRMATION\n uint32 recipient channel\n uint32 sender channel\n uint32 initial window size\n uint32 maximum packet size\n .... channel type specific data follows\n */\n // \"The 'recipient channel' is the channel number given in the\n // original open request, and 'sender channel' is the channel number\n // allocated by the other side.\"\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n const sender = bufferParser.readUInt32BE();\n const window = bufferParser.readUInt32BE();\n const packetSize = bufferParser.readUInt32BE();\n const data = (bufferParser.avail() ? bufferParser.readRaw() : undefined);\n bufferParser.clear();\n\n if (packetSize === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_OPEN_CONFIRMATION packet'\n );\n }\n\n self._debug && self._debug(\n `Inbound: CHANNEL_OPEN_CONFIRMATION (r:${recipient}, s:${sender})`\n );\n\n const handler = self._handlers.CHANNEL_OPEN_CONFIRMATION;\n if (handler)\n handler(self, { recipient, sender, window, packetSize, data });\n },\n [MESSAGE.CHANNEL_OPEN_FAILURE]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_OPEN_FAILURE\n uint32 recipient channel\n uint32 reason code\n string description in ISO-10646 UTF-8 encoding [RFC3629]\n string language tag [RFC3066]\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n const reason = bufferParser.readUInt32BE();\n const description = bufferParser.readString(true);\n const lang = bufferParser.readString();\n bufferParser.clear();\n\n if (lang === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_OPEN_FAILURE packet'\n );\n }\n\n self._debug\n && self._debug(`Inbound: CHANNEL_OPEN_FAILURE (r:${recipient})`);\n\n const handler = self._handlers.CHANNEL_OPEN_FAILURE;\n handler && handler(self, recipient, reason, description);\n },\n [MESSAGE.CHANNEL_WINDOW_ADJUST]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_WINDOW_ADJUST\n uint32 recipient channel\n uint32 bytes to add\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n const bytesToAdd = bufferParser.readUInt32BE();\n bufferParser.clear();\n\n if (bytesToAdd === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_WINDOW_ADJUST packet'\n );\n }\n\n self._debug && self._debug(\n `Inbound: CHANNEL_WINDOW_ADJUST (r:${recipient}, ${bytesToAdd})`\n );\n\n const handler = self._handlers.CHANNEL_WINDOW_ADJUST;\n handler && handler(self, recipient, bytesToAdd);\n },\n [MESSAGE.CHANNEL_DATA]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_DATA\n uint32 recipient channel\n string data\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n const data = bufferParser.readString();\n bufferParser.clear();\n\n if (data === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_DATA packet'\n );\n }\n\n self._debug\n && self._debug(`Inbound: CHANNEL_DATA (r:${recipient}, ${data.length})`);\n\n const handler = self._handlers.CHANNEL_DATA;\n handler && handler(self, recipient, data);\n },\n [MESSAGE.CHANNEL_EXTENDED_DATA]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_EXTENDED_DATA\n uint32 recipient channel\n uint32 data_type_code\n string data\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n const type = bufferParser.readUInt32BE();\n const data = bufferParser.readString();\n bufferParser.clear();\n\n if (data === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_EXTENDED_DATA packet'\n );\n }\n\n self._debug && self._debug(\n `Inbound: CHANNEL_EXTENDED_DATA (r:${recipient}, ${data.length})`\n );\n\n const handler = self._handlers.CHANNEL_EXTENDED_DATA;\n handler && handler(self, recipient, data, type);\n },\n [MESSAGE.CHANNEL_EOF]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_EOF\n uint32 recipient channel\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n bufferParser.clear();\n\n if (recipient === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_EOF packet'\n );\n }\n\n self._debug && self._debug(`Inbound: CHANNEL_EOF (r:${recipient})`);\n\n const handler = self._handlers.CHANNEL_EOF;\n handler && handler(self, recipient);\n },\n [MESSAGE.CHANNEL_CLOSE]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_CLOSE\n uint32 recipient channel\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n bufferParser.clear();\n\n if (recipient === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_CLOSE packet'\n );\n }\n\n self._debug && self._debug(`Inbound: CHANNEL_CLOSE (r:${recipient})`);\n\n const handler = self._handlers.CHANNEL_CLOSE;\n handler && handler(self, recipient);\n },\n [MESSAGE.CHANNEL_REQUEST]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_REQUEST\n uint32 recipient channel\n string request type in US-ASCII characters only\n boolean want reply\n .... type-specific data follows\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n const type = bufferParser.readString(true);\n const wantReply = bufferParser.readBool();\n let data;\n if (wantReply !== undefined) {\n switch (type) {\n case 'exit-status': // S->C\n /*\n uint32 exit_status\n */\n data = bufferParser.readUInt32BE();\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type}: ${data})`\n );\n break;\n case 'exit-signal': { // S->C\n /*\n string signal name (without the \"SIG\" prefix)\n boolean core dumped\n string error message in ISO-10646 UTF-8 encoding\n string language tag\n */\n let signal;\n let coreDumped;\n if (self._compatFlags & COMPAT.OLD_EXIT) {\n /*\n Instead of `signal name` and `core dumped`, we have just:\n uint32 signal number\n */\n const num = bufferParser.readUInt32BE();\n switch (num) {\n case 1:\n signal = 'HUP';\n break;\n case 2:\n signal = 'INT';\n break;\n case 3:\n signal = 'QUIT';\n break;\n case 6:\n signal = 'ABRT';\n break;\n case 9:\n signal = 'KILL';\n break;\n case 14:\n signal = 'ALRM';\n break;\n case 15:\n signal = 'TERM';\n break;\n default:\n if (num !== undefined) {\n // Unknown or OS-specific\n signal = `UNKNOWN (${num})`;\n }\n }\n coreDumped = false;\n } else {\n signal = bufferParser.readString(true);\n coreDumped = bufferParser.readBool();\n if (coreDumped === undefined)\n signal = undefined;\n }\n const errorMessage = bufferParser.readString(true);\n if (bufferParser.skipString() !== undefined)\n data = { signal, coreDumped, errorMessage };\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type}: ${signal})`\n );\n break;\n }\n case 'pty-req': { // C->S\n /*\n string TERM environment variable value (e.g., vt100)\n uint32 terminal width, characters (e.g., 80)\n uint32 terminal height, rows (e.g., 24)\n uint32 terminal width, pixels (e.g., 640)\n uint32 terminal height, pixels (e.g., 480)\n string encoded terminal modes\n */\n const term = bufferParser.readString(true);\n const cols = bufferParser.readUInt32BE();\n const rows = bufferParser.readUInt32BE();\n const width = bufferParser.readUInt32BE();\n const height = bufferParser.readUInt32BE();\n const modesBinary = bufferParser.readString();\n if (modesBinary !== undefined) {\n bufferParser.init(modesBinary, 1);\n let modes = {};\n while (bufferParser.avail()) {\n const opcode = bufferParser.readByte();\n if (opcode === TERMINAL_MODE.TTY_OP_END)\n break;\n const name = TERMINAL_MODE_BY_VALUE[opcode];\n const value = bufferParser.readUInt32BE();\n if (opcode === undefined\n || name === undefined\n || value === undefined) {\n modes = undefined;\n break;\n }\n modes[name] = value;\n }\n if (modes !== undefined)\n data = { term, cols, rows, width, height, modes };\n }\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type})`\n );\n break;\n }\n case 'window-change': { // C->S\n /*\n uint32 terminal width, columns\n uint32 terminal height, rows\n uint32 terminal width, pixels\n uint32 terminal height, pixels\n */\n const cols = bufferParser.readUInt32BE();\n const rows = bufferParser.readUInt32BE();\n const width = bufferParser.readUInt32BE();\n const height = bufferParser.readUInt32BE();\n if (height !== undefined)\n data = { cols, rows, width, height };\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type})`\n );\n break;\n }\n case 'x11-req': { // C->S\n /*\n boolean single connection\n string x11 authentication protocol\n string x11 authentication cookie\n uint32 x11 screen number\n */\n const single = bufferParser.readBool();\n const protocol = bufferParser.readString(true);\n const cookie = bufferParser.readString();\n const screen = bufferParser.readUInt32BE();\n if (screen !== undefined)\n data = { single, protocol, cookie, screen };\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type})`\n );\n break;\n }\n case 'env': { // C->S\n /*\n string variable name\n string variable value\n */\n const name = bufferParser.readString(true);\n const value = bufferParser.readString(true);\n if (value !== undefined)\n data = { name, value };\n if (self._debug) {\n self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type}: `\n + `${name}=${value})`\n );\n }\n break;\n }\n case 'shell': // C->S\n data = null; // No extra data\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type})`\n );\n break;\n case 'exec': // C->S\n /*\n string command\n */\n data = bufferParser.readString(true);\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type}: ${data})`\n );\n break;\n case 'subsystem': // C->S\n /*\n string subsystem name\n */\n data = bufferParser.readString(true);\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type}: ${data})`\n );\n break;\n case 'signal': // C->S\n /*\n string signal name (without the \"SIG\" prefix)\n */\n data = bufferParser.readString(true);\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type}: ${data})`\n );\n break;\n case 'xon-xoff': // C->S\n /*\n boolean client can do\n */\n data = bufferParser.readBool();\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type}: ${data})`\n );\n break;\n case 'auth-agent-req@openssh.com': // C-S\n data = null; // No extra data\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type})`\n );\n break;\n default:\n data = (bufferParser.avail() ? bufferParser.readRaw() : null);\n self._debug && self._debug(\n `Inbound: CHANNEL_REQUEST (r:${recipient}, ${type})`\n );\n }\n }\n bufferParser.clear();\n\n if (data === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_REQUEST packet'\n );\n }\n\n const handler = self._handlers.CHANNEL_REQUEST;\n handler && handler(self, recipient, type, wantReply, data);\n },\n [MESSAGE.CHANNEL_SUCCESS]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_SUCCESS\n uint32 recipient channel\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n bufferParser.clear();\n\n if (recipient === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_SUCCESS packet'\n );\n }\n\n self._debug && self._debug(`Inbound: CHANNEL_SUCCESS (r:${recipient})`);\n\n const handler = self._handlers.CHANNEL_SUCCESS;\n handler && handler(self, recipient);\n },\n [MESSAGE.CHANNEL_FAILURE]: (self, payload) => {\n /*\n byte SSH_MSG_CHANNEL_FAILURE\n uint32 recipient channel\n */\n bufferParser.init(payload, 1);\n const recipient = bufferParser.readUInt32BE();\n bufferParser.clear();\n\n if (recipient === undefined) {\n return doFatalError(\n self,\n 'Inbound: Malformed CHANNEL_FAILURE packet'\n );\n }\n\n self._debug && self._debug(`Inbound: CHANNEL_FAILURE (r:${recipient})`);\n\n const handler = self._handlers.CHANNEL_FAILURE;\n handler && handler(self, recipient);\n },\n};\n", "'use strict';\n\nconst MESSAGE_HANDLERS = new Array(256);\n[\n require('./kex.js').HANDLERS,\n require('./handlers.misc.js'),\n].forEach((handlers) => {\n // eslint-disable-next-line prefer-const\n for (let [type, handler] of Object.entries(handlers)) {\n type = +type;\n if (isFinite(type) && type >= 0 && type < MESSAGE_HANDLERS.length)\n MESSAGE_HANDLERS[type] = handler;\n }\n});\n\nmodule.exports = MESSAGE_HANDLERS;\n", "'use strict';\n\nconst {\n createDiffieHellman,\n createDiffieHellmanGroup,\n createECDH,\n createHash,\n createPublicKey,\n diffieHellman,\n generateKeyPairSync,\n randomFillSync,\n} = require('crypto');\n\nconst { Ber } = require('asn1');\n\nconst {\n COMPAT,\n curve25519Supported,\n DEFAULT_KEX,\n DEFAULT_SERVER_HOST_KEY,\n DEFAULT_CIPHER,\n DEFAULT_MAC,\n DEFAULT_COMPRESSION,\n DISCONNECT_REASON,\n MESSAGE,\n} = require('./constants.js');\nconst {\n CIPHER_INFO,\n createCipher,\n createDecipher,\n MAC_INFO,\n} = require('./crypto.js');\nconst { parseDERKey } = require('./keyParser.js');\nconst {\n bufferFill,\n bufferParser,\n convertSignature,\n doFatalError,\n FastBuffer,\n sigSSHToASN1,\n writeUInt32BE,\n} = require('./utils.js');\nconst {\n PacketReader,\n PacketWriter,\n ZlibPacketReader,\n ZlibPacketWriter,\n} = require('./zlib.js');\n\nlet MESSAGE_HANDLERS;\n\nconst GEX_MIN_BITS = 2048; // RFC 8270\nconst GEX_MAX_BITS = 8192; // RFC 8270\n\nconst EMPTY_BUFFER = Buffer.alloc(0);\n\n// Client/Server\nfunction kexinit(self) {\n /*\n byte SSH_MSG_KEXINIT\n byte[16] cookie (random bytes)\n name-list kex_algorithms\n name-list server_host_key_algorithms\n name-list encryption_algorithms_client_to_server\n name-list encryption_algorithms_server_to_client\n name-list mac_algorithms_client_to_server\n name-list mac_algorithms_server_to_client\n name-list compression_algorithms_client_to_server\n name-list compression_algorithms_server_to_client\n name-list languages_client_to_server\n name-list languages_server_to_client\n boolean first_kex_packet_follows\n uint32 0 (reserved for future extension)\n */\n\n let payload;\n if (self._compatFlags & COMPAT.BAD_DHGEX) {\n const entry = self._offer.lists.kex;\n let kex = entry.array;\n let found = false;\n for (let i = 0; i < kex.length; ++i) {\n if (kex[i].includes('group-exchange')) {\n if (!found) {\n found = true;\n // Copy array lazily\n kex = kex.slice();\n }\n kex.splice(i--, 1);\n }\n }\n if (found) {\n let len = 1 + 16 + self._offer.totalSize + 1 + 4;\n const newKexBuf = Buffer.from(kex.join(','));\n len -= (entry.buffer.length - newKexBuf.length);\n\n const all = self._offer.lists.all;\n const rest = new Uint8Array(\n all.buffer,\n all.byteOffset + 4 + entry.buffer.length,\n all.length - (4 + entry.buffer.length)\n );\n\n payload = Buffer.allocUnsafe(len);\n writeUInt32BE(payload, newKexBuf.length, 17);\n payload.set(newKexBuf, 17 + 4);\n payload.set(rest, 17 + 4 + newKexBuf.length);\n }\n }\n\n if (payload === undefined) {\n payload = Buffer.allocUnsafe(1 + 16 + self._offer.totalSize + 1 + 4);\n self._offer.copyAllTo(payload, 17);\n }\n\n self._debug && self._debug('Outbound: Sending KEXINIT');\n\n payload[0] = MESSAGE.KEXINIT;\n randomFillSync(payload, 1, 16);\n\n // Zero-fill first_kex_packet_follows and reserved bytes\n bufferFill(payload, 0, payload.length - 5);\n\n self._kexinit = payload;\n\n // Needed to correct the starting position in allocated \"packets\" when packets\n // will be buffered due to active key exchange\n self._packetRW.write.allocStart = 0;\n\n // TODO: only create single buffer and set _kexinit as slice of packet instead\n {\n const p = self._packetRW.write.allocStartKEX;\n const packet = self._packetRW.write.alloc(payload.length, true);\n packet.set(payload, p);\n self._cipher.encrypt(self._packetRW.write.finalize(packet, true));\n }\n}\n\nfunction handleKexInit(self, payload) {\n /*\n byte SSH_MSG_KEXINIT\n byte[16] cookie (random bytes)\n name-list kex_algorithms\n name-list server_host_key_algorithms\n name-list encryption_algorithms_client_to_server\n name-list encryption_algorithms_server_to_client\n name-list mac_algorithms_client_to_server\n name-list mac_algorithms_server_to_client\n name-list compression_algorithms_client_to_server\n name-list compression_algorithms_server_to_client\n name-list languages_client_to_server\n name-list languages_server_to_client\n boolean first_kex_packet_follows\n uint32 0 (reserved for future extension)\n */\n const init = {\n kex: undefined,\n serverHostKey: undefined,\n cs: {\n cipher: undefined,\n mac: undefined,\n compress: undefined,\n lang: undefined,\n },\n sc: {\n cipher: undefined,\n mac: undefined,\n compress: undefined,\n lang: undefined,\n },\n };\n\n bufferParser.init(payload, 17);\n\n if ((init.kex = bufferParser.readList()) === undefined\n || (init.serverHostKey = bufferParser.readList()) === undefined\n || (init.cs.cipher = bufferParser.readList()) === undefined\n || (init.sc.cipher = bufferParser.readList()) === undefined\n || (init.cs.mac = bufferParser.readList()) === undefined\n || (init.sc.mac = bufferParser.readList()) === undefined\n || (init.cs.compress = bufferParser.readList()) === undefined\n || (init.sc.compress = bufferParser.readList()) === undefined\n || (init.cs.lang = bufferParser.readList()) === undefined\n || (init.sc.lang = bufferParser.readList()) === undefined) {\n bufferParser.clear();\n return doFatalError(\n self,\n 'Received malformed KEXINIT',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n const pos = bufferParser.pos();\n const firstFollows = (pos < payload.length && payload[pos] === 1);\n bufferParser.clear();\n\n const local = self._offer;\n const remote = init;\n\n let localKex = local.lists.kex.array;\n if (self._compatFlags & COMPAT.BAD_DHGEX) {\n let found = false;\n for (let i = 0; i < localKex.length; ++i) {\n if (localKex[i].indexOf('group-exchange') !== -1) {\n if (!found) {\n found = true;\n // Copy array lazily\n localKex = localKex.slice();\n }\n localKex.splice(i--, 1);\n }\n }\n }\n\n let clientList;\n let serverList;\n let i;\n const debug = self._debug;\n\n debug && debug('Inbound: Handshake in progress');\n\n // Key exchange method =======================================================\n debug && debug(`Handshake: (local) KEX method: ${localKex}`);\n debug && debug(`Handshake: (remote) KEX method: ${remote.kex}`);\n let remoteExtInfoEnabled;\n if (self._server) {\n serverList = localKex;\n clientList = remote.kex;\n remoteExtInfoEnabled = (clientList.indexOf('ext-info-c') !== -1);\n } else {\n serverList = remote.kex;\n clientList = localKex;\n remoteExtInfoEnabled = (serverList.indexOf('ext-info-s') !== -1);\n }\n if (self._strictMode === undefined) {\n if (self._server) {\n self._strictMode =\n (clientList.indexOf('kex-strict-c-v00@openssh.com') !== -1);\n } else {\n self._strictMode =\n (serverList.indexOf('kex-strict-s-v00@openssh.com') !== -1);\n }\n // Note: We check for seqno of 1 instead of 0 since we increment before\n // calling the packet handler\n if (self._strictMode) {\n debug && debug('Handshake: strict KEX mode enabled');\n if (self._decipher.inSeqno !== 1) {\n if (debug)\n debug('Handshake: KEXINIT not first packet in strict KEX mode');\n return doFatalError(\n self,\n 'Handshake failed: KEXINIT not first packet in strict KEX mode',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n }\n }\n // Check for agreeable key exchange algorithm\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: no matching key exchange algorithm');\n return doFatalError(\n self,\n 'Handshake failed: no matching key exchange algorithm',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.kex = clientList[i];\n debug && debug(`Handshake: KEX algorithm: ${clientList[i]}`);\n if (firstFollows && (!remote.kex.length || clientList[i] !== remote.kex[0])) {\n // Ignore next inbound packet, it was a wrong first guess at KEX algorithm\n self._skipNextInboundPacket = true;\n }\n\n\n // Server host key format ====================================================\n const localSrvHostKey = local.lists.serverHostKey.array;\n debug && debug(`Handshake: (local) Host key format: ${localSrvHostKey}`);\n debug && debug(\n `Handshake: (remote) Host key format: ${remote.serverHostKey}`\n );\n if (self._server) {\n serverList = localSrvHostKey;\n clientList = remote.serverHostKey;\n } else {\n serverList = remote.serverHostKey;\n clientList = localSrvHostKey;\n }\n // Check for agreeable server host key format\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: No matching host key format');\n return doFatalError(\n self,\n 'Handshake failed: no matching host key format',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.serverHostKey = clientList[i];\n debug && debug(`Handshake: Host key format: ${clientList[i]}`);\n\n\n // Client->Server cipher =====================================================\n const localCSCipher = local.lists.cs.cipher.array;\n debug && debug(`Handshake: (local) C->S cipher: ${localCSCipher}`);\n debug && debug(`Handshake: (remote) C->S cipher: ${remote.cs.cipher}`);\n if (self._server) {\n serverList = localCSCipher;\n clientList = remote.cs.cipher;\n } else {\n serverList = remote.cs.cipher;\n clientList = localCSCipher;\n }\n // Check for agreeable client->server cipher\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: No matching C->S cipher');\n return doFatalError(\n self,\n 'Handshake failed: no matching C->S cipher',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.cs.cipher = clientList[i];\n debug && debug(`Handshake: C->S Cipher: ${clientList[i]}`);\n\n\n // Server->Client cipher =====================================================\n const localSCCipher = local.lists.sc.cipher.array;\n debug && debug(`Handshake: (local) S->C cipher: ${localSCCipher}`);\n debug && debug(`Handshake: (remote) S->C cipher: ${remote.sc.cipher}`);\n if (self._server) {\n serverList = localSCCipher;\n clientList = remote.sc.cipher;\n } else {\n serverList = remote.sc.cipher;\n clientList = localSCCipher;\n }\n // Check for agreeable server->client cipher\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: No matching S->C cipher');\n return doFatalError(\n self,\n 'Handshake failed: no matching S->C cipher',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.sc.cipher = clientList[i];\n debug && debug(`Handshake: S->C cipher: ${clientList[i]}`);\n\n\n // Client->Server MAC ========================================================\n const localCSMAC = local.lists.cs.mac.array;\n debug && debug(`Handshake: (local) C->S MAC: ${localCSMAC}`);\n debug && debug(`Handshake: (remote) C->S MAC: ${remote.cs.mac}`);\n if (CIPHER_INFO[init.cs.cipher].authLen > 0) {\n init.cs.mac = '';\n debug && debug('Handshake: C->S MAC: <implicit>');\n } else {\n if (self._server) {\n serverList = localCSMAC;\n clientList = remote.cs.mac;\n } else {\n serverList = remote.cs.mac;\n clientList = localCSMAC;\n }\n // Check for agreeable client->server hmac algorithm\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: No matching C->S MAC');\n return doFatalError(\n self,\n 'Handshake failed: no matching C->S MAC',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.cs.mac = clientList[i];\n debug && debug(`Handshake: C->S MAC: ${clientList[i]}`);\n }\n\n\n // Server->Client MAC ========================================================\n const localSCMAC = local.lists.sc.mac.array;\n debug && debug(`Handshake: (local) S->C MAC: ${localSCMAC}`);\n debug && debug(`Handshake: (remote) S->C MAC: ${remote.sc.mac}`);\n if (CIPHER_INFO[init.sc.cipher].authLen > 0) {\n init.sc.mac = '';\n debug && debug('Handshake: S->C MAC: <implicit>');\n } else {\n if (self._server) {\n serverList = localSCMAC;\n clientList = remote.sc.mac;\n } else {\n serverList = remote.sc.mac;\n clientList = localSCMAC;\n }\n // Check for agreeable server->client hmac algorithm\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: No matching S->C MAC');\n return doFatalError(\n self,\n 'Handshake failed: no matching S->C MAC',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.sc.mac = clientList[i];\n debug && debug(`Handshake: S->C MAC: ${clientList[i]}`);\n }\n\n\n // Client->Server compression ================================================\n const localCSCompress = local.lists.cs.compress.array;\n debug && debug(`Handshake: (local) C->S compression: ${localCSCompress}`);\n debug && debug(`Handshake: (remote) C->S compression: ${remote.cs.compress}`);\n if (self._server) {\n serverList = localCSCompress;\n clientList = remote.cs.compress;\n } else {\n serverList = remote.cs.compress;\n clientList = localCSCompress;\n }\n // Check for agreeable client->server compression algorithm\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: No matching C->S compression');\n return doFatalError(\n self,\n 'Handshake failed: no matching C->S compression',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.cs.compress = clientList[i];\n debug && debug(`Handshake: C->S compression: ${clientList[i]}`);\n\n\n // Server->Client compression ================================================\n const localSCCompress = local.lists.sc.compress.array;\n debug && debug(`Handshake: (local) S->C compression: ${localSCCompress}`);\n debug && debug(`Handshake: (remote) S->C compression: ${remote.sc.compress}`);\n if (self._server) {\n serverList = localSCCompress;\n clientList = remote.sc.compress;\n } else {\n serverList = remote.sc.compress;\n clientList = localSCCompress;\n }\n // Check for agreeable server->client compression algorithm\n for (i = 0;\n i < clientList.length && serverList.indexOf(clientList[i]) === -1;\n ++i);\n if (i === clientList.length) {\n // No suitable match found!\n debug && debug('Handshake: No matching S->C compression');\n return doFatalError(\n self,\n 'Handshake failed: no matching S->C compression',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n init.sc.compress = clientList[i];\n debug && debug(`Handshake: S->C compression: ${clientList[i]}`);\n\n init.cs.lang = '';\n init.sc.lang = '';\n\n // XXX: hack -- find a better way to do this\n if (self._kex) {\n if (!self._kexinit) {\n // We received a rekey request, but we haven't sent a KEXINIT in response\n // yet\n kexinit(self);\n }\n self._decipher._onPayload = onKEXPayload.bind(self, { firstPacket: false });\n }\n\n self._kex = createKeyExchange(init, self, payload);\n self._kex.remoteExtInfoEnabled = remoteExtInfoEnabled;\n self._kex.start();\n}\n\nconst createKeyExchange = (() => {\n function convertToMpint(buf) {\n let idx = 0;\n let length = buf.length;\n while (buf[idx] === 0x00) {\n ++idx;\n --length;\n }\n let newBuf;\n if (buf[idx] & 0x80) {\n newBuf = Buffer.allocUnsafe(1 + length);\n newBuf[0] = 0;\n buf.copy(newBuf, 1, idx);\n buf = newBuf;\n } else if (length !== buf.length) {\n newBuf = Buffer.allocUnsafe(length);\n buf.copy(newBuf, 0, idx);\n buf = newBuf;\n }\n return buf;\n }\n\n class KeyExchange {\n constructor(negotiated, protocol, remoteKexinit) {\n this._protocol = protocol;\n\n this.sessionID = (protocol._kex ? protocol._kex.sessionID : undefined);\n this.negotiated = negotiated;\n this.remoteExtInfoEnabled = false;\n this._step = 1;\n this._public = null;\n this._dh = null;\n this._sentNEWKEYS = false;\n this._receivedNEWKEYS = false;\n this._finished = false;\n this._hostVerified = false;\n\n // Data needed for initializing cipher/decipher/etc.\n this._kexinit = protocol._kexinit;\n this._remoteKexinit = remoteKexinit;\n this._identRaw = protocol._identRaw;\n this._remoteIdentRaw = protocol._remoteIdentRaw;\n this._hostKey = undefined;\n this._dhData = undefined;\n this._sig = undefined;\n }\n finish(scOnly) {\n if (this._finished)\n return false;\n this._finished = true;\n\n const isServer = this._protocol._server;\n const negotiated = this.negotiated;\n\n const pubKey = this.convertPublicKey(this._dhData);\n let secret = this.computeSecret(this._dhData);\n if (secret instanceof Error) {\n secret.message =\n `Error while computing DH secret (${this.type}): ${secret.message}`;\n secret.level = 'handshake';\n return doFatalError(\n this._protocol,\n secret,\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n const hash = createHash(this.hashName);\n // V_C\n hashString(hash, (isServer ? this._remoteIdentRaw : this._identRaw));\n // \"V_S\"\n hashString(hash, (isServer ? this._identRaw : this._remoteIdentRaw));\n // \"I_C\"\n hashString(hash, (isServer ? this._remoteKexinit : this._kexinit));\n // \"I_S\"\n hashString(hash, (isServer ? this._kexinit : this._remoteKexinit));\n // \"K_S\"\n const serverPublicHostKey = (isServer\n ? this._hostKey.getPublicSSH()\n : this._hostKey);\n hashString(hash, serverPublicHostKey);\n\n if (this.type === 'groupex') {\n // Group exchange-specific\n const params = this.getDHParams();\n const num = Buffer.allocUnsafe(4);\n // min (uint32)\n writeUInt32BE(num, this._minBits, 0);\n hash.update(num);\n // preferred (uint32)\n writeUInt32BE(num, this._prefBits, 0);\n hash.update(num);\n // max (uint32)\n writeUInt32BE(num, this._maxBits, 0);\n hash.update(num);\n // prime\n hashString(hash, params.prime);\n // generator\n hashString(hash, params.generator);\n }\n\n // method-specific data sent by client\n hashString(hash, (isServer ? pubKey : this.getPublicKey()));\n // method-specific data sent by server\n const serverPublicKey = (isServer ? this.getPublicKey() : pubKey);\n hashString(hash, serverPublicKey);\n // shared secret (\"K\")\n hashString(hash, secret);\n\n // \"H\"\n const exchangeHash = hash.digest();\n\n if (!isServer) {\n bufferParser.init(this._sig, 0);\n const sigType = bufferParser.readString(true);\n\n if (!sigType) {\n return doFatalError(\n this._protocol,\n 'Malformed packet while reading signature',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n if (sigType !== negotiated.serverHostKey) {\n return doFatalError(\n this._protocol,\n `Wrong signature type: ${sigType}, `\n + `expected: ${negotiated.serverHostKey}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n // \"s\"\n let sigValue = bufferParser.readString();\n\n bufferParser.clear();\n\n if (sigValue === undefined) {\n return doFatalError(\n this._protocol,\n 'Malformed packet while reading signature',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n if (!(sigValue = sigSSHToASN1(sigValue, sigType))) {\n return doFatalError(\n this._protocol,\n 'Malformed signature',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n let parsedHostKey;\n {\n bufferParser.init(this._hostKey, 0);\n const name = bufferParser.readString(true);\n const hostKey = this._hostKey.slice(bufferParser.pos());\n bufferParser.clear();\n parsedHostKey = parseDERKey(hostKey, name);\n if (parsedHostKey instanceof Error) {\n parsedHostKey.level = 'handshake';\n return doFatalError(\n this._protocol,\n parsedHostKey,\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n }\n\n let hashAlgo;\n // Check if we need to override the default hash algorithm\n switch (this.negotiated.serverHostKey) {\n case 'rsa-sha2-256': hashAlgo = 'sha256'; break;\n case 'rsa-sha2-512': hashAlgo = 'sha512'; break;\n }\n\n this._protocol._debug\n && this._protocol._debug('Verifying signature ...');\n\n const verified = parsedHostKey.verify(exchangeHash, sigValue, hashAlgo);\n if (verified !== true) {\n if (verified instanceof Error) {\n this._protocol._debug && this._protocol._debug(\n `Signature verification failed: ${verified.stack}`\n );\n } else {\n this._protocol._debug && this._protocol._debug(\n 'Signature verification failed'\n );\n }\n return doFatalError(\n this._protocol,\n 'Handshake failed: signature verification failed',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug('Verified signature');\n } else {\n // Server\n\n let hashAlgo;\n // Check if we need to override the default hash algorithm\n switch (this.negotiated.serverHostKey) {\n case 'rsa-sha2-256': hashAlgo = 'sha256'; break;\n case 'rsa-sha2-512': hashAlgo = 'sha512'; break;\n }\n\n this._protocol._debug && this._protocol._debug(\n 'Generating signature ...'\n );\n\n let signature = this._hostKey.sign(exchangeHash, hashAlgo);\n if (signature instanceof Error) {\n return doFatalError(\n this._protocol,\n 'Handshake failed: signature generation failed for '\n + `${this._hostKey.type} host key: ${signature.message}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n signature = convertSignature(signature, this._hostKey.type);\n if (signature === false) {\n return doFatalError(\n this._protocol,\n 'Handshake failed: signature conversion failed for '\n + `${this._hostKey.type} host key`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n // Send KEX reply\n /*\n byte SSH_MSG_KEXDH_REPLY\n / SSH_MSG_KEX_DH_GEX_REPLY\n / SSH_MSG_KEX_ECDH_REPLY\n string server public host key and certificates (K_S)\n string <method-specific data>\n string signature of H\n */\n const sigType = this.negotiated.serverHostKey;\n const sigTypeLen = Buffer.byteLength(sigType);\n const sigLen = 4 + sigTypeLen + 4 + signature.length;\n let p = this._protocol._packetRW.write.allocStartKEX;\n const packet = this._protocol._packetRW.write.alloc(\n 1\n + 4 + serverPublicHostKey.length\n + 4 + serverPublicKey.length\n + 4 + sigLen,\n true\n );\n\n packet[p] = MESSAGE.KEXDH_REPLY;\n\n writeUInt32BE(packet, serverPublicHostKey.length, ++p);\n packet.set(serverPublicHostKey, p += 4);\n\n writeUInt32BE(packet,\n serverPublicKey.length,\n p += serverPublicHostKey.length);\n packet.set(serverPublicKey, p += 4);\n\n writeUInt32BE(packet, sigLen, p += serverPublicKey.length);\n\n writeUInt32BE(packet, sigTypeLen, p += 4);\n packet.utf8Write(sigType, p += 4, sigTypeLen);\n\n writeUInt32BE(packet, signature.length, p += sigTypeLen);\n packet.set(signature, p += 4);\n\n if (this._protocol._debug) {\n let type;\n switch (this.type) {\n case 'group':\n type = 'KEXDH_REPLY';\n break;\n case 'groupex':\n type = 'KEXDH_GEX_REPLY';\n break;\n default:\n type = 'KEXECDH_REPLY';\n }\n this._protocol._debug(`Outbound: Sending ${type}`);\n }\n this._protocol._cipher.encrypt(\n this._protocol._packetRW.write.finalize(packet, true)\n );\n }\n\n if (isServer || !scOnly)\n trySendNEWKEYS(this);\n\n let hsCipherConfig;\n let hsWrite;\n const completeHandshake = (partial) => {\n if (hsCipherConfig) {\n trySendNEWKEYS(this);\n hsCipherConfig.outbound.seqno = this._protocol._cipher.outSeqno;\n this._protocol._cipher.free();\n this._protocol._cipher = createCipher(hsCipherConfig);\n this._protocol._packetRW.write = hsWrite;\n hsCipherConfig = undefined;\n hsWrite = undefined;\n this._protocol._onHandshakeComplete(negotiated);\n\n return false;\n }\n\n if (!this.sessionID)\n this.sessionID = exchangeHash;\n\n {\n const newSecret = Buffer.allocUnsafe(4 + secret.length);\n writeUInt32BE(newSecret, secret.length, 0);\n newSecret.set(secret, 4);\n secret = newSecret;\n }\n\n // Initialize new ciphers, deciphers, etc.\n\n const csCipherInfo = CIPHER_INFO[negotiated.cs.cipher];\n const scCipherInfo = CIPHER_INFO[negotiated.sc.cipher];\n\n const csIV = generateKEXVal(csCipherInfo.ivLen,\n this.hashName,\n secret,\n exchangeHash,\n this.sessionID,\n 'A');\n const scIV = generateKEXVal(scCipherInfo.ivLen,\n this.hashName,\n secret,\n exchangeHash,\n this.sessionID,\n 'B');\n const csKey = generateKEXVal(csCipherInfo.keyLen,\n this.hashName,\n secret,\n exchangeHash,\n this.sessionID,\n 'C');\n const scKey = generateKEXVal(scCipherInfo.keyLen,\n this.hashName,\n secret,\n exchangeHash,\n this.sessionID,\n 'D');\n let csMacInfo;\n let csMacKey;\n if (!csCipherInfo.authLen) {\n csMacInfo = MAC_INFO[negotiated.cs.mac];\n csMacKey = generateKEXVal(csMacInfo.len,\n this.hashName,\n secret,\n exchangeHash,\n this.sessionID,\n 'E');\n }\n let scMacInfo;\n let scMacKey;\n if (!scCipherInfo.authLen) {\n scMacInfo = MAC_INFO[negotiated.sc.mac];\n scMacKey = generateKEXVal(scMacInfo.len,\n this.hashName,\n secret,\n exchangeHash,\n this.sessionID,\n 'F');\n }\n\n const config = {\n inbound: {\n onPayload: this._protocol._onPayload,\n seqno: this._protocol._decipher.inSeqno,\n decipherInfo: (!isServer ? scCipherInfo : csCipherInfo),\n decipherIV: (!isServer ? scIV : csIV),\n decipherKey: (!isServer ? scKey : csKey),\n macInfo: (!isServer ? scMacInfo : csMacInfo),\n macKey: (!isServer ? scMacKey : csMacKey),\n },\n outbound: {\n onWrite: this._protocol._onWrite,\n seqno: this._protocol._cipher.outSeqno,\n cipherInfo: (isServer ? scCipherInfo : csCipherInfo),\n cipherIV: (isServer ? scIV : csIV),\n cipherKey: (isServer ? scKey : csKey),\n macInfo: (isServer ? scMacInfo : csMacInfo),\n macKey: (isServer ? scMacKey : csMacKey),\n },\n };\n this._protocol._decipher.free();\n hsCipherConfig = config;\n this._protocol._decipher = createDecipher(config);\n\n const rw = {\n read: undefined,\n write: undefined,\n };\n switch (negotiated.cs.compress) {\n case 'zlib': // starts immediately\n if (isServer)\n rw.read = new ZlibPacketReader();\n else\n rw.write = new ZlibPacketWriter(this._protocol);\n break;\n case 'zlib@openssh.com':\n // Starts after successful user authentication\n\n if (this._protocol._authenticated) {\n // If a rekey happens and this compression method is selected and\n // we already authenticated successfully, we need to start\n // immediately instead\n if (isServer)\n rw.read = new ZlibPacketReader();\n else\n rw.write = new ZlibPacketWriter(this._protocol);\n break;\n }\n // FALLTHROUGH\n default:\n // none -- never any compression/decompression\n\n if (isServer)\n rw.read = new PacketReader();\n else\n rw.write = new PacketWriter(this._protocol);\n }\n switch (negotiated.sc.compress) {\n case 'zlib': // starts immediately\n if (isServer)\n rw.write = new ZlibPacketWriter(this._protocol);\n else\n rw.read = new ZlibPacketReader();\n break;\n case 'zlib@openssh.com':\n // Starts after successful user authentication\n\n if (this._protocol._authenticated) {\n // If a rekey happens and this compression method is selected and\n // we already authenticated successfully, we need to start\n // immediately instead\n if (isServer)\n rw.write = new ZlibPacketWriter(this._protocol);\n else\n rw.read = new ZlibPacketReader();\n break;\n }\n // FALLTHROUGH\n default:\n // none -- never any compression/decompression\n\n if (isServer)\n rw.write = new PacketWriter(this._protocol);\n else\n rw.read = new PacketReader();\n }\n this._protocol._packetRW.read.cleanup();\n this._protocol._packetRW.write.cleanup();\n this._protocol._packetRW.read = rw.read;\n hsWrite = rw.write;\n\n // Cleanup/reset various state\n this._public = null;\n this._dh = null;\n this._kexinit = this._protocol._kexinit = undefined;\n this._remoteKexinit = undefined;\n this._identRaw = undefined;\n this._remoteIdentRaw = undefined;\n this._hostKey = undefined;\n this._dhData = undefined;\n this._sig = undefined;\n\n if (!partial)\n return completeHandshake();\n return false;\n };\n\n if (isServer || scOnly)\n this.finish = completeHandshake;\n\n if (!isServer)\n return completeHandshake(scOnly);\n }\n\n start() {\n if (!this._protocol._server) {\n if (this._protocol._debug) {\n let type;\n switch (this.type) {\n case 'group':\n type = 'KEXDH_INIT';\n break;\n default:\n type = 'KEXECDH_INIT';\n }\n this._protocol._debug(`Outbound: Sending ${type}`);\n }\n\n const pubKey = this.getPublicKey();\n\n let p = this._protocol._packetRW.write.allocStartKEX;\n const packet = this._protocol._packetRW.write.alloc(\n 1 + 4 + pubKey.length,\n true\n );\n packet[p] = MESSAGE.KEXDH_INIT;\n writeUInt32BE(packet, pubKey.length, ++p);\n packet.set(pubKey, p += 4);\n this._protocol._cipher.encrypt(\n this._protocol._packetRW.write.finalize(packet, true)\n );\n }\n }\n getPublicKey() {\n this.generateKeys();\n\n const key = this._public;\n\n if (key)\n return this.convertPublicKey(key);\n }\n convertPublicKey(key) {\n let newKey;\n let idx = 0;\n let len = key.length;\n while (key[idx] === 0x00) {\n ++idx;\n --len;\n }\n\n if (key[idx] & 0x80) {\n newKey = Buffer.allocUnsafe(1 + len);\n newKey[0] = 0;\n key.copy(newKey, 1, idx);\n return newKey;\n }\n\n if (len !== key.length) {\n newKey = Buffer.allocUnsafe(len);\n key.copy(newKey, 0, idx);\n key = newKey;\n }\n return key;\n }\n computeSecret(otherPublicKey) {\n this.generateKeys();\n\n try {\n return convertToMpint(this._dh.computeSecret(otherPublicKey));\n } catch (ex) {\n return ex;\n }\n }\n parse(payload) {\n const type = payload[0];\n switch (this._step) {\n case 1:\n if (this._protocol._server) {\n // Server\n if (type !== MESSAGE.KEXDH_INIT) {\n return doFatalError(\n this._protocol,\n `Received packet ${type} instead of ${MESSAGE.KEXDH_INIT}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug(\n 'Received DH Init'\n );\n /*\n byte SSH_MSG_KEXDH_INIT\n / SSH_MSG_KEX_ECDH_INIT\n string <method-specific data>\n */\n bufferParser.init(payload, 1);\n const dhData = bufferParser.readString();\n bufferParser.clear();\n if (dhData === undefined) {\n return doFatalError(\n this._protocol,\n 'Received malformed KEX*_INIT',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n // Client public key\n this._dhData = dhData;\n\n let hostKey =\n this._protocol._hostKeys[this.negotiated.serverHostKey];\n if (Array.isArray(hostKey))\n hostKey = hostKey[0];\n this._hostKey = hostKey;\n\n this.finish();\n } else {\n // Client\n if (type !== MESSAGE.KEXDH_REPLY) {\n return doFatalError(\n this._protocol,\n `Received packet ${type} instead of ${MESSAGE.KEXDH_REPLY}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug(\n 'Received DH Reply'\n );\n /*\n byte SSH_MSG_KEXDH_REPLY\n / SSH_MSG_KEX_DH_GEX_REPLY\n / SSH_MSG_KEX_ECDH_REPLY\n string server public host key and certificates (K_S)\n string <method-specific data>\n string signature of H\n */\n bufferParser.init(payload, 1);\n let hostPubKey;\n let dhData;\n let sig;\n if ((hostPubKey = bufferParser.readString()) === undefined\n || (dhData = bufferParser.readString()) === undefined\n || (sig = bufferParser.readString()) === undefined) {\n bufferParser.clear();\n return doFatalError(\n this._protocol,\n 'Received malformed KEX*_REPLY',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n bufferParser.clear();\n\n // Check that the host public key type matches what was negotiated\n // during KEXINIT swap\n bufferParser.init(hostPubKey, 0);\n const hostPubKeyType = bufferParser.readString(true);\n bufferParser.clear();\n if (hostPubKeyType === undefined) {\n return doFatalError(\n this._protocol,\n 'Received malformed host public key',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n if (hostPubKeyType !== this.negotiated.serverHostKey) {\n // Check if we need to make an exception\n switch (this.negotiated.serverHostKey) {\n case 'rsa-sha2-256':\n case 'rsa-sha2-512':\n if (hostPubKeyType === 'ssh-rsa')\n break;\n // FALLTHROUGH\n default:\n return doFatalError(\n this._protocol,\n 'Host key does not match negotiated type',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n }\n\n this._hostKey = hostPubKey;\n this._dhData = dhData;\n this._sig = sig;\n\n let checked = false;\n let ret;\n if (this._protocol._hostVerifier === undefined) {\n ret = true;\n this._protocol._debug && this._protocol._debug(\n 'Host accepted by default (no verification)'\n );\n } else {\n ret = this._protocol._hostVerifier(hostPubKey, (permitted) => {\n if (checked)\n return;\n checked = true;\n if (permitted === false) {\n this._protocol._debug && this._protocol._debug(\n 'Host denied (verification failed)'\n );\n return doFatalError(\n this._protocol,\n 'Host denied (verification failed)',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug(\n 'Host accepted (verified)'\n );\n this._hostVerified = true;\n if (this._receivedNEWKEYS)\n this.finish();\n else\n trySendNEWKEYS(this);\n });\n }\n if (ret === undefined) {\n // Async host verification\n ++this._step;\n return;\n }\n checked = true;\n if (ret === false) {\n this._protocol._debug && this._protocol._debug(\n 'Host denied (verification failed)'\n );\n return doFatalError(\n this._protocol,\n 'Host denied (verification failed)',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug(\n 'Host accepted (verified)'\n );\n this._hostVerified = true;\n trySendNEWKEYS(this);\n }\n ++this._step;\n break;\n case 2:\n if (type !== MESSAGE.NEWKEYS) {\n return doFatalError(\n this._protocol,\n `Received packet ${type} instead of ${MESSAGE.NEWKEYS}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug(\n 'Inbound: NEWKEYS'\n );\n this._receivedNEWKEYS = true;\n if (this._protocol._strictMode)\n this._protocol._decipher.inSeqno = 0;\n ++this._step;\n\n return this.finish(!this._protocol._server && !this._hostVerified);\n default:\n return doFatalError(\n this._protocol,\n `Received unexpected packet ${type} after NEWKEYS`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n }\n }\n\n class Curve25519Exchange extends KeyExchange {\n constructor(hashName, ...args) {\n super(...args);\n\n this.type = '25519';\n this.hashName = hashName;\n this._keys = null;\n }\n generateKeys() {\n if (!this._keys)\n this._keys = generateKeyPairSync('x25519');\n }\n getPublicKey() {\n this.generateKeys();\n\n const key = this._keys.publicKey.export({ type: 'spki', format: 'der' });\n return key.slice(-32); // HACK: avoids parsing DER/BER header\n }\n convertPublicKey(key) {\n let newKey;\n let idx = 0;\n let len = key.length;\n while (key[idx] === 0x00) {\n ++idx;\n --len;\n }\n\n if (key.length === 32)\n return key;\n\n if (len !== key.length) {\n newKey = Buffer.allocUnsafe(len);\n key.copy(newKey, 0, idx);\n key = newKey;\n }\n return key;\n }\n computeSecret(otherPublicKey) {\n this.generateKeys();\n\n try {\n const asnWriter = new Ber.Writer();\n asnWriter.startSequence();\n // algorithm\n asnWriter.startSequence();\n asnWriter.writeOID('1.3.101.110'); // id-X25519\n asnWriter.endSequence();\n\n // PublicKey\n asnWriter.startSequence(Ber.BitString);\n asnWriter.writeByte(0x00);\n // XXX: hack to write a raw buffer without a tag -- yuck\n asnWriter._ensure(otherPublicKey.length);\n otherPublicKey.copy(asnWriter._buf,\n asnWriter._offset,\n 0,\n otherPublicKey.length);\n asnWriter._offset += otherPublicKey.length;\n asnWriter.endSequence();\n asnWriter.endSequence();\n\n return convertToMpint(diffieHellman({\n privateKey: this._keys.privateKey,\n publicKey: createPublicKey({\n key: asnWriter.buffer,\n type: 'spki',\n format: 'der',\n }),\n }));\n } catch (ex) {\n return ex;\n }\n }\n }\n\n class ECDHExchange extends KeyExchange {\n constructor(curveName, hashName, ...args) {\n super(...args);\n\n this.type = 'ecdh';\n this.curveName = curveName;\n this.hashName = hashName;\n }\n generateKeys() {\n if (!this._dh) {\n this._dh = createECDH(this.curveName);\n this._public = this._dh.generateKeys();\n }\n }\n }\n\n class DHGroupExchange extends KeyExchange {\n constructor(hashName, ...args) {\n super(...args);\n\n this.type = 'groupex';\n this.hashName = hashName;\n this._prime = null;\n this._generator = null;\n this._minBits = GEX_MIN_BITS;\n this._prefBits = dhEstimate(this.negotiated);\n if (this._protocol._compatFlags & COMPAT.BUG_DHGEX_LARGE)\n this._prefBits = Math.min(this._prefBits, 4096);\n this._maxBits = GEX_MAX_BITS;\n }\n start() {\n if (this._protocol._server)\n return;\n this._protocol._debug && this._protocol._debug(\n 'Outbound: Sending KEXDH_GEX_REQUEST'\n );\n let p = this._protocol._packetRW.write.allocStartKEX;\n const packet = this._protocol._packetRW.write.alloc(\n 1 + 4 + 4 + 4,\n true\n );\n packet[p] = MESSAGE.KEXDH_GEX_REQUEST;\n writeUInt32BE(packet, this._minBits, ++p);\n writeUInt32BE(packet, this._prefBits, p += 4);\n writeUInt32BE(packet, this._maxBits, p += 4);\n this._protocol._cipher.encrypt(\n this._protocol._packetRW.write.finalize(packet, true)\n );\n }\n generateKeys() {\n if (!this._dh && this._prime && this._generator) {\n this._dh = createDiffieHellman(this._prime, this._generator);\n this._public = this._dh.generateKeys();\n }\n }\n setDHParams(prime, generator) {\n if (!Buffer.isBuffer(prime))\n throw new Error('Invalid prime value');\n if (!Buffer.isBuffer(generator))\n throw new Error('Invalid generator value');\n this._prime = prime;\n this._generator = generator;\n }\n getDHParams() {\n if (this._dh) {\n return {\n prime: convertToMpint(this._dh.getPrime()),\n generator: convertToMpint(this._dh.getGenerator()),\n };\n }\n }\n parse(payload) {\n const type = payload[0];\n switch (this._step) {\n case 1: {\n if (this._protocol._server) {\n if (type !== MESSAGE.KEXDH_GEX_REQUEST) {\n return doFatalError(\n this._protocol,\n `Received packet ${type} instead of `\n + MESSAGE.KEXDH_GEX_REQUEST,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n // TODO: allow user implementation to provide safe prime and\n // generator on demand to support group exchange on server side\n return doFatalError(\n this._protocol,\n 'Group exchange not implemented for server',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n if (type !== MESSAGE.KEXDH_GEX_GROUP) {\n return doFatalError(\n this._protocol,\n `Received packet ${type} instead of ${MESSAGE.KEXDH_GEX_GROUP}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n\n this._protocol._debug && this._protocol._debug(\n 'Received DH GEX Group'\n );\n\n /*\n byte SSH_MSG_KEX_DH_GEX_GROUP\n mpint p, safe prime\n mpint g, generator for subgroup in GF(p)\n */\n bufferParser.init(payload, 1);\n let prime;\n let gen;\n if ((prime = bufferParser.readString()) === undefined\n || (gen = bufferParser.readString()) === undefined) {\n bufferParser.clear();\n return doFatalError(\n this._protocol,\n 'Received malformed KEXDH_GEX_GROUP',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n bufferParser.clear();\n\n // TODO: validate prime\n this.setDHParams(prime, gen);\n this.generateKeys();\n const pubkey = this.getPublicKey();\n\n this._protocol._debug && this._protocol._debug(\n 'Outbound: Sending KEXDH_GEX_INIT'\n );\n\n let p = this._protocol._packetRW.write.allocStartKEX;\n const packet =\n this._protocol._packetRW.write.alloc(1 + 4 + pubkey.length, true);\n packet[p] = MESSAGE.KEXDH_GEX_INIT;\n writeUInt32BE(packet, pubkey.length, ++p);\n packet.set(pubkey, p += 4);\n this._protocol._cipher.encrypt(\n this._protocol._packetRW.write.finalize(packet, true)\n );\n\n ++this._step;\n break;\n }\n case 2:\n if (this._protocol._server) {\n if (type !== MESSAGE.KEXDH_GEX_INIT) {\n return doFatalError(\n this._protocol,\n `Received packet ${type} instead of ${MESSAGE.KEXDH_GEX_INIT}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug(\n 'Received DH GEX Init'\n );\n return doFatalError(\n this._protocol,\n 'Group exchange not implemented for server',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n } else if (type !== MESSAGE.KEXDH_GEX_REPLY) {\n return doFatalError(\n this._protocol,\n `Received packet ${type} instead of ${MESSAGE.KEXDH_GEX_REPLY}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n this._protocol._debug && this._protocol._debug(\n 'Received DH GEX Reply'\n );\n this._step = 1;\n payload[0] = MESSAGE.KEXDH_REPLY;\n this.parse = KeyExchange.prototype.parse;\n this.parse(payload);\n }\n }\n }\n\n class DHExchange extends KeyExchange {\n constructor(groupName, hashName, ...args) {\n super(...args);\n\n this.type = 'group';\n this.groupName = groupName;\n this.hashName = hashName;\n }\n start() {\n if (!this._protocol._server) {\n this._protocol._debug && this._protocol._debug(\n 'Outbound: Sending KEXDH_INIT'\n );\n const pubKey = this.getPublicKey();\n let p = this._protocol._packetRW.write.allocStartKEX;\n const packet =\n this._protocol._packetRW.write.alloc(1 + 4 + pubKey.length, true);\n packet[p] = MESSAGE.KEXDH_INIT;\n writeUInt32BE(packet, pubKey.length, ++p);\n packet.set(pubKey, p += 4);\n this._protocol._cipher.encrypt(\n this._protocol._packetRW.write.finalize(packet, true)\n );\n }\n }\n generateKeys() {\n if (!this._dh) {\n this._dh = createDiffieHellmanGroup(this.groupName);\n this._public = this._dh.generateKeys();\n }\n }\n getDHParams() {\n if (this._dh) {\n return {\n prime: convertToMpint(this._dh.getPrime()),\n generator: convertToMpint(this._dh.getGenerator()),\n };\n }\n }\n }\n\n return (negotiated, ...args) => {\n if (typeof negotiated !== 'object' || negotiated === null)\n throw new Error('Invalid negotiated argument');\n const kexType = negotiated.kex;\n if (typeof kexType === 'string') {\n args = [negotiated, ...args];\n switch (kexType) {\n case 'curve25519-sha256':\n case 'curve25519-sha256@libssh.org':\n if (!curve25519Supported)\n break;\n return new Curve25519Exchange('sha256', ...args);\n\n case 'ecdh-sha2-nistp256':\n return new ECDHExchange('prime256v1', 'sha256', ...args);\n case 'ecdh-sha2-nistp384':\n return new ECDHExchange('secp384r1', 'sha384', ...args);\n case 'ecdh-sha2-nistp521':\n return new ECDHExchange('secp521r1', 'sha512', ...args);\n\n case 'diffie-hellman-group1-sha1':\n return new DHExchange('modp2', 'sha1', ...args);\n case 'diffie-hellman-group14-sha1':\n return new DHExchange('modp14', 'sha1', ...args);\n case 'diffie-hellman-group14-sha256':\n return new DHExchange('modp14', 'sha256', ...args);\n case 'diffie-hellman-group15-sha512':\n return new DHExchange('modp15', 'sha512', ...args);\n case 'diffie-hellman-group16-sha512':\n return new DHExchange('modp16', 'sha512', ...args);\n case 'diffie-hellman-group17-sha512':\n return new DHExchange('modp17', 'sha512', ...args);\n case 'diffie-hellman-group18-sha512':\n return new DHExchange('modp18', 'sha512', ...args);\n\n case 'diffie-hellman-group-exchange-sha1':\n return new DHGroupExchange('sha1', ...args);\n case 'diffie-hellman-group-exchange-sha256':\n return new DHGroupExchange('sha256', ...args);\n }\n throw new Error(`Unsupported key exchange algorithm: ${kexType}`);\n }\n throw new Error(`Invalid key exchange type: ${kexType}`);\n };\n})();\n\nconst KexInit = (() => {\n const KEX_PROPERTY_NAMES = [\n 'kex',\n 'serverHostKey',\n ['cs', 'cipher' ],\n ['sc', 'cipher' ],\n ['cs', 'mac' ],\n ['sc', 'mac' ],\n ['cs', 'compress' ],\n ['sc', 'compress' ],\n ['cs', 'lang' ],\n ['sc', 'lang' ],\n ];\n return class KexInit {\n constructor(obj) {\n if (typeof obj !== 'object' || obj === null)\n throw new TypeError('Argument must be an object');\n\n const lists = {\n kex: undefined,\n serverHostKey: undefined,\n cs: {\n cipher: undefined,\n mac: undefined,\n compress: undefined,\n lang: undefined,\n },\n sc: {\n cipher: undefined,\n mac: undefined,\n compress: undefined,\n lang: undefined,\n },\n\n all: undefined,\n };\n let totalSize = 0;\n for (const prop of KEX_PROPERTY_NAMES) {\n let base;\n let val;\n let desc;\n let key;\n if (typeof prop === 'string') {\n base = lists;\n val = obj[prop];\n desc = key = prop;\n } else {\n const parent = prop[0];\n base = lists[parent];\n key = prop[1];\n val = obj[parent][key];\n desc = `${parent}.${key}`;\n }\n const entry = { array: undefined, buffer: undefined };\n if (Buffer.isBuffer(val)) {\n entry.array = ('' + val).split(',');\n entry.buffer = val;\n totalSize += 4 + val.length;\n } else {\n if (typeof val === 'string')\n val = val.split(',');\n if (Array.isArray(val)) {\n entry.array = val;\n entry.buffer = Buffer.from(val.join(','));\n } else {\n throw new TypeError(`Invalid \\`${desc}\\` type: ${typeof val}`);\n }\n totalSize += 4 + entry.buffer.length;\n }\n base[key] = entry;\n }\n\n const all = Buffer.allocUnsafe(totalSize);\n lists.all = all;\n\n let allPos = 0;\n for (const prop of KEX_PROPERTY_NAMES) {\n let data;\n if (typeof prop === 'string')\n data = lists[prop].buffer;\n else\n data = lists[prop[0]][prop[1]].buffer;\n allPos = writeUInt32BE(all, data.length, allPos);\n all.set(data, allPos);\n allPos += data.length;\n }\n\n this.totalSize = totalSize;\n this.lists = lists;\n }\n copyAllTo(buf, offset) {\n const src = this.lists.all;\n if (typeof offset !== 'number')\n throw new TypeError(`Invalid offset value: ${typeof offset}`);\n if (buf.length - offset < src.length)\n throw new Error('Insufficient space to copy list');\n buf.set(src, offset);\n return src.length;\n }\n };\n})();\n\nconst hashString = (() => {\n const LEN = Buffer.allocUnsafe(4);\n return (hash, buf) => {\n writeUInt32BE(LEN, buf.length, 0);\n hash.update(LEN);\n hash.update(buf);\n };\n})();\n\nfunction generateKEXVal(len, hashName, secret, exchangeHash, sessionID, char) {\n let ret;\n if (len) {\n let digest = createHash(hashName)\n .update(secret)\n .update(exchangeHash)\n .update(char)\n .update(sessionID)\n .digest();\n while (digest.length < len) {\n const chunk = createHash(hashName)\n .update(secret)\n .update(exchangeHash)\n .update(digest)\n .digest();\n const extended = Buffer.allocUnsafe(digest.length + chunk.length);\n extended.set(digest, 0);\n extended.set(chunk, digest.length);\n digest = extended;\n }\n if (digest.length === len)\n ret = digest;\n else\n ret = new FastBuffer(digest.buffer, digest.byteOffset, len);\n } else {\n ret = EMPTY_BUFFER;\n }\n return ret;\n}\n\nfunction onKEXPayload(state, payload) {\n // XXX: move this to the Decipher implementations?\n if (payload.length === 0) {\n this._debug && this._debug('Inbound: Skipping empty packet payload');\n return;\n }\n\n if (this._skipNextInboundPacket) {\n this._skipNextInboundPacket = false;\n return;\n }\n\n payload = this._packetRW.read.read(payload);\n\n const type = payload[0];\n\n if (!this._strictMode) {\n switch (type) {\n case MESSAGE.IGNORE:\n case MESSAGE.UNIMPLEMENTED:\n case MESSAGE.DEBUG:\n if (!MESSAGE_HANDLERS)\n MESSAGE_HANDLERS = require('./handlers.js');\n return MESSAGE_HANDLERS[type](this, payload);\n }\n }\n\n switch (type) {\n case MESSAGE.DISCONNECT:\n if (!MESSAGE_HANDLERS)\n MESSAGE_HANDLERS = require('./handlers.js');\n return MESSAGE_HANDLERS[type](this, payload);\n case MESSAGE.KEXINIT:\n if (!state.firstPacket) {\n return doFatalError(\n this,\n 'Received extra KEXINIT during handshake',\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n state.firstPacket = false;\n return handleKexInit(this, payload);\n default:\n // Ensure packet is either an algorithm negotiation or KEX\n // algorithm-specific packet\n if (type < 20 || type > 49) {\n return doFatalError(\n this,\n `Received unexpected packet type ${type}`,\n 'handshake',\n DISCONNECT_REASON.KEY_EXCHANGE_FAILED\n );\n }\n }\n\n return this._kex.parse(payload);\n}\n\nfunction dhEstimate(neg) {\n const csCipher = CIPHER_INFO[neg.cs.cipher];\n const scCipher = CIPHER_INFO[neg.sc.cipher];\n // XXX: if OpenSSH's `umac-*` MACs are ever supported, their key lengths will\n // also need to be considered when calculating `bits`\n const bits = Math.max(\n 0,\n (csCipher.sslName === 'des-ede3-cbc' ? 14 : csCipher.keyLen),\n csCipher.blockLen,\n csCipher.ivLen,\n (scCipher.sslName === 'des-ede3-cbc' ? 14 : scCipher.keyLen),\n scCipher.blockLen,\n scCipher.ivLen\n ) * 8;\n if (bits <= 112)\n return 2048;\n if (bits <= 128)\n return 3072;\n if (bits <= 192)\n return 7680;\n return 8192;\n}\n\nfunction trySendNEWKEYS(kex) {\n if (!kex._sentNEWKEYS) {\n kex._protocol._debug && kex._protocol._debug(\n 'Outbound: Sending NEWKEYS'\n );\n const p = kex._protocol._packetRW.write.allocStartKEX;\n const packet = kex._protocol._packetRW.write.alloc(1, true);\n packet[p] = MESSAGE.NEWKEYS;\n kex._protocol._cipher.encrypt(\n kex._protocol._packetRW.write.finalize(packet, true)\n );\n kex._sentNEWKEYS = true;\n if (kex._protocol._strictMode)\n kex._protocol._cipher.outSeqno = 0;\n }\n}\n\nmodule.exports = {\n KexInit,\n kexinit,\n onKEXPayload,\n DEFAULT_KEXINIT_CLIENT: new KexInit({\n kex: DEFAULT_KEX.concat(['ext-info-c', 'kex-strict-c-v00@openssh.com']),\n serverHostKey: DEFAULT_SERVER_HOST_KEY,\n cs: {\n cipher: DEFAULT_CIPHER,\n mac: DEFAULT_MAC,\n compress: DEFAULT_COMPRESSION,\n lang: [],\n },\n sc: {\n cipher: DEFAULT_CIPHER,\n mac: DEFAULT_MAC,\n compress: DEFAULT_COMPRESSION,\n lang: [],\n },\n }),\n DEFAULT_KEXINIT_SERVER: new KexInit({\n kex: DEFAULT_KEX.concat(['kex-strict-s-v00@openssh.com']),\n serverHostKey: DEFAULT_SERVER_HOST_KEY,\n cs: {\n cipher: DEFAULT_CIPHER,\n mac: DEFAULT_MAC,\n compress: DEFAULT_COMPRESSION,\n lang: [],\n },\n sc: {\n cipher: DEFAULT_CIPHER,\n mac: DEFAULT_MAC,\n compress: DEFAULT_COMPRESSION,\n lang: [],\n },\n }),\n HANDLERS: {\n [MESSAGE.KEXINIT]: handleKexInit,\n },\n};\n", "{\n \"name\": \"ssh2\",\n \"version\": \"1.17.0\",\n \"author\": \"Brian White <mscdex@mscdex.net>\",\n \"description\": \"SSH2 client and server modules written in pure JavaScript for node.js\",\n \"main\": \"./lib/index.js\",\n \"engines\": {\n \"node\": \">=10.16.0\"\n },\n \"dependencies\": {\n \"asn1\": \"^0.2.6\",\n \"bcrypt-pbkdf\": \"^1.0.2\"\n },\n \"devDependencies\": {\n \"@mscdex/eslint-config\": \"^1.1.0\",\n \"eslint\": \"^7.32.0\"\n },\n \"optionalDependencies\": {\n \"cpu-features\": \"~0.0.10\",\n \"nan\": \"^2.23.0\"\n },\n \"scripts\": {\n \"install\": \"node install.js\",\n \"rebuild\": \"node install.js\",\n \"test\": \"node test/test.js\",\n \"lint\": \"eslint --cache --report-unused-disable-directives --ext=.js .eslintrc.js examples lib test\",\n \"lint:fix\": \"npm run lint -- --fix\"\n },\n \"keywords\": [\n \"ssh\",\n \"ssh2\",\n \"sftp\",\n \"secure\",\n \"shell\",\n \"exec\",\n \"remote\",\n \"client\"\n ],\n \"licenses\": [\n {\n \"type\": \"MIT\",\n \"url\": \"http://github.com/mscdex/ssh2/raw/master/LICENSE\"\n }\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"http://github.com/mscdex/ssh2.git\"\n }\n}\n", "/*\n TODO:\n * Replace `buffer._pos` usage in keyParser.js and elsewhere\n * Utilize optional \"writev\" support when writing packets from\n cipher.encrypt()\n * Built-in support for automatic re-keying, on by default\n * Revisit receiving unexpected/unknown packets\n * Error (fatal or otherwise) or ignore or pass on to user (in some or all\n cases)?\n * Including server/client check for single directional packet types?\n * Check packets for validity or bail as early as possible?\n * Automatic re-key every 2**31 packets after the last key exchange (sent or\n received), as suggested by RFC4344. OpenSSH currently does this.\n * Automatic re-key every so many blocks depending on cipher. RFC4344:\n Because of a birthday property of block ciphers and some modes of\n operation, implementations must be careful not to encrypt too many\n blocks with the same encryption key.\n\n Let L be the block length (in bits) of an SSH encryption method's\n block cipher (e.g., 128 for AES). If L is at least 128, then, after\n rekeying, an SSH implementation SHOULD NOT encrypt more than 2**(L/4)\n blocks before rekeying again. If L is at least 128, then SSH\n implementations should also attempt to force a rekey before receiving\n more than 2**(L/4) blocks. If L is less than 128 (which is the case\n for older ciphers such as 3DES, Blowfish, CAST-128, and IDEA), then,\n although it may be too expensive to rekey every 2**(L/4) blocks, it\n is still advisable for SSH implementations to follow the original\n recommendation in [RFC4253]: rekey at least once for every gigabyte\n of transmitted data.\n\n Note that if L is less than or equal to 128, then the recommendation\n in this subsection supersedes the recommendation in Section 3.1. If\n an SSH implementation uses a block cipher with a larger block size\n (e.g., Rijndael with 256-bit blocks), then the recommendations in\n Section 3.1 may supersede the recommendations in this subsection\n (depending on the lengths of the packets).\n*/\n\n'use strict';\n\nconst { inspect } = require('util');\n\nconst { bindingAvailable, NullCipher, NullDecipher } = require('./crypto.js');\nconst {\n COMPAT_CHECKS,\n DISCONNECT_REASON,\n eddsaSupported,\n MESSAGE,\n SIGNALS,\n TERMINAL_MODE,\n} = require('./constants.js');\nconst {\n DEFAULT_KEXINIT_CLIENT,\n DEFAULT_KEXINIT_SERVER,\n KexInit,\n kexinit,\n onKEXPayload,\n} = require('./kex.js');\nconst {\n parseKey,\n} = require('./keyParser.js');\nconst MESSAGE_HANDLERS = require('./handlers.js');\nconst {\n bufferCopy,\n bufferFill,\n bufferSlice,\n convertSignature,\n sendPacket,\n writeUInt32BE,\n} = require('./utils.js');\nconst {\n PacketReader,\n PacketWriter,\n ZlibPacketReader,\n ZlibPacketWriter,\n} = require('./zlib.js');\n\nconst MODULE_VER = require('../../package.json').version;\n\nconst VALID_DISCONNECT_REASONS = new Map(\n Object.values(DISCONNECT_REASON).map((n) => [n, 1])\n);\nconst IDENT_RAW = Buffer.from(`SSH-2.0-ssh2js${MODULE_VER}`);\nconst IDENT = Buffer.from(`${IDENT_RAW}\\r\\n`);\nconst MAX_LINE_LEN = 8192;\nconst MAX_LINES = 1024;\nconst PING_PAYLOAD = Buffer.from([\n MESSAGE.GLOBAL_REQUEST,\n // \"keepalive@openssh.com\"\n 0, 0, 0, 21,\n 107, 101, 101, 112, 97, 108, 105, 118, 101, 64, 111, 112, 101, 110, 115,\n 115, 104, 46, 99, 111, 109,\n // Request a reply\n 1,\n]);\nconst NO_TERMINAL_MODES_BUFFER = Buffer.from([ TERMINAL_MODE.TTY_OP_END ]);\n\nfunction noop() {}\n\n/*\n Inbound:\n * kexinit payload (needed only until exchange hash is generated)\n * raw ident\n * rekey packet queue\n * expected packet (implemented as separate _parse() function?)\n Outbound:\n * kexinit payload (needed only until exchange hash is generated)\n * rekey packet queue\n * kex secret (needed only until NEWKEYS)\n * exchange hash (needed only until NEWKEYS)\n * session ID (set to exchange hash from initial handshake)\n*/\nclass Protocol {\n constructor(config) {\n const onWrite = config.onWrite;\n if (typeof onWrite !== 'function')\n throw new Error('Missing onWrite function');\n this._onWrite = (data) => { onWrite(data); };\n\n const onError = config.onError;\n if (typeof onError !== 'function')\n throw new Error('Missing onError function');\n this._onError = (err) => { onError(err); };\n\n const debug = config.debug;\n this._debug = (typeof debug === 'function'\n ? (msg) => { debug(msg); }\n : undefined);\n\n const onHeader = config.onHeader;\n this._onHeader = (typeof onHeader === 'function'\n ? (...args) => { onHeader(...args); }\n : noop);\n\n const onPacket = config.onPacket;\n this._onPacket = (typeof onPacket === 'function'\n ? () => { onPacket(); }\n : noop);\n\n let onHandshakeComplete = config.onHandshakeComplete;\n if (typeof onHandshakeComplete !== 'function')\n onHandshakeComplete = noop;\n let firstHandshake;\n this._onHandshakeComplete = (...args) => {\n this._debug && this._debug('Handshake completed');\n if (firstHandshake === undefined)\n firstHandshake = true;\n else\n firstHandshake = false;\n\n // Process packets queued during a rekey where necessary\n const oldQueue = this._queue;\n if (oldQueue) {\n this._queue = undefined;\n this._debug && this._debug(\n `Draining outbound queue (${oldQueue.length}) ...`\n );\n for (let i = 0; i < oldQueue.length; ++i) {\n const data = oldQueue[i];\n // data === payload only\n\n // XXX: hacky\n let finalized = this._packetRW.write.finalize(data);\n if (finalized === data) {\n const packet = this._cipher.allocPacket(data.length);\n packet.set(data, 5);\n finalized = packet;\n }\n\n sendPacket(this, finalized);\n }\n this._debug && this._debug('... finished draining outbound queue');\n }\n\n if (firstHandshake && this._server && this._kex.remoteExtInfoEnabled)\n sendExtInfo(this);\n\n onHandshakeComplete(...args);\n };\n this._queue = undefined;\n\n const messageHandlers = config.messageHandlers;\n if (typeof messageHandlers === 'object' && messageHandlers !== null)\n this._handlers = messageHandlers;\n else\n this._handlers = {};\n\n this._onPayload = onPayload.bind(this);\n\n this._server = !!config.server;\n this._banner = undefined;\n let greeting;\n if (this._server) {\n if (typeof config.hostKeys !== 'object' || config.hostKeys === null)\n throw new Error('Missing server host key(s)');\n this._hostKeys = config.hostKeys;\n\n // Greeting displayed before the ssh identification string is sent, this\n // is usually ignored by most clients\n if (typeof config.greeting === 'string' && config.greeting.length) {\n greeting = (config.greeting.slice(-2) === '\\r\\n'\n ? config.greeting\n : `${config.greeting}\\r\\n`);\n }\n\n // Banner shown after the handshake completes, but before user\n // authentication begins\n if (typeof config.banner === 'string' && config.banner.length) {\n this._banner = (config.banner.slice(-2) === '\\r\\n'\n ? config.banner\n : `${config.banner}\\r\\n`);\n }\n } else {\n this._hostKeys = undefined;\n }\n\n let offer = config.offer;\n if (typeof offer !== 'object' || offer === null) {\n offer = (this._server ? DEFAULT_KEXINIT_SERVER : DEFAULT_KEXINIT_CLIENT);\n } else if (offer.constructor !== KexInit) {\n if (this._server) {\n offer.kex = offer.kex.concat(['kex-strict-s-v00@openssh.com']);\n } else {\n offer.kex = offer.kex.concat([\n 'ext-info-c',\n 'kex-strict-c-v00@openssh.com',\n ]);\n }\n offer = new KexInit(offer);\n }\n this._kex = undefined;\n this._strictMode = undefined;\n this._kexinit = undefined;\n this._offer = offer;\n this._cipher = new NullCipher(0, this._onWrite);\n this._decipher = undefined;\n this._skipNextInboundPacket = false;\n this._packetRW = {\n read: new PacketReader(),\n write: new PacketWriter(this),\n };\n this._hostVerifier = (!this._server\n && typeof config.hostVerifier === 'function'\n ? config.hostVerifier\n : undefined);\n\n this._parse = parseHeader;\n this._buffer = undefined;\n this._authsQueue = [];\n this._authenticated = false;\n this._remoteIdentRaw = undefined;\n let sentIdent;\n if (typeof config.ident === 'string') {\n this._identRaw = Buffer.from(`SSH-2.0-${config.ident}`);\n\n sentIdent = Buffer.allocUnsafe(this._identRaw.length + 2);\n sentIdent.set(this._identRaw, 0);\n sentIdent[sentIdent.length - 2] = 13; // '\\r'\n sentIdent[sentIdent.length - 1] = 10; // '\\n'\n } else if (Buffer.isBuffer(config.ident)) {\n const fullIdent = Buffer.allocUnsafe(8 + config.ident.length);\n fullIdent.latin1Write('SSH-2.0-', 0, 8);\n fullIdent.set(config.ident, 8);\n this._identRaw = fullIdent;\n\n sentIdent = Buffer.allocUnsafe(fullIdent.length + 2);\n sentIdent.set(fullIdent, 0);\n sentIdent[sentIdent.length - 2] = 13; // '\\r'\n sentIdent[sentIdent.length - 1] = 10; // '\\n'\n } else {\n this._identRaw = IDENT_RAW;\n sentIdent = IDENT;\n }\n this._compatFlags = 0;\n\n if (this._debug) {\n if (bindingAvailable)\n this._debug('Custom crypto binding available');\n else\n this._debug('Custom crypto binding not available');\n }\n\n this._debug && this._debug(\n `Local ident: ${inspect(this._identRaw.toString())}`\n );\n this.start = () => {\n this.start = undefined;\n if (greeting)\n this._onWrite(greeting);\n this._onWrite(sentIdent);\n };\n }\n _destruct(reason) {\n this._packetRW.read.cleanup();\n this._packetRW.write.cleanup();\n this._cipher && this._cipher.free();\n this._decipher && this._decipher.free();\n if (typeof reason !== 'string' || reason.length === 0)\n reason = 'fatal error';\n this.parse = () => {\n throw new Error(`Instance unusable after ${reason}`);\n };\n this._onWrite = () => {\n throw new Error(`Instance unusable after ${reason}`);\n };\n this._destruct = undefined;\n }\n cleanup() {\n this._destruct && this._destruct();\n }\n parse(chunk, i, len) {\n while (i < len)\n i = this._parse(chunk, i, len);\n }\n\n // Protocol message API\n\n // ===========================================================================\n // Common/Shared =============================================================\n // ===========================================================================\n\n // Global\n // ------\n disconnect(reason) {\n const pktLen = 1 + 4 + 4 + 4;\n // We don't use _packetRW.write.* here because we need to make sure that\n // we always get a full packet allocated because this message can be sent\n // at any time -- even during a key exchange\n let p = this._packetRW.write.allocStartKEX;\n const packet = this._packetRW.write.alloc(pktLen, true);\n const end = p + pktLen;\n\n if (!VALID_DISCONNECT_REASONS.has(reason))\n reason = DISCONNECT_REASON.PROTOCOL_ERROR;\n\n packet[p] = MESSAGE.DISCONNECT;\n writeUInt32BE(packet, reason, ++p);\n packet.fill(0, p += 4, end);\n\n this._debug && this._debug(`Outbound: Sending DISCONNECT (${reason})`);\n sendPacket(this, this._packetRW.write.finalize(packet, true), true);\n }\n ping() {\n const p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(PING_PAYLOAD.length);\n\n packet.set(PING_PAYLOAD, p);\n\n this._debug && this._debug(\n 'Outbound: Sending ping (GLOBAL_REQUEST: keepalive@openssh.com)'\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n rekey() {\n if (this._kexinit === undefined) {\n this._debug && this._debug('Outbound: Initiated explicit rekey');\n this._queue = [];\n kexinit(this);\n } else {\n this._debug && this._debug('Outbound: Ignoring rekey during handshake');\n }\n }\n\n // 'ssh-connection' service-specific\n // ---------------------------------\n requestSuccess(data) {\n let p = this._packetRW.write.allocStart;\n let packet;\n if (Buffer.isBuffer(data)) {\n packet = this._packetRW.write.alloc(1 + data.length);\n\n packet[p] = MESSAGE.REQUEST_SUCCESS;\n\n packet.set(data, ++p);\n } else {\n packet = this._packetRW.write.alloc(1);\n\n packet[p] = MESSAGE.REQUEST_SUCCESS;\n }\n\n this._debug && this._debug('Outbound: Sending REQUEST_SUCCESS');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n requestFailure() {\n const p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1);\n\n packet[p] = MESSAGE.REQUEST_FAILURE;\n\n this._debug && this._debug('Outbound: Sending REQUEST_FAILURE');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelSuccess(chan) {\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4);\n\n packet[p] = MESSAGE.CHANNEL_SUCCESS;\n\n writeUInt32BE(packet, chan, ++p);\n\n this._debug && this._debug(`Outbound: Sending CHANNEL_SUCCESS (r:${chan})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelFailure(chan) {\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4);\n\n packet[p] = MESSAGE.CHANNEL_FAILURE;\n\n writeUInt32BE(packet, chan, ++p);\n\n this._debug && this._debug(`Outbound: Sending CHANNEL_FAILURE (r:${chan})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelEOF(chan) {\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4);\n\n packet[p] = MESSAGE.CHANNEL_EOF;\n\n writeUInt32BE(packet, chan, ++p);\n\n this._debug && this._debug(`Outbound: Sending CHANNEL_EOF (r:${chan})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelClose(chan) {\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4);\n\n packet[p] = MESSAGE.CHANNEL_CLOSE;\n\n writeUInt32BE(packet, chan, ++p);\n\n this._debug && this._debug(`Outbound: Sending CHANNEL_CLOSE (r:${chan})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelWindowAdjust(chan, amount) {\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4);\n\n packet[p] = MESSAGE.CHANNEL_WINDOW_ADJUST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, amount, p += 4);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_WINDOW_ADJUST (r:${chan}, ${amount})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelData(chan, data) {\n const isBuffer = Buffer.isBuffer(data);\n const dataLen = (isBuffer ? data.length : Buffer.byteLength(data));\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + dataLen);\n\n packet[p] = MESSAGE.CHANNEL_DATA;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, dataLen, p += 4);\n\n if (isBuffer)\n packet.set(data, p += 4);\n else\n packet.utf8Write(data, p += 4, dataLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_DATA (r:${chan}, ${dataLen})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelExtData(chan, data, type) {\n const isBuffer = Buffer.isBuffer(data);\n const dataLen = (isBuffer ? data.length : Buffer.byteLength(data));\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 4 + dataLen);\n\n packet[p] = MESSAGE.CHANNEL_EXTENDED_DATA;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, type, p += 4);\n\n writeUInt32BE(packet, dataLen, p += 4);\n\n if (isBuffer)\n packet.set(data, p += 4);\n else\n packet.utf8Write(data, p += 4, dataLen);\n\n this._debug\n && this._debug(`Outbound: Sending CHANNEL_EXTENDED_DATA (r:${chan})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelOpenConfirm(remote, local, initWindow, maxPacket) {\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 4 + 4);\n\n packet[p] = MESSAGE.CHANNEL_OPEN_CONFIRMATION;\n\n writeUInt32BE(packet, remote, ++p);\n\n writeUInt32BE(packet, local, p += 4);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_OPEN_CONFIRMATION (r:${remote}, l:${local})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n channelOpenFail(remote, reason, desc) {\n if (typeof desc !== 'string')\n desc = '';\n\n const descLen = Buffer.byteLength(desc);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 4 + descLen + 4);\n\n packet[p] = MESSAGE.CHANNEL_OPEN_FAILURE;\n\n writeUInt32BE(packet, remote, ++p);\n\n writeUInt32BE(packet, reason, p += 4);\n\n writeUInt32BE(packet, descLen, p += 4);\n\n p += 4;\n if (descLen) {\n packet.utf8Write(desc, p, descLen);\n p += descLen;\n }\n\n writeUInt32BE(packet, 0, p); // Empty language tag\n\n this._debug\n && this._debug(`Outbound: Sending CHANNEL_OPEN_FAILURE (r:${remote})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n\n // ===========================================================================\n // Client-specific ===========================================================\n // ===========================================================================\n\n // Global\n // ------\n service(name) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const nameLen = Buffer.byteLength(name);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + nameLen);\n\n packet[p] = MESSAGE.SERVICE_REQUEST;\n\n writeUInt32BE(packet, nameLen, ++p);\n packet.utf8Write(name, p += 4, nameLen);\n\n this._debug && this._debug(`Outbound: Sending SERVICE_REQUEST (${name})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n\n // 'ssh-userauth' service-specific\n // -------------------------------\n authPassword(username, password, newPassword) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const userLen = Buffer.byteLength(username);\n const passLen = Buffer.byteLength(password);\n const newPassLen = (newPassword ? Buffer.byteLength(newPassword) : 0);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + userLen + 4 + 14 + 4 + 8 + 1 + 4 + passLen\n + (newPassword ? 4 + newPassLen : 0)\n );\n\n packet[p] = MESSAGE.USERAUTH_REQUEST;\n\n writeUInt32BE(packet, userLen, ++p);\n packet.utf8Write(username, p += 4, userLen);\n\n writeUInt32BE(packet, 14, p += userLen);\n packet.utf8Write('ssh-connection', p += 4, 14);\n\n writeUInt32BE(packet, 8, p += 14);\n packet.utf8Write('password', p += 4, 8);\n\n packet[p += 8] = (newPassword ? 1 : 0);\n\n writeUInt32BE(packet, passLen, ++p);\n if (Buffer.isBuffer(password))\n bufferCopy(password, packet, 0, passLen, p += 4);\n else\n packet.utf8Write(password, p += 4, passLen);\n\n if (newPassword) {\n writeUInt32BE(packet, newPassLen, p += passLen);\n if (Buffer.isBuffer(newPassword))\n bufferCopy(newPassword, packet, 0, newPassLen, p += 4);\n else\n packet.utf8Write(newPassword, p += 4, newPassLen);\n this._debug && this._debug(\n 'Outbound: Sending USERAUTH_REQUEST (changed password)'\n );\n } else {\n this._debug && this._debug(\n 'Outbound: Sending USERAUTH_REQUEST (password)'\n );\n }\n\n this._authsQueue.push('password');\n\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n authPK(username, pubKey, keyAlgo, cbSign) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n pubKey = parseKey(pubKey);\n if (pubKey instanceof Error)\n throw new Error('Invalid key');\n\n const keyType = pubKey.type;\n pubKey = pubKey.getPublicSSH();\n\n if (typeof keyAlgo === 'function') {\n cbSign = keyAlgo;\n keyAlgo = undefined;\n }\n if (!keyAlgo)\n keyAlgo = keyType;\n\n const userLen = Buffer.byteLength(username);\n const algoLen = Buffer.byteLength(keyAlgo);\n const pubKeyLen = pubKey.length;\n const sessionID = this._kex.sessionID;\n const sesLen = sessionID.length;\n const payloadLen =\n (cbSign ? 4 + sesLen : 0)\n + 1 + 4 + userLen + 4 + 14 + 4 + 9 + 1 + 4 + algoLen + 4 + pubKeyLen;\n let packet;\n let p;\n if (cbSign) {\n packet = Buffer.allocUnsafe(payloadLen);\n p = 0;\n writeUInt32BE(packet, sesLen, p);\n packet.set(sessionID, p += 4);\n p += sesLen;\n } else {\n packet = this._packetRW.write.alloc(payloadLen);\n p = this._packetRW.write.allocStart;\n }\n\n packet[p] = MESSAGE.USERAUTH_REQUEST;\n\n writeUInt32BE(packet, userLen, ++p);\n packet.utf8Write(username, p += 4, userLen);\n\n writeUInt32BE(packet, 14, p += userLen);\n packet.utf8Write('ssh-connection', p += 4, 14);\n\n writeUInt32BE(packet, 9, p += 14);\n packet.utf8Write('publickey', p += 4, 9);\n\n packet[p += 9] = (cbSign ? 1 : 0);\n\n writeUInt32BE(packet, algoLen, ++p);\n packet.utf8Write(keyAlgo, p += 4, algoLen);\n\n writeUInt32BE(packet, pubKeyLen, p += algoLen);\n packet.set(pubKey, p += 4);\n\n if (!cbSign) {\n this._authsQueue.push('publickey');\n\n this._debug && this._debug(\n 'Outbound: Sending USERAUTH_REQUEST (publickey -- check)'\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n return;\n }\n\n cbSign(packet, (signature) => {\n signature = convertSignature(signature, keyType);\n if (signature === false)\n throw new Error('Error while converting handshake signature');\n\n const sigLen = signature.length;\n p = this._packetRW.write.allocStart;\n packet = this._packetRW.write.alloc(\n 1 + 4 + userLen + 4 + 14 + 4 + 9 + 1 + 4 + algoLen + 4 + pubKeyLen + 4\n + 4 + algoLen + 4 + sigLen\n );\n\n // TODO: simply copy from original \"packet\" to new `packet` to avoid\n // having to write each individual field a second time?\n packet[p] = MESSAGE.USERAUTH_REQUEST;\n\n writeUInt32BE(packet, userLen, ++p);\n packet.utf8Write(username, p += 4, userLen);\n\n writeUInt32BE(packet, 14, p += userLen);\n packet.utf8Write('ssh-connection', p += 4, 14);\n\n writeUInt32BE(packet, 9, p += 14);\n packet.utf8Write('publickey', p += 4, 9);\n\n packet[p += 9] = 1;\n\n writeUInt32BE(packet, algoLen, ++p);\n packet.utf8Write(keyAlgo, p += 4, algoLen);\n\n writeUInt32BE(packet, pubKeyLen, p += algoLen);\n packet.set(pubKey, p += 4);\n\n writeUInt32BE(packet, 4 + algoLen + 4 + sigLen, p += pubKeyLen);\n\n writeUInt32BE(packet, algoLen, p += 4);\n packet.utf8Write(keyAlgo, p += 4, algoLen);\n\n writeUInt32BE(packet, sigLen, p += algoLen);\n packet.set(signature, p += 4);\n\n // Servers shouldn't send packet type 60 in response to signed publickey\n // attempts, but if they do, interpret as type 60.\n this._authsQueue.push('publickey');\n\n this._debug && this._debug(\n 'Outbound: Sending USERAUTH_REQUEST (publickey)'\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n });\n }\n authHostbased(username, pubKey, hostname, userlocal, keyAlgo, cbSign) {\n // TODO: Make DRY by sharing similar code with authPK()\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n pubKey = parseKey(pubKey);\n if (pubKey instanceof Error)\n throw new Error('Invalid key');\n\n const keyType = pubKey.type;\n pubKey = pubKey.getPublicSSH();\n\n if (typeof keyAlgo === 'function') {\n cbSign = keyAlgo;\n keyAlgo = undefined;\n }\n if (!keyAlgo)\n keyAlgo = keyType;\n\n const userLen = Buffer.byteLength(username);\n const algoLen = Buffer.byteLength(keyAlgo);\n const pubKeyLen = pubKey.length;\n const sessionID = this._kex.sessionID;\n const sesLen = sessionID.length;\n const hostnameLen = Buffer.byteLength(hostname);\n const userlocalLen = Buffer.byteLength(userlocal);\n const data = Buffer.allocUnsafe(\n 4 + sesLen + 1 + 4 + userLen + 4 + 14 + 4 + 9 + 4 + algoLen\n + 4 + pubKeyLen + 4 + hostnameLen + 4 + userlocalLen\n );\n let p = 0;\n\n writeUInt32BE(data, sesLen, p);\n data.set(sessionID, p += 4);\n\n data[p += sesLen] = MESSAGE.USERAUTH_REQUEST;\n\n writeUInt32BE(data, userLen, ++p);\n data.utf8Write(username, p += 4, userLen);\n\n writeUInt32BE(data, 14, p += userLen);\n data.utf8Write('ssh-connection', p += 4, 14);\n\n writeUInt32BE(data, 9, p += 14);\n data.utf8Write('hostbased', p += 4, 9);\n\n writeUInt32BE(data, algoLen, p += 9);\n data.utf8Write(keyAlgo, p += 4, algoLen);\n\n writeUInt32BE(data, pubKeyLen, p += algoLen);\n data.set(pubKey, p += 4);\n\n writeUInt32BE(data, hostnameLen, p += pubKeyLen);\n data.utf8Write(hostname, p += 4, hostnameLen);\n\n writeUInt32BE(data, userlocalLen, p += hostnameLen);\n data.utf8Write(userlocal, p += 4, userlocalLen);\n\n cbSign(data, (signature) => {\n signature = convertSignature(signature, keyType);\n if (!signature)\n throw new Error('Error while converting handshake signature');\n\n const sigLen = signature.length;\n const reqDataLen = (data.length - sesLen - 4);\n p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n reqDataLen + 4 + 4 + algoLen + 4 + sigLen\n );\n\n bufferCopy(data, packet, 4 + sesLen, data.length, p);\n\n writeUInt32BE(packet, 4 + algoLen + 4 + sigLen, p += reqDataLen);\n writeUInt32BE(packet, algoLen, p += 4);\n packet.utf8Write(keyAlgo, p += 4, algoLen);\n writeUInt32BE(packet, sigLen, p += algoLen);\n packet.set(signature, p += 4);\n\n this._authsQueue.push('hostbased');\n\n this._debug && this._debug(\n 'Outbound: Sending USERAUTH_REQUEST (hostbased)'\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n });\n }\n authKeyboard(username) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const userLen = Buffer.byteLength(username);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + userLen + 4 + 14 + 4 + 20 + 4 + 4\n );\n\n packet[p] = MESSAGE.USERAUTH_REQUEST;\n\n writeUInt32BE(packet, userLen, ++p);\n packet.utf8Write(username, p += 4, userLen);\n\n writeUInt32BE(packet, 14, p += userLen);\n packet.utf8Write('ssh-connection', p += 4, 14);\n\n writeUInt32BE(packet, 20, p += 14);\n packet.utf8Write('keyboard-interactive', p += 4, 20);\n\n writeUInt32BE(packet, 0, p += 20);\n\n writeUInt32BE(packet, 0, p += 4);\n\n this._authsQueue.push('keyboard-interactive');\n\n this._debug && this._debug(\n 'Outbound: Sending USERAUTH_REQUEST (keyboard-interactive)'\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n authNone(username) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const userLen = Buffer.byteLength(username);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + userLen + 4 + 14 + 4 + 4);\n\n packet[p] = MESSAGE.USERAUTH_REQUEST;\n\n writeUInt32BE(packet, userLen, ++p);\n packet.utf8Write(username, p += 4, userLen);\n\n writeUInt32BE(packet, 14, p += userLen);\n packet.utf8Write('ssh-connection', p += 4, 14);\n\n writeUInt32BE(packet, 4, p += 14);\n packet.utf8Write('none', p += 4, 4);\n\n this._authsQueue.push('none');\n\n this._debug && this._debug('Outbound: Sending USERAUTH_REQUEST (none)');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n authInfoRes(responses) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n let responsesTotalLen = 0;\n let responseLens;\n\n if (responses) {\n responseLens = new Array(responses.length);\n for (let i = 0; i < responses.length; ++i) {\n const len = Buffer.byteLength(responses[i]);\n responseLens[i] = len;\n responsesTotalLen += 4 + len;\n }\n }\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + responsesTotalLen);\n\n packet[p] = MESSAGE.USERAUTH_INFO_RESPONSE;\n\n if (responses) {\n writeUInt32BE(packet, responses.length, ++p);\n p += 4;\n for (let i = 0; i < responses.length; ++i) {\n const len = responseLens[i];\n writeUInt32BE(packet, len, p);\n p += 4;\n if (len) {\n packet.utf8Write(responses[i], p, len);\n p += len;\n }\n }\n } else {\n writeUInt32BE(packet, 0, ++p);\n }\n\n this._debug && this._debug('Outbound: Sending USERAUTH_INFO_RESPONSE');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n\n // 'ssh-connection' service-specific\n // ---------------------------------\n tcpipForward(bindAddr, bindPort, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const addrLen = Buffer.byteLength(bindAddr);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 13 + 1 + 4 + addrLen + 4);\n\n packet[p] = MESSAGE.GLOBAL_REQUEST;\n\n writeUInt32BE(packet, 13, ++p);\n packet.utf8Write('tcpip-forward', p += 4, 13);\n\n packet[p += 13] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, addrLen, ++p);\n packet.utf8Write(bindAddr, p += 4, addrLen);\n\n writeUInt32BE(packet, bindPort, p += addrLen);\n\n this._debug\n && this._debug('Outbound: Sending GLOBAL_REQUEST (tcpip-forward)');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n cancelTcpipForward(bindAddr, bindPort, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const addrLen = Buffer.byteLength(bindAddr);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 20 + 1 + 4 + addrLen + 4);\n\n packet[p] = MESSAGE.GLOBAL_REQUEST;\n\n writeUInt32BE(packet, 20, ++p);\n packet.utf8Write('cancel-tcpip-forward', p += 4, 20);\n\n packet[p += 20] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, addrLen, ++p);\n packet.utf8Write(bindAddr, p += 4, addrLen);\n\n writeUInt32BE(packet, bindPort, p += addrLen);\n\n this._debug\n && this._debug('Outbound: Sending GLOBAL_REQUEST (cancel-tcpip-forward)');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_streamLocalForward(socketPath, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const socketPathLen = Buffer.byteLength(socketPath);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 31 + 1 + 4 + socketPathLen\n );\n\n packet[p] = MESSAGE.GLOBAL_REQUEST;\n\n writeUInt32BE(packet, 31, ++p);\n packet.utf8Write('streamlocal-forward@openssh.com', p += 4, 31);\n\n packet[p += 31] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, socketPathLen, ++p);\n packet.utf8Write(socketPath, p += 4, socketPathLen);\n\n this._debug && this._debug(\n 'Outbound: Sending GLOBAL_REQUEST (streamlocal-forward@openssh.com)'\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_cancelStreamLocalForward(socketPath, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const socketPathLen = Buffer.byteLength(socketPath);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 38 + 1 + 4 + socketPathLen\n );\n\n packet[p] = MESSAGE.GLOBAL_REQUEST;\n\n writeUInt32BE(packet, 38, ++p);\n packet.utf8Write('cancel-streamlocal-forward@openssh.com', p += 4, 38);\n\n packet[p += 38] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, socketPathLen, ++p);\n packet.utf8Write(socketPath, p += 4, socketPathLen);\n\n if (this._debug) {\n this._debug(\n 'Outbound: Sending GLOBAL_REQUEST '\n + '(cancel-streamlocal-forward@openssh.com)'\n );\n }\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n directTcpip(chan, initWindow, maxPacket, cfg) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const srcLen = Buffer.byteLength(cfg.srcIP);\n const dstLen = Buffer.byteLength(cfg.dstIP);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 12 + 4 + 4 + 4 + 4 + srcLen + 4 + 4 + dstLen + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_OPEN;\n\n writeUInt32BE(packet, 12, ++p);\n packet.utf8Write('direct-tcpip', p += 4, 12);\n\n writeUInt32BE(packet, chan, p += 12);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n writeUInt32BE(packet, dstLen, p += 4);\n packet.utf8Write(cfg.dstIP, p += 4, dstLen);\n\n writeUInt32BE(packet, cfg.dstPort, p += dstLen);\n\n writeUInt32BE(packet, srcLen, p += 4);\n packet.utf8Write(cfg.srcIP, p += 4, srcLen);\n\n writeUInt32BE(packet, cfg.srcPort, p += srcLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_OPEN (r:${chan}, direct-tcpip)`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_directStreamLocal(chan, initWindow, maxPacket, cfg) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n const pathLen = Buffer.byteLength(cfg.socketPath);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 30 + 4 + 4 + 4 + 4 + pathLen + 4 + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_OPEN;\n\n writeUInt32BE(packet, 30, ++p);\n packet.utf8Write('direct-streamlocal@openssh.com', p += 4, 30);\n\n writeUInt32BE(packet, chan, p += 30);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n writeUInt32BE(packet, pathLen, p += 4);\n packet.utf8Write(cfg.socketPath, p += 4, pathLen);\n\n // zero-fill reserved fields (string and uint32)\n bufferFill(packet, 0, p += pathLen, p + 8);\n\n if (this._debug) {\n this._debug(\n 'Outbound: Sending CHANNEL_OPEN '\n + `(r:${chan}, direct-streamlocal@openssh.com)`\n );\n }\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_noMoreSessions(wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 28 + 1);\n\n packet[p] = MESSAGE.GLOBAL_REQUEST;\n\n writeUInt32BE(packet, 28, ++p);\n packet.utf8Write('no-more-sessions@openssh.com', p += 4, 28);\n\n packet[p += 28] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n this._debug && this._debug(\n 'Outbound: Sending GLOBAL_REQUEST (no-more-sessions@openssh.com)'\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n session(chan, initWindow, maxPacket) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 7 + 4 + 4 + 4);\n\n packet[p] = MESSAGE.CHANNEL_OPEN;\n\n writeUInt32BE(packet, 7, ++p);\n packet.utf8Write('session', p += 4, 7);\n\n writeUInt32BE(packet, chan, p += 7);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n this._debug\n && this._debug(`Outbound: Sending CHANNEL_OPEN (r:${chan}, session)`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n windowChange(chan, rows, cols, height, width) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 4 + 13 + 1 + 4 + 4 + 4 + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 13, p += 4);\n packet.utf8Write('window-change', p += 4, 13);\n\n packet[p += 13] = 0;\n\n writeUInt32BE(packet, cols, ++p);\n\n writeUInt32BE(packet, rows, p += 4);\n\n writeUInt32BE(packet, width, p += 4);\n\n writeUInt32BE(packet, height, p += 4);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_REQUEST (r:${chan}, window-change)`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n pty(chan, rows, cols, height, width, term, modes, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n if (!term || !term.length)\n term = 'vt100';\n if (modes\n && !Buffer.isBuffer(modes)\n && !Array.isArray(modes)\n && typeof modes === 'object'\n && modes !== null) {\n modes = modesToBytes(modes);\n }\n if (!modes || !modes.length)\n modes = NO_TERMINAL_MODES_BUFFER;\n\n const termLen = term.length;\n const modesLen = modes.length;\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 4 + 7 + 1 + 4 + termLen + 4 + 4 + 4 + 4 + 4 + modesLen\n );\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 7, p += 4);\n packet.utf8Write('pty-req', p += 4, 7);\n\n packet[p += 7] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, termLen, ++p);\n packet.utf8Write(term, p += 4, termLen);\n\n writeUInt32BE(packet, cols, p += termLen);\n\n writeUInt32BE(packet, rows, p += 4);\n\n writeUInt32BE(packet, width, p += 4);\n\n writeUInt32BE(packet, height, p += 4);\n\n writeUInt32BE(packet, modesLen, p += 4);\n p += 4;\n if (Array.isArray(modes)) {\n for (let i = 0; i < modesLen; ++i)\n packet[p++] = modes[i];\n } else if (Buffer.isBuffer(modes)) {\n packet.set(modes, p);\n }\n\n this._debug\n && this._debug(`Outbound: Sending CHANNEL_REQUEST (r:${chan}, pty-req)`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n shell(chan, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 5 + 1);\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 5, p += 4);\n packet.utf8Write('shell', p += 4, 5);\n\n packet[p += 5] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n this._debug\n && this._debug(`Outbound: Sending CHANNEL_REQUEST (r:${chan}, shell)`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n exec(chan, cmd, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n const isBuf = Buffer.isBuffer(cmd);\n const cmdLen = (isBuf ? cmd.length : Buffer.byteLength(cmd));\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 4 + 1 + 4 + cmdLen);\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 4, p += 4);\n packet.utf8Write('exec', p += 4, 4);\n\n packet[p += 4] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, cmdLen, ++p);\n if (isBuf)\n packet.set(cmd, p += 4);\n else\n packet.utf8Write(cmd, p += 4, cmdLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_REQUEST (r:${chan}, exec: ${cmd})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n signal(chan, signal) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n const origSignal = signal;\n\n signal = signal.toUpperCase();\n if (signal.slice(0, 3) === 'SIG')\n signal = signal.slice(3);\n\n if (SIGNALS[signal] !== 1)\n throw new Error(`Invalid signal: ${origSignal}`);\n\n const signalLen = signal.length;\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 4 + 6 + 1 + 4 + signalLen\n );\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 6, p += 4);\n packet.utf8Write('signal', p += 4, 6);\n\n packet[p += 6] = 0;\n\n writeUInt32BE(packet, signalLen, ++p);\n packet.utf8Write(signal, p += 4, signalLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_REQUEST (r:${chan}, signal: ${signal})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n env(chan, key, val, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n const keyLen = Buffer.byteLength(key);\n const isBuf = Buffer.isBuffer(val);\n const valLen = (isBuf ? val.length : Buffer.byteLength(val));\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 4 + 3 + 1 + 4 + keyLen + 4 + valLen\n );\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 3, p += 4);\n packet.utf8Write('env', p += 4, 3);\n\n packet[p += 3] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, keyLen, ++p);\n packet.utf8Write(key, p += 4, keyLen);\n\n writeUInt32BE(packet, valLen, p += keyLen);\n if (isBuf)\n packet.set(val, p += 4);\n else\n packet.utf8Write(val, p += 4, valLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_REQUEST (r:${chan}, env: ${key}=${val})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n x11Forward(chan, cfg, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n const protocol = cfg.protocol;\n const cookie = cfg.cookie;\n const isBufProto = Buffer.isBuffer(protocol);\n const protoLen = (isBufProto\n ? protocol.length\n : Buffer.byteLength(protocol));\n const isBufCookie = Buffer.isBuffer(cookie);\n const cookieLen = (isBufCookie\n ? cookie.length\n : Buffer.byteLength(cookie));\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 4 + 7 + 1 + 1 + 4 + protoLen + 4 + cookieLen + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 7, p += 4);\n packet.utf8Write('x11-req', p += 4, 7);\n\n packet[p += 7] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n packet[++p] = (cfg.single ? 1 : 0);\n\n writeUInt32BE(packet, protoLen, ++p);\n if (isBufProto)\n packet.set(protocol, p += 4);\n else\n packet.utf8Write(protocol, p += 4, protoLen);\n\n writeUInt32BE(packet, cookieLen, p += protoLen);\n if (isBufCookie)\n packet.set(cookie, p += 4);\n else\n packet.latin1Write(cookie, p += 4, cookieLen);\n\n writeUInt32BE(packet, (cfg.screen || 0), p += cookieLen);\n\n this._debug\n && this._debug(`Outbound: Sending CHANNEL_REQUEST (r:${chan}, x11-req)`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n subsystem(chan, name, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n const nameLen = Buffer.byteLength(name);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 9 + 1 + 4 + nameLen);\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 9, p += 4);\n packet.utf8Write('subsystem', p += 4, 9);\n\n packet[p += 9] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n writeUInt32BE(packet, nameLen, ++p);\n packet.utf8Write(name, p += 4, nameLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_REQUEST (r:${chan}, subsystem: ${name})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_agentForward(chan, wantReply) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n // Does not consume window space\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 26 + 1);\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 26, p += 4);\n packet.utf8Write('auth-agent-req@openssh.com', p += 4, 26);\n\n packet[p += 26] = (wantReply === undefined || wantReply === true ? 1 : 0);\n\n if (this._debug) {\n this._debug(\n 'Outbound: Sending CHANNEL_REQUEST '\n + `(r:${chan}, auth-agent-req@openssh.com)`\n );\n }\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_hostKeysProve(keys) {\n if (this._server)\n throw new Error('Client-only method called in server mode');\n\n let keysTotal = 0;\n const publicKeys = [];\n for (const key of keys) {\n const publicKey = key.getPublicSSH();\n keysTotal += 4 + publicKey.length;\n publicKeys.push(publicKey);\n }\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 29 + 1 + keysTotal);\n\n packet[p] = MESSAGE.GLOBAL_REQUEST;\n\n writeUInt32BE(packet, 29, ++p);\n packet.utf8Write('hostkeys-prove-00@openssh.com', p += 4, 29);\n\n packet[p += 29] = 1; // want reply\n\n ++p;\n for (const buf of publicKeys) {\n writeUInt32BE(packet, buf.length, p);\n bufferCopy(buf, packet, 0, buf.length, p += 4);\n p += buf.length;\n }\n\n if (this._debug) {\n this._debug(\n 'Outbound: Sending GLOBAL_REQUEST (hostkeys-prove-00@openssh.com)'\n );\n }\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n\n // ===========================================================================\n // Server-specific ===========================================================\n // ===========================================================================\n\n // Global\n // ------\n serviceAccept(svcName) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n const svcNameLen = Buffer.byteLength(svcName);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + svcNameLen);\n\n packet[p] = MESSAGE.SERVICE_ACCEPT;\n\n writeUInt32BE(packet, svcNameLen, ++p);\n packet.utf8Write(svcName, p += 4, svcNameLen);\n\n this._debug && this._debug(`Outbound: Sending SERVICE_ACCEPT (${svcName})`);\n sendPacket(this, this._packetRW.write.finalize(packet));\n\n if (this._server && this._banner && svcName === 'ssh-userauth') {\n const banner = this._banner;\n this._banner = undefined; // Prevent banner from being displayed again\n const bannerLen = Buffer.byteLength(banner);\n p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + bannerLen + 4);\n\n packet[p] = MESSAGE.USERAUTH_BANNER;\n\n writeUInt32BE(packet, bannerLen, ++p);\n packet.utf8Write(banner, p += 4, bannerLen);\n\n writeUInt32BE(packet, 0, p += bannerLen); // Empty language tag\n\n this._debug && this._debug('Outbound: Sending USERAUTH_BANNER');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n }\n // 'ssh-connection' service-specific\n forwardedTcpip(chan, initWindow, maxPacket, cfg) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n const boundAddrLen = Buffer.byteLength(cfg.boundAddr);\n const remoteAddrLen = Buffer.byteLength(cfg.remoteAddr);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 15 + 4 + 4 + 4 + 4 + boundAddrLen + 4 + 4 + remoteAddrLen + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_OPEN;\n\n writeUInt32BE(packet, 15, ++p);\n packet.utf8Write('forwarded-tcpip', p += 4, 15);\n\n writeUInt32BE(packet, chan, p += 15);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n writeUInt32BE(packet, boundAddrLen, p += 4);\n packet.utf8Write(cfg.boundAddr, p += 4, boundAddrLen);\n\n writeUInt32BE(packet, cfg.boundPort, p += boundAddrLen);\n\n writeUInt32BE(packet, remoteAddrLen, p += 4);\n packet.utf8Write(cfg.remoteAddr, p += 4, remoteAddrLen);\n\n writeUInt32BE(packet, cfg.remotePort, p += remoteAddrLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_OPEN (r:${chan}, forwarded-tcpip)`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n x11(chan, initWindow, maxPacket, cfg) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n const addrLen = Buffer.byteLength(cfg.originAddr);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 3 + 4 + 4 + 4 + 4 + addrLen + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_OPEN;\n\n writeUInt32BE(packet, 3, ++p);\n packet.utf8Write('x11', p += 4, 3);\n\n writeUInt32BE(packet, chan, p += 3);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n writeUInt32BE(packet, addrLen, p += 4);\n packet.utf8Write(cfg.originAddr, p += 4, addrLen);\n\n writeUInt32BE(packet, cfg.originPort, p += addrLen);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_OPEN (r:${chan}, x11)`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_authAgent(chan, initWindow, maxPacket) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 22 + 4 + 4 + 4);\n\n packet[p] = MESSAGE.CHANNEL_OPEN;\n\n writeUInt32BE(packet, 22, ++p);\n packet.utf8Write('auth-agent@openssh.com', p += 4, 22);\n\n writeUInt32BE(packet, chan, p += 22);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_OPEN (r:${chan}, auth-agent@openssh.com)`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n openssh_forwardedStreamLocal(chan, initWindow, maxPacket, cfg) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n const pathLen = Buffer.byteLength(cfg.socketPath);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 33 + 4 + 4 + 4 + 4 + pathLen + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_OPEN;\n\n writeUInt32BE(packet, 33, ++p);\n packet.utf8Write('forwarded-streamlocal@openssh.com', p += 4, 33);\n\n writeUInt32BE(packet, chan, p += 33);\n\n writeUInt32BE(packet, initWindow, p += 4);\n\n writeUInt32BE(packet, maxPacket, p += 4);\n\n writeUInt32BE(packet, pathLen, p += 4);\n packet.utf8Write(cfg.socketPath, p += 4, pathLen);\n\n writeUInt32BE(packet, 0, p += pathLen);\n\n if (this._debug) {\n this._debug(\n 'Outbound: Sending CHANNEL_OPEN '\n + `(r:${chan}, forwarded-streamlocal@openssh.com)`\n );\n }\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n exitStatus(chan, status) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n // Does not consume window space\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + 4 + 11 + 1 + 4);\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 11, p += 4);\n packet.utf8Write('exit-status', p += 4, 11);\n\n packet[p += 11] = 0;\n\n writeUInt32BE(packet, status, ++p);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_REQUEST (r:${chan}, exit-status: ${status})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n exitSignal(chan, name, coreDumped, msg) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n // Does not consume window space\n\n const origSignal = name;\n\n if (typeof origSignal !== 'string' || !origSignal)\n throw new Error(`Invalid signal: ${origSignal}`);\n\n let signal = name.toUpperCase();\n if (signal.slice(0, 3) === 'SIG')\n signal = signal.slice(3);\n\n if (SIGNALS[signal] !== 1)\n throw new Error(`Invalid signal: ${origSignal}`);\n\n const nameLen = Buffer.byteLength(signal);\n const msgLen = (msg ? Buffer.byteLength(msg) : 0);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + 4 + 11 + 1 + 4 + nameLen + 1 + 4 + msgLen + 4\n );\n\n packet[p] = MESSAGE.CHANNEL_REQUEST;\n\n writeUInt32BE(packet, chan, ++p);\n\n writeUInt32BE(packet, 11, p += 4);\n packet.utf8Write('exit-signal', p += 4, 11);\n\n packet[p += 11] = 0;\n\n writeUInt32BE(packet, nameLen, ++p);\n packet.utf8Write(signal, p += 4, nameLen);\n\n packet[p += nameLen] = (coreDumped ? 1 : 0);\n\n writeUInt32BE(packet, msgLen, ++p);\n\n p += 4;\n if (msgLen) {\n packet.utf8Write(msg, p, msgLen);\n p += msgLen;\n }\n\n writeUInt32BE(packet, 0, p);\n\n this._debug && this._debug(\n `Outbound: Sending CHANNEL_REQUEST (r:${chan}, exit-signal: ${name})`\n );\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n // 'ssh-userauth' service-specific\n authFailure(authMethods, isPartial) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n if (this._authsQueue.length === 0)\n throw new Error('No auth in progress');\n\n let methods;\n\n if (typeof authMethods === 'boolean') {\n isPartial = authMethods;\n authMethods = undefined;\n }\n\n if (authMethods) {\n methods = [];\n for (let i = 0; i < authMethods.length; ++i) {\n if (authMethods[i].toLowerCase() === 'none')\n continue;\n methods.push(authMethods[i]);\n }\n methods = methods.join(',');\n } else {\n methods = '';\n }\n\n const methodsLen = methods.length;\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + methodsLen + 1);\n\n packet[p] = MESSAGE.USERAUTH_FAILURE;\n\n writeUInt32BE(packet, methodsLen, ++p);\n packet.utf8Write(methods, p += 4, methodsLen);\n\n packet[p += methodsLen] = (isPartial === true ? 1 : 0);\n\n this._authsQueue.shift();\n\n this._debug && this._debug('Outbound: Sending USERAUTH_FAILURE');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n authSuccess() {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n if (this._authsQueue.length === 0)\n throw new Error('No auth in progress');\n\n const p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1);\n\n packet[p] = MESSAGE.USERAUTH_SUCCESS;\n\n this._authsQueue.shift();\n this._authenticated = true;\n\n this._debug && this._debug('Outbound: Sending USERAUTH_SUCCESS');\n sendPacket(this, this._packetRW.write.finalize(packet));\n\n if (this._kex.negotiated.cs.compress === 'zlib@openssh.com')\n this._packetRW.read = new ZlibPacketReader();\n if (this._kex.negotiated.sc.compress === 'zlib@openssh.com')\n this._packetRW.write = new ZlibPacketWriter(this);\n }\n authPKOK(keyAlgo, key) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n if (this._authsQueue.length === 0 || this._authsQueue[0] !== 'publickey')\n throw new Error('\"publickey\" auth not in progress');\n\n // TODO: support parsed key for `key`\n\n const keyAlgoLen = Buffer.byteLength(keyAlgo);\n const keyLen = key.length;\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + keyAlgoLen + 4 + keyLen);\n\n packet[p] = MESSAGE.USERAUTH_PK_OK;\n\n writeUInt32BE(packet, keyAlgoLen, ++p);\n packet.utf8Write(keyAlgo, p += 4, keyAlgoLen);\n\n writeUInt32BE(packet, keyLen, p += keyAlgoLen);\n packet.set(key, p += 4);\n\n this._authsQueue.shift();\n\n this._debug && this._debug('Outbound: Sending USERAUTH_PK_OK');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n authPasswdChg(prompt) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n const promptLen = Buffer.byteLength(prompt);\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(1 + 4 + promptLen + 4);\n\n packet[p] = MESSAGE.USERAUTH_PASSWD_CHANGEREQ;\n\n writeUInt32BE(packet, promptLen, ++p);\n packet.utf8Write(prompt, p += 4, promptLen);\n\n writeUInt32BE(packet, 0, p += promptLen); // Empty language tag\n\n this._debug && this._debug('Outbound: Sending USERAUTH_PASSWD_CHANGEREQ');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n authInfoReq(name, instructions, prompts) {\n if (!this._server)\n throw new Error('Server-only method called in client mode');\n\n let promptsLen = 0;\n const nameLen = name ? Buffer.byteLength(name) : 0;\n const instrLen = instructions ? Buffer.byteLength(instructions) : 0;\n\n for (let i = 0; i < prompts.length; ++i)\n promptsLen += 4 + Buffer.byteLength(prompts[i].prompt) + 1;\n\n let p = this._packetRW.write.allocStart;\n const packet = this._packetRW.write.alloc(\n 1 + 4 + nameLen + 4 + instrLen + 4 + 4 + promptsLen\n );\n\n packet[p] = MESSAGE.USERAUTH_INFO_REQUEST;\n\n writeUInt32BE(packet, nameLen, ++p);\n p += 4;\n if (name) {\n packet.utf8Write(name, p, nameLen);\n p += nameLen;\n }\n\n writeUInt32BE(packet, instrLen, p);\n p += 4;\n if (instructions) {\n packet.utf8Write(instructions, p, instrLen);\n p += instrLen;\n }\n\n writeUInt32BE(packet, 0, p);\n\n writeUInt32BE(packet, prompts.length, p += 4);\n p += 4;\n for (let i = 0; i < prompts.length; ++i) {\n const prompt = prompts[i];\n const promptLen = Buffer.byteLength(prompt.prompt);\n\n writeUInt32BE(packet, promptLen, p);\n p += 4;\n if (promptLen) {\n packet.utf8Write(prompt.prompt, p, promptLen);\n p += promptLen;\n }\n packet[p++] = (prompt.echo ? 1 : 0);\n }\n\n this._debug && this._debug('Outbound: Sending USERAUTH_INFO_REQUEST');\n sendPacket(this, this._packetRW.write.finalize(packet));\n }\n}\n\n// SSH-protoversion-softwareversion (SP comments) CR LF\nconst RE_IDENT = /^SSH-(2\\.0|1\\.99)-([^ ]+)(?: (.*))?$/;\n\n// TODO: optimize this by starting n bytes from the end of this._buffer instead\n// of the beginning\nfunction parseHeader(chunk, p, len) {\n let data;\n let chunkOffset;\n if (this._buffer) {\n data = Buffer.allocUnsafe(this._buffer.length + (len - p));\n data.set(this._buffer, 0);\n if (p === 0) {\n data.set(chunk, this._buffer.length);\n } else {\n data.set(new Uint8Array(chunk.buffer,\n chunk.byteOffset + p,\n (len - p)),\n this._buffer.length);\n }\n chunkOffset = this._buffer.length;\n p = 0;\n } else {\n data = chunk;\n chunkOffset = 0;\n }\n const op = p;\n let start = p;\n let end = p;\n let needNL = false;\n let lineLen = 0;\n let lines = 0;\n for (; p < data.length; ++p) {\n const ch = data[p];\n\n if (ch === 13 /* '\\r' */) {\n needNL = true;\n continue;\n }\n\n if (ch === 10 /* '\\n' */) {\n if (end > start\n && end - start > 4\n && data[start] === 83 /* 'S' */\n && data[start + 1] === 83 /* 'S' */\n && data[start + 2] === 72 /* 'H' */\n && data[start + 3] === 45 /* '-' */) {\n\n const full = data.latin1Slice(op, end + 1);\n const identRaw = (start === op ? full : full.slice(start - op));\n const m = RE_IDENT.exec(identRaw);\n if (!m)\n throw new Error('Invalid identification string');\n\n const header = {\n greeting: (start === op ? '' : full.slice(0, start - op)),\n identRaw,\n versions: {\n protocol: m[1],\n software: m[2],\n },\n comments: m[3]\n };\n\n // Needed during handshake\n this._remoteIdentRaw = Buffer.from(identRaw);\n\n this._debug && this._debug(`Remote ident: ${inspect(identRaw)}`);\n this._compatFlags = getCompatFlags(header);\n\n this._buffer = undefined;\n this._decipher =\n new NullDecipher(0, onKEXPayload.bind(this, { firstPacket: true }));\n this._parse = parsePacket;\n\n this._onHeader(header);\n if (!this._destruct) {\n // We disconnected inside _onHeader\n return len;\n }\n\n kexinit(this);\n\n return p + 1 - chunkOffset;\n }\n\n // Only allow pre-ident greetings when we're a client\n if (this._server)\n throw new Error('Greetings from clients not permitted');\n\n if (++lines > MAX_LINES)\n throw new Error('Max greeting lines exceeded');\n\n needNL = false;\n start = p + 1;\n lineLen = 0;\n } else if (needNL) {\n throw new Error('Invalid header: expected newline');\n } else if (++lineLen >= MAX_LINE_LEN) {\n throw new Error('Header line too long');\n }\n\n end = p;\n }\n if (!this._buffer)\n this._buffer = bufferSlice(data, op);\n\n return p - chunkOffset;\n}\n\nfunction parsePacket(chunk, p, len) {\n return this._decipher.decrypt(chunk, p, len);\n}\n\nfunction onPayload(payload) {\n // XXX: move this to the Decipher implementations?\n\n this._onPacket();\n\n if (payload.length === 0) {\n this._debug && this._debug('Inbound: Skipping empty packet payload');\n return;\n }\n\n payload = this._packetRW.read.read(payload);\n\n const type = payload[0];\n if (type === MESSAGE.USERAUTH_SUCCESS\n && !this._server\n && !this._authenticated) {\n this._authenticated = true;\n if (this._kex.negotiated.cs.compress === 'zlib@openssh.com')\n this._packetRW.write = new ZlibPacketWriter(this);\n if (this._kex.negotiated.sc.compress === 'zlib@openssh.com')\n this._packetRW.read = new ZlibPacketReader();\n }\n const handler = MESSAGE_HANDLERS[type];\n if (handler === undefined) {\n this._debug && this._debug(`Inbound: Unsupported message type: ${type}`);\n return;\n }\n\n return handler(this, payload);\n}\n\nfunction getCompatFlags(header) {\n const software = header.versions.software;\n\n let flags = 0;\n\n for (const rule of COMPAT_CHECKS) {\n if (typeof rule[0] === 'string') {\n if (software === rule[0])\n flags |= rule[1];\n } else if (rule[0].test(software)) {\n flags |= rule[1];\n }\n }\n\n return flags;\n}\n\nfunction modesToBytes(modes) {\n const keys = Object.keys(modes);\n const bytes = Buffer.allocUnsafe((5 * keys.length) + 1);\n let b = 0;\n\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n if (key === 'TTY_OP_END')\n continue;\n\n const opcode = TERMINAL_MODE[key];\n if (opcode === undefined)\n continue;\n\n const val = modes[key];\n if (typeof val === 'number' && isFinite(val)) {\n bytes[b++] = opcode;\n bytes[b++] = val >>> 24;\n bytes[b++] = val >>> 16;\n bytes[b++] = val >>> 8;\n bytes[b++] = val;\n }\n }\n\n bytes[b++] = TERMINAL_MODE.TTY_OP_END;\n\n if (b < bytes.length)\n return bufferSlice(bytes, 0, b);\n\n return bytes;\n}\n\nfunction sendExtInfo(proto) {\n let serverSigAlgs =\n 'ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521'\n + 'rsa-sha2-512,rsa-sha2-256,ssh-rsa,ssh-dss';\n if (eddsaSupported)\n serverSigAlgs = `ssh-ed25519,${serverSigAlgs}`;\n const algsLen = Buffer.byteLength(serverSigAlgs);\n\n let p = proto._packetRW.write.allocStart;\n const packet = proto._packetRW.write.alloc(1 + 4 + 4 + 15 + 4 + algsLen);\n\n packet[p] = MESSAGE.EXT_INFO;\n\n writeUInt32BE(packet, 1, ++p);\n\n writeUInt32BE(packet, 15, p += 4);\n packet.utf8Write('server-sig-algs', p += 4, 15);\n\n writeUInt32BE(packet, algsLen, p += 15);\n packet.utf8Write(serverSigAlgs, p += 4, algsLen);\n\n proto._debug && proto._debug('Outbound: Sending EXT_INFO');\n sendPacket(proto, proto._packetRW.write.finalize(packet));\n}\n\nmodule.exports = Protocol;\n", "'use strict';\n\nconst assert = require('assert');\nconst { inspect } = require('util');\n\n// Only use this for integers! Decimal numbers do not work with this function.\nfunction addNumericalSeparator(val) {\n let res = '';\n let i = val.length;\n const start = val[0] === '-' ? 1 : 0;\n for (; i >= start + 4; i -= 3)\n res = `_${val.slice(i - 3, i)}${res}`;\n return `${val.slice(0, i)}${res}`;\n}\n\nfunction oneOf(expected, thing) {\n assert(typeof thing === 'string', '`thing` has to be of type string');\n if (Array.isArray(expected)) {\n const len = expected.length;\n assert(len > 0, 'At least one expected value needs to be specified');\n expected = expected.map((i) => String(i));\n if (len > 2) {\n return `one of ${thing} ${expected.slice(0, len - 1).join(', ')}, or `\n + expected[len - 1];\n } else if (len === 2) {\n return `one of ${thing} ${expected[0]} or ${expected[1]}`;\n }\n return `of ${thing} ${expected[0]}`;\n }\n return `of ${thing} ${String(expected)}`;\n}\n\n\nexports.ERR_INTERNAL_ASSERTION = class ERR_INTERNAL_ASSERTION extends Error {\n constructor(message) {\n super();\n Error.captureStackTrace(this, ERR_INTERNAL_ASSERTION);\n\n const suffix = 'This is caused by either a bug in ssh2 '\n + 'or incorrect usage of ssh2 internals.\\n'\n + 'Please open an issue with this stack trace at '\n + 'https://github.com/mscdex/ssh2/issues\\n';\n\n this.message = (message === undefined ? suffix : `${message}\\n${suffix}`);\n }\n};\n\nconst MAX_32BIT_INT = 2 ** 32;\nconst MAX_32BIT_BIGINT = (() => {\n try {\n return new Function('return 2n ** 32n')();\n } catch {}\n})();\nexports.ERR_OUT_OF_RANGE = class ERR_OUT_OF_RANGE extends RangeError {\n constructor(str, range, input, replaceDefaultBoolean) {\n super();\n Error.captureStackTrace(this, ERR_OUT_OF_RANGE);\n\n assert(range, 'Missing \"range\" argument');\n let msg = (replaceDefaultBoolean\n ? str\n : `The value of \"${str}\" is out of range.`);\n let received;\n if (Number.isInteger(input) && Math.abs(input) > MAX_32BIT_INT) {\n received = addNumericalSeparator(String(input));\n } else if (typeof input === 'bigint') {\n received = String(input);\n if (input > MAX_32BIT_BIGINT || input < -MAX_32BIT_BIGINT)\n received = addNumericalSeparator(received);\n received += 'n';\n } else {\n received = inspect(input);\n }\n msg += ` It must be ${range}. Received ${received}`;\n\n this.message = msg;\n }\n};\n\nclass ERR_INVALID_ARG_TYPE extends TypeError {\n constructor(name, expected, actual) {\n super();\n Error.captureStackTrace(this, ERR_INVALID_ARG_TYPE);\n\n assert(typeof name === 'string', `'name' must be a string`);\n\n // determiner: 'must be' or 'must not be'\n let determiner;\n if (typeof expected === 'string' && expected.startsWith('not ')) {\n determiner = 'must not be';\n expected = expected.replace(/^not /, '');\n } else {\n determiner = 'must be';\n }\n\n let msg;\n if (name.endsWith(' argument')) {\n // For cases like 'first argument'\n msg = `The ${name} ${determiner} ${oneOf(expected, 'type')}`;\n } else {\n const type = (name.includes('.') ? 'property' : 'argument');\n msg = `The \"${name}\" ${type} ${determiner} ${oneOf(expected, 'type')}`;\n }\n\n msg += `. Received type ${typeof actual}`;\n\n this.message = msg;\n }\n}\nexports.ERR_INVALID_ARG_TYPE = ERR_INVALID_ARG_TYPE;\n\nexports.validateNumber = function validateNumber(value, name) {\n if (typeof value !== 'number')\n throw new ERR_INVALID_ARG_TYPE(name, 'number', value);\n};\n", "'use strict';\n\nconst EventEmitter = require('events');\nconst fs = require('fs');\nconst { constants } = fs;\nconst {\n Readable: ReadableStream,\n Writable: WritableStream\n} = require('stream');\nconst { inherits, types: { isDate } } = require('util');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst {\n bufferCopy,\n bufferSlice,\n makeBufferParser,\n writeUInt32BE,\n} = require('./utils.js');\n\nconst ATTR = {\n SIZE: 0x00000001,\n UIDGID: 0x00000002,\n PERMISSIONS: 0x00000004,\n ACMODTIME: 0x00000008,\n EXTENDED: 0x80000000,\n};\n\n// Large enough to store all possible attributes\nconst ATTRS_BUF = Buffer.alloc(28);\n\nconst STATUS_CODE = {\n OK: 0,\n EOF: 1,\n NO_SUCH_FILE: 2,\n PERMISSION_DENIED: 3,\n FAILURE: 4,\n BAD_MESSAGE: 5,\n NO_CONNECTION: 6,\n CONNECTION_LOST: 7,\n OP_UNSUPPORTED: 8\n};\n\nconst VALID_STATUS_CODES = new Map(\n Object.values(STATUS_CODE).map((n) => [n, 1])\n);\n\nconst STATUS_CODE_STR = {\n [STATUS_CODE.OK]: 'No error',\n [STATUS_CODE.EOF]: 'End of file',\n [STATUS_CODE.NO_SUCH_FILE]: 'No such file or directory',\n [STATUS_CODE.PERMISSION_DENIED]: 'Permission denied',\n [STATUS_CODE.FAILURE]: 'Failure',\n [STATUS_CODE.BAD_MESSAGE]: 'Bad message',\n [STATUS_CODE.NO_CONNECTION]: 'No connection',\n [STATUS_CODE.CONNECTION_LOST]: 'Connection lost',\n [STATUS_CODE.OP_UNSUPPORTED]: 'Operation unsupported',\n};\n\nconst REQUEST = {\n INIT: 1,\n OPEN: 3,\n CLOSE: 4,\n READ: 5,\n WRITE: 6,\n LSTAT: 7,\n FSTAT: 8,\n SETSTAT: 9,\n FSETSTAT: 10,\n OPENDIR: 11,\n READDIR: 12,\n REMOVE: 13,\n MKDIR: 14,\n RMDIR: 15,\n REALPATH: 16,\n STAT: 17,\n RENAME: 18,\n READLINK: 19,\n SYMLINK: 20,\n EXTENDED: 200\n};\n\nconst RESPONSE = {\n VERSION: 2,\n STATUS: 101,\n HANDLE: 102,\n DATA: 103,\n NAME: 104,\n ATTRS: 105,\n EXTENDED: 201\n};\n\nconst OPEN_MODE = {\n READ: 0x00000001,\n WRITE: 0x00000002,\n APPEND: 0x00000004,\n CREAT: 0x00000008,\n TRUNC: 0x00000010,\n EXCL: 0x00000020\n};\n\nconst PKT_RW_OVERHEAD = 2 * 1024;\nconst MAX_REQID = 2 ** 32 - 1;\nconst CLIENT_VERSION_BUFFER = Buffer.from([\n 0, 0, 0, 5 /* length */,\n REQUEST.INIT,\n 0, 0, 0, 3 /* version */\n]);\nconst SERVER_VERSION_BUFFER = Buffer.from([\n 0, 0, 0, 5 /* length */,\n RESPONSE.VERSION,\n 0, 0, 0, 3 /* version */\n]);\n\nconst RE_OPENSSH = /^SSH-2.0-(?:OpenSSH|dropbear)/;\nconst OPENSSH_MAX_PKT_LEN = 256 * 1024;\n\nconst bufferParser = makeBufferParser();\n\nconst fakeStderr = {\n readable: false,\n writable: false,\n push: (data) => {},\n once: () => {},\n on: () => {},\n emit: () => {},\n end: () => {},\n};\n\nfunction noop() {}\n\n// Emulates enough of `Channel` to be able to be used as a drop-in replacement\n// in order to process incoming data with as little overhead as possible\nclass SFTP extends EventEmitter {\n constructor(client, chanInfo, cfg) {\n super();\n\n if (typeof cfg !== 'object' || !cfg)\n cfg = {};\n\n const remoteIdentRaw = client._protocol._remoteIdentRaw;\n\n this.server = !!cfg.server;\n this._debug = (typeof cfg.debug === 'function' ? cfg.debug : undefined);\n this._isOpenSSH = (remoteIdentRaw && RE_OPENSSH.test(remoteIdentRaw));\n\n this._version = -1;\n this._extensions = {};\n this._biOpt = cfg.biOpt;\n this._pktLenBytes = 0;\n this._pktLen = 0;\n this._pktPos = 0;\n this._pktType = 0;\n this._pktData = undefined;\n this._writeReqid = -1;\n this._requests = {};\n this._maxInPktLen = OPENSSH_MAX_PKT_LEN;\n this._maxOutPktLen = 34000;\n this._maxReadLen =\n (this._isOpenSSH ? OPENSSH_MAX_PKT_LEN : 34000) - PKT_RW_OVERHEAD;\n this._maxWriteLen =\n (this._isOpenSSH ? OPENSSH_MAX_PKT_LEN : 34000) - PKT_RW_OVERHEAD;\n\n this.maxOpenHandles = undefined;\n\n // Channel compatibility\n this._client = client;\n this._protocol = client._protocol;\n this._callbacks = [];\n this._hasX11 = false;\n this._exit = {\n code: undefined,\n signal: undefined,\n dump: undefined,\n desc: undefined,\n };\n this._waitWindow = false; // SSH-level backpressure\n this._chunkcb = undefined;\n this._buffer = [];\n this.type = chanInfo.type;\n this.subtype = undefined;\n this.incoming = chanInfo.incoming;\n this.outgoing = chanInfo.outgoing;\n this.stderr = fakeStderr;\n this.readable = true;\n }\n\n // This handles incoming data to parse\n push(data) {\n if (data === null) {\n cleanupRequests(this);\n if (!this.readable)\n return;\n // No more incoming data from the remote side\n this.readable = false;\n this.emit('end');\n return;\n }\n /*\n uint32 length\n byte type\n byte[length - 1] data payload\n */\n let p = 0;\n\n while (p < data.length) {\n if (this._pktLenBytes < 4) {\n let nb = Math.min(4 - this._pktLenBytes, data.length - p);\n this._pktLenBytes += nb;\n\n while (nb--)\n this._pktLen = (this._pktLen << 8) + data[p++];\n\n if (this._pktLenBytes < 4)\n return;\n if (this._pktLen === 0)\n return doFatalSFTPError(this, 'Invalid packet length');\n if (this._pktLen > this._maxInPktLen) {\n const max = this._maxInPktLen;\n return doFatalSFTPError(\n this,\n `Packet length ${this._pktLen} exceeds max length of ${max}`\n );\n }\n if (p >= data.length)\n return;\n }\n if (this._pktPos < this._pktLen) {\n const nb = Math.min(this._pktLen - this._pktPos, data.length - p);\n if (p !== 0 || nb !== data.length) {\n if (nb === this._pktLen) {\n this._pkt = new FastBuffer(data.buffer, data.byteOffset + p, nb);\n } else {\n if (!this._pkt)\n this._pkt = Buffer.allocUnsafe(this._pktLen);\n this._pkt.set(\n new Uint8Array(data.buffer, data.byteOffset + p, nb),\n this._pktPos\n );\n }\n } else if (nb === this._pktLen) {\n this._pkt = data;\n } else {\n if (!this._pkt)\n this._pkt = Buffer.allocUnsafe(this._pktLen);\n this._pkt.set(data, this._pktPos);\n }\n p += nb;\n this._pktPos += nb;\n if (this._pktPos < this._pktLen)\n return;\n }\n\n const type = this._pkt[0];\n const payload = this._pkt;\n\n // Prepare for next packet\n this._pktLen = 0;\n this._pktLenBytes = 0;\n this._pkt = undefined;\n this._pktPos = 0;\n\n const handler = (this.server\n ? SERVER_HANDLERS[type]\n : CLIENT_HANDLERS[type]);\n if (!handler)\n return doFatalSFTPError(this, `Unknown packet type ${type}`);\n\n if (this._version === -1) {\n if (this.server) {\n if (type !== REQUEST.INIT)\n return doFatalSFTPError(this, `Expected INIT packet, got ${type}`);\n } else if (type !== RESPONSE.VERSION) {\n return doFatalSFTPError(this, `Expected VERSION packet, got ${type}`);\n }\n }\n\n if (handler(this, payload) === false)\n return;\n }\n }\n\n end() {\n this.destroy();\n }\n destroy() {\n if (this.outgoing.state === 'open' || this.outgoing.state === 'eof') {\n this.outgoing.state = 'closing';\n this._protocol.channelClose(this.outgoing.id);\n }\n }\n _init() {\n this._init = noop;\n if (!this.server)\n sendOrBuffer(this, CLIENT_VERSION_BUFFER);\n }\n\n // ===========================================================================\n // Client-specific ===========================================================\n // ===========================================================================\n createReadStream(path, options) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n return new ReadStream(this, path, options);\n }\n createWriteStream(path, options) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n return new WriteStream(this, path, options);\n }\n open(path, flags_, attrs, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (typeof attrs === 'function') {\n cb = attrs;\n attrs = undefined;\n }\n\n const flags = (typeof flags_ === 'number' ? flags_ : stringToFlags(flags_));\n if (flags === null)\n throw new Error(`Unknown flags string: ${flags_}`);\n\n let attrsFlags = 0;\n let attrsLen = 0;\n if (typeof attrs === 'string' || typeof attrs === 'number')\n attrs = { mode: attrs };\n if (typeof attrs === 'object' && attrs !== null) {\n attrs = attrsToBytes(attrs);\n attrsFlags = attrs.flags;\n attrsLen = attrs.nb;\n }\n\n /*\n uint32 id\n string filename\n uint32 pflags\n ATTRS attrs\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen + 4 + 4 + attrsLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.OPEN;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n writeUInt32BE(buf, flags, p += pathLen);\n writeUInt32BE(buf, attrsFlags, p += 4);\n if (attrsLen) {\n p += 4;\n\n if (attrsLen === ATTRS_BUF.length)\n buf.set(ATTRS_BUF, p);\n else\n bufferCopy(ATTRS_BUF, buf, 0, attrsLen, p);\n\n p += attrsLen;\n }\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} OPEN`\n );\n }\n close(handle, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n\n /*\n uint32 id\n string handle\n */\n const handleLen = handle.length;\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + handleLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.CLOSE;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, handleLen, p);\n buf.set(handle, p += 4);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} CLOSE`\n );\n }\n read(handle, buf, off, len, position, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n if (!Buffer.isBuffer(buf))\n throw new Error('buffer is not a Buffer');\n if (off >= buf.length)\n throw new Error('offset is out of bounds');\n if (off + len > buf.length)\n throw new Error('length extends beyond buffer');\n if (position === null)\n throw new Error('null position currently unsupported');\n\n read_(this, handle, buf, off, len, position, cb);\n }\n readData(handle, buf, off, len, position, cb) {\n // Backwards compatibility\n this.read(handle, buf, off, len, position, cb);\n }\n write(handle, buf, off, len, position, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n if (!Buffer.isBuffer(buf))\n throw new Error('buffer is not a Buffer');\n if (off > buf.length)\n throw new Error('offset is out of bounds');\n if (off + len > buf.length)\n throw new Error('length extends beyond buffer');\n if (position === null)\n throw new Error('null position currently unsupported');\n\n if (!len) {\n cb && process.nextTick(cb, undefined, 0);\n return;\n }\n\n const maxDataLen = this._maxWriteLen;\n const overflow = Math.max(len - maxDataLen, 0);\n const origPosition = position;\n\n if (overflow)\n len = maxDataLen;\n\n /*\n uint32 id\n string handle\n uint64 offset\n string data\n */\n const handleLen = handle.length;\n let p = 9;\n const out = Buffer.allocUnsafe(4 + 1 + 4 + 4 + handleLen + 8 + 4 + len);\n\n writeUInt32BE(out, out.length - 4, 0);\n out[4] = REQUEST.WRITE;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(out, reqid, 5);\n\n writeUInt32BE(out, handleLen, p);\n out.set(handle, p += 4);\n p += handleLen;\n for (let i = 7; i >= 0; --i) {\n out[p + i] = position & 0xFF;\n position /= 256;\n }\n writeUInt32BE(out, len, p += 8);\n bufferCopy(buf, out, off, off + len, p += 4);\n\n this._requests[reqid] = {\n cb: (err) => {\n if (err) {\n if (typeof cb === 'function')\n cb(err);\n } else if (overflow) {\n this.write(handle,\n buf,\n off + len,\n overflow,\n origPosition + len,\n cb);\n } else if (typeof cb === 'function') {\n cb(undefined, off + len);\n }\n }\n };\n\n const isSent = sendOrBuffer(this, out);\n if (this._debug) {\n const how = (isSent ? 'Sent' : 'Buffered');\n this._debug(`SFTP: Outbound: ${how} WRITE (id:${reqid})`);\n }\n }\n writeData(handle, buf, off, len, position, cb) {\n // Backwards compatibility\n this.write(handle, buf, off, len, position, cb);\n }\n fastGet(remotePath, localPath, opts, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n fastXfer(this, fs, remotePath, localPath, opts, cb);\n }\n fastPut(localPath, remotePath, opts, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n fastXfer(fs, this, localPath, remotePath, opts, cb);\n }\n readFile(path, options, callback_) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n let callback;\n if (typeof callback_ === 'function') {\n callback = callback_;\n } else if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n\n if (typeof options === 'string')\n options = { encoding: options, flag: 'r' };\n else if (!options)\n options = { encoding: null, flag: 'r' };\n else if (typeof options !== 'object')\n throw new TypeError('Bad arguments');\n\n const encoding = options.encoding;\n if (encoding && !Buffer.isEncoding(encoding))\n throw new Error(`Unknown encoding: ${encoding}`);\n\n // First stat the file, so we know the size.\n let size;\n let buffer; // Single buffer with file data\n let buffers; // List for when size is unknown\n let pos = 0;\n let handle;\n\n // SFTPv3 does not support using -1 for read position, so we have to track\n // read position manually\n let bytesRead = 0;\n\n const flag = options.flag || 'r';\n\n const read = () => {\n if (size === 0) {\n buffer = Buffer.allocUnsafe(8192);\n this.read(handle, buffer, 0, 8192, bytesRead, afterRead);\n } else {\n this.read(handle, buffer, pos, size - pos, bytesRead, afterRead);\n }\n };\n\n const afterRead = (er, nbytes) => {\n let eof;\n if (er) {\n eof = (er.code === STATUS_CODE.EOF);\n if (!eof) {\n return this.close(handle, () => {\n return callback && callback(er);\n });\n }\n } else {\n eof = false;\n }\n\n if (eof || (size === 0 && nbytes === 0))\n return close();\n\n bytesRead += nbytes;\n pos += nbytes;\n if (size !== 0) {\n if (pos === size)\n close();\n else\n read();\n } else {\n // Unknown size, just read until we don't get bytes.\n buffers.push(bufferSlice(buffer, 0, nbytes));\n read();\n }\n };\n afterRead._wantEOFError = true;\n\n const close = () => {\n this.close(handle, (er) => {\n if (size === 0) {\n // Collect the data into the buffers list.\n buffer = Buffer.concat(buffers, pos);\n } else if (pos < size) {\n buffer = bufferSlice(buffer, 0, pos);\n }\n\n if (encoding)\n buffer = buffer.toString(encoding);\n return callback && callback(er, buffer);\n });\n };\n\n this.open(path, flag, 0o666, (er, handle_) => {\n if (er)\n return callback && callback(er);\n handle = handle_;\n\n const tryStat = (er, st) => {\n if (er) {\n // Try stat() for sftp servers that may not support fstat() for\n // whatever reason\n this.stat(path, (er_, st_) => {\n if (er_) {\n return this.close(handle, () => {\n callback && callback(er);\n });\n }\n tryStat(null, st_);\n });\n return;\n }\n\n size = st.size || 0;\n if (size === 0) {\n // The kernel lies about many files.\n // Go ahead and try to read some bytes.\n buffers = [];\n return read();\n }\n\n buffer = Buffer.allocUnsafe(size);\n read();\n };\n this.fstat(handle, tryStat);\n });\n }\n writeFile(path, data, options, callback_) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n let callback;\n if (typeof callback_ === 'function') {\n callback = callback_;\n } else if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n\n if (typeof options === 'string')\n options = { encoding: options, mode: 0o666, flag: 'w' };\n else if (!options)\n options = { encoding: 'utf8', mode: 0o666, flag: 'w' };\n else if (typeof options !== 'object')\n throw new TypeError('Bad arguments');\n\n if (options.encoding && !Buffer.isEncoding(options.encoding))\n throw new Error(`Unknown encoding: ${options.encoding}`);\n\n const flag = options.flag || 'w';\n this.open(path, flag, options.mode, (openErr, handle) => {\n if (openErr) {\n callback && callback(openErr);\n } else {\n const buffer = (Buffer.isBuffer(data)\n ? data\n : Buffer.from('' + data, options.encoding || 'utf8'));\n const position = (/a/.test(flag) ? null : 0);\n\n // SFTPv3 does not support the notion of 'current position'\n // (null position), so we just attempt to append to the end of the file\n // instead\n if (position === null) {\n const tryStat = (er, st) => {\n if (er) {\n // Try stat() for sftp servers that may not support fstat() for\n // whatever reason\n this.stat(path, (er_, st_) => {\n if (er_) {\n return this.close(handle, () => {\n callback && callback(er);\n });\n }\n tryStat(null, st_);\n });\n return;\n }\n writeAll(this, handle, buffer, 0, buffer.length, st.size, callback);\n };\n this.fstat(handle, tryStat);\n return;\n }\n writeAll(this, handle, buffer, 0, buffer.length, position, callback);\n }\n });\n }\n appendFile(path, data, options, callback_) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n let callback;\n if (typeof callback_ === 'function') {\n callback = callback_;\n } else if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n\n if (typeof options === 'string')\n options = { encoding: options, mode: 0o666, flag: 'a' };\n else if (!options)\n options = { encoding: 'utf8', mode: 0o666, flag: 'a' };\n else if (typeof options !== 'object')\n throw new TypeError('Bad arguments');\n\n if (!options.flag)\n options = Object.assign({ flag: 'a' }, options);\n this.writeFile(path, data, options, callback);\n }\n exists(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n this.stat(path, (err) => {\n cb && cb(err ? false : true);\n });\n }\n unlink(filename, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string filename\n */\n const fnameLen = Buffer.byteLength(filename);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + fnameLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.REMOVE;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, fnameLen, p);\n buf.utf8Write(filename, p += 4, fnameLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} REMOVE`\n );\n }\n rename(oldPath, newPath, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string oldpath\n string newpath\n */\n const oldLen = Buffer.byteLength(oldPath);\n const newLen = Buffer.byteLength(newPath);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + oldLen + 4 + newLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.RENAME;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, oldLen, p);\n buf.utf8Write(oldPath, p += 4, oldLen);\n writeUInt32BE(buf, newLen, p += oldLen);\n buf.utf8Write(newPath, p += 4, newLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} RENAME`\n );\n }\n mkdir(path, attrs, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n let flags = 0;\n let attrsLen = 0;\n\n if (typeof attrs === 'function') {\n cb = attrs;\n attrs = undefined;\n }\n if (typeof attrs === 'object' && attrs !== null) {\n attrs = attrsToBytes(attrs);\n flags = attrs.flags;\n attrsLen = attrs.nb;\n }\n\n /*\n uint32 id\n string path\n ATTRS attrs\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen + 4 + attrsLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.MKDIR;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n writeUInt32BE(buf, flags, p += pathLen);\n if (attrsLen) {\n p += 4;\n\n if (attrsLen === ATTRS_BUF.length)\n buf.set(ATTRS_BUF, p);\n else\n bufferCopy(ATTRS_BUF, buf, 0, attrsLen, p);\n\n p += attrsLen;\n }\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} MKDIR`\n );\n }\n rmdir(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.RMDIR;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} RMDIR`\n );\n }\n readdir(where, opts, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (typeof opts === 'function') {\n cb = opts;\n opts = {};\n }\n if (typeof opts !== 'object' || opts === null)\n opts = {};\n\n const doFilter = (opts && opts.full ? false : true);\n\n if (!Buffer.isBuffer(where) && typeof where !== 'string')\n throw new Error('missing directory handle or path');\n\n if (typeof where === 'string') {\n const entries = [];\n let e = 0;\n\n const reread = (err, handle) => {\n if (err)\n return cb(err);\n\n this.readdir(handle, opts, (err, list) => {\n const eof = (err && err.code === STATUS_CODE.EOF);\n\n if (err && !eof)\n return this.close(handle, () => cb(err));\n\n if (eof) {\n return this.close(handle, (err) => {\n if (err)\n return cb(err);\n cb(undefined, entries);\n });\n }\n\n for (let i = 0; i < list.length; ++i, ++e)\n entries[e] = list[i];\n\n reread(undefined, handle);\n });\n };\n return this.opendir(where, reread);\n }\n\n /*\n uint32 id\n string handle\n */\n const handleLen = where.length;\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + handleLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.READDIR;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, handleLen, p);\n buf.set(where, p += 4);\n\n this._requests[reqid] = {\n cb: (doFilter\n ? (err, list) => {\n if (typeof cb !== 'function')\n return;\n if (err)\n return cb(err);\n\n for (let i = list.length - 1; i >= 0; --i) {\n if (list[i].filename === '.' || list[i].filename === '..')\n list.splice(i, 1);\n }\n\n cb(undefined, list);\n }\n : cb)\n };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} READDIR`\n );\n }\n fstat(handle, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n\n /*\n uint32 id\n string handle\n */\n const handleLen = handle.length;\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + handleLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.FSTAT;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, handleLen, p);\n buf.set(handle, p += 4);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} FSTAT`\n );\n }\n stat(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.STAT;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} STAT`\n );\n }\n lstat(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.LSTAT;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} LSTAT`\n );\n }\n opendir(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.OPENDIR;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} OPENDIR`\n );\n }\n setstat(path, attrs, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n let flags = 0;\n let attrsLen = 0;\n\n if (typeof attrs === 'object' && attrs !== null) {\n attrs = attrsToBytes(attrs);\n flags = attrs.flags;\n attrsLen = attrs.nb;\n } else if (typeof attrs === 'function') {\n cb = attrs;\n }\n\n /*\n uint32 id\n string path\n ATTRS attrs\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen + 4 + attrsLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.SETSTAT;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n writeUInt32BE(buf, flags, p += pathLen);\n if (attrsLen) {\n p += 4;\n\n if (attrsLen === ATTRS_BUF.length)\n buf.set(ATTRS_BUF, p);\n else\n bufferCopy(ATTRS_BUF, buf, 0, attrsLen, p);\n\n p += attrsLen;\n }\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} SETSTAT`\n );\n }\n fsetstat(handle, attrs, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n\n let flags = 0;\n let attrsLen = 0;\n\n if (typeof attrs === 'object' && attrs !== null) {\n attrs = attrsToBytes(attrs);\n flags = attrs.flags;\n attrsLen = attrs.nb;\n } else if (typeof attrs === 'function') {\n cb = attrs;\n }\n\n /*\n uint32 id\n string handle\n ATTRS attrs\n */\n const handleLen = handle.length;\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + handleLen + 4 + attrsLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.FSETSTAT;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, handleLen, p);\n buf.set(handle, p += 4);\n writeUInt32BE(buf, flags, p += handleLen);\n if (attrsLen) {\n p += 4;\n\n if (attrsLen === ATTRS_BUF.length)\n buf.set(ATTRS_BUF, p);\n else\n bufferCopy(ATTRS_BUF, buf, 0, attrsLen, p);\n\n p += attrsLen;\n }\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} FSETSTAT`\n );\n }\n futimes(handle, atime, mtime, cb) {\n return this.fsetstat(handle, {\n atime: toUnixTimestamp(atime),\n mtime: toUnixTimestamp(mtime)\n }, cb);\n }\n utimes(path, atime, mtime, cb) {\n return this.setstat(path, {\n atime: toUnixTimestamp(atime),\n mtime: toUnixTimestamp(mtime)\n }, cb);\n }\n fchown(handle, uid, gid, cb) {\n return this.fsetstat(handle, {\n uid: uid,\n gid: gid\n }, cb);\n }\n chown(path, uid, gid, cb) {\n return this.setstat(path, {\n uid: uid,\n gid: gid\n }, cb);\n }\n fchmod(handle, mode, cb) {\n return this.fsetstat(handle, {\n mode: mode\n }, cb);\n }\n chmod(path, mode, cb) {\n return this.setstat(path, {\n mode: mode\n }, cb);\n }\n readlink(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.READLINK;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = {\n cb: (err, names) => {\n if (typeof cb !== 'function')\n return;\n if (err)\n return cb(err);\n if (!names || !names.length)\n return cb(new Error('Response missing link info'));\n cb(undefined, names[0].filename);\n }\n };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} READLINK`\n );\n }\n symlink(targetPath, linkPath, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string linkpath\n string targetpath\n */\n const linkLen = Buffer.byteLength(linkPath);\n const targetLen = Buffer.byteLength(targetPath);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + linkLen + 4 + targetLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.SYMLINK;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n if (this._isOpenSSH) {\n // OpenSSH has linkpath and targetpath positions switched\n writeUInt32BE(buf, targetLen, p);\n buf.utf8Write(targetPath, p += 4, targetLen);\n writeUInt32BE(buf, linkLen, p += targetLen);\n buf.utf8Write(linkPath, p += 4, linkLen);\n } else {\n writeUInt32BE(buf, linkLen, p);\n buf.utf8Write(linkPath, p += 4, linkLen);\n writeUInt32BE(buf, targetLen, p += linkLen);\n buf.utf8Write(targetPath, p += 4, targetLen);\n }\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} SYMLINK`\n );\n }\n realpath(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n /*\n uint32 id\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.REALPATH;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, pathLen, p);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = {\n cb: (err, names) => {\n if (typeof cb !== 'function')\n return;\n if (err)\n return cb(err);\n if (!names || !names.length)\n return cb(new Error('Response missing path info'));\n cb(undefined, names[0].filename);\n }\n };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} REALPATH`\n );\n }\n // extended requests\n ext_openssh_rename(oldPath, newPath, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['posix-rename@openssh.com'];\n if (!ext || ext !== '1')\n throw new Error('Server does not support this extended request');\n\n /*\n uint32 id\n string \"posix-rename@openssh.com\"\n string oldpath\n string newpath\n */\n const oldLen = Buffer.byteLength(oldPath);\n const newLen = Buffer.byteLength(newPath);\n let p = 9;\n const buf =\n Buffer.allocUnsafe(4 + 1 + 4 + 4 + 24 + 4 + oldLen + 4 + newLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 24, p);\n buf.utf8Write('posix-rename@openssh.com', p += 4, 24);\n writeUInt32BE(buf, oldLen, p += 24);\n buf.utf8Write(oldPath, p += 4, oldLen);\n writeUInt32BE(buf, newLen, p += oldLen);\n buf.utf8Write(newPath, p += 4, newLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const which = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${which} posix-rename@openssh.com`);\n }\n }\n ext_openssh_statvfs(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['statvfs@openssh.com'];\n if (!ext || ext !== '2')\n throw new Error('Server does not support this extended request');\n\n /*\n uint32 id\n string \"statvfs@openssh.com\"\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + 19 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 19, p);\n buf.utf8Write('statvfs@openssh.com', p += 4, 19);\n writeUInt32BE(buf, pathLen, p += 19);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = { extended: 'statvfs@openssh.com', cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const which = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${which} statvfs@openssh.com`);\n }\n }\n ext_openssh_fstatvfs(handle, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['fstatvfs@openssh.com'];\n if (!ext || ext !== '2')\n throw new Error('Server does not support this extended request');\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n\n /*\n uint32 id\n string \"fstatvfs@openssh.com\"\n string handle\n */\n const handleLen = handle.length;\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + 20 + 4 + handleLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 20, p);\n buf.utf8Write('fstatvfs@openssh.com', p += 4, 20);\n writeUInt32BE(buf, handleLen, p += 20);\n buf.set(handle, p += 4);\n\n this._requests[reqid] = { extended: 'fstatvfs@openssh.com', cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const which = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${which} fstatvfs@openssh.com`);\n }\n }\n ext_openssh_hardlink(oldPath, newPath, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['hardlink@openssh.com'];\n if (ext !== '1')\n throw new Error('Server does not support this extended request');\n\n /*\n uint32 id\n string \"hardlink@openssh.com\"\n string oldpath\n string newpath\n */\n const oldLen = Buffer.byteLength(oldPath);\n const newLen = Buffer.byteLength(newPath);\n let p = 9;\n const buf =\n Buffer.allocUnsafe(4 + 1 + 4 + 4 + 20 + 4 + oldLen + 4 + newLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 20, p);\n buf.utf8Write('hardlink@openssh.com', p += 4, 20);\n writeUInt32BE(buf, oldLen, p += 20);\n buf.utf8Write(oldPath, p += 4, oldLen);\n writeUInt32BE(buf, newLen, p += oldLen);\n buf.utf8Write(newPath, p += 4, newLen);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const which = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${which} hardlink@openssh.com`);\n }\n }\n ext_openssh_fsync(handle, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['fsync@openssh.com'];\n if (ext !== '1')\n throw new Error('Server does not support this extended request');\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n\n /*\n uint32 id\n string \"fsync@openssh.com\"\n string handle\n */\n const handleLen = handle.length;\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + 17 + 4 + handleLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 17, p);\n buf.utf8Write('fsync@openssh.com', p += 4, 17);\n writeUInt32BE(buf, handleLen, p += 17);\n buf.set(handle, p += 4);\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} fsync@openssh.com`\n );\n }\n ext_openssh_lsetstat(path, attrs, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['lsetstat@openssh.com'];\n if (ext !== '1')\n throw new Error('Server does not support this extended request');\n\n let flags = 0;\n let attrsLen = 0;\n\n if (typeof attrs === 'object' && attrs !== null) {\n attrs = attrsToBytes(attrs);\n flags = attrs.flags;\n attrsLen = attrs.nb;\n } else if (typeof attrs === 'function') {\n cb = attrs;\n }\n\n /*\n uint32 id\n string \"lsetstat@openssh.com\"\n string path\n ATTRS attrs\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf =\n Buffer.allocUnsafe(4 + 1 + 4 + 4 + 20 + 4 + pathLen + 4 + attrsLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 20, p);\n buf.utf8Write('lsetstat@openssh.com', p += 4, 20);\n\n writeUInt32BE(buf, pathLen, p += 20);\n buf.utf8Write(path, p += 4, pathLen);\n\n writeUInt32BE(buf, flags, p += pathLen);\n if (attrsLen) {\n p += 4;\n\n if (attrsLen === ATTRS_BUF.length)\n buf.set(ATTRS_BUF, p);\n else\n bufferCopy(ATTRS_BUF, buf, 0, attrsLen, p);\n\n p += attrsLen;\n }\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const status = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${status} lsetstat@openssh.com`);\n }\n }\n ext_openssh_expandPath(path, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['expand-path@openssh.com'];\n if (ext !== '1')\n throw new Error('Server does not support this extended request');\n\n /*\n uint32 id\n string \"expand-path@openssh.com\"\n string path\n */\n const pathLen = Buffer.byteLength(path);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + 23 + 4 + pathLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 23, p);\n buf.utf8Write('expand-path@openssh.com', p += 4, 23);\n\n writeUInt32BE(buf, pathLen, p += 20);\n buf.utf8Write(path, p += 4, pathLen);\n\n this._requests[reqid] = {\n cb: (err, names) => {\n if (typeof cb !== 'function')\n return;\n if (err)\n return cb(err);\n if (!names || !names.length)\n return cb(new Error('Response missing expanded path'));\n cb(undefined, names[0].filename);\n }\n };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const status = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${status} expand-path@openssh.com`);\n }\n }\n ext_copy_data(srcHandle, srcOffset, len, dstHandle, dstOffset, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['copy-data'];\n if (ext !== '1')\n throw new Error('Server does not support this extended request');\n\n if (!Buffer.isBuffer(srcHandle))\n throw new Error('Source handle is not a Buffer');\n\n if (!Buffer.isBuffer(dstHandle))\n throw new Error('Destination handle is not a Buffer');\n\n /*\n uint32 id\n string \"copy-data\"\n string read-from-handle\n uint64 read-from-offset\n uint64 read-data-length\n string write-to-handle\n uint64 write-to-offset\n */\n let p = 0;\n const buf = Buffer.allocUnsafe(\n 4 + 1\n + 4\n + 4 + 9\n + 4 + srcHandle.length\n + 8\n + 8\n + 4 + dstHandle.length\n + 8\n );\n\n writeUInt32BE(buf, buf.length - 4, p);\n p += 4;\n\n buf[p] = REQUEST.EXTENDED;\n ++p;\n\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, p);\n p += 4;\n\n writeUInt32BE(buf, 9, p);\n p += 4;\n buf.utf8Write('copy-data', p, 9);\n p += 9;\n\n writeUInt32BE(buf, srcHandle.length, p);\n p += 4;\n buf.set(srcHandle, p);\n p += srcHandle.length;\n\n for (let i = 7; i >= 0; --i) {\n buf[p + i] = srcOffset & 0xFF;\n srcOffset /= 256;\n }\n p += 8;\n\n for (let i = 7; i >= 0; --i) {\n buf[p + i] = len & 0xFF;\n len /= 256;\n }\n p += 8;\n\n writeUInt32BE(buf, dstHandle.length, p);\n p += 4;\n buf.set(dstHandle, p);\n p += dstHandle.length;\n\n for (let i = 7; i >= 0; --i) {\n buf[p + i] = dstOffset & 0xFF;\n dstOffset /= 256;\n }\n\n this._requests[reqid] = { cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const status = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${status} copy-data`);\n }\n }\n ext_home_dir(username, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['home-directory'];\n if (ext !== '1')\n throw new Error('Server does not support this extended request');\n\n if (typeof username !== 'string')\n throw new TypeError('username is not a string');\n\n /*\n uint32 id\n string \"home-directory\"\n string username\n */\n let p = 0;\n const usernameLen = Buffer.byteLength(username);\n const buf = Buffer.allocUnsafe(\n 4 + 1\n + 4\n + 4 + 14\n + 4 + usernameLen\n );\n\n writeUInt32BE(buf, buf.length - 4, p);\n p += 4;\n\n buf[p] = REQUEST.EXTENDED;\n ++p;\n\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, p);\n p += 4;\n\n writeUInt32BE(buf, 14, p);\n p += 4;\n buf.utf8Write('home-directory', p, 14);\n p += 14;\n\n writeUInt32BE(buf, usernameLen, p);\n p += 4;\n buf.utf8Write(username, p, usernameLen);\n p += usernameLen;\n\n this._requests[reqid] = {\n cb: (err, names) => {\n if (typeof cb !== 'function')\n return;\n if (err)\n return cb(err);\n if (!names || !names.length)\n return cb(new Error('Response missing home directory'));\n cb(undefined, names[0].filename);\n }\n };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const status = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${status} home-directory`);\n }\n }\n ext_users_groups(uids, gids, cb) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n const ext = this._extensions['users-groups-by-id@openssh.com'];\n if (ext !== '1')\n throw new Error('Server does not support this extended request');\n\n if (!Array.isArray(uids))\n throw new TypeError('uids is not an array');\n for (const val of uids) {\n if (!Number.isInteger(val) || val < 0 || val > (2 ** 32 - 1))\n throw new Error('uid values must all be 32-bit unsigned integers');\n }\n if (!Array.isArray(gids))\n throw new TypeError('gids is not an array');\n for (const val of gids) {\n if (!Number.isInteger(val) || val < 0 || val > (2 ** 32 - 1))\n throw new Error('gid values must all be 32-bit unsigned integers');\n }\n\n /*\n uint32 id\n string \"users-groups-by-id@openssh.com\"\n string uids\n uint32 uid1\n ...\n string gids\n uint32 gid1\n ...\n */\n let p = 0;\n const buf = Buffer.allocUnsafe(\n 4 + 1\n + 4\n + 4 + 30\n + 4 + (4 * uids.length)\n + 4 + (4 * gids.length)\n );\n\n writeUInt32BE(buf, buf.length - 4, p);\n p += 4;\n\n buf[p] = REQUEST.EXTENDED;\n ++p;\n\n const reqid = this._writeReqid = (this._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, p);\n p += 4;\n\n writeUInt32BE(buf, 30, p);\n p += 4;\n buf.utf8Write('users-groups-by-id@openssh.com', p, 30);\n p += 30;\n\n writeUInt32BE(buf, 4 * uids.length, p);\n p += 4;\n for (const val of uids) {\n writeUInt32BE(buf, val, p);\n p += 4;\n }\n\n writeUInt32BE(buf, 4 * gids.length, p);\n p += 4;\n for (const val of gids) {\n writeUInt32BE(buf, val, p);\n p += 4;\n }\n\n this._requests[reqid] = { extended: 'users-groups-by-id@openssh.com', cb };\n\n const isBuffered = sendOrBuffer(this, buf);\n if (this._debug) {\n const status = (isBuffered ? 'Buffered' : 'Sending');\n this._debug(`SFTP: Outbound: ${status} users-groups-by-id@openssh.com`);\n }\n }\n // ===========================================================================\n // Server-specific ===========================================================\n // ===========================================================================\n handle(reqid, handle) {\n if (!this.server)\n throw new Error('Server-only method called in client mode');\n\n if (!Buffer.isBuffer(handle))\n throw new Error('handle is not a Buffer');\n\n const handleLen = handle.length;\n\n if (handleLen > 256)\n throw new Error('handle too large (> 256 bytes)');\n\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + handleLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = RESPONSE.HANDLE;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, handleLen, p);\n if (handleLen)\n buf.set(handle, p += 4);\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} HANDLE`\n );\n }\n status(reqid, code, message) {\n if (!this.server)\n throw new Error('Server-only method called in client mode');\n\n if (!VALID_STATUS_CODES.has(code))\n throw new Error(`Bad status code: ${code}`);\n\n message || (message = '');\n\n const msgLen = Buffer.byteLength(message);\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + 4 + msgLen + 4);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = RESPONSE.STATUS;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, code, p);\n\n writeUInt32BE(buf, msgLen, p += 4);\n p += 4;\n if (msgLen) {\n buf.utf8Write(message, p, msgLen);\n p += msgLen;\n }\n\n writeUInt32BE(buf, 0, p); // Empty language tag\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} STATUS`\n );\n }\n data(reqid, data, encoding) {\n if (!this.server)\n throw new Error('Server-only method called in client mode');\n\n const isBuffer = Buffer.isBuffer(data);\n\n if (!isBuffer && typeof data !== 'string')\n throw new Error('data is not a Buffer or string');\n\n let isUTF8;\n if (!isBuffer && !encoding) {\n encoding = undefined;\n isUTF8 = true;\n }\n\n const dataLen = (\n isBuffer\n ? data.length\n : Buffer.byteLength(data, encoding)\n );\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + dataLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = RESPONSE.DATA;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, dataLen, p);\n if (dataLen) {\n if (isBuffer)\n buf.set(data, p += 4);\n else if (isUTF8)\n buf.utf8Write(data, p += 4, dataLen);\n else\n buf.write(data, p += 4, dataLen, encoding);\n }\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} DATA`\n );\n }\n name(reqid, names) {\n if (!this.server)\n throw new Error('Server-only method called in client mode');\n\n if (!Array.isArray(names)) {\n if (typeof names !== 'object' || names === null)\n throw new Error('names is not an object or array');\n names = [ names ];\n }\n\n const count = names.length;\n let namesLen = 0;\n let nameAttrs;\n const attrs = [];\n\n for (let i = 0; i < count; ++i) {\n const name = names[i];\n const filename = (\n !name || !name.filename || typeof name.filename !== 'string'\n ? ''\n : name.filename\n );\n namesLen += 4 + Buffer.byteLength(filename);\n const longname = (\n !name || !name.longname || typeof name.longname !== 'string'\n ? ''\n : name.longname\n );\n namesLen += 4 + Buffer.byteLength(longname);\n\n if (typeof name.attrs === 'object' && name.attrs !== null) {\n nameAttrs = attrsToBytes(name.attrs);\n namesLen += 4 + nameAttrs.nb;\n\n if (nameAttrs.nb) {\n let bytes;\n\n if (nameAttrs.nb === ATTRS_BUF.length) {\n bytes = new Uint8Array(ATTRS_BUF);\n } else {\n bytes = new Uint8Array(nameAttrs.nb);\n bufferCopy(ATTRS_BUF, bytes, 0, nameAttrs.nb, 0);\n }\n\n nameAttrs.bytes = bytes;\n }\n\n attrs.push(nameAttrs);\n } else {\n namesLen += 4;\n attrs.push(null);\n }\n }\n\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + namesLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = RESPONSE.NAME;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, count, p);\n\n p += 4;\n\n for (let i = 0; i < count; ++i) {\n const name = names[i];\n\n {\n const filename = (\n !name || !name.filename || typeof name.filename !== 'string'\n ? ''\n : name.filename\n );\n const len = Buffer.byteLength(filename);\n writeUInt32BE(buf, len, p);\n p += 4;\n if (len) {\n buf.utf8Write(filename, p, len);\n p += len;\n }\n }\n\n {\n const longname = (\n !name || !name.longname || typeof name.longname !== 'string'\n ? ''\n : name.longname\n );\n const len = Buffer.byteLength(longname);\n writeUInt32BE(buf, len, p);\n p += 4;\n if (len) {\n buf.utf8Write(longname, p, len);\n p += len;\n }\n }\n\n const attr = attrs[i];\n if (attr) {\n writeUInt32BE(buf, attr.flags, p);\n p += 4;\n if (attr.flags && attr.bytes) {\n buf.set(attr.bytes, p);\n p += attr.nb;\n }\n } else {\n writeUInt32BE(buf, 0, p);\n p += 4;\n }\n }\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} NAME`\n );\n }\n attrs(reqid, attrs) {\n if (!this.server)\n throw new Error('Server-only method called in client mode');\n\n if (typeof attrs !== 'object' || attrs === null)\n throw new Error('attrs is not an object');\n\n attrs = attrsToBytes(attrs);\n const flags = attrs.flags;\n const attrsLen = attrs.nb;\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + attrsLen);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = RESPONSE.ATTRS;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, flags, p);\n if (attrsLen) {\n p += 4;\n\n if (attrsLen === ATTRS_BUF.length)\n buf.set(ATTRS_BUF, p);\n else\n bufferCopy(ATTRS_BUF, buf, 0, attrsLen, p);\n\n p += attrsLen;\n }\n\n const isBuffered = sendOrBuffer(this, buf);\n this._debug && this._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} ATTRS`\n );\n }\n}\n\nfunction tryCreateBuffer(size) {\n try {\n return Buffer.allocUnsafe(size);\n } catch (ex) {\n return ex;\n }\n}\n\nfunction read_(self, handle, buf, off, len, position, cb, req_) {\n const maxDataLen = self._maxReadLen;\n const overflow = Math.max(len - maxDataLen, 0);\n\n if (overflow)\n len = maxDataLen;\n\n /*\n uint32 id\n string handle\n uint64 offset\n uint32 len\n */\n const handleLen = handle.length;\n let p = 9;\n let pos = position;\n const out = Buffer.allocUnsafe(4 + 1 + 4 + 4 + handleLen + 8 + 4);\n\n writeUInt32BE(out, out.length - 4, 0);\n out[4] = REQUEST.READ;\n const reqid = self._writeReqid = (self._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(out, reqid, 5);\n\n writeUInt32BE(out, handleLen, p);\n out.set(handle, p += 4);\n p += handleLen;\n for (let i = 7; i >= 0; --i) {\n out[p + i] = pos & 0xFF;\n pos /= 256;\n }\n writeUInt32BE(out, len, p += 8);\n\n if (typeof cb !== 'function')\n cb = noop;\n\n const req = (req_ || {\n nb: 0,\n position,\n off,\n origOff: off,\n len: undefined,\n overflow: undefined,\n cb: (err, data, nb) => {\n const len = req.len;\n const overflow = req.overflow;\n\n if (err) {\n if (cb._wantEOFError || err.code !== STATUS_CODE.EOF)\n return cb(err);\n } else if (nb > len) {\n return cb(new Error('Received more data than requested'));\n } else if (nb === len && overflow) {\n req.nb += nb;\n req.position += nb;\n req.off += nb;\n read_(self, handle, buf, req.off, overflow, req.position, cb, req);\n return;\n }\n\n nb = (nb || 0);\n if (req.origOff === 0 && buf.length === req.nb)\n data = buf;\n else\n data = bufferSlice(buf, req.origOff, req.origOff + req.nb + nb);\n cb(undefined, req.nb + nb, data, req.position);\n },\n buffer: undefined,\n });\n\n req.len = len;\n req.overflow = overflow;\n\n // TODO: avoid creating multiple buffer slices when we need to re-call read_()\n // because of overflow\n req.buffer = bufferSlice(buf, off, off + len);\n\n self._requests[reqid] = req;\n\n const isBuffered = sendOrBuffer(self, out);\n self._debug && self._debug(\n `SFTP: Outbound: ${isBuffered ? 'Buffered' : 'Sending'} READ`\n );\n}\n\nfunction fastXfer(src, dst, srcPath, dstPath, opts, cb) {\n let concurrency = 64;\n let chunkSize = 32768;\n let onstep;\n let mode;\n let fileSize;\n\n if (typeof opts === 'function') {\n cb = opts;\n } else if (typeof opts === 'object' && opts !== null) {\n if (typeof opts.concurrency === 'number'\n && opts.concurrency > 0\n && !isNaN(opts.concurrency)) {\n concurrency = opts.concurrency;\n }\n if (typeof opts.chunkSize === 'number'\n && opts.chunkSize > 0\n && !isNaN(opts.chunkSize)) {\n chunkSize = opts.chunkSize;\n }\n if (typeof opts.fileSize === 'number'\n && opts.fileSize > 0\n && !isNaN(opts.fileSize)) {\n fileSize = opts.fileSize;\n }\n if (typeof opts.step === 'function')\n onstep = opts.step;\n\n if (typeof opts.mode === 'string' || typeof opts.mode === 'number')\n mode = modeNum(opts.mode);\n }\n\n // Internal state variables\n let fsize;\n let pdst = 0;\n let total = 0;\n let hadError = false;\n let srcHandle;\n let dstHandle;\n let readbuf;\n let bufsize = chunkSize * concurrency;\n\n function onerror(err) {\n if (hadError)\n return;\n\n hadError = true;\n\n let left = 0;\n let cbfinal;\n\n if (srcHandle || dstHandle) {\n cbfinal = () => {\n if (--left === 0)\n cb(err);\n };\n if (srcHandle && (src === fs || src.outgoing.state === 'open'))\n ++left;\n if (dstHandle && (dst === fs || dst.outgoing.state === 'open'))\n ++left;\n if (srcHandle && (src === fs || src.outgoing.state === 'open'))\n src.close(srcHandle, cbfinal);\n if (dstHandle && (dst === fs || dst.outgoing.state === 'open'))\n dst.close(dstHandle, cbfinal);\n } else {\n cb(err);\n }\n }\n\n src.open(srcPath, 'r', (err, sourceHandle) => {\n if (err)\n return onerror(err);\n\n srcHandle = sourceHandle;\n\n if (fileSize === undefined)\n src.fstat(srcHandle, tryStat);\n else\n tryStat(null, { size: fileSize });\n\n function tryStat(err, attrs) {\n if (err) {\n if (src !== fs) {\n // Try stat() for sftp servers that may not support fstat() for\n // whatever reason\n src.stat(srcPath, (err_, attrs_) => {\n if (err_)\n return onerror(err);\n tryStat(null, attrs_);\n });\n return;\n }\n return onerror(err);\n }\n fsize = attrs.size;\n\n dst.open(dstPath, 'w', (err, destHandle) => {\n if (err)\n return onerror(err);\n\n dstHandle = destHandle;\n\n if (fsize <= 0)\n return onerror();\n\n // Use less memory where possible\n while (bufsize > fsize) {\n if (concurrency === 1) {\n bufsize = fsize;\n break;\n }\n bufsize -= chunkSize;\n --concurrency;\n }\n\n readbuf = tryCreateBuffer(bufsize);\n if (readbuf instanceof Error)\n return onerror(readbuf);\n\n if (mode !== undefined) {\n dst.fchmod(dstHandle, mode, function tryAgain(err) {\n if (err) {\n // Try chmod() for sftp servers that may not support fchmod()\n // for whatever reason\n dst.chmod(dstPath, mode, (err_) => tryAgain());\n return;\n }\n startReads();\n });\n } else {\n startReads();\n }\n\n function onread(err, nb, data, dstpos, datapos, origChunkLen) {\n if (err)\n return onerror(err);\n\n datapos = datapos || 0;\n\n dst.write(dstHandle, readbuf, datapos, nb, dstpos, writeCb);\n\n function writeCb(err) {\n if (err)\n return onerror(err);\n\n total += nb;\n onstep && onstep(total, nb, fsize);\n\n if (nb < origChunkLen)\n return singleRead(datapos, dstpos + nb, origChunkLen - nb);\n\n if (total === fsize) {\n dst.close(dstHandle, (err) => {\n dstHandle = undefined;\n if (err)\n return onerror(err);\n src.close(srcHandle, (err) => {\n srcHandle = undefined;\n if (err)\n return onerror(err);\n cb();\n });\n });\n return;\n }\n\n if (pdst >= fsize)\n return;\n\n const chunk =\n (pdst + chunkSize > fsize ? fsize - pdst : chunkSize);\n singleRead(datapos, pdst, chunk);\n pdst += chunk;\n }\n }\n\n function makeCb(psrc, pdst, chunk) {\n return (err, nb, data) => {\n onread(err, nb, data, pdst, psrc, chunk);\n };\n }\n\n function singleRead(psrc, pdst, chunk) {\n src.read(srcHandle,\n readbuf,\n psrc,\n chunk,\n pdst,\n makeCb(psrc, pdst, chunk));\n }\n\n function startReads() {\n let reads = 0;\n let psrc = 0;\n while (pdst < fsize && reads < concurrency) {\n const chunk =\n (pdst + chunkSize > fsize ? fsize - pdst : chunkSize);\n singleRead(psrc, pdst, chunk);\n psrc += chunk;\n pdst += chunk;\n ++reads;\n }\n }\n });\n }\n });\n}\n\nfunction writeAll(sftp, handle, buffer, offset, length, position, callback_) {\n const callback = (typeof callback_ === 'function' ? callback_ : undefined);\n\n sftp.write(handle,\n buffer,\n offset,\n length,\n position,\n (writeErr, written) => {\n if (writeErr) {\n return sftp.close(handle, () => {\n callback && callback(writeErr);\n });\n }\n if (written === length) {\n sftp.close(handle, callback);\n } else {\n offset += written;\n length -= written;\n position += written;\n writeAll(sftp, handle, buffer, offset, length, position, callback);\n }\n });\n}\n\nclass Stats {\n constructor(initial) {\n this.mode = (initial && initial.mode);\n this.uid = (initial && initial.uid);\n this.gid = (initial && initial.gid);\n this.size = (initial && initial.size);\n this.atime = (initial && initial.atime);\n this.mtime = (initial && initial.mtime);\n this.extended = (initial && initial.extended);\n }\n isDirectory() {\n return ((this.mode & constants.S_IFMT) === constants.S_IFDIR);\n }\n isFile() {\n return ((this.mode & constants.S_IFMT) === constants.S_IFREG);\n }\n isBlockDevice() {\n return ((this.mode & constants.S_IFMT) === constants.S_IFBLK);\n }\n isCharacterDevice() {\n return ((this.mode & constants.S_IFMT) === constants.S_IFCHR);\n }\n isSymbolicLink() {\n return ((this.mode & constants.S_IFMT) === constants.S_IFLNK);\n }\n isFIFO() {\n return ((this.mode & constants.S_IFMT) === constants.S_IFIFO);\n }\n isSocket() {\n return ((this.mode & constants.S_IFMT) === constants.S_IFSOCK);\n }\n}\n\nfunction attrsToBytes(attrs) {\n let flags = 0;\n let nb = 0;\n\n if (typeof attrs === 'object' && attrs !== null) {\n if (typeof attrs.size === 'number') {\n flags |= ATTR.SIZE;\n const val = attrs.size;\n // Big Endian\n ATTRS_BUF[nb++] = val / 72057594037927940; // 2**56\n ATTRS_BUF[nb++] = val / 281474976710656; // 2**48\n ATTRS_BUF[nb++] = val / 1099511627776; // 2**40\n ATTRS_BUF[nb++] = val / 4294967296; // 2**32\n ATTRS_BUF[nb++] = val / 16777216; // 2**24\n ATTRS_BUF[nb++] = val / 65536; // 2**16\n ATTRS_BUF[nb++] = val / 256; // 2**8\n ATTRS_BUF[nb++] = val;\n }\n if (typeof attrs.uid === 'number' && typeof attrs.gid === 'number') {\n flags |= ATTR.UIDGID;\n const uid = attrs.uid;\n const gid = attrs.gid;\n // Big Endian\n ATTRS_BUF[nb++] = uid >>> 24;\n ATTRS_BUF[nb++] = uid >>> 16;\n ATTRS_BUF[nb++] = uid >>> 8;\n ATTRS_BUF[nb++] = uid;\n ATTRS_BUF[nb++] = gid >>> 24;\n ATTRS_BUF[nb++] = gid >>> 16;\n ATTRS_BUF[nb++] = gid >>> 8;\n ATTRS_BUF[nb++] = gid;\n }\n if (typeof attrs.mode === 'number' || typeof attrs.mode === 'string') {\n const mode = modeNum(attrs.mode);\n flags |= ATTR.PERMISSIONS;\n // Big Endian\n ATTRS_BUF[nb++] = mode >>> 24;\n ATTRS_BUF[nb++] = mode >>> 16;\n ATTRS_BUF[nb++] = mode >>> 8;\n ATTRS_BUF[nb++] = mode;\n }\n if ((typeof attrs.atime === 'number' || isDate(attrs.atime))\n && (typeof attrs.mtime === 'number' || isDate(attrs.mtime))) {\n const atime = toUnixTimestamp(attrs.atime);\n const mtime = toUnixTimestamp(attrs.mtime);\n\n flags |= ATTR.ACMODTIME;\n // Big Endian\n ATTRS_BUF[nb++] = atime >>> 24;\n ATTRS_BUF[nb++] = atime >>> 16;\n ATTRS_BUF[nb++] = atime >>> 8;\n ATTRS_BUF[nb++] = atime;\n ATTRS_BUF[nb++] = mtime >>> 24;\n ATTRS_BUF[nb++] = mtime >>> 16;\n ATTRS_BUF[nb++] = mtime >>> 8;\n ATTRS_BUF[nb++] = mtime;\n }\n // TODO: extended attributes\n }\n\n return { flags, nb };\n}\n\nfunction toUnixTimestamp(time) {\n // eslint-disable-next-line no-self-compare\n if (typeof time === 'number' && time === time) // Valid, non-NaN number\n return time;\n if (isDate(time))\n return parseInt(time.getTime() / 1000, 10);\n throw new Error(`Cannot parse time: ${time}`);\n}\n\nfunction modeNum(mode) {\n // eslint-disable-next-line no-self-compare\n if (typeof mode === 'number' && mode === mode) // Valid, non-NaN number\n return mode;\n if (typeof mode === 'string')\n return modeNum(parseInt(mode, 8));\n throw new Error(`Cannot parse mode: ${mode}`);\n}\n\nconst stringFlagMap = {\n 'r': OPEN_MODE.READ,\n 'r+': OPEN_MODE.READ | OPEN_MODE.WRITE,\n 'w': OPEN_MODE.TRUNC | OPEN_MODE.CREAT | OPEN_MODE.WRITE,\n 'wx': OPEN_MODE.TRUNC | OPEN_MODE.CREAT | OPEN_MODE.WRITE | OPEN_MODE.EXCL,\n 'xw': OPEN_MODE.TRUNC | OPEN_MODE.CREAT | OPEN_MODE.WRITE | OPEN_MODE.EXCL,\n 'w+': OPEN_MODE.TRUNC | OPEN_MODE.CREAT | OPEN_MODE.READ | OPEN_MODE.WRITE,\n 'wx+': OPEN_MODE.TRUNC | OPEN_MODE.CREAT | OPEN_MODE.READ | OPEN_MODE.WRITE\n | OPEN_MODE.EXCL,\n 'xw+': OPEN_MODE.TRUNC | OPEN_MODE.CREAT | OPEN_MODE.READ | OPEN_MODE.WRITE\n | OPEN_MODE.EXCL,\n 'a': OPEN_MODE.APPEND | OPEN_MODE.CREAT | OPEN_MODE.WRITE,\n 'ax': OPEN_MODE.APPEND | OPEN_MODE.CREAT | OPEN_MODE.WRITE | OPEN_MODE.EXCL,\n 'xa': OPEN_MODE.APPEND | OPEN_MODE.CREAT | OPEN_MODE.WRITE | OPEN_MODE.EXCL,\n 'a+': OPEN_MODE.APPEND | OPEN_MODE.CREAT | OPEN_MODE.READ | OPEN_MODE.WRITE,\n 'ax+': OPEN_MODE.APPEND | OPEN_MODE.CREAT | OPEN_MODE.READ | OPEN_MODE.WRITE\n | OPEN_MODE.EXCL,\n 'xa+': OPEN_MODE.APPEND | OPEN_MODE.CREAT | OPEN_MODE.READ | OPEN_MODE.WRITE\n | OPEN_MODE.EXCL\n};\n\nfunction stringToFlags(str) {\n const flags = stringFlagMap[str];\n return (flags !== undefined ? flags : null);\n}\n\nconst flagsToString = (() => {\n const stringFlagMapKeys = Object.keys(stringFlagMap);\n return (flags) => {\n for (let i = 0; i < stringFlagMapKeys.length; ++i) {\n const key = stringFlagMapKeys[i];\n if (stringFlagMap[key] === flags)\n return key;\n }\n return null;\n };\n})();\n\nfunction readAttrs(biOpt) {\n /*\n uint32 flags\n uint64 size present only if flag SSH_FILEXFER_ATTR_SIZE\n uint32 uid present only if flag SSH_FILEXFER_ATTR_UIDGID\n uint32 gid present only if flag SSH_FILEXFER_ATTR_UIDGID\n uint32 permissions present only if flag SSH_FILEXFER_ATTR_PERMISSIONS\n uint32 atime present only if flag SSH_FILEXFER_ACMODTIME\n uint32 mtime present only if flag SSH_FILEXFER_ACMODTIME\n uint32 extended_count present only if flag SSH_FILEXFER_ATTR_EXTENDED\n string extended_type\n string extended_data\n ... more extended data (extended_type - extended_data pairs),\n so that number of pairs equals extended_count\n */\n const flags = bufferParser.readUInt32BE();\n if (flags === undefined)\n return;\n\n const attrs = new Stats();\n if (flags & ATTR.SIZE) {\n const size = bufferParser.readUInt64BE(biOpt);\n if (size === undefined)\n return;\n attrs.size = size;\n }\n\n if (flags & ATTR.UIDGID) {\n const uid = bufferParser.readUInt32BE();\n const gid = bufferParser.readUInt32BE();\n if (gid === undefined)\n return;\n attrs.uid = uid;\n attrs.gid = gid;\n }\n\n if (flags & ATTR.PERMISSIONS) {\n const mode = bufferParser.readUInt32BE();\n if (mode === undefined)\n return;\n attrs.mode = mode;\n }\n\n if (flags & ATTR.ACMODTIME) {\n const atime = bufferParser.readUInt32BE();\n const mtime = bufferParser.readUInt32BE();\n if (mtime === undefined)\n return;\n attrs.atime = atime;\n attrs.mtime = mtime;\n }\n\n if (flags & ATTR.EXTENDED) {\n const count = bufferParser.readUInt32BE();\n if (count === undefined)\n return;\n const extended = {};\n for (let i = 0; i < count; ++i) {\n const type = bufferParser.readString(true);\n const data = bufferParser.readString();\n if (data === undefined)\n return;\n extended[type] = data;\n }\n attrs.extended = extended;\n }\n\n return attrs;\n}\n\nfunction sendOrBuffer(sftp, payload) {\n const ret = tryWritePayload(sftp, payload);\n if (ret !== undefined) {\n sftp._buffer.push(ret);\n return false;\n }\n return true;\n}\n\nfunction tryWritePayload(sftp, payload) {\n const outgoing = sftp.outgoing;\n if (outgoing.state !== 'open')\n return;\n\n if (outgoing.window === 0) {\n sftp._waitWindow = true;\n sftp._chunkcb = drainBuffer;\n return payload;\n }\n\n let ret;\n const len = payload.length;\n let p = 0;\n\n while (len - p > 0 && outgoing.window > 0) {\n const actualLen = Math.min(len - p, outgoing.window, outgoing.packetSize);\n outgoing.window -= actualLen;\n if (outgoing.window === 0) {\n sftp._waitWindow = true;\n sftp._chunkcb = drainBuffer;\n }\n\n if (p === 0 && actualLen === len) {\n sftp._protocol.channelData(sftp.outgoing.id, payload);\n } else {\n sftp._protocol.channelData(sftp.outgoing.id,\n bufferSlice(payload, p, p + actualLen));\n }\n\n p += actualLen;\n }\n\n if (len - p > 0) {\n if (p > 0)\n ret = bufferSlice(payload, p, len);\n else\n ret = payload; // XXX: should never get here?\n }\n\n return ret;\n}\n\nfunction drainBuffer() {\n this._chunkcb = undefined;\n const buffer = this._buffer;\n let i = 0;\n while (i < buffer.length) {\n const payload = buffer[i];\n const ret = tryWritePayload(this, payload);\n if (ret !== undefined) {\n if (ret !== payload)\n buffer[i] = ret;\n if (i > 0)\n this._buffer = buffer.slice(i);\n return;\n }\n ++i;\n }\n if (i > 0)\n this._buffer = [];\n}\n\nfunction doFatalSFTPError(sftp, msg, noDebug) {\n const err = new Error(msg);\n err.level = 'sftp-protocol';\n if (!noDebug && sftp._debug)\n sftp._debug(`SFTP: Inbound: ${msg}`);\n sftp.emit('error', err);\n sftp.destroy();\n cleanupRequests(sftp);\n return false;\n}\n\nfunction cleanupRequests(sftp) {\n const keys = Object.keys(sftp._requests);\n if (keys.length === 0)\n return;\n\n const reqs = sftp._requests;\n sftp._requests = {};\n const err = new Error('No response from server');\n for (let i = 0; i < keys.length; ++i) {\n const req = reqs[keys[i]];\n if (typeof req.cb === 'function')\n req.cb(err);\n }\n}\n\nfunction requestLimits(sftp, cb) {\n /*\n uint32 id\n string \"limits@openssh.com\"\n */\n let p = 9;\n const buf = Buffer.allocUnsafe(4 + 1 + 4 + 4 + 18);\n\n writeUInt32BE(buf, buf.length - 4, 0);\n buf[4] = REQUEST.EXTENDED;\n const reqid = sftp._writeReqid = (sftp._writeReqid + 1) & MAX_REQID;\n writeUInt32BE(buf, reqid, 5);\n\n writeUInt32BE(buf, 18, p);\n buf.utf8Write('limits@openssh.com', p += 4, 18);\n\n sftp._requests[reqid] = { extended: 'limits@openssh.com', cb };\n\n const isBuffered = sendOrBuffer(sftp, buf);\n if (sftp._debug) {\n const which = (isBuffered ? 'Buffered' : 'Sending');\n sftp._debug(`SFTP: Outbound: ${which} limits@openssh.com`);\n }\n}\n\nconst CLIENT_HANDLERS = {\n [RESPONSE.VERSION]: (sftp, payload) => {\n if (sftp._version !== -1)\n return doFatalSFTPError(sftp, 'Duplicate VERSION packet');\n\n const extensions = {};\n\n /*\n uint32 version\n <extension data>\n */\n bufferParser.init(payload, 1);\n let version = bufferParser.readUInt32BE();\n while (bufferParser.avail()) {\n const extName = bufferParser.readString(true);\n const extData = bufferParser.readString(true);\n if (extData === undefined) {\n version = undefined;\n break;\n }\n extensions[extName] = extData;\n }\n bufferParser.clear();\n\n if (version === undefined)\n return doFatalSFTPError(sftp, 'Malformed VERSION packet');\n\n if (sftp._debug) {\n const names = Object.keys(extensions);\n if (names.length) {\n sftp._debug(\n `SFTP: Inbound: Received VERSION (v${version}, exts:${names})`\n );\n } else {\n sftp._debug(`SFTP: Inbound: Received VERSION (v${version})`);\n }\n }\n\n sftp._version = version;\n sftp._extensions = extensions;\n\n if (extensions['limits@openssh.com'] === '1') {\n return requestLimits(sftp, (err, limits) => {\n if (!err) {\n if (limits.maxPktLen > 0)\n sftp._maxOutPktLen = limits.maxPktLen;\n if (limits.maxReadLen > 0)\n sftp._maxReadLen = limits.maxReadLen;\n if (limits.maxWriteLen > 0)\n sftp._maxWriteLen = limits.maxWriteLen;\n sftp.maxOpenHandles = (\n limits.maxOpenHandles > 0 ? limits.maxOpenHandles : Infinity\n );\n }\n sftp.emit('ready');\n });\n }\n\n sftp.emit('ready');\n },\n [RESPONSE.STATUS]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n uint32 error/status code\n string error message (ISO-10646 UTF-8)\n string language tag\n */\n const errorCode = bufferParser.readUInt32BE();\n const errorMsg = bufferParser.readString(true);\n bufferParser.clear();\n\n // Note: we avoid checking that the error message and language tag are in\n // the packet because there are some broken implementations that incorrectly\n // omit them. The language tag in general was never really used amongst ssh\n // implementations, so in the case of a missing error message we just\n // default to something sensible.\n\n if (sftp._debug) {\n const jsonMsg = JSON.stringify(errorMsg);\n sftp._debug(\n `SFTP: Inbound: Received STATUS (id:${reqID}, ${errorCode}, ${jsonMsg})`\n );\n }\n const req = sftp._requests[reqID];\n delete sftp._requests[reqID];\n if (req && typeof req.cb === 'function') {\n if (errorCode === STATUS_CODE.OK) {\n req.cb();\n return;\n }\n const err = new Error(errorMsg\n || STATUS_CODE_STR[errorCode]\n || 'Unknown status');\n err.code = errorCode;\n req.cb(err);\n }\n },\n [RESPONSE.HANDLE]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string handle\n */\n const handle = bufferParser.readString();\n bufferParser.clear();\n\n if (handle === undefined) {\n if (reqID !== undefined)\n delete sftp._requests[reqID];\n return doFatalSFTPError(sftp, 'Malformed HANDLE packet');\n }\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received HANDLE (id:${reqID})`);\n\n const req = sftp._requests[reqID];\n delete sftp._requests[reqID];\n if (req && typeof req.cb === 'function')\n req.cb(undefined, handle);\n },\n [RESPONSE.DATA]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n let req;\n if (reqID !== undefined) {\n req = sftp._requests[reqID];\n delete sftp._requests[reqID];\n }\n /*\n string data\n */\n if (req && typeof req.cb === 'function') {\n if (req.buffer) {\n // We have already pre-allocated space to store the data\n\n const nb = bufferParser.readString(req.buffer);\n bufferParser.clear();\n\n if (nb !== undefined) {\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received DATA (id:${reqID}, ${nb})`\n );\n req.cb(undefined, req.buffer, nb);\n return;\n }\n } else {\n const data = bufferParser.readString();\n bufferParser.clear();\n\n if (data !== undefined) {\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received DATA (id:${reqID}, ${data.length})`\n );\n req.cb(undefined, data);\n return;\n }\n }\n } else {\n const nb = bufferParser.skipString();\n bufferParser.clear();\n if (nb !== undefined) {\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received DATA (id:${reqID}, ${nb})`\n );\n return;\n }\n }\n\n return doFatalSFTPError(sftp, 'Malformed DATA packet');\n },\n [RESPONSE.NAME]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n let req;\n if (reqID !== undefined) {\n req = sftp._requests[reqID];\n delete sftp._requests[reqID];\n }\n /*\n uint32 count\n repeats count times:\n string filename\n string longname\n ATTRS attrs\n */\n const count = bufferParser.readUInt32BE();\n if (count !== undefined) {\n let names = [];\n for (let i = 0; i < count; ++i) {\n // We are going to assume UTF-8 for filenames despite the SFTPv3\n // spec not specifying an encoding because the specs for newer\n // versions of the protocol all explicitly specify UTF-8 for\n // filenames\n const filename = bufferParser.readString(true);\n\n // `longname` only exists in SFTPv3 and since it typically will\n // contain the filename, we assume it is also UTF-8\n const longname = bufferParser.readString(true);\n\n const attrs = readAttrs(sftp._biOpt);\n if (attrs === undefined) {\n names = undefined;\n break;\n }\n names.push({ filename, longname, attrs });\n }\n if (names !== undefined) {\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received NAME (id:${reqID}, ${names.length})`\n );\n bufferParser.clear();\n if (req && typeof req.cb === 'function')\n req.cb(undefined, names);\n return;\n }\n }\n\n bufferParser.clear();\n return doFatalSFTPError(sftp, 'Malformed NAME packet');\n },\n [RESPONSE.ATTRS]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n let req;\n if (reqID !== undefined) {\n req = sftp._requests[reqID];\n delete sftp._requests[reqID];\n }\n /*\n ATTRS attrs\n */\n const attrs = readAttrs(sftp._biOpt);\n bufferParser.clear();\n if (attrs !== undefined) {\n sftp._debug && sftp._debug(`SFTP: Inbound: Received ATTRS (id:${reqID})`);\n if (req && typeof req.cb === 'function')\n req.cb(undefined, attrs);\n return;\n }\n\n return doFatalSFTPError(sftp, 'Malformed ATTRS packet');\n },\n [RESPONSE.EXTENDED]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n if (reqID !== undefined) {\n const req = sftp._requests[reqID];\n if (req) {\n delete sftp._requests[reqID];\n switch (req.extended) {\n case 'statvfs@openssh.com':\n case 'fstatvfs@openssh.com': {\n /*\n uint64 f_bsize // file system block size\n uint64 f_frsize // fundamental fs block size\n uint64 f_blocks // number of blocks (unit f_frsize)\n uint64 f_bfree // free blocks in file system\n uint64 f_bavail // free blocks for non-root\n uint64 f_files // total file inodes\n uint64 f_ffree // free file inodes\n uint64 f_favail // free file inodes for to non-root\n uint64 f_fsid // file system id\n uint64 f_flag // bit mask of f_flag values\n uint64 f_namemax // maximum filename length\n */\n const biOpt = sftp._biOpt;\n const stats = {\n f_bsize: bufferParser.readUInt64BE(biOpt),\n f_frsize: bufferParser.readUInt64BE(biOpt),\n f_blocks: bufferParser.readUInt64BE(biOpt),\n f_bfree: bufferParser.readUInt64BE(biOpt),\n f_bavail: bufferParser.readUInt64BE(biOpt),\n f_files: bufferParser.readUInt64BE(biOpt),\n f_ffree: bufferParser.readUInt64BE(biOpt),\n f_favail: bufferParser.readUInt64BE(biOpt),\n f_sid: bufferParser.readUInt64BE(biOpt),\n f_flag: bufferParser.readUInt64BE(biOpt),\n f_namemax: bufferParser.readUInt64BE(biOpt),\n };\n if (stats.f_namemax === undefined)\n break;\n if (sftp._debug) {\n sftp._debug(\n 'SFTP: Inbound: Received EXTENDED_REPLY '\n + `(id:${reqID}, ${req.extended})`\n );\n }\n bufferParser.clear();\n if (typeof req.cb === 'function')\n req.cb(undefined, stats);\n return;\n }\n case 'limits@openssh.com': {\n /*\n uint64 max-packet-length\n uint64 max-read-length\n uint64 max-write-length\n uint64 max-open-handles\n */\n const limits = {\n maxPktLen: bufferParser.readUInt64BE(),\n maxReadLen: bufferParser.readUInt64BE(),\n maxWriteLen: bufferParser.readUInt64BE(),\n maxOpenHandles: bufferParser.readUInt64BE(),\n };\n if (limits.maxOpenHandles === undefined)\n break;\n if (sftp._debug) {\n sftp._debug(\n 'SFTP: Inbound: Received EXTENDED_REPLY '\n + `(id:${reqID}, ${req.extended})`\n );\n }\n bufferParser.clear();\n if (typeof req.cb === 'function')\n req.cb(undefined, limits);\n return;\n }\n case 'users-groups-by-id@openssh.com': {\n /*\n string usernames\n string username1\n ...\n string groupnames\n string groupname1\n ...\n */\n const usernameCount = bufferParser.readUInt32BE();\n if (usernameCount === undefined)\n break;\n const usernames = new Array(usernameCount);\n for (let i = 0; i < usernames.length; ++i)\n usernames[i] = bufferParser.readString(true);\n\n const groupnameCount = bufferParser.readUInt32BE();\n if (groupnameCount === undefined)\n break;\n const groupnames = new Array(groupnameCount);\n for (let i = 0; i < groupnames.length; ++i)\n groupnames[i] = bufferParser.readString(true);\n if (groupnames.length > 0\n && groupnames[groupnames.length - 1] === undefined) {\n break;\n }\n\n if (sftp._debug) {\n sftp._debug(\n 'SFTP: Inbound: Received EXTENDED_REPLY '\n + `(id:${reqID}, ${req.extended})`\n );\n }\n bufferParser.clear();\n if (typeof req.cb === 'function')\n req.cb(undefined, usernames, groupnames);\n return;\n }\n default:\n // Unknown extended request\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received EXTENDED_REPLY (id:${reqID}, ???)`\n );\n bufferParser.clear();\n if (typeof req.cb === 'function')\n req.cb();\n return;\n }\n } else {\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received EXTENDED_REPLY (id:${reqID}, ???)`\n );\n bufferParser.clear();\n return;\n }\n }\n\n bufferParser.clear();\n return doFatalSFTPError(sftp, 'Malformed EXTENDED_REPLY packet');\n },\n};\nconst SERVER_HANDLERS = {\n [REQUEST.INIT]: (sftp, payload) => {\n if (sftp._version !== -1)\n return doFatalSFTPError(sftp, 'Duplicate INIT packet');\n\n const extensions = {};\n\n /*\n uint32 version\n <extension data>\n */\n bufferParser.init(payload, 1);\n let version = bufferParser.readUInt32BE();\n while (bufferParser.avail()) {\n const extName = bufferParser.readString(true);\n const extData = bufferParser.readString(true);\n if (extData === undefined) {\n version = undefined;\n break;\n }\n extensions[extName] = extData;\n }\n bufferParser.clear();\n\n if (version === undefined)\n return doFatalSFTPError(sftp, 'Malformed INIT packet');\n\n if (sftp._debug) {\n const names = Object.keys(extensions);\n if (names.length) {\n sftp._debug(\n `SFTP: Inbound: Received INIT (v${version}, exts:${names})`\n );\n } else {\n sftp._debug(`SFTP: Inbound: Received INIT (v${version})`);\n }\n }\n\n sendOrBuffer(sftp, SERVER_VERSION_BUFFER);\n\n sftp._version = version;\n sftp._extensions = extensions;\n sftp.emit('ready');\n },\n [REQUEST.OPEN]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string filename\n uint32 pflags\n ATTRS attrs\n */\n const filename = bufferParser.readString(true);\n const pflags = bufferParser.readUInt32BE();\n const attrs = readAttrs(sftp._biOpt);\n bufferParser.clear();\n\n if (attrs === undefined)\n return doFatalSFTPError(sftp, 'Malformed OPEN packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received OPEN (id:${reqID})`);\n\n if (!sftp.emit('OPEN', reqID, filename, pflags, attrs)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.CLOSE]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string handle\n */\n const handle = bufferParser.readString();\n bufferParser.clear();\n\n if (handle === undefined || handle.length > 256)\n return doFatalSFTPError(sftp, 'Malformed CLOSE packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received CLOSE (id:${reqID})`);\n\n if (!sftp.emit('CLOSE', reqID, handle)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.READ]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string handle\n uint64 offset\n uint32 len\n */\n const handle = bufferParser.readString();\n const offset = bufferParser.readUInt64BE(sftp._biOpt);\n const len = bufferParser.readUInt32BE();\n bufferParser.clear();\n\n if (len === undefined || handle.length > 256)\n return doFatalSFTPError(sftp, 'Malformed READ packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received READ (id:${reqID})`);\n\n if (!sftp.emit('READ', reqID, handle, offset, len)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.WRITE]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string handle\n uint64 offset\n string data\n */\n const handle = bufferParser.readString();\n const offset = bufferParser.readUInt64BE(sftp._biOpt);\n const data = bufferParser.readString();\n bufferParser.clear();\n\n if (data === undefined || handle.length > 256)\n return doFatalSFTPError(sftp, 'Malformed WRITE packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received WRITE (id:${reqID})`);\n\n if (!sftp.emit('WRITE', reqID, handle, offset, data)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.LSTAT]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n */\n const path = bufferParser.readString(true);\n bufferParser.clear();\n\n if (path === undefined)\n return doFatalSFTPError(sftp, 'Malformed LSTAT packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received LSTAT (id:${reqID})`);\n\n if (!sftp.emit('LSTAT', reqID, path)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.FSTAT]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string handle\n */\n const handle = bufferParser.readString();\n bufferParser.clear();\n\n if (handle === undefined || handle.length > 256)\n return doFatalSFTPError(sftp, 'Malformed FSTAT packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received FSTAT (id:${reqID})`);\n\n if (!sftp.emit('FSTAT', reqID, handle)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.SETSTAT]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n ATTRS attrs\n */\n const path = bufferParser.readString(true);\n const attrs = readAttrs(sftp._biOpt);\n bufferParser.clear();\n\n if (attrs === undefined)\n return doFatalSFTPError(sftp, 'Malformed SETSTAT packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received SETSTAT (id:${reqID})`);\n\n if (!sftp.emit('SETSTAT', reqID, path, attrs)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.FSETSTAT]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string handle\n ATTRS attrs\n */\n const handle = bufferParser.readString();\n const attrs = readAttrs(sftp._biOpt);\n bufferParser.clear();\n\n if (attrs === undefined || handle.length > 256)\n return doFatalSFTPError(sftp, 'Malformed FSETSTAT packet');\n\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received FSETSTAT (id:${reqID})`\n );\n\n if (!sftp.emit('FSETSTAT', reqID, handle, attrs)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.OPENDIR]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n */\n const path = bufferParser.readString(true);\n bufferParser.clear();\n\n if (path === undefined)\n return doFatalSFTPError(sftp, 'Malformed OPENDIR packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received OPENDIR (id:${reqID})`);\n\n if (!sftp.emit('OPENDIR', reqID, path)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.READDIR]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string handle\n */\n const handle = bufferParser.readString();\n bufferParser.clear();\n\n if (handle === undefined || handle.length > 256)\n return doFatalSFTPError(sftp, 'Malformed READDIR packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received READDIR (id:${reqID})`);\n\n if (!sftp.emit('READDIR', reqID, handle)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.REMOVE]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n */\n const path = bufferParser.readString(true);\n bufferParser.clear();\n\n if (path === undefined)\n return doFatalSFTPError(sftp, 'Malformed REMOVE packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received REMOVE (id:${reqID})`);\n\n if (!sftp.emit('REMOVE', reqID, path)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.MKDIR]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n ATTRS attrs\n */\n const path = bufferParser.readString(true);\n const attrs = readAttrs(sftp._biOpt);\n bufferParser.clear();\n\n if (attrs === undefined)\n return doFatalSFTPError(sftp, 'Malformed MKDIR packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received MKDIR (id:${reqID})`);\n\n if (!sftp.emit('MKDIR', reqID, path, attrs)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.RMDIR]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n */\n const path = bufferParser.readString(true);\n bufferParser.clear();\n\n if (path === undefined)\n return doFatalSFTPError(sftp, 'Malformed RMDIR packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received RMDIR (id:${reqID})`);\n\n if (!sftp.emit('RMDIR', reqID, path)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.REALPATH]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n */\n const path = bufferParser.readString(true);\n bufferParser.clear();\n\n if (path === undefined)\n return doFatalSFTPError(sftp, 'Malformed REALPATH packet');\n\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received REALPATH (id:${reqID})`\n );\n\n if (!sftp.emit('REALPATH', reqID, path)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.STAT]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n */\n const path = bufferParser.readString(true);\n bufferParser.clear();\n\n if (path === undefined)\n return doFatalSFTPError(sftp, 'Malformed STAT packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received STAT (id:${reqID})`);\n\n if (!sftp.emit('STAT', reqID, path)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.RENAME]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string oldpath\n string newpath\n */\n const oldPath = bufferParser.readString(true);\n const newPath = bufferParser.readString(true);\n bufferParser.clear();\n\n if (newPath === undefined)\n return doFatalSFTPError(sftp, 'Malformed RENAME packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received RENAME (id:${reqID})`);\n\n if (!sftp.emit('RENAME', reqID, oldPath, newPath)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.READLINK]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string path\n */\n const path = bufferParser.readString(true);\n bufferParser.clear();\n\n if (path === undefined)\n return doFatalSFTPError(sftp, 'Malformed READLINK packet');\n\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received READLINK (id:${reqID})`\n );\n\n if (!sftp.emit('READLINK', reqID, path)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.SYMLINK]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string linkpath\n string targetpath\n */\n const linkPath = bufferParser.readString(true);\n const targetPath = bufferParser.readString(true);\n bufferParser.clear();\n\n if (targetPath === undefined)\n return doFatalSFTPError(sftp, 'Malformed SYMLINK packet');\n\n sftp._debug && sftp._debug(`SFTP: Inbound: Received SYMLINK (id:${reqID})`);\n\n let handled;\n if (sftp._isOpenSSH) {\n // OpenSSH has linkpath and targetpath positions switched\n handled = sftp.emit('SYMLINK', reqID, targetPath, linkPath);\n } else {\n handled = sftp.emit('SYMLINK', reqID, linkPath, targetPath);\n }\n if (!handled) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n [REQUEST.EXTENDED]: (sftp, payload) => {\n bufferParser.init(payload, 1);\n const reqID = bufferParser.readUInt32BE();\n /*\n string extended-request\n ... any request-specific data ...\n */\n const extName = bufferParser.readString(true);\n if (extName === undefined) {\n bufferParser.clear();\n return doFatalSFTPError(sftp, 'Malformed EXTENDED packet');\n }\n\n let extData;\n if (bufferParser.avail())\n extData = bufferParser.readRaw();\n bufferParser.clear();\n\n sftp._debug && sftp._debug(\n `SFTP: Inbound: Received EXTENDED (id:${reqID})`\n );\n\n if (!sftp.emit('EXTENDED', reqID, extName, extData)) {\n // Automatically reject request if no handler for request type\n sftp.status(reqID, STATUS_CODE.OP_UNSUPPORTED);\n }\n },\n};\n\n// =============================================================================\n// ReadStream/WriteStream-related ==============================================\n// =============================================================================\nconst {\n ERR_INVALID_ARG_TYPE,\n ERR_OUT_OF_RANGE,\n validateNumber\n} = require('./node-fs-compat');\n\nconst kMinPoolSpace = 128;\n\nlet pool;\n// It can happen that we expect to read a large chunk of data, and reserve\n// a large chunk of the pool accordingly, but the read() call only filled\n// a portion of it. If a concurrently executing read() then uses the same pool,\n// the \"reserved\" portion cannot be used, so we allow it to be re-used as a\n// new pool later.\nconst poolFragments = [];\n\nfunction allocNewPool(poolSize) {\n if (poolFragments.length > 0)\n pool = poolFragments.pop();\n else\n pool = Buffer.allocUnsafe(poolSize);\n pool.used = 0;\n}\n\n// Check the `this.start` and `this.end` of stream.\nfunction checkPosition(pos, name) {\n if (!Number.isSafeInteger(pos)) {\n validateNumber(pos, name);\n if (!Number.isInteger(pos))\n throw new ERR_OUT_OF_RANGE(name, 'an integer', pos);\n throw new ERR_OUT_OF_RANGE(name, '>= 0 and <= 2 ** 53 - 1', pos);\n }\n if (pos < 0)\n throw new ERR_OUT_OF_RANGE(name, '>= 0 and <= 2 ** 53 - 1', pos);\n}\n\nfunction roundUpToMultipleOf8(n) {\n return (n + 7) & ~7; // Align to 8 byte boundary.\n}\n\nfunction ReadStream(sftp, path, options) {\n if (options === undefined)\n options = {};\n else if (typeof options === 'string')\n options = { encoding: options };\n else if (options === null || typeof options !== 'object')\n throw new TypeError('\"options\" argument must be a string or an object');\n else\n options = Object.create(options);\n\n // A little bit bigger buffer and water marks by default\n if (options.highWaterMark === undefined)\n options.highWaterMark = 64 * 1024;\n\n // For backwards compat do not emit close on destroy.\n options.emitClose = false;\n options.autoDestroy = false; // Node 14 major change.\n\n ReadableStream.call(this, options);\n\n this.path = path;\n this.flags = options.flags === undefined ? 'r' : options.flags;\n this.mode = options.mode === undefined ? 0o666 : options.mode;\n\n this.start = options.start;\n this.end = options.end;\n this.autoClose = options.autoClose === undefined ? true : options.autoClose;\n this.pos = 0;\n this.bytesRead = 0;\n this.isClosed = false;\n\n this.handle = options.handle === undefined ? null : options.handle;\n this.sftp = sftp;\n this._opening = false;\n\n if (this.start !== undefined) {\n checkPosition(this.start, 'start');\n\n this.pos = this.start;\n }\n\n if (this.end === undefined) {\n this.end = Infinity;\n } else if (this.end !== Infinity) {\n checkPosition(this.end, 'end');\n\n if (this.start !== undefined && this.start > this.end) {\n throw new ERR_OUT_OF_RANGE(\n 'start',\n `<= \"end\" (here: ${this.end})`,\n this.start\n );\n }\n }\n\n this.on('end', function() {\n if (this.autoClose)\n this.destroy();\n });\n\n if (!Buffer.isBuffer(this.handle))\n this.open();\n}\ninherits(ReadStream, ReadableStream);\n\nReadStream.prototype.open = function() {\n if (this._opening)\n return;\n\n this._opening = true;\n\n this.sftp.open(this.path, this.flags, this.mode, (er, handle) => {\n this._opening = false;\n\n if (er) {\n this.emit('error', er);\n if (this.autoClose)\n this.destroy();\n return;\n }\n\n this.handle = handle;\n this.emit('open', handle);\n this.emit('ready');\n // Start the flow of data.\n this.read();\n });\n};\n\nReadStream.prototype._read = function(n) {\n if (!Buffer.isBuffer(this.handle))\n return this.once('open', () => this._read(n));\n\n // XXX: safe to remove this?\n if (this.destroyed)\n return;\n\n if (!pool || pool.length - pool.used < kMinPoolSpace) {\n // Discard the old pool.\n allocNewPool(this.readableHighWaterMark\n || this._readableState.highWaterMark);\n }\n\n // Grab another reference to the pool in the case that while we're\n // in the thread pool another read() finishes up the pool, and\n // allocates a new one.\n const thisPool = pool;\n let toRead = Math.min(pool.length - pool.used, n);\n const start = pool.used;\n\n if (this.end !== undefined)\n toRead = Math.min(this.end - this.pos + 1, toRead);\n\n // Already read everything we were supposed to read!\n // treat as EOF.\n if (toRead <= 0)\n return this.push(null);\n\n // the actual read.\n this.sftp.read(this.handle,\n pool,\n pool.used,\n toRead,\n this.pos,\n (er, bytesRead) => {\n if (er) {\n this.emit('error', er);\n if (this.autoClose)\n this.destroy();\n return;\n }\n let b = null;\n\n // Now that we know how much data we have actually read, re-wind the\n // 'used' field if we can, and otherwise allow the remainder of our\n // reservation to be used as a new pool later.\n if (start + toRead === thisPool.used && thisPool === pool) {\n thisPool.used = roundUpToMultipleOf8(thisPool.used + bytesRead - toRead);\n } else {\n // Round down to the next lowest multiple of 8 to ensure the new pool\n // fragment start and end positions are aligned to an 8 byte boundary.\n const alignedEnd = (start + toRead) & ~7;\n const alignedStart = roundUpToMultipleOf8(start + bytesRead);\n if (alignedEnd - alignedStart >= kMinPoolSpace)\n poolFragments.push(thisPool.slice(alignedStart, alignedEnd));\n }\n\n if (bytesRead > 0) {\n this.bytesRead += bytesRead;\n b = thisPool.slice(start, start + bytesRead);\n }\n\n // Move the pool positions, and internal position for reading.\n this.pos += bytesRead;\n\n this.push(b);\n });\n\n pool.used = roundUpToMultipleOf8(pool.used + toRead);\n};\n\nReadStream.prototype._destroy = function(err, cb) {\n if (this._opening && !Buffer.isBuffer(this.handle)) {\n this.once('open', closeStream.bind(null, this, cb, err));\n return;\n }\n\n closeStream(this, cb, err);\n this.handle = null;\n this._opening = false;\n};\n\nfunction closeStream(stream, cb, err) {\n if (!stream.handle)\n return onclose();\n\n stream.sftp.close(stream.handle, onclose);\n\n function onclose(er) {\n er = er || err;\n cb(er);\n stream.isClosed = true;\n if (!er)\n stream.emit('close');\n }\n}\n\nReadStream.prototype.close = function(cb) {\n this.destroy(null, cb);\n};\n\nObject.defineProperty(ReadStream.prototype, 'pending', {\n get() {\n return this.handle === null;\n },\n configurable: true\n});\n\n// TODO: add `concurrency` setting to allow more than one in-flight WRITE\n// request to server to improve throughput\nfunction WriteStream(sftp, path, options) {\n if (options === undefined)\n options = {};\n else if (typeof options === 'string')\n options = { encoding: options };\n else if (options === null || typeof options !== 'object')\n throw new TypeError('\"options\" argument must be a string or an object');\n else\n options = Object.create(options);\n\n // For backwards compat do not emit close on destroy.\n options.emitClose = false;\n options.autoDestroy = false; // Node 14 major change.\n\n WritableStream.call(this, options);\n\n this.path = path;\n this.flags = options.flags === undefined ? 'w' : options.flags;\n this.mode = options.mode === undefined ? 0o666 : options.mode;\n\n this.start = options.start;\n this.autoClose = options.autoClose === undefined ? true : options.autoClose;\n this.pos = 0;\n this.bytesWritten = 0;\n this.isClosed = false;\n\n this.handle = options.handle === undefined ? null : options.handle;\n this.sftp = sftp;\n this._opening = false;\n\n if (this.start !== undefined) {\n checkPosition(this.start, 'start');\n\n this.pos = this.start;\n }\n\n if (options.encoding)\n this.setDefaultEncoding(options.encoding);\n\n // Node v6.x only\n this.on('finish', function() {\n if (this._writableState.finalCalled)\n return;\n if (this.autoClose)\n this.destroy();\n });\n\n if (!Buffer.isBuffer(this.handle))\n this.open();\n}\ninherits(WriteStream, WritableStream);\n\nWriteStream.prototype._final = function(cb) {\n if (this.autoClose)\n this.destroy();\n cb();\n};\n\nWriteStream.prototype.open = function() {\n if (this._opening)\n return;\n\n this._opening = true;\n\n this.sftp.open(this.path, this.flags, this.mode, (er, handle) => {\n this._opening = false;\n\n if (er) {\n this.emit('error', er);\n if (this.autoClose)\n this.destroy();\n return;\n }\n\n this.handle = handle;\n\n const tryAgain = (err) => {\n if (err) {\n // Try chmod() for sftp servers that may not support fchmod() for\n // whatever reason\n this.sftp.chmod(this.path, this.mode, (err_) => tryAgain());\n return;\n }\n\n // SFTPv3 requires absolute offsets, no matter the open flag used\n if (this.flags[0] === 'a') {\n const tryStat = (err, st) => {\n if (err) {\n // Try stat() for sftp servers that may not support fstat() for\n // whatever reason\n this.sftp.stat(this.path, (err_, st_) => {\n if (err_) {\n this.destroy();\n this.emit('error', err);\n return;\n }\n tryStat(null, st_);\n });\n return;\n }\n\n this.pos = st.size;\n this.emit('open', handle);\n this.emit('ready');\n };\n\n this.sftp.fstat(handle, tryStat);\n return;\n }\n\n this.emit('open', handle);\n this.emit('ready');\n };\n\n this.sftp.fchmod(handle, this.mode, tryAgain);\n });\n};\n\nWriteStream.prototype._write = function(data, encoding, cb) {\n if (!Buffer.isBuffer(data)) {\n const err = new ERR_INVALID_ARG_TYPE('data', 'Buffer', data);\n return this.emit('error', err);\n }\n\n if (!Buffer.isBuffer(this.handle)) {\n return this.once('open', function() {\n this._write(data, encoding, cb);\n });\n }\n\n this.sftp.write(this.handle,\n data,\n 0,\n data.length,\n this.pos,\n (er, bytes) => {\n if (er) {\n if (this.autoClose)\n this.destroy();\n return cb(er);\n }\n this.bytesWritten += bytes;\n cb();\n });\n\n this.pos += data.length;\n};\n\nWriteStream.prototype._writev = function(data, cb) {\n if (!Buffer.isBuffer(this.handle)) {\n return this.once('open', function() {\n this._writev(data, cb);\n });\n }\n\n const sftp = this.sftp;\n const handle = this.handle;\n let writesLeft = data.length;\n\n const onwrite = (er, bytes) => {\n if (er) {\n this.destroy();\n return cb(er);\n }\n this.bytesWritten += bytes;\n if (--writesLeft === 0)\n cb();\n };\n\n // TODO: try to combine chunks to reduce number of requests to the server?\n for (let i = 0; i < data.length; ++i) {\n const chunk = data[i].chunk;\n\n sftp.write(handle, chunk, 0, chunk.length, this.pos, onwrite);\n this.pos += chunk.length;\n }\n};\n\nif (typeof WritableStream.prototype.destroy !== 'function')\n WriteStream.prototype.destroy = ReadStream.prototype.destroy;\n\nWriteStream.prototype._destroy = ReadStream.prototype._destroy;\nWriteStream.prototype.close = function(cb) {\n if (cb) {\n if (this.isClosed) {\n process.nextTick(cb);\n return;\n }\n this.on('close', cb);\n }\n\n // If we are not autoClosing, we should call\n // destroy on 'finish'.\n if (!this.autoClose)\n this.on('finish', this.destroy.bind(this));\n\n this.end();\n};\n\n// There is no shutdown() for files.\nWriteStream.prototype.destroySoon = WriteStream.prototype.end;\n\nObject.defineProperty(WriteStream.prototype, 'pending', {\n get() {\n return this.handle === null;\n },\n configurable: true\n});\n// =============================================================================\n\nmodule.exports = {\n flagsToString,\n OPEN_MODE,\n SFTP,\n Stats,\n STATUS_CODE,\n stringToFlags,\n};\n", "'use strict';\n\nconst {\n Duplex: DuplexStream,\n Readable: ReadableStream,\n Writable: WritableStream,\n} = require('stream');\n\nconst {\n CHANNEL_EXTENDED_DATATYPE: { STDERR },\n} = require('./protocol/constants.js');\nconst { bufferSlice } = require('./protocol/utils.js');\n\nconst PACKET_SIZE = 32 * 1024;\nconst MAX_WINDOW = 2 * 1024 * 1024;\nconst WINDOW_THRESHOLD = MAX_WINDOW / 2;\n\nclass ClientStderr extends ReadableStream {\n constructor(channel, streamOpts) {\n super(streamOpts);\n\n this._channel = channel;\n }\n _read(n) {\n if (this._channel._waitChanDrain) {\n this._channel._waitChanDrain = false;\n if (this._channel.incoming.window <= WINDOW_THRESHOLD)\n windowAdjust(this._channel);\n }\n }\n}\n\nclass ServerStderr extends WritableStream {\n constructor(channel) {\n super({ highWaterMark: MAX_WINDOW });\n\n this._channel = channel;\n }\n\n _write(data, encoding, cb) {\n const channel = this._channel;\n const protocol = channel._client._protocol;\n const outgoing = channel.outgoing;\n const packetSize = outgoing.packetSize;\n const id = outgoing.id;\n let window = outgoing.window;\n const len = data.length;\n let p = 0;\n\n if (outgoing.state !== 'open')\n return;\n\n while (len - p > 0 && window > 0) {\n let sliceLen = len - p;\n if (sliceLen > window)\n sliceLen = window;\n if (sliceLen > packetSize)\n sliceLen = packetSize;\n\n if (p === 0 && sliceLen === len)\n protocol.channelExtData(id, data, STDERR);\n else\n protocol.channelExtData(id, bufferSlice(data, p, p + sliceLen), STDERR);\n\n p += sliceLen;\n window -= sliceLen;\n }\n\n outgoing.window = window;\n\n if (len - p > 0) {\n if (window === 0)\n channel._waitWindow = true;\n if (p > 0)\n channel._chunkErr = bufferSlice(data, p, len);\n else\n channel._chunkErr = data;\n channel._chunkcbErr = cb;\n return;\n }\n\n cb();\n }\n}\n\nclass Channel extends DuplexStream {\n constructor(client, info, opts) {\n const streamOpts = {\n highWaterMark: MAX_WINDOW,\n allowHalfOpen: (!opts || (opts && opts.allowHalfOpen !== false)),\n emitClose: false,\n };\n super(streamOpts);\n this.allowHalfOpen = streamOpts.allowHalfOpen;\n\n const server = !!(opts && opts.server);\n\n this.server = server;\n this.type = info.type;\n this.subtype = undefined;\n\n /*\n incoming and outgoing contain these properties:\n {\n id: undefined,\n window: undefined,\n packetSize: undefined,\n state: 'closed'\n }\n */\n this.incoming = info.incoming;\n this.outgoing = info.outgoing;\n this._callbacks = [];\n\n this._client = client;\n this._hasX11 = false;\n this._exit = {\n code: undefined,\n signal: undefined,\n dump: undefined,\n desc: undefined,\n };\n\n this.stdin = this.stdout = this;\n\n if (server)\n this.stderr = new ServerStderr(this);\n else\n this.stderr = new ClientStderr(this, streamOpts);\n\n // Outgoing data\n this._waitWindow = false; // SSH-level backpressure\n\n // Incoming data\n this._waitChanDrain = false; // Channel Readable side backpressure\n\n this._chunk = undefined;\n this._chunkcb = undefined;\n this._chunkErr = undefined;\n this._chunkcbErr = undefined;\n\n this.on('finish', onFinish)\n .on('prefinish', onFinish); // For node v0.11+\n\n this.on('end', onEnd).on('close', onEnd);\n }\n\n _read(n) {\n if (this._waitChanDrain) {\n this._waitChanDrain = false;\n if (this.incoming.window <= WINDOW_THRESHOLD)\n windowAdjust(this);\n }\n }\n\n _write(data, encoding, cb) {\n const protocol = this._client._protocol;\n const outgoing = this.outgoing;\n const packetSize = outgoing.packetSize;\n const id = outgoing.id;\n let window = outgoing.window;\n const len = data.length;\n let p = 0;\n\n if (outgoing.state !== 'open')\n return;\n\n while (len - p > 0 && window > 0) {\n let sliceLen = len - p;\n if (sliceLen > window)\n sliceLen = window;\n if (sliceLen > packetSize)\n sliceLen = packetSize;\n\n if (p === 0 && sliceLen === len)\n protocol.channelData(id, data);\n else\n protocol.channelData(id, bufferSlice(data, p, p + sliceLen));\n\n p += sliceLen;\n window -= sliceLen;\n }\n\n outgoing.window = window;\n\n if (len - p > 0) {\n if (window === 0)\n this._waitWindow = true;\n if (p > 0)\n this._chunk = bufferSlice(data, p, len);\n else\n this._chunk = data;\n this._chunkcb = cb;\n return;\n }\n\n cb();\n }\n\n eof() {\n if (this.outgoing.state === 'open') {\n this.outgoing.state = 'eof';\n this._client._protocol.channelEOF(this.outgoing.id);\n }\n }\n\n close() {\n if (this.outgoing.state === 'open' || this.outgoing.state === 'eof') {\n this.outgoing.state = 'closing';\n this._client._protocol.channelClose(this.outgoing.id);\n }\n }\n\n destroy() {\n this.end();\n this.close();\n return this;\n }\n\n // Session type-specific methods =============================================\n setWindow(rows, cols, height, width) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (this.type === 'session'\n && (this.subtype === 'shell' || this.subtype === 'exec')\n && this.writable\n && this.outgoing.state === 'open') {\n this._client._protocol.windowChange(this.outgoing.id,\n rows,\n cols,\n height,\n width);\n }\n }\n\n signal(signalName) {\n if (this.server)\n throw new Error('Client-only method called in server mode');\n\n if (this.type === 'session'\n && this.writable\n && this.outgoing.state === 'open') {\n this._client._protocol.signal(this.outgoing.id, signalName);\n }\n }\n\n exit(statusOrSignal, coreDumped, msg) {\n if (!this.server)\n throw new Error('Server-only method called in client mode');\n\n if (this.type === 'session'\n && this.writable\n && this.outgoing.state === 'open') {\n if (typeof statusOrSignal === 'number') {\n this._client._protocol.exitStatus(this.outgoing.id, statusOrSignal);\n } else {\n this._client._protocol.exitSignal(this.outgoing.id,\n statusOrSignal,\n coreDumped,\n msg);\n }\n }\n }\n\n}\n\nfunction onFinish() {\n this.eof();\n if (this.server || !this.allowHalfOpen)\n this.close();\n this.writable = false;\n}\n\nfunction onEnd() {\n this.readable = false;\n}\n\nfunction windowAdjust(self) {\n if (self.outgoing.state === 'closed')\n return;\n const amt = MAX_WINDOW - self.incoming.window;\n if (amt <= 0)\n return;\n self.incoming.window += amt;\n self._client._protocol.channelWindowAdjust(self.outgoing.id, amt);\n}\n\nmodule.exports = {\n Channel,\n MAX_WINDOW,\n PACKET_SIZE,\n windowAdjust,\n WINDOW_THRESHOLD,\n};\n", "'use strict';\n\nconst { SFTP } = require('./protocol/SFTP.js');\n\nconst MAX_CHANNEL = 2 ** 32 - 1;\n\nfunction onChannelOpenFailure(self, recipient, info, cb) {\n self._chanMgr.remove(recipient);\n if (typeof cb !== 'function')\n return;\n\n let err;\n if (info instanceof Error) {\n err = info;\n } else if (typeof info === 'object' && info !== null) {\n err = new Error(`(SSH) Channel open failure: ${info.description}`);\n err.reason = info.reason;\n } else {\n err = new Error(\n '(SSH) Channel open failure: server closed channel unexpectedly'\n );\n err.reason = '';\n }\n\n cb(err);\n}\n\nfunction onCHANNEL_CLOSE(self, recipient, channel, err, dead) {\n if (typeof channel === 'function') {\n // We got CHANNEL_CLOSE instead of CHANNEL_OPEN_FAILURE when\n // requesting to open a channel\n onChannelOpenFailure(self, recipient, err, channel);\n return;\n }\n\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.incoming && channel.incoming.state === 'closed')\n return;\n\n self._chanMgr.remove(recipient);\n\n if (channel.server && channel.constructor.name === 'Session')\n return;\n\n channel.incoming.state = 'closed';\n\n if (channel.readable)\n channel.push(null);\n if (channel.server) {\n if (channel.stderr.writable)\n channel.stderr.end();\n } else if (channel.stderr.readable) {\n channel.stderr.push(null);\n }\n\n if (channel.constructor !== SFTP\n && (channel.outgoing.state === 'open'\n || channel.outgoing.state === 'eof')\n && !dead) {\n channel.close();\n }\n if (channel.outgoing.state === 'closing')\n channel.outgoing.state = 'closed';\n\n const readState = channel._readableState;\n const writeState = channel._writableState;\n if (writeState && !writeState.ending && !writeState.finished && !dead)\n channel.end();\n\n // Take care of any outstanding channel requests\n const chanCallbacks = channel._callbacks;\n channel._callbacks = [];\n for (let i = 0; i < chanCallbacks.length; ++i)\n chanCallbacks[i](true);\n\n if (channel.server) {\n if (!channel.readable\n || channel.destroyed\n || (readState && readState.endEmitted)) {\n channel.emit('close');\n } else {\n channel.once('end', () => channel.emit('close'));\n }\n } else {\n let doClose;\n switch (channel.type) {\n case 'direct-streamlocal@openssh.com':\n case 'direct-tcpip':\n doClose = () => channel.emit('close');\n break;\n default: {\n // Align more with node child processes, where the close event gets\n // the same arguments as the exit event\n const exit = channel._exit;\n doClose = () => {\n if (exit.code === null)\n channel.emit('close', exit.code, exit.signal, exit.dump, exit.desc);\n else\n channel.emit('close', exit.code);\n };\n }\n }\n if (!channel.readable\n || channel.destroyed\n || (readState && readState.endEmitted)) {\n doClose();\n } else {\n channel.once('end', doClose);\n }\n\n const errReadState = channel.stderr._readableState;\n if (!channel.stderr.readable\n || channel.stderr.destroyed\n || (errReadState && errReadState.endEmitted)) {\n channel.stderr.emit('close');\n } else {\n channel.stderr.once('end', () => channel.stderr.emit('close'));\n }\n }\n}\n\nclass ChannelManager {\n constructor(client) {\n this._client = client;\n this._channels = {};\n this._cur = -1;\n this._count = 0;\n }\n add(val) {\n // Attempt to reserve an id\n\n let id;\n // Optimized paths\n if (this._cur < MAX_CHANNEL) {\n id = ++this._cur;\n } else if (this._count === 0) {\n // Revert and reset back to fast path once we no longer have any channels\n // open\n this._cur = 0;\n id = 0;\n } else {\n // Slower lookup path\n\n // This path is triggered we have opened at least MAX_CHANNEL channels\n // while having at least one channel open at any given time, so we have\n // to search for a free id.\n const channels = this._channels;\n for (let i = 0; i < MAX_CHANNEL; ++i) {\n if (channels[i] === undefined) {\n id = i;\n break;\n }\n }\n }\n\n if (id === undefined)\n return -1;\n\n this._channels[id] = (val || true);\n ++this._count;\n\n return id;\n }\n update(id, val) {\n if (typeof id !== 'number' || id < 0 || id >= MAX_CHANNEL || !isFinite(id))\n throw new Error(`Invalid channel id: ${id}`);\n\n if (val && this._channels[id])\n this._channels[id] = val;\n }\n get(id) {\n if (typeof id !== 'number' || id < 0 || id >= MAX_CHANNEL || !isFinite(id))\n throw new Error(`Invalid channel id: ${id}`);\n\n return this._channels[id];\n }\n remove(id) {\n if (typeof id !== 'number' || id < 0 || id >= MAX_CHANNEL || !isFinite(id))\n throw new Error(`Invalid channel id: ${id}`);\n\n if (this._channels[id]) {\n delete this._channels[id];\n if (this._count)\n --this._count;\n }\n }\n cleanup(err) {\n const channels = this._channels;\n this._channels = {};\n this._cur = -1;\n this._count = 0;\n\n const chanIDs = Object.keys(channels);\n const client = this._client;\n for (let i = 0; i < chanIDs.length; ++i) {\n const id = +chanIDs[i];\n const channel = channels[id];\n onCHANNEL_CLOSE(client, id, channel._channel || channel, err, true);\n }\n }\n}\n\nconst isRegExp = (() => {\n const toString = Object.prototype.toString;\n return (val) => toString.call(val) === '[object RegExp]';\n})();\n\nfunction generateAlgorithmList(algoList, defaultList, supportedList) {\n if (Array.isArray(algoList) && algoList.length > 0) {\n // Exact list\n for (let i = 0; i < algoList.length; ++i) {\n if (supportedList.indexOf(algoList[i]) === -1)\n throw new Error(`Unsupported algorithm: ${algoList[i]}`);\n }\n return algoList;\n }\n\n if (typeof algoList === 'object' && algoList !== null) {\n // Operations based on the default list\n const keys = Object.keys(algoList);\n let list = defaultList;\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let val = algoList[key];\n switch (key) {\n case 'append':\n if (!Array.isArray(val))\n val = [val];\n if (Array.isArray(val)) {\n for (let j = 0; j < val.length; ++j) {\n const append = val[j];\n if (typeof append === 'string') {\n if (!append || list.indexOf(append) !== -1)\n continue;\n if (supportedList.indexOf(append) === -1)\n throw new Error(`Unsupported algorithm: ${append}`);\n if (list === defaultList)\n list = list.slice();\n list.push(append);\n } else if (isRegExp(append)) {\n for (let k = 0; k < supportedList.length; ++k) {\n const algo = supportedList[k];\n if (append.test(algo)) {\n if (list.indexOf(algo) !== -1)\n continue;\n if (list === defaultList)\n list = list.slice();\n list.push(algo);\n }\n }\n }\n }\n }\n break;\n case 'prepend':\n if (!Array.isArray(val))\n val = [val];\n if (Array.isArray(val)) {\n for (let j = val.length; j >= 0; --j) {\n const prepend = val[j];\n if (typeof prepend === 'string') {\n if (!prepend || list.indexOf(prepend) !== -1)\n continue;\n if (supportedList.indexOf(prepend) === -1)\n throw new Error(`Unsupported algorithm: ${prepend}`);\n if (list === defaultList)\n list = list.slice();\n list.unshift(prepend);\n } else if (isRegExp(prepend)) {\n for (let k = supportedList.length; k >= 0; --k) {\n const algo = supportedList[k];\n if (prepend.test(algo)) {\n if (list.indexOf(algo) !== -1)\n continue;\n if (list === defaultList)\n list = list.slice();\n list.unshift(algo);\n }\n }\n }\n }\n }\n break;\n case 'remove':\n if (!Array.isArray(val))\n val = [val];\n if (Array.isArray(val)) {\n for (let j = 0; j < val.length; ++j) {\n const search = val[j];\n if (typeof search === 'string') {\n if (!search)\n continue;\n const idx = list.indexOf(search);\n if (idx === -1)\n continue;\n if (list === defaultList)\n list = list.slice();\n list.splice(idx, 1);\n } else if (isRegExp(search)) {\n for (let k = 0; k < list.length; ++k) {\n if (search.test(list[k])) {\n if (list === defaultList)\n list = list.slice();\n list.splice(k, 1);\n --k;\n }\n }\n }\n }\n }\n break;\n }\n }\n\n return list;\n }\n\n return defaultList;\n}\n\nmodule.exports = {\n ChannelManager,\n generateAlgorithmList,\n onChannelOpenFailure,\n onCHANNEL_CLOSE,\n isWritable: (stream) => {\n // XXX: hack to workaround regression in node\n // See: https://github.com/nodejs/node/issues/36029\n return (stream\n && stream.writable\n && stream._readableState\n && stream._readableState.ended === false);\n },\n};\n", "// TODO:\n// * add `.connected` or similar property to allow immediate connection\n// status checking\n// * add/improve debug output during user authentication phase\n'use strict';\n\nconst {\n createHash,\n getHashes,\n randomFillSync,\n} = require('crypto');\nconst { Socket } = require('net');\nconst { lookup: dnsLookup } = require('dns');\nconst EventEmitter = require('events');\nconst HASHES = getHashes();\n\nconst {\n COMPAT,\n CHANNEL_EXTENDED_DATATYPE: { STDERR },\n CHANNEL_OPEN_FAILURE,\n DEFAULT_CIPHER,\n DEFAULT_COMPRESSION,\n DEFAULT_KEX,\n DEFAULT_MAC,\n DEFAULT_SERVER_HOST_KEY,\n DISCONNECT_REASON,\n DISCONNECT_REASON_BY_VALUE,\n SUPPORTED_CIPHER,\n SUPPORTED_COMPRESSION,\n SUPPORTED_KEX,\n SUPPORTED_MAC,\n SUPPORTED_SERVER_HOST_KEY,\n} = require('./protocol/constants.js');\nconst { init: cryptoInit } = require('./protocol/crypto.js');\nconst Protocol = require('./protocol/Protocol.js');\nconst { parseKey } = require('./protocol/keyParser.js');\nconst { SFTP } = require('./protocol/SFTP.js');\nconst {\n bufferCopy,\n makeBufferParser,\n makeError,\n readUInt32BE,\n sigSSHToASN1,\n writeUInt32BE,\n} = require('./protocol/utils.js');\n\nconst { AgentContext, createAgent, isAgent } = require('./agent.js');\nconst {\n Channel,\n MAX_WINDOW,\n PACKET_SIZE,\n windowAdjust,\n WINDOW_THRESHOLD,\n} = require('./Channel.js');\nconst {\n ChannelManager,\n generateAlgorithmList,\n isWritable,\n onChannelOpenFailure,\n onCHANNEL_CLOSE,\n} = require('./utils.js');\n\nconst bufferParser = makeBufferParser();\nconst sigParser = makeBufferParser();\nconst RE_OPENSSH = /^OpenSSH_(?:(?![0-4])\\d)|(?:\\d{2,})/;\nconst noop = (err) => {};\n\nclass Client extends EventEmitter {\n constructor() {\n super();\n\n this.config = {\n host: undefined,\n port: undefined,\n localAddress: undefined,\n localPort: undefined,\n forceIPv4: undefined,\n forceIPv6: undefined,\n keepaliveCountMax: undefined,\n keepaliveInterval: undefined,\n readyTimeout: undefined,\n ident: undefined,\n\n username: undefined,\n password: undefined,\n privateKey: undefined,\n tryKeyboard: undefined,\n agent: undefined,\n allowAgentFwd: undefined,\n authHandler: undefined,\n\n hostHashAlgo: undefined,\n hostHashCb: undefined,\n strictVendor: undefined,\n debug: undefined\n };\n\n this._agent = undefined;\n this._readyTimeout = undefined;\n this._chanMgr = undefined;\n this._callbacks = undefined;\n this._forwarding = undefined;\n this._forwardingUnix = undefined;\n this._acceptX11 = undefined;\n this._agentFwdEnabled = undefined;\n this._remoteVer = undefined;\n\n this._protocol = undefined;\n this._sock = undefined;\n this._resetKA = undefined;\n }\n\n connect(cfg) {\n if (this._sock && isWritable(this._sock)) {\n this.once('close', () => {\n this.connect(cfg);\n });\n this.end();\n return this;\n }\n\n this.config.host = cfg.hostname || cfg.host || 'localhost';\n this.config.port = cfg.port || 22;\n this.config.localAddress = (typeof cfg.localAddress === 'string'\n ? cfg.localAddress\n : undefined);\n this.config.localPort = (typeof cfg.localPort === 'string'\n || typeof cfg.localPort === 'number'\n ? cfg.localPort\n : undefined);\n this.config.forceIPv4 = cfg.forceIPv4 || false;\n this.config.forceIPv6 = cfg.forceIPv6 || false;\n this.config.keepaliveCountMax = (typeof cfg.keepaliveCountMax === 'number'\n && cfg.keepaliveCountMax >= 0\n ? cfg.keepaliveCountMax\n : 3);\n this.config.keepaliveInterval = (typeof cfg.keepaliveInterval === 'number'\n && cfg.keepaliveInterval > 0\n ? cfg.keepaliveInterval\n : 0);\n this.config.readyTimeout = (typeof cfg.readyTimeout === 'number'\n && cfg.readyTimeout >= 0\n ? cfg.readyTimeout\n : 20000);\n this.config.ident = (typeof cfg.ident === 'string'\n || Buffer.isBuffer(cfg.ident)\n ? cfg.ident\n : undefined);\n\n const algorithms = {\n kex: undefined,\n serverHostKey: undefined,\n cs: {\n cipher: undefined,\n mac: undefined,\n compress: undefined,\n lang: [],\n },\n sc: undefined,\n };\n let allOfferDefaults = true;\n if (typeof cfg.algorithms === 'object' && cfg.algorithms !== null) {\n algorithms.kex = generateAlgorithmList(cfg.algorithms.kex,\n DEFAULT_KEX,\n SUPPORTED_KEX);\n if (algorithms.kex !== DEFAULT_KEX)\n allOfferDefaults = false;\n\n algorithms.serverHostKey =\n generateAlgorithmList(cfg.algorithms.serverHostKey,\n DEFAULT_SERVER_HOST_KEY,\n SUPPORTED_SERVER_HOST_KEY);\n if (algorithms.serverHostKey !== DEFAULT_SERVER_HOST_KEY)\n allOfferDefaults = false;\n\n algorithms.cs.cipher = generateAlgorithmList(cfg.algorithms.cipher,\n DEFAULT_CIPHER,\n SUPPORTED_CIPHER);\n if (algorithms.cs.cipher !== DEFAULT_CIPHER)\n allOfferDefaults = false;\n\n algorithms.cs.mac = generateAlgorithmList(cfg.algorithms.hmac,\n DEFAULT_MAC,\n SUPPORTED_MAC);\n if (algorithms.cs.mac !== DEFAULT_MAC)\n allOfferDefaults = false;\n\n algorithms.cs.compress = generateAlgorithmList(cfg.algorithms.compress,\n DEFAULT_COMPRESSION,\n SUPPORTED_COMPRESSION);\n if (algorithms.cs.compress !== DEFAULT_COMPRESSION)\n allOfferDefaults = false;\n\n if (!allOfferDefaults)\n algorithms.sc = algorithms.cs;\n }\n\n if (typeof cfg.username === 'string')\n this.config.username = cfg.username;\n else if (typeof cfg.user === 'string')\n this.config.username = cfg.user;\n else\n throw new Error('Invalid username');\n\n this.config.password = (typeof cfg.password === 'string'\n ? cfg.password\n : undefined);\n this.config.privateKey = (typeof cfg.privateKey === 'string'\n || Buffer.isBuffer(cfg.privateKey)\n ? cfg.privateKey\n : undefined);\n this.config.localHostname = (typeof cfg.localHostname === 'string'\n ? cfg.localHostname\n : undefined);\n this.config.localUsername = (typeof cfg.localUsername === 'string'\n ? cfg.localUsername\n : undefined);\n this.config.tryKeyboard = (cfg.tryKeyboard === true);\n if (typeof cfg.agent === 'string' && cfg.agent.length)\n this.config.agent = createAgent(cfg.agent);\n else if (isAgent(cfg.agent))\n this.config.agent = cfg.agent;\n else\n this.config.agent = undefined;\n this.config.allowAgentFwd = (cfg.agentForward === true\n && this.config.agent !== undefined);\n let authHandler = this.config.authHandler = (\n typeof cfg.authHandler === 'function'\n || Array.isArray(cfg.authHandler)\n ? cfg.authHandler\n : undefined\n );\n\n this.config.strictVendor = (typeof cfg.strictVendor === 'boolean'\n ? cfg.strictVendor\n : true);\n\n const debug = this.config.debug = (typeof cfg.debug === 'function'\n ? cfg.debug\n : undefined);\n\n if (cfg.agentForward === true && !this.config.allowAgentFwd) {\n throw new Error(\n 'You must set a valid agent path to allow agent forwarding'\n );\n }\n\n let callbacks = this._callbacks = [];\n this._chanMgr = new ChannelManager(this);\n this._forwarding = {};\n this._forwardingUnix = {};\n this._acceptX11 = 0;\n this._agentFwdEnabled = false;\n this._agent = (this.config.agent ? this.config.agent : undefined);\n this._remoteVer = undefined;\n let privateKey;\n\n if (this.config.privateKey) {\n privateKey = parseKey(this.config.privateKey, cfg.passphrase);\n if (privateKey instanceof Error)\n throw new Error(`Cannot parse privateKey: ${privateKey.message}`);\n if (Array.isArray(privateKey)) {\n // OpenSSH's newer format only stores 1 key for now\n privateKey = privateKey[0];\n }\n if (privateKey.getPrivatePEM() === null) {\n throw new Error(\n 'privateKey value does not contain a (valid) private key'\n );\n }\n }\n\n let hostVerifier;\n if (typeof cfg.hostVerifier === 'function') {\n const hashCb = cfg.hostVerifier;\n let hashAlgo;\n if (HASHES.indexOf(cfg.hostHash) !== -1) {\n // Default to old behavior of hashing on user's behalf\n hashAlgo = cfg.hostHash;\n }\n hostVerifier = (key, verify) => {\n if (hashAlgo)\n key = createHash(hashAlgo).update(key).digest('hex');\n const ret = hashCb(key, verify);\n if (ret !== undefined)\n verify(ret);\n };\n }\n\n const sock = this._sock = (cfg.sock || new Socket());\n let ready = false;\n let sawHeader = false;\n if (this._protocol)\n this._protocol.cleanup();\n const DEBUG_HANDLER = (!debug ? undefined : (p, display, msg) => {\n debug(`Debug output from server: ${JSON.stringify(msg)}`);\n });\n let serverSigAlgs;\n const proto = this._protocol = new Protocol({\n ident: this.config.ident,\n offer: (allOfferDefaults ? undefined : algorithms),\n onWrite: (data) => {\n if (isWritable(sock))\n sock.write(data);\n },\n onError: (err) => {\n if (err.level === 'handshake')\n clearTimeout(this._readyTimeout);\n if (!proto._destruct)\n sock.removeAllListeners('data');\n this.emit('error', err);\n try {\n sock.end();\n } catch {}\n },\n onHeader: (header) => {\n sawHeader = true;\n this._remoteVer = header.versions.software;\n if (header.greeting)\n this.emit('greeting', header.greeting);\n },\n onHandshakeComplete: (negotiated) => {\n this.emit('handshake', negotiated);\n if (!ready) {\n ready = true;\n proto.service('ssh-userauth');\n }\n },\n debug,\n hostVerifier,\n messageHandlers: {\n DEBUG: DEBUG_HANDLER,\n DISCONNECT: (p, reason, desc) => {\n if (reason !== DISCONNECT_REASON.BY_APPLICATION) {\n if (!desc) {\n desc = DISCONNECT_REASON_BY_VALUE[reason];\n if (desc === undefined)\n desc = `Unexpected disconnection reason: ${reason}`;\n }\n const err = new Error(desc);\n err.code = reason;\n this.emit('error', err);\n }\n sock.end();\n },\n SERVICE_ACCEPT: (p, name) => {\n if (name === 'ssh-userauth')\n tryNextAuth();\n },\n EXT_INFO: (p, exts) => {\n if (serverSigAlgs === undefined) {\n for (const ext of exts) {\n if (ext.name === 'server-sig-algs') {\n serverSigAlgs = ext.algs;\n return;\n }\n }\n serverSigAlgs = null;\n }\n },\n USERAUTH_BANNER: (p, msg) => {\n this.emit('banner', msg);\n },\n USERAUTH_SUCCESS: (p) => {\n // Start keepalive mechanism\n resetKA();\n\n clearTimeout(this._readyTimeout);\n\n this.emit('ready');\n },\n USERAUTH_FAILURE: (p, authMethods, partialSuccess) => {\n // For key-based authentication, check if we should retry the current\n // key with a different algorithm first\n if (curAuth.keyAlgos) {\n const oldKeyAlgo = curAuth.keyAlgos[0][0];\n if (debug)\n debug(`Client: ${curAuth.type} (${oldKeyAlgo}) auth failed`);\n curAuth.keyAlgos.shift();\n if (curAuth.keyAlgos.length) {\n const [keyAlgo, hashAlgo] = curAuth.keyAlgos[0];\n switch (curAuth.type) {\n case 'agent':\n proto.authPK(\n curAuth.username,\n curAuth.agentCtx.currentKey(),\n keyAlgo\n );\n return;\n case 'publickey':\n proto.authPK(curAuth.username, curAuth.key, keyAlgo);\n return;\n case 'hostbased':\n proto.authHostbased(curAuth.username,\n curAuth.key,\n curAuth.localHostname,\n curAuth.localUsername,\n keyAlgo,\n (buf, cb) => {\n const signature = curAuth.key.sign(buf, hashAlgo);\n if (signature instanceof Error) {\n signature.message =\n `Error while signing with key: ${signature.message}`;\n signature.level = 'client-authentication';\n this.emit('error', signature);\n return tryNextAuth();\n }\n\n cb(signature);\n });\n return;\n }\n } else {\n curAuth.keyAlgos = undefined;\n }\n }\n\n if (curAuth.type === 'agent') {\n const pos = curAuth.agentCtx.pos();\n debug && debug(`Client: Agent key #${pos + 1} failed`);\n return tryNextAgentKey();\n }\n\n debug && debug(`Client: ${curAuth.type} auth failed`);\n\n curPartial = partialSuccess;\n curAuthsLeft = authMethods;\n tryNextAuth();\n },\n USERAUTH_PASSWD_CHANGEREQ: (p, prompt) => {\n if (curAuth.type === 'password') {\n // TODO: support a `changePrompt()` on `curAuth` that defaults to\n // emitting 'change password' as before\n this.emit('change password', prompt, (newPassword) => {\n proto.authPassword(\n this.config.username,\n this.config.password,\n newPassword\n );\n });\n }\n },\n USERAUTH_PK_OK: (p) => {\n let keyAlgo;\n let hashAlgo;\n if (curAuth.keyAlgos)\n [keyAlgo, hashAlgo] = curAuth.keyAlgos[0];\n if (curAuth.type === 'agent') {\n const key = curAuth.agentCtx.currentKey();\n proto.authPK(curAuth.username, key, keyAlgo, (buf, cb) => {\n const opts = { hash: hashAlgo };\n curAuth.agentCtx.sign(key, buf, opts, (err, signed) => {\n if (err) {\n err.level = 'agent';\n this.emit('error', err);\n } else {\n return cb(signed);\n }\n\n tryNextAgentKey();\n });\n });\n } else if (curAuth.type === 'publickey') {\n proto.authPK(curAuth.username, curAuth.key, keyAlgo, (buf, cb) => {\n const signature = curAuth.key.sign(buf, hashAlgo);\n if (signature instanceof Error) {\n signature.message =\n `Error signing data with key: ${signature.message}`;\n signature.level = 'client-authentication';\n this.emit('error', signature);\n return tryNextAuth();\n }\n cb(signature);\n });\n }\n },\n USERAUTH_INFO_REQUEST: (p, name, instructions, prompts) => {\n if (curAuth.type === 'keyboard-interactive') {\n const nprompts = (Array.isArray(prompts) ? prompts.length : 0);\n if (nprompts === 0) {\n debug && debug(\n 'Client: Sending automatic USERAUTH_INFO_RESPONSE'\n );\n proto.authInfoRes();\n return;\n }\n // We sent a keyboard-interactive user authentication request and\n // now the server is sending us the prompts we need to present to\n // the user\n curAuth.prompt(\n name,\n instructions,\n '',\n prompts,\n (answers) => {\n proto.authInfoRes(answers);\n }\n );\n }\n },\n REQUEST_SUCCESS: (p, data) => {\n if (callbacks.length)\n callbacks.shift()(false, data);\n },\n REQUEST_FAILURE: (p) => {\n if (callbacks.length)\n callbacks.shift()(true);\n },\n GLOBAL_REQUEST: (p, name, wantReply, data) => {\n switch (name) {\n case 'hostkeys-00@openssh.com':\n // Automatically verify keys before passing to end user\n hostKeysProve(this, data, (err, keys) => {\n if (err)\n return;\n this.emit('hostkeys', keys);\n });\n if (wantReply)\n proto.requestSuccess();\n break;\n default:\n // Auto-reject all other global requests, this can be especially\n // useful if the server is sending us dummy keepalive global\n // requests\n if (wantReply)\n proto.requestFailure();\n }\n },\n CHANNEL_OPEN: (p, info) => {\n // Handle incoming requests from server, typically a forwarded TCP or\n // X11 connection\n onCHANNEL_OPEN(this, info);\n },\n CHANNEL_OPEN_CONFIRMATION: (p, info) => {\n const channel = this._chanMgr.get(info.recipient);\n if (typeof channel !== 'function')\n return;\n\n const isSFTP = (channel.type === 'sftp');\n const type = (isSFTP ? 'session' : channel.type);\n const chanInfo = {\n type,\n incoming: {\n id: info.recipient,\n window: MAX_WINDOW,\n packetSize: PACKET_SIZE,\n state: 'open'\n },\n outgoing: {\n id: info.sender,\n window: info.window,\n packetSize: info.packetSize,\n state: 'open'\n }\n };\n const instance = (\n isSFTP\n ? new SFTP(this, chanInfo, { debug })\n : new Channel(this, chanInfo)\n );\n this._chanMgr.update(info.recipient, instance);\n channel(undefined, instance);\n },\n CHANNEL_OPEN_FAILURE: (p, recipient, reason, description) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'function')\n return;\n\n const info = { reason, description };\n onChannelOpenFailure(this, recipient, info, channel);\n },\n CHANNEL_DATA: (p, recipient, data) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n // The remote party should not be sending us data if there is no\n // window space available ...\n // TODO: raise error on data with not enough window?\n if (channel.incoming.window === 0)\n return;\n\n channel.incoming.window -= data.length;\n\n if (channel.push(data) === false) {\n channel._waitChanDrain = true;\n return;\n }\n\n if (channel.incoming.window <= WINDOW_THRESHOLD)\n windowAdjust(channel);\n },\n CHANNEL_EXTENDED_DATA: (p, recipient, data, type) => {\n if (type !== STDERR)\n return;\n\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n // The remote party should not be sending us data if there is no\n // window space available ...\n // TODO: raise error on data with not enough window?\n if (channel.incoming.window === 0)\n return;\n\n channel.incoming.window -= data.length;\n\n if (!channel.stderr.push(data)) {\n channel._waitChanDrain = true;\n return;\n }\n\n if (channel.incoming.window <= WINDOW_THRESHOLD)\n windowAdjust(channel);\n },\n CHANNEL_WINDOW_ADJUST: (p, recipient, amount) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n // The other side is allowing us to send `amount` more bytes of data\n channel.outgoing.window += amount;\n\n if (channel._waitWindow) {\n channel._waitWindow = false;\n\n if (channel._chunk) {\n channel._write(channel._chunk, null, channel._chunkcb);\n } else if (channel._chunkcb) {\n channel._chunkcb();\n } else if (channel._chunkErr) {\n channel.stderr._write(channel._chunkErr,\n null,\n channel._chunkcbErr);\n } else if (channel._chunkcbErr) {\n channel._chunkcbErr();\n }\n }\n },\n CHANNEL_SUCCESS: (p, recipient) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n this._resetKA();\n\n if (channel._callbacks.length)\n channel._callbacks.shift()(false);\n },\n CHANNEL_FAILURE: (p, recipient) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n this._resetKA();\n\n if (channel._callbacks.length)\n channel._callbacks.shift()(true);\n },\n CHANNEL_REQUEST: (p, recipient, type, wantReply, data) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n const exit = channel._exit;\n if (exit.code !== undefined)\n return;\n switch (type) {\n case 'exit-status':\n channel.emit('exit', exit.code = data);\n return;\n case 'exit-signal':\n channel.emit('exit',\n exit.code = null,\n exit.signal = `SIG${data.signal}`,\n exit.dump = data.coreDumped,\n exit.desc = data.errorMessage);\n return;\n }\n\n // Keepalive request? OpenSSH will send one as a channel request if\n // there is a channel open\n\n if (wantReply)\n p.channelFailure(channel.outgoing.id);\n },\n CHANNEL_EOF: (p, recipient) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.incoming.state !== 'open')\n return;\n channel.incoming.state = 'eof';\n\n if (channel.readable)\n channel.push(null);\n if (channel.stderr.readable)\n channel.stderr.push(null);\n },\n CHANNEL_CLOSE: (p, recipient) => {\n onCHANNEL_CLOSE(this, recipient, this._chanMgr.get(recipient));\n },\n },\n });\n\n sock.pause();\n\n // TODO: check keepalive implementation\n // Keepalive-related\n const kainterval = this.config.keepaliveInterval;\n const kacountmax = this.config.keepaliveCountMax;\n let kacount = 0;\n let katimer;\n const sendKA = () => {\n if (++kacount > kacountmax) {\n clearInterval(katimer);\n if (sock.readable) {\n const err = new Error('Keepalive timeout');\n err.level = 'client-timeout';\n this.emit('error', err);\n sock.destroy();\n }\n return;\n }\n if (isWritable(sock)) {\n // Append dummy callback to keep correct callback order\n callbacks.push(resetKA);\n proto.ping();\n } else {\n clearInterval(katimer);\n }\n };\n function resetKA() {\n if (kainterval > 0) {\n kacount = 0;\n clearInterval(katimer);\n if (isWritable(sock))\n katimer = setInterval(sendKA, kainterval);\n }\n }\n this._resetKA = resetKA;\n\n const onDone = (() => {\n let called = false;\n return () => {\n if (called)\n return;\n called = true;\n if (wasConnected && !sawHeader) {\n const err =\n makeError('Connection lost before handshake', 'protocol', true);\n this.emit('error', err);\n }\n };\n })();\n const onConnect = (() => {\n let called = false;\n return () => {\n if (called)\n return;\n called = true;\n\n wasConnected = true;\n debug && debug('Socket connected');\n this.emit('connect');\n\n cryptoInit.then(() => {\n proto.start();\n sock.on('data', (data) => {\n try {\n proto.parse(data, 0, data.length);\n } catch (ex) {\n this.emit('error', ex);\n try {\n if (isWritable(sock))\n sock.end();\n } catch {}\n }\n });\n\n // Drain stderr if we are connection hopping using an exec stream\n if (sock.stderr && typeof sock.stderr.resume === 'function')\n sock.stderr.resume();\n\n sock.resume();\n }).catch((err) => {\n this.emit('error', err);\n try {\n if (isWritable(sock))\n sock.end();\n } catch {}\n });\n };\n })();\n let wasConnected = false;\n sock.on('connect', onConnect)\n .on('timeout', () => {\n this.emit('timeout');\n }).on('error', (err) => {\n debug && debug(`Socket error: ${err.message}`);\n clearTimeout(this._readyTimeout);\n err.level = 'client-socket';\n this.emit('error', err);\n }).on('end', () => {\n debug && debug('Socket ended');\n onDone();\n proto.cleanup();\n clearTimeout(this._readyTimeout);\n clearInterval(katimer);\n this.emit('end');\n }).on('close', () => {\n debug && debug('Socket closed');\n onDone();\n proto.cleanup();\n clearTimeout(this._readyTimeout);\n clearInterval(katimer);\n this.emit('close');\n\n // Notify outstanding channel requests of disconnection ...\n const callbacks_ = callbacks;\n callbacks = this._callbacks = [];\n const err = new Error('No response from server');\n for (let i = 0; i < callbacks_.length; ++i)\n callbacks_[i](err);\n\n // Simulate error for any channels waiting to be opened\n this._chanMgr.cleanup(err);\n });\n\n // Begin authentication handling ===========================================\n let curAuth;\n let curPartial = null;\n let curAuthsLeft = null;\n const authsAllowed = ['none'];\n if (this.config.password !== undefined)\n authsAllowed.push('password');\n if (privateKey !== undefined)\n authsAllowed.push('publickey');\n if (this._agent !== undefined)\n authsAllowed.push('agent');\n if (this.config.tryKeyboard)\n authsAllowed.push('keyboard-interactive');\n if (privateKey !== undefined\n && this.config.localHostname !== undefined\n && this.config.localUsername !== undefined) {\n authsAllowed.push('hostbased');\n }\n\n if (Array.isArray(authHandler))\n authHandler = makeSimpleAuthHandler(authHandler);\n else if (typeof authHandler !== 'function')\n authHandler = makeSimpleAuthHandler(authsAllowed);\n\n let hasSentAuth = false;\n const doNextAuth = (nextAuth) => {\n if (hasSentAuth)\n return;\n hasSentAuth = true;\n\n if (nextAuth === false) {\n const err = new Error('All configured authentication methods failed');\n err.level = 'client-authentication';\n this.emit('error', err);\n this.end();\n return;\n }\n\n if (typeof nextAuth === 'string') {\n // Remain backwards compatible with original `authHandler()` usage,\n // which only supported passing names of next method to try using data\n // from the `connect()` config object\n\n const type = nextAuth;\n if (authsAllowed.indexOf(type) === -1)\n return skipAuth(`Authentication method not allowed: ${type}`);\n\n const username = this.config.username;\n switch (type) {\n case 'password':\n nextAuth = { type, username, password: this.config.password };\n break;\n case 'publickey':\n nextAuth = { type, username, key: privateKey };\n break;\n case 'hostbased':\n nextAuth = {\n type,\n username,\n key: privateKey,\n localHostname: this.config.localHostname,\n localUsername: this.config.localUsername,\n };\n break;\n case 'agent':\n nextAuth = {\n type,\n username,\n agentCtx: new AgentContext(this._agent),\n };\n break;\n case 'keyboard-interactive':\n nextAuth = {\n type,\n username,\n prompt: (...args) => this.emit('keyboard-interactive', ...args),\n };\n break;\n case 'none':\n nextAuth = { type, username };\n break;\n default:\n return skipAuth(\n `Skipping unsupported authentication method: ${nextAuth}`\n );\n }\n } else if (typeof nextAuth !== 'object' || nextAuth === null) {\n return skipAuth(\n `Skipping invalid authentication attempt: ${nextAuth}`\n );\n } else {\n const username = nextAuth.username;\n if (typeof username !== 'string') {\n return skipAuth(\n `Skipping invalid authentication attempt: ${nextAuth}`\n );\n }\n const type = nextAuth.type;\n switch (type) {\n case 'password': {\n const { password } = nextAuth;\n if (typeof password !== 'string' && !Buffer.isBuffer(password))\n return skipAuth('Skipping invalid password auth attempt');\n nextAuth = { type, username, password };\n break;\n }\n case 'publickey': {\n const key = parseKey(nextAuth.key, nextAuth.passphrase);\n if (key instanceof Error)\n return skipAuth('Skipping invalid key auth attempt');\n if (!key.isPrivateKey())\n return skipAuth('Skipping non-private key');\n nextAuth = { type, username, key };\n break;\n }\n case 'hostbased': {\n const { localHostname, localUsername } = nextAuth;\n const key = parseKey(nextAuth.key, nextAuth.passphrase);\n if (key instanceof Error\n || typeof localHostname !== 'string'\n || typeof localUsername !== 'string') {\n return skipAuth('Skipping invalid hostbased auth attempt');\n }\n if (!key.isPrivateKey())\n return skipAuth('Skipping non-private key');\n nextAuth = { type, username, key, localHostname, localUsername };\n break;\n }\n case 'agent': {\n let agent = nextAuth.agent;\n if (typeof agent === 'string' && agent.length) {\n agent = createAgent(agent);\n } else if (!isAgent(agent)) {\n return skipAuth(\n `Skipping invalid agent: ${nextAuth.agent}`\n );\n }\n nextAuth = { type, username, agentCtx: new AgentContext(agent) };\n break;\n }\n case 'keyboard-interactive': {\n const { prompt } = nextAuth;\n if (typeof prompt !== 'function') {\n return skipAuth(\n 'Skipping invalid keyboard-interactive auth attempt'\n );\n }\n nextAuth = { type, username, prompt };\n break;\n }\n case 'none':\n nextAuth = { type, username };\n break;\n default:\n return skipAuth(\n `Skipping unsupported authentication method: ${nextAuth}`\n );\n }\n }\n curAuth = nextAuth;\n\n // Begin authentication method's process\n try {\n const username = curAuth.username;\n switch (curAuth.type) {\n case 'password':\n proto.authPassword(username, curAuth.password);\n break;\n case 'publickey': {\n let keyAlgo;\n curAuth.keyAlgos = getKeyAlgos(this, curAuth.key, serverSigAlgs);\n if (curAuth.keyAlgos) {\n if (curAuth.keyAlgos.length) {\n keyAlgo = curAuth.keyAlgos[0][0];\n } else {\n return skipAuth(\n 'Skipping key authentication (no mutual hash algorithm)'\n );\n }\n }\n proto.authPK(username, curAuth.key, keyAlgo);\n break;\n }\n case 'hostbased': {\n let keyAlgo;\n let hashAlgo;\n curAuth.keyAlgos = getKeyAlgos(this, curAuth.key, serverSigAlgs);\n if (curAuth.keyAlgos) {\n if (curAuth.keyAlgos.length) {\n [keyAlgo, hashAlgo] = curAuth.keyAlgos[0];\n } else {\n return skipAuth(\n 'Skipping hostbased authentication (no mutual hash algorithm)'\n );\n }\n }\n\n proto.authHostbased(username,\n curAuth.key,\n curAuth.localHostname,\n curAuth.localUsername,\n keyAlgo,\n (buf, cb) => {\n const signature = curAuth.key.sign(buf, hashAlgo);\n if (signature instanceof Error) {\n signature.message =\n `Error while signing with key: ${signature.message}`;\n signature.level = 'client-authentication';\n this.emit('error', signature);\n return tryNextAuth();\n }\n\n cb(signature);\n });\n break;\n }\n case 'agent':\n curAuth.agentCtx.init((err) => {\n if (err) {\n err.level = 'agent';\n this.emit('error', err);\n return tryNextAuth();\n }\n tryNextAgentKey();\n });\n break;\n case 'keyboard-interactive':\n proto.authKeyboard(username);\n break;\n case 'none':\n proto.authNone(username);\n break;\n }\n } finally {\n hasSentAuth = false;\n }\n };\n\n function skipAuth(msg) {\n debug && debug(msg);\n process.nextTick(tryNextAuth);\n }\n\n function tryNextAuth() {\n hasSentAuth = false;\n const auth = authHandler(curAuthsLeft, curPartial, doNextAuth);\n if (hasSentAuth || auth === undefined)\n return;\n doNextAuth(auth);\n }\n\n const tryNextAgentKey = () => {\n if (curAuth.type === 'agent') {\n const key = curAuth.agentCtx.nextKey();\n if (key === false) {\n debug && debug('Agent: No more keys left to try');\n debug && debug('Client: agent auth failed');\n tryNextAuth();\n } else {\n const pos = curAuth.agentCtx.pos();\n let keyAlgo;\n curAuth.keyAlgos = getKeyAlgos(this, key, serverSigAlgs);\n if (curAuth.keyAlgos) {\n if (curAuth.keyAlgos.length) {\n keyAlgo = curAuth.keyAlgos[0][0];\n } else {\n debug && debug(\n `Agent: Skipping key #${pos + 1} (no mutual hash algorithm)`\n );\n tryNextAgentKey();\n return;\n }\n }\n debug && debug(`Agent: Trying key #${pos + 1}`);\n proto.authPK(curAuth.username, key, keyAlgo);\n }\n }\n };\n\n const startTimeout = () => {\n if (this.config.readyTimeout > 0) {\n this._readyTimeout = setTimeout(() => {\n const err = new Error('Timed out while waiting for handshake');\n err.level = 'client-timeout';\n this.emit('error', err);\n sock.destroy();\n }, this.config.readyTimeout);\n }\n };\n\n if (!cfg.sock) {\n let host = this.config.host;\n const forceIPv4 = this.config.forceIPv4;\n const forceIPv6 = this.config.forceIPv6;\n\n debug && debug(`Client: Trying ${host} on port ${this.config.port} ...`);\n\n const doConnect = () => {\n startTimeout();\n sock.connect({\n host,\n port: this.config.port,\n localAddress: this.config.localAddress,\n localPort: this.config.localPort\n });\n sock.setMaxListeners(0);\n sock.setTimeout(typeof cfg.timeout === 'number' ? cfg.timeout : 0);\n };\n\n if ((!forceIPv4 && !forceIPv6) || (forceIPv4 && forceIPv6)) {\n doConnect();\n } else {\n dnsLookup(host, (forceIPv4 ? 4 : 6), (err, address, family) => {\n if (err) {\n const type = (forceIPv4 ? 'IPv4' : 'IPv6');\n const error = new Error(\n `Error while looking up ${type} address for '${host}': ${err}`\n );\n clearTimeout(this._readyTimeout);\n error.level = 'client-dns';\n this.emit('error', error);\n this.emit('close');\n return;\n }\n host = address;\n doConnect();\n });\n }\n } else {\n // Custom socket passed in\n startTimeout();\n if (typeof sock.connecting === 'boolean') {\n // net.Socket\n\n if (!sock.connecting) {\n // Already connected\n onConnect();\n }\n } else {\n // Assume socket/stream is already \"connected\"\n onConnect();\n }\n }\n\n return this;\n }\n\n end() {\n if (this._sock && isWritable(this._sock)) {\n this._protocol.disconnect(DISCONNECT_REASON.BY_APPLICATION);\n this._sock.end();\n }\n return this;\n }\n\n destroy() {\n this._sock && isWritable(this._sock) && this._sock.destroy();\n return this;\n }\n\n exec(cmd, opts, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n if (typeof opts === 'function') {\n cb = opts;\n opts = {};\n }\n\n const extraOpts = { allowHalfOpen: (opts.allowHalfOpen !== false) };\n\n openChannel(this, 'session', extraOpts, (err, chan) => {\n if (err) {\n cb(err);\n return;\n }\n\n const todo = [];\n\n function reqCb(err) {\n if (err) {\n chan.close();\n cb(err);\n return;\n }\n if (todo.length)\n todo.shift()();\n }\n\n if (this.config.allowAgentFwd === true\n || (opts\n && opts.agentForward === true\n && this._agent !== undefined)) {\n todo.push(() => reqAgentFwd(chan, reqCb));\n }\n\n if (typeof opts === 'object' && opts !== null) {\n if (typeof opts.env === 'object' && opts.env !== null)\n reqEnv(chan, opts.env);\n if ((typeof opts.pty === 'object' && opts.pty !== null)\n || opts.pty === true) {\n todo.push(() => reqPty(chan, opts.pty, reqCb));\n }\n if ((typeof opts.x11 === 'object' && opts.x11 !== null)\n || opts.x11 === 'number'\n || opts.x11 === true) {\n todo.push(() => reqX11(chan, opts.x11, reqCb));\n }\n }\n\n todo.push(() => reqExec(chan, cmd, opts, cb));\n todo.shift()();\n });\n\n return this;\n }\n\n shell(wndopts, opts, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n if (typeof wndopts === 'function') {\n cb = wndopts;\n wndopts = opts = undefined;\n } else if (typeof opts === 'function') {\n cb = opts;\n opts = undefined;\n }\n if (wndopts && (wndopts.x11 !== undefined || wndopts.env !== undefined)) {\n opts = wndopts;\n wndopts = undefined;\n }\n\n openChannel(this, 'session', (err, chan) => {\n if (err) {\n cb(err);\n return;\n }\n\n const todo = [];\n\n function reqCb(err) {\n if (err) {\n chan.close();\n cb(err);\n return;\n }\n if (todo.length)\n todo.shift()();\n }\n\n if (this.config.allowAgentFwd === true\n || (opts\n && opts.agentForward === true\n && this._agent !== undefined)) {\n todo.push(() => reqAgentFwd(chan, reqCb));\n }\n\n if (wndopts !== false)\n todo.push(() => reqPty(chan, wndopts, reqCb));\n\n if (typeof opts === 'object' && opts !== null) {\n if (typeof opts.env === 'object' && opts.env !== null)\n reqEnv(chan, opts.env);\n if ((typeof opts.x11 === 'object' && opts.x11 !== null)\n || opts.x11 === 'number'\n || opts.x11 === true) {\n todo.push(() => reqX11(chan, opts.x11, reqCb));\n }\n }\n\n todo.push(() => reqShell(chan, cb));\n todo.shift()();\n });\n\n return this;\n }\n\n subsys(name, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n openChannel(this, 'session', (err, chan) => {\n if (err) {\n cb(err);\n return;\n }\n\n reqSubsystem(chan, name, (err, stream) => {\n if (err) {\n cb(err);\n return;\n }\n\n cb(undefined, stream);\n });\n });\n\n return this;\n }\n\n forwardIn(bindAddr, bindPort, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n // Send a request for the server to start forwarding TCP connections to us\n // on a particular address and port\n\n const wantReply = (typeof cb === 'function');\n\n if (wantReply) {\n this._callbacks.push((had_err, data) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error(`Unable to bind to ${bindAddr}:${bindPort}`));\n return;\n }\n\n let realPort = bindPort;\n if (bindPort === 0 && data && data.length >= 4) {\n realPort = readUInt32BE(data, 0);\n if (!(this._protocol._compatFlags & COMPAT.DYN_RPORT_BUG))\n bindPort = realPort;\n }\n\n this._forwarding[`${bindAddr}:${bindPort}`] = realPort;\n\n cb(undefined, realPort);\n });\n }\n\n this._protocol.tcpipForward(bindAddr, bindPort, wantReply);\n\n return this;\n }\n\n unforwardIn(bindAddr, bindPort, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n // Send a request to stop forwarding us new connections for a particular\n // address and port\n\n const wantReply = (typeof cb === 'function');\n\n if (wantReply) {\n this._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error(`Unable to unbind from ${bindAddr}:${bindPort}`));\n return;\n }\n\n delete this._forwarding[`${bindAddr}:${bindPort}`];\n\n cb();\n });\n }\n\n this._protocol.cancelTcpipForward(bindAddr, bindPort, wantReply);\n\n return this;\n }\n\n forwardOut(srcIP, srcPort, dstIP, dstPort, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n // Send a request to forward a TCP connection to the server\n\n const cfg = {\n srcIP: srcIP,\n srcPort: srcPort,\n dstIP: dstIP,\n dstPort: dstPort\n };\n\n if (typeof cb !== 'function')\n cb = noop;\n\n openChannel(this, 'direct-tcpip', cfg, cb);\n\n return this;\n }\n\n openssh_noMoreSessions(cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n const wantReply = (typeof cb === 'function');\n\n if (!this.config.strictVendor\n || (this.config.strictVendor && RE_OPENSSH.test(this._remoteVer))) {\n if (wantReply) {\n this._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error('Unable to disable future sessions'));\n return;\n }\n\n cb();\n });\n }\n\n this._protocol.openssh_noMoreSessions(wantReply);\n return this;\n }\n\n if (!wantReply)\n return this;\n\n process.nextTick(\n cb,\n new Error(\n 'strictVendor enabled and server is not OpenSSH or compatible version'\n )\n );\n\n return this;\n }\n\n openssh_forwardInStreamLocal(socketPath, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n const wantReply = (typeof cb === 'function');\n\n if (!this.config.strictVendor\n || (this.config.strictVendor && RE_OPENSSH.test(this._remoteVer))) {\n if (wantReply) {\n this._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error(`Unable to bind to ${socketPath}`));\n return;\n }\n this._forwardingUnix[socketPath] = true;\n cb();\n });\n }\n\n this._protocol.openssh_streamLocalForward(socketPath, wantReply);\n return this;\n }\n\n if (!wantReply)\n return this;\n\n process.nextTick(\n cb,\n new Error(\n 'strictVendor enabled and server is not OpenSSH or compatible version'\n )\n );\n\n return this;\n }\n\n openssh_unforwardInStreamLocal(socketPath, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n const wantReply = (typeof cb === 'function');\n\n if (!this.config.strictVendor\n || (this.config.strictVendor && RE_OPENSSH.test(this._remoteVer))) {\n if (wantReply) {\n this._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error(`Unable to unbind from ${socketPath}`));\n return;\n }\n delete this._forwardingUnix[socketPath];\n cb();\n });\n }\n\n this._protocol.openssh_cancelStreamLocalForward(socketPath, wantReply);\n return this;\n }\n\n if (!wantReply)\n return this;\n\n process.nextTick(\n cb,\n new Error(\n 'strictVendor enabled and server is not OpenSSH or compatible version'\n )\n );\n\n return this;\n }\n\n openssh_forwardOutStreamLocal(socketPath, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n if (typeof cb !== 'function')\n cb = noop;\n\n if (!this.config.strictVendor\n || (this.config.strictVendor && RE_OPENSSH.test(this._remoteVer))) {\n openChannel(this, 'direct-streamlocal@openssh.com', { socketPath }, cb);\n return this;\n }\n process.nextTick(\n cb,\n new Error(\n 'strictVendor enabled and server is not OpenSSH or compatible version'\n )\n );\n\n return this;\n }\n\n sftp(env, cb) {\n if (!this._sock || !isWritable(this._sock))\n throw new Error('Not connected');\n\n if (typeof env === 'function') {\n cb = env;\n env = undefined;\n }\n\n openChannel(this, 'sftp', (err, sftp) => {\n if (err) {\n cb(err);\n return;\n }\n\n const reqSubsystemCb = (err, sftp_) => {\n if (err) {\n cb(err);\n return;\n }\n\n function removeListeners() {\n sftp.removeListener('ready', onReady);\n sftp.removeListener('error', onError);\n sftp.removeListener('exit', onExit);\n sftp.removeListener('close', onExit);\n }\n\n function onReady() {\n // TODO: do not remove exit/close in case remote end closes the\n // channel abruptly and we need to notify outstanding callbacks\n removeListeners();\n cb(undefined, sftp);\n }\n\n function onError(err) {\n removeListeners();\n cb(err);\n }\n\n function onExit(code, signal) {\n removeListeners();\n let msg;\n if (typeof code === 'number')\n msg = `Received exit code ${code} while establishing SFTP session`;\n else if (signal !== undefined)\n msg = `Received signal ${signal} while establishing SFTP session`;\n else\n msg = 'Received unexpected SFTP session termination';\n const err = new Error(msg);\n err.code = code;\n err.signal = signal;\n cb(err);\n }\n\n sftp.on('ready', onReady)\n .on('error', onError)\n .on('exit', onExit)\n .on('close', onExit);\n\n sftp._init();\n };\n\n if (typeof env === 'object' && env !== null) {\n reqEnv(sftp, env, (err) => {\n if (err) {\n cb(err);\n return;\n }\n\n reqSubsystem(sftp, 'sftp', reqSubsystemCb);\n });\n } else {\n reqSubsystem(sftp, 'sftp', reqSubsystemCb);\n }\n });\n\n return this;\n }\n\n setNoDelay(noDelay) {\n if (this._sock && typeof this._sock.setNoDelay === 'function')\n this._sock.setNoDelay(noDelay);\n\n return this;\n }\n}\n\nfunction openChannel(self, type, opts, cb) {\n // Ask the server to open a channel for some purpose\n // (e.g. session (sftp, exec, shell), or forwarding a TCP connection\n const initWindow = MAX_WINDOW;\n const maxPacket = PACKET_SIZE;\n\n if (typeof opts === 'function') {\n cb = opts;\n opts = {};\n }\n\n const wrapper = (err, stream) => {\n cb(err, stream);\n };\n wrapper.type = type;\n\n const localChan = self._chanMgr.add(wrapper);\n\n if (localChan === -1) {\n cb(new Error('No free channels available'));\n return;\n }\n\n switch (type) {\n case 'session':\n case 'sftp':\n self._protocol.session(localChan, initWindow, maxPacket);\n break;\n case 'direct-tcpip':\n self._protocol.directTcpip(localChan, initWindow, maxPacket, opts);\n break;\n case 'direct-streamlocal@openssh.com':\n self._protocol.openssh_directStreamLocal(\n localChan, initWindow, maxPacket, opts\n );\n break;\n default:\n throw new Error(`Unsupported channel type: ${type}`);\n }\n}\n\nfunction reqX11(chan, screen, cb) {\n // Asks server to start sending us X11 connections\n const cfg = {\n single: false,\n protocol: 'MIT-MAGIC-COOKIE-1',\n cookie: undefined,\n screen: 0\n };\n\n if (typeof screen === 'function') {\n cb = screen;\n } else if (typeof screen === 'object' && screen !== null) {\n if (typeof screen.single === 'boolean')\n cfg.single = screen.single;\n if (typeof screen.screen === 'number')\n cfg.screen = screen.screen;\n if (typeof screen.protocol === 'string')\n cfg.protocol = screen.protocol;\n if (typeof screen.cookie === 'string')\n cfg.cookie = screen.cookie;\n else if (Buffer.isBuffer(screen.cookie))\n cfg.cookie = screen.cookie.hexSlice(0, screen.cookie.length);\n }\n if (cfg.cookie === undefined)\n cfg.cookie = randomCookie();\n\n const wantReply = (typeof cb === 'function');\n\n if (chan.outgoing.state !== 'open') {\n if (wantReply)\n cb(new Error('Channel is not open'));\n return;\n }\n\n if (wantReply) {\n chan._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true ? had_err : new Error('Unable to request X11'));\n return;\n }\n\n chan._hasX11 = true;\n ++chan._client._acceptX11;\n chan.once('close', () => {\n if (chan._client._acceptX11)\n --chan._client._acceptX11;\n });\n\n cb();\n });\n }\n\n chan._client._protocol.x11Forward(chan.outgoing.id, cfg, wantReply);\n}\n\nfunction reqPty(chan, opts, cb) {\n let rows = 24;\n let cols = 80;\n let width = 640;\n let height = 480;\n let term = 'vt100';\n let modes = null;\n\n if (typeof opts === 'function') {\n cb = opts;\n } else if (typeof opts === 'object' && opts !== null) {\n if (typeof opts.rows === 'number')\n rows = opts.rows;\n if (typeof opts.cols === 'number')\n cols = opts.cols;\n if (typeof opts.width === 'number')\n width = opts.width;\n if (typeof opts.height === 'number')\n height = opts.height;\n if (typeof opts.term === 'string')\n term = opts.term;\n if (typeof opts.modes === 'object')\n modes = opts.modes;\n }\n\n const wantReply = (typeof cb === 'function');\n\n if (chan.outgoing.state !== 'open') {\n if (wantReply)\n cb(new Error('Channel is not open'));\n return;\n }\n\n if (wantReply) {\n chan._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error('Unable to request a pseudo-terminal'));\n return;\n }\n cb();\n });\n }\n\n chan._client._protocol.pty(chan.outgoing.id,\n rows,\n cols,\n height,\n width,\n term,\n modes,\n wantReply);\n}\n\nfunction reqAgentFwd(chan, cb) {\n const wantReply = (typeof cb === 'function');\n\n if (chan.outgoing.state !== 'open') {\n wantReply && cb(new Error('Channel is not open'));\n return;\n }\n if (chan._client._agentFwdEnabled) {\n wantReply && cb(false);\n return;\n }\n\n chan._client._agentFwdEnabled = true;\n\n chan._callbacks.push((had_err) => {\n if (had_err) {\n chan._client._agentFwdEnabled = false;\n if (wantReply) {\n cb(had_err !== true\n ? had_err\n : new Error('Unable to request agent forwarding'));\n }\n return;\n }\n\n if (wantReply)\n cb();\n });\n\n chan._client._protocol.openssh_agentForward(chan.outgoing.id, true);\n}\n\nfunction reqShell(chan, cb) {\n if (chan.outgoing.state !== 'open') {\n cb(new Error('Channel is not open'));\n return;\n }\n\n chan._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true ? had_err : new Error('Unable to open shell'));\n return;\n }\n chan.subtype = 'shell';\n cb(undefined, chan);\n });\n\n chan._client._protocol.shell(chan.outgoing.id, true);\n}\n\nfunction reqExec(chan, cmd, opts, cb) {\n if (chan.outgoing.state !== 'open') {\n cb(new Error('Channel is not open'));\n return;\n }\n\n chan._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true ? had_err : new Error('Unable to exec'));\n return;\n }\n chan.subtype = 'exec';\n chan.allowHalfOpen = (opts.allowHalfOpen !== false);\n cb(undefined, chan);\n });\n\n chan._client._protocol.exec(chan.outgoing.id, cmd, true);\n}\n\nfunction reqEnv(chan, env, cb) {\n const wantReply = (typeof cb === 'function');\n\n if (chan.outgoing.state !== 'open') {\n if (wantReply)\n cb(new Error('Channel is not open'));\n return;\n }\n\n if (wantReply) {\n chan._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error('Unable to set environment'));\n return;\n }\n cb();\n });\n }\n\n const keys = Object.keys(env || {});\n\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n const val = env[key];\n chan._client._protocol.env(chan.outgoing.id, key, val, wantReply);\n }\n}\n\nfunction reqSubsystem(chan, name, cb) {\n if (chan.outgoing.state !== 'open') {\n cb(new Error('Channel is not open'));\n return;\n }\n\n chan._callbacks.push((had_err) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error(`Unable to start subsystem: ${name}`));\n return;\n }\n chan.subtype = 'subsystem';\n cb(undefined, chan);\n });\n\n chan._client._protocol.subsystem(chan.outgoing.id, name, true);\n}\n\n// TODO: inline implementation into single call site\nfunction onCHANNEL_OPEN(self, info) {\n // The server is trying to open a channel with us, this is usually when\n // we asked the server to forward us connections on some port and now they\n // are asking us to accept/deny an incoming connection on their side\n\n let localChan = -1;\n let reason;\n\n const accept = () => {\n const chanInfo = {\n type: info.type,\n incoming: {\n id: localChan,\n window: MAX_WINDOW,\n packetSize: PACKET_SIZE,\n state: 'open'\n },\n outgoing: {\n id: info.sender,\n window: info.window,\n packetSize: info.packetSize,\n state: 'open'\n }\n };\n const stream = new Channel(self, chanInfo);\n self._chanMgr.update(localChan, stream);\n\n self._protocol.channelOpenConfirm(info.sender,\n localChan,\n MAX_WINDOW,\n PACKET_SIZE);\n return stream;\n };\n const reject = () => {\n if (reason === undefined) {\n if (localChan === -1)\n reason = CHANNEL_OPEN_FAILURE.RESOURCE_SHORTAGE;\n else\n reason = CHANNEL_OPEN_FAILURE.CONNECT_FAILED;\n }\n\n if (localChan !== -1)\n self._chanMgr.remove(localChan);\n\n self._protocol.channelOpenFail(info.sender, reason, '');\n };\n const reserveChannel = () => {\n localChan = self._chanMgr.add();\n\n if (localChan === -1) {\n reason = CHANNEL_OPEN_FAILURE.RESOURCE_SHORTAGE;\n if (self.config.debug) {\n self.config.debug(\n 'Client: Automatic rejection of incoming channel open: '\n + 'no channels available'\n );\n }\n }\n\n return (localChan !== -1);\n };\n\n const data = info.data;\n switch (info.type) {\n case 'forwarded-tcpip': {\n const val = self._forwarding[`${data.destIP}:${data.destPort}`];\n if (val !== undefined && reserveChannel()) {\n if (data.destPort === 0)\n data.destPort = val;\n self.emit('tcp connection', data, accept, reject);\n return;\n }\n break;\n }\n case 'forwarded-streamlocal@openssh.com':\n if (self._forwardingUnix[data.socketPath] !== undefined\n && reserveChannel()) {\n self.emit('unix connection', data, accept, reject);\n return;\n }\n break;\n case 'auth-agent@openssh.com':\n if (self._agentFwdEnabled\n && typeof self._agent.getStream === 'function'\n && reserveChannel()) {\n self._agent.getStream((err, stream) => {\n if (err)\n return reject();\n\n const upstream = accept();\n upstream.pipe(stream).pipe(upstream);\n });\n return;\n }\n break;\n case 'x11':\n if (self._acceptX11 !== 0 && reserveChannel()) {\n self.emit('x11', data, accept, reject);\n return;\n }\n break;\n default:\n // Automatically reject any unsupported channel open requests\n reason = CHANNEL_OPEN_FAILURE.UNKNOWN_CHANNEL_TYPE;\n if (self.config.debug) {\n self.config.debug(\n 'Client: Automatic rejection of unsupported incoming channel open '\n + `type: ${info.type}`\n );\n }\n }\n\n if (reason === undefined) {\n reason = CHANNEL_OPEN_FAILURE.ADMINISTRATIVELY_PROHIBITED;\n if (self.config.debug) {\n self.config.debug(\n 'Client: Automatic rejection of unexpected incoming channel open for: '\n + info.type\n );\n }\n }\n\n reject();\n}\n\nconst randomCookie = (() => {\n const buffer = Buffer.allocUnsafe(16);\n return () => {\n randomFillSync(buffer, 0, 16);\n return buffer.hexSlice(0, 16);\n };\n})();\n\nfunction makeSimpleAuthHandler(authList) {\n if (!Array.isArray(authList))\n throw new Error('authList must be an array');\n\n let a = 0;\n return (authsLeft, partialSuccess, cb) => {\n if (a === authList.length)\n return false;\n return authList[a++];\n };\n}\n\nfunction hostKeysProve(client, keys_, cb) {\n if (!client._sock || !isWritable(client._sock))\n return;\n\n if (typeof cb !== 'function')\n cb = noop;\n\n if (!Array.isArray(keys_))\n throw new TypeError('Invalid keys argument type');\n\n const keys = [];\n for (const key of keys_) {\n const parsed = parseKey(key);\n if (parsed instanceof Error)\n throw parsed;\n keys.push(parsed);\n }\n\n if (!client.config.strictVendor\n || (client.config.strictVendor && RE_OPENSSH.test(client._remoteVer))) {\n client._callbacks.push((had_err, data) => {\n if (had_err) {\n cb(had_err !== true\n ? had_err\n : new Error('Server failed to prove supplied keys'));\n return;\n }\n\n // TODO: move all of this parsing/verifying logic out of the client?\n const ret = [];\n let keyIdx = 0;\n bufferParser.init(data, 0);\n while (bufferParser.avail()) {\n if (keyIdx === keys.length)\n break;\n const key = keys[keyIdx++];\n const keyPublic = key.getPublicSSH();\n\n const sigEntry = bufferParser.readString();\n sigParser.init(sigEntry, 0);\n const type = sigParser.readString(true);\n let value = sigParser.readString();\n\n let algo;\n if (type !== key.type) {\n if (key.type === 'ssh-rsa') {\n switch (type) {\n case 'rsa-sha2-256':\n algo = 'sha256';\n break;\n case 'rsa-sha2-512':\n algo = 'sha512';\n break;\n default:\n continue;\n }\n } else {\n continue;\n }\n }\n\n const sessionID = client._protocol._kex.sessionID;\n const verifyData = Buffer.allocUnsafe(\n 4 + 29 + 4 + sessionID.length + 4 + keyPublic.length\n );\n let p = 0;\n writeUInt32BE(verifyData, 29, p);\n verifyData.utf8Write('hostkeys-prove-00@openssh.com', p += 4, 29);\n writeUInt32BE(verifyData, sessionID.length, p += 29);\n bufferCopy(sessionID, verifyData, 0, sessionID.length, p += 4);\n writeUInt32BE(verifyData, keyPublic.length, p += sessionID.length);\n bufferCopy(keyPublic, verifyData, 0, keyPublic.length, p += 4);\n\n if (!(value = sigSSHToASN1(value, type)))\n continue;\n if (key.verify(verifyData, value, algo) === true)\n ret.push(key);\n }\n sigParser.clear();\n bufferParser.clear();\n\n cb(null, ret);\n });\n\n client._protocol.openssh_hostKeysProve(keys);\n return;\n }\n\n process.nextTick(\n cb,\n new Error(\n 'strictVendor enabled and server is not OpenSSH or compatible version'\n )\n );\n}\n\nfunction getKeyAlgos(client, key, serverSigAlgs) {\n switch (key.type) {\n case 'ssh-rsa':\n if (client._protocol._compatFlags & COMPAT.IMPLY_RSA_SHA2_SIGALGS) {\n if (!Array.isArray(serverSigAlgs))\n serverSigAlgs = ['rsa-sha2-256', 'rsa-sha2-512'];\n else\n serverSigAlgs = ['rsa-sha2-256', 'rsa-sha2-512', ...serverSigAlgs];\n }\n if (Array.isArray(serverSigAlgs)) {\n if (serverSigAlgs.indexOf('rsa-sha2-256') !== -1)\n return [['rsa-sha2-256', 'sha256']];\n if (serverSigAlgs.indexOf('rsa-sha2-512') !== -1)\n return [['rsa-sha2-512', 'sha512']];\n if (serverSigAlgs.indexOf('ssh-rsa') === -1)\n return [];\n }\n return [['ssh-rsa', 'sha1']];\n }\n}\n\nmodule.exports = Client;\n", "'use strict';\n\nconst { Agent: HttpAgent } = require('http');\nconst { Agent: HttpsAgent } = require('https');\nconst { connect: tlsConnect } = require('tls');\n\nlet Client;\n\nfor (const ctor of [HttpAgent, HttpsAgent]) {\n class SSHAgent extends ctor {\n constructor(connectCfg, agentOptions) {\n super(agentOptions);\n\n this._connectCfg = connectCfg;\n this._defaultSrcIP = (agentOptions && agentOptions.srcIP) || 'localhost';\n }\n\n createConnection(options, cb) {\n const srcIP = (options && options.localAddress) || this._defaultSrcIP;\n const srcPort = (options && options.localPort) || 0;\n const dstIP = options.host;\n const dstPort = options.port;\n\n if (Client === undefined)\n Client = require('./client.js');\n\n const client = new Client();\n let triedForward = false;\n client.on('ready', () => {\n client.forwardOut(srcIP, srcPort, dstIP, dstPort, (err, stream) => {\n triedForward = true;\n if (err) {\n client.end();\n return cb(err);\n }\n stream.once('close', () => client.end());\n cb(null, decorateStream(stream, ctor, options));\n });\n }).on('error', cb).on('close', () => {\n if (!triedForward)\n cb(new Error('Unexpected connection close'));\n }).connect(this._connectCfg);\n }\n }\n\n exports[ctor === HttpAgent ? 'SSHTTPAgent' : 'SSHTTPSAgent'] = SSHAgent;\n}\n\nfunction noop() {}\n\nfunction decorateStream(stream, ctor, options) {\n if (ctor === HttpAgent) {\n // HTTP\n stream.setKeepAlive = noop;\n stream.setNoDelay = noop;\n stream.setTimeout = noop;\n stream.ref = noop;\n stream.unref = noop;\n stream.destroySoon = stream.destroy;\n return stream;\n }\n\n // HTTPS\n options.socket = stream;\n const wrapped = tlsConnect(options);\n\n // This is a workaround for a regression in node v12.16.3+\n // https://github.com/nodejs/node/issues/35904\n const onClose = (() => {\n let called = false;\n return () => {\n if (called)\n return;\n called = true;\n if (stream.isPaused())\n stream.resume();\n };\n })();\n // 'end' listener is needed because 'close' is not emitted in some scenarios\n // in node v12.x for some unknown reason\n wrapped.on('end', onClose).on('close', onClose);\n\n return wrapped;\n}\n", "// TODO:\n// * convert listenerCount() usage to emit() return value checking?\n// * emit error when connection severed early (e.g. before handshake)\n// * add '.connected' or similar property to connection objects to allow\n// immediate connection status checking\n'use strict';\n\nconst { Server: netServer } = require('net');\nconst EventEmitter = require('events');\nconst { listenerCount } = EventEmitter;\n\nconst {\n CHANNEL_OPEN_FAILURE,\n DEFAULT_CIPHER,\n DEFAULT_COMPRESSION,\n DEFAULT_KEX,\n DEFAULT_MAC,\n DEFAULT_SERVER_HOST_KEY,\n DISCONNECT_REASON,\n DISCONNECT_REASON_BY_VALUE,\n SUPPORTED_CIPHER,\n SUPPORTED_COMPRESSION,\n SUPPORTED_KEX,\n SUPPORTED_MAC,\n SUPPORTED_SERVER_HOST_KEY,\n} = require('./protocol/constants.js');\nconst { init: cryptoInit } = require('./protocol/crypto.js');\nconst { KexInit } = require('./protocol/kex.js');\nconst { parseKey } = require('./protocol/keyParser.js');\nconst Protocol = require('./protocol/Protocol.js');\nconst { SFTP } = require('./protocol/SFTP.js');\nconst { writeUInt32BE } = require('./protocol/utils.js');\n\nconst {\n Channel,\n MAX_WINDOW,\n PACKET_SIZE,\n windowAdjust,\n WINDOW_THRESHOLD,\n} = require('./Channel.js');\n\nconst {\n ChannelManager,\n generateAlgorithmList,\n isWritable,\n onChannelOpenFailure,\n onCHANNEL_CLOSE,\n} = require('./utils.js');\n\nconst MAX_PENDING_AUTHS = 10;\n\nclass AuthContext extends EventEmitter {\n constructor(protocol, username, service, method, cb) {\n super();\n\n this.username = this.user = username;\n this.service = service;\n this.method = method;\n this._initialResponse = false;\n this._finalResponse = false;\n this._multistep = false;\n this._cbfinal = (allowed, methodsLeft, isPartial) => {\n if (!this._finalResponse) {\n this._finalResponse = true;\n cb(this, allowed, methodsLeft, isPartial);\n }\n };\n this._protocol = protocol;\n }\n\n accept() {\n this._cleanup && this._cleanup();\n this._initialResponse = true;\n this._cbfinal(true);\n }\n reject(methodsLeft, isPartial) {\n this._cleanup && this._cleanup();\n this._initialResponse = true;\n this._cbfinal(false, methodsLeft, isPartial);\n }\n}\n\n\nclass KeyboardAuthContext extends AuthContext {\n constructor(protocol, username, service, method, submethods, cb) {\n super(protocol, username, service, method, cb);\n\n this._multistep = true;\n\n this._cb = undefined;\n this._onInfoResponse = (responses) => {\n const callback = this._cb;\n if (callback) {\n this._cb = undefined;\n callback(responses);\n }\n };\n this.submethods = submethods;\n this.on('abort', () => {\n this._cb && this._cb(new Error('Authentication request aborted'));\n });\n }\n\n prompt(prompts, title, instructions, cb) {\n if (!Array.isArray(prompts))\n prompts = [ prompts ];\n\n if (typeof title === 'function') {\n cb = title;\n title = instructions = undefined;\n } else if (typeof instructions === 'function') {\n cb = instructions;\n instructions = undefined;\n } else if (typeof cb !== 'function') {\n cb = undefined;\n }\n\n for (let i = 0; i < prompts.length; ++i) {\n if (typeof prompts[i] === 'string') {\n prompts[i] = {\n prompt: prompts[i],\n echo: true\n };\n }\n }\n\n this._cb = cb;\n this._initialResponse = true;\n\n this._protocol.authInfoReq(title, instructions, prompts);\n }\n}\n\nclass PKAuthContext extends AuthContext {\n constructor(protocol, username, service, method, pkInfo, cb) {\n super(protocol, username, service, method, cb);\n\n this.key = { algo: pkInfo.keyAlgo, data: pkInfo.key };\n this.hashAlgo = pkInfo.hashAlgo;\n this.signature = pkInfo.signature;\n this.blob = pkInfo.blob;\n }\n\n accept() {\n if (!this.signature) {\n this._initialResponse = true;\n this._protocol.authPKOK(this.key.algo, this.key.data);\n } else {\n AuthContext.prototype.accept.call(this);\n }\n }\n}\n\nclass HostbasedAuthContext extends AuthContext {\n constructor(protocol, username, service, method, pkInfo, cb) {\n super(protocol, username, service, method, cb);\n\n this.key = { algo: pkInfo.keyAlgo, data: pkInfo.key };\n this.hashAlgo = pkInfo.hashAlgo;\n this.signature = pkInfo.signature;\n this.blob = pkInfo.blob;\n this.localHostname = pkInfo.localHostname;\n this.localUsername = pkInfo.localUsername;\n }\n}\n\nclass PwdAuthContext extends AuthContext {\n constructor(protocol, username, service, method, password, cb) {\n super(protocol, username, service, method, cb);\n\n this.password = password;\n this._changeCb = undefined;\n }\n\n requestChange(prompt, cb) {\n if (this._changeCb)\n throw new Error('Change request already in progress');\n if (typeof prompt !== 'string')\n throw new Error('prompt argument must be a string');\n if (typeof cb !== 'function')\n throw new Error('Callback argument must be a function');\n this._changeCb = cb;\n this._protocol.authPasswdChg(prompt);\n }\n}\n\n\nclass Session extends EventEmitter {\n constructor(client, info, localChan) {\n super();\n\n this.type = 'session';\n this.subtype = undefined;\n this.server = true;\n this._ending = false;\n this._channel = undefined;\n this._chanInfo = {\n type: 'session',\n incoming: {\n id: localChan,\n window: MAX_WINDOW,\n packetSize: PACKET_SIZE,\n state: 'open'\n },\n outgoing: {\n id: info.sender,\n window: info.window,\n packetSize: info.packetSize,\n state: 'open'\n }\n };\n }\n}\n\n\nclass Server extends EventEmitter {\n constructor(cfg, listener) {\n super();\n\n if (typeof cfg !== 'object' || cfg === null)\n throw new Error('Missing configuration object');\n\n const hostKeys = Object.create(null);\n const hostKeyAlgoOrder = [];\n\n const hostKeys_ = cfg.hostKeys;\n if (!Array.isArray(hostKeys_))\n throw new Error('hostKeys must be an array');\n\n const cfgAlgos = (\n typeof cfg.algorithms === 'object' && cfg.algorithms !== null\n ? cfg.algorithms\n : {}\n );\n\n const hostKeyAlgos = generateAlgorithmList(\n cfgAlgos.serverHostKey,\n DEFAULT_SERVER_HOST_KEY,\n SUPPORTED_SERVER_HOST_KEY\n );\n for (let i = 0; i < hostKeys_.length; ++i) {\n let privateKey;\n if (Buffer.isBuffer(hostKeys_[i]) || typeof hostKeys_[i] === 'string')\n privateKey = parseKey(hostKeys_[i]);\n else\n privateKey = parseKey(hostKeys_[i].key, hostKeys_[i].passphrase);\n\n if (privateKey instanceof Error)\n throw new Error(`Cannot parse privateKey: ${privateKey.message}`);\n\n if (Array.isArray(privateKey)) {\n // OpenSSH's newer format only stores 1 key for now\n privateKey = privateKey[0];\n }\n\n if (privateKey.getPrivatePEM() === null)\n throw new Error('privateKey value contains an invalid private key');\n\n // Discard key if we already found a key of the same type\n if (hostKeyAlgoOrder.includes(privateKey.type))\n continue;\n\n if (privateKey.type === 'ssh-rsa') {\n // SSH supports multiple signature hashing algorithms for RSA, so we add\n // the algorithms in the desired order\n let sha1Pos = hostKeyAlgos.indexOf('ssh-rsa');\n const sha256Pos = hostKeyAlgos.indexOf('rsa-sha2-256');\n const sha512Pos = hostKeyAlgos.indexOf('rsa-sha2-512');\n if (sha1Pos === -1) {\n // Fall back to giving SHA1 the lowest priority\n sha1Pos = Infinity;\n }\n [sha1Pos, sha256Pos, sha512Pos].sort(compareNumbers).forEach((pos) => {\n if (pos === -1)\n return;\n\n let type;\n switch (pos) {\n case sha1Pos: type = 'ssh-rsa'; break;\n case sha256Pos: type = 'rsa-sha2-256'; break;\n case sha512Pos: type = 'rsa-sha2-512'; break;\n default: return;\n }\n\n // Store same RSA key under each hash algorithm name for convenience\n hostKeys[type] = privateKey;\n\n hostKeyAlgoOrder.push(type);\n });\n } else {\n hostKeys[privateKey.type] = privateKey;\n hostKeyAlgoOrder.push(privateKey.type);\n }\n }\n\n const algorithms = {\n kex: generateAlgorithmList(\n cfgAlgos.kex,\n DEFAULT_KEX,\n SUPPORTED_KEX\n ).concat(['kex-strict-s-v00@openssh.com']),\n serverHostKey: hostKeyAlgoOrder,\n cs: {\n cipher: generateAlgorithmList(\n cfgAlgos.cipher,\n DEFAULT_CIPHER,\n SUPPORTED_CIPHER\n ),\n mac: generateAlgorithmList(cfgAlgos.hmac, DEFAULT_MAC, SUPPORTED_MAC),\n compress: generateAlgorithmList(\n cfgAlgos.compress,\n DEFAULT_COMPRESSION,\n SUPPORTED_COMPRESSION\n ),\n lang: [],\n },\n sc: undefined,\n };\n algorithms.sc = algorithms.cs;\n\n if (typeof listener === 'function')\n this.on('connection', listener);\n\n const origDebug = (typeof cfg.debug === 'function' ? cfg.debug : undefined);\n const ident = (cfg.ident ? Buffer.from(cfg.ident) : undefined);\n const offer = new KexInit(algorithms);\n\n this._srv = new netServer((socket) => {\n if (this._connections >= this.maxConnections) {\n socket.destroy();\n return;\n }\n ++this._connections;\n socket.once('close', () => {\n --this._connections;\n });\n\n let debug;\n if (origDebug) {\n // Prepend debug output with a unique identifier in case there are\n // multiple clients connected at the same time\n const debugPrefix = `[${process.hrtime().join('.')}] `;\n debug = (msg) => {\n origDebug(`${debugPrefix}${msg}`);\n };\n }\n\n // eslint-disable-next-line no-use-before-define\n new Client(socket, hostKeys, ident, offer, debug, this, cfg);\n }).on('error', (err) => {\n this.emit('error', err);\n }).on('listening', () => {\n this.emit('listening');\n }).on('close', () => {\n this.emit('close');\n });\n this._connections = 0;\n this.maxConnections = Infinity;\n }\n\n injectSocket(socket) {\n this._srv.emit('connection', socket);\n }\n\n listen(...args) {\n this._srv.listen(...args);\n return this;\n }\n\n address() {\n return this._srv.address();\n }\n\n getConnections(cb) {\n this._srv.getConnections(cb);\n return this;\n }\n\n close(cb) {\n this._srv.close(cb);\n return this;\n }\n\n ref() {\n this._srv.ref();\n return this;\n }\n\n unref() {\n this._srv.unref();\n return this;\n }\n}\nServer.KEEPALIVE_CLIENT_INTERVAL = 15000;\nServer.KEEPALIVE_CLIENT_COUNT_MAX = 3;\n\n\nclass Client extends EventEmitter {\n constructor(socket, hostKeys, ident, offer, debug, server, srvCfg) {\n super();\n\n let exchanges = 0;\n let acceptedAuthSvc = false;\n let pendingAuths = [];\n let authCtx;\n let kaTimer;\n let onPacket;\n const unsentGlobalRequestsReplies = [];\n this._sock = socket;\n this._chanMgr = new ChannelManager(this);\n this._debug = debug;\n this.noMoreSessions = false;\n this.authenticated = false;\n\n // Silence pre-header errors\n function onClientPreHeaderError(err) {}\n this.on('error', onClientPreHeaderError);\n\n const DEBUG_HANDLER = (!debug ? undefined : (p, display, msg) => {\n debug(`Debug output from client: ${JSON.stringify(msg)}`);\n });\n\n const kaIntvl = (\n typeof srvCfg.keepaliveInterval === 'number'\n && isFinite(srvCfg.keepaliveInterval)\n && srvCfg.keepaliveInterval > 0\n ? srvCfg.keepaliveInterval\n : (\n typeof Server.KEEPALIVE_CLIENT_INTERVAL === 'number'\n && isFinite(Server.KEEPALIVE_CLIENT_INTERVAL)\n && Server.KEEPALIVE_CLIENT_INTERVAL > 0\n ? Server.KEEPALIVE_CLIENT_INTERVAL\n : -1\n )\n );\n const kaCountMax = (\n typeof srvCfg.keepaliveCountMax === 'number'\n && isFinite(srvCfg.keepaliveCountMax)\n && srvCfg.keepaliveCountMax >= 0\n ? srvCfg.keepaliveCountMax\n : (\n typeof Server.KEEPALIVE_CLIENT_COUNT_MAX === 'number'\n && isFinite(Server.KEEPALIVE_CLIENT_COUNT_MAX)\n && Server.KEEPALIVE_CLIENT_COUNT_MAX >= 0\n ? Server.KEEPALIVE_CLIENT_COUNT_MAX\n : -1\n )\n );\n let kaCurCount = 0;\n if (kaIntvl !== -1 && kaCountMax !== -1) {\n this.once('ready', () => {\n const onClose = () => {\n clearInterval(kaTimer);\n };\n this.on('close', onClose).on('end', onClose);\n kaTimer = setInterval(() => {\n if (++kaCurCount > kaCountMax) {\n clearInterval(kaTimer);\n const err = new Error('Keepalive timeout');\n err.level = 'client-timeout';\n this.emit('error', err);\n this.end();\n } else {\n // XXX: if the server ever starts sending real global requests to\n // the client, we will need to add a dummy callback here to\n // keep the correct reply order\n proto.ping();\n }\n }, kaIntvl);\n });\n // TODO: re-verify keepalive behavior with OpenSSH\n onPacket = () => {\n kaTimer && kaTimer.refresh();\n kaCurCount = 0;\n };\n }\n\n const proto = this._protocol = new Protocol({\n server: true,\n hostKeys,\n ident,\n offer,\n onPacket,\n greeting: srvCfg.greeting,\n banner: srvCfg.banner,\n onWrite: (data) => {\n if (isWritable(socket))\n socket.write(data);\n },\n onError: (err) => {\n if (!proto._destruct)\n socket.removeAllListeners('data');\n this.emit('error', err);\n try {\n socket.end();\n } catch {}\n },\n onHeader: (header) => {\n this.removeListener('error', onClientPreHeaderError);\n\n const info = {\n ip: socket.remoteAddress,\n family: socket.remoteFamily,\n port: socket.remotePort,\n header,\n };\n if (!server.emit('connection', this, info)) {\n // auto reject\n proto.disconnect(DISCONNECT_REASON.BY_APPLICATION);\n socket.end();\n return;\n }\n\n if (header.greeting)\n this.emit('greeting', header.greeting);\n },\n onHandshakeComplete: (negotiated) => {\n if (++exchanges > 1)\n this.emit('rekey');\n this.emit('handshake', negotiated);\n },\n debug,\n messageHandlers: {\n DEBUG: DEBUG_HANDLER,\n DISCONNECT: (p, reason, desc) => {\n if (reason !== DISCONNECT_REASON.BY_APPLICATION) {\n if (!desc) {\n desc = DISCONNECT_REASON_BY_VALUE[reason];\n if (desc === undefined)\n desc = `Unexpected disconnection reason: ${reason}`;\n }\n const err = new Error(desc);\n err.code = reason;\n this.emit('error', err);\n }\n socket.end();\n },\n CHANNEL_OPEN: (p, info) => {\n // Handle incoming requests from client\n\n // Do early reject in some cases to prevent wasteful channel\n // allocation\n if ((info.type === 'session' && this.noMoreSessions)\n || !this.authenticated) {\n const reasonCode = CHANNEL_OPEN_FAILURE.ADMINISTRATIVELY_PROHIBITED;\n return proto.channelOpenFail(info.sender, reasonCode);\n }\n\n let localChan = -1;\n let reason;\n let replied = false;\n\n let accept;\n const reject = () => {\n if (replied)\n return;\n replied = true;\n\n if (reason === undefined) {\n if (localChan === -1)\n reason = CHANNEL_OPEN_FAILURE.RESOURCE_SHORTAGE;\n else\n reason = CHANNEL_OPEN_FAILURE.CONNECT_FAILED;\n }\n\n if (localChan !== -1)\n this._chanMgr.remove(localChan);\n proto.channelOpenFail(info.sender, reason, '');\n };\n const reserveChannel = () => {\n localChan = this._chanMgr.add();\n\n if (localChan === -1) {\n reason = CHANNEL_OPEN_FAILURE.RESOURCE_SHORTAGE;\n if (debug) {\n debug('Automatic rejection of incoming channel open: '\n + 'no channels available');\n }\n }\n\n return (localChan !== -1);\n };\n\n const data = info.data;\n switch (info.type) {\n case 'session':\n if (listenerCount(this, 'session') && reserveChannel()) {\n accept = () => {\n if (replied)\n return;\n replied = true;\n\n const instance = new Session(this, info, localChan);\n this._chanMgr.update(localChan, instance);\n\n proto.channelOpenConfirm(info.sender,\n localChan,\n MAX_WINDOW,\n PACKET_SIZE);\n\n return instance;\n };\n\n this.emit('session', accept, reject);\n return;\n }\n break;\n case 'direct-tcpip':\n if (listenerCount(this, 'tcpip') && reserveChannel()) {\n accept = () => {\n if (replied)\n return;\n replied = true;\n\n const chanInfo = {\n type: undefined,\n incoming: {\n id: localChan,\n window: MAX_WINDOW,\n packetSize: PACKET_SIZE,\n state: 'open'\n },\n outgoing: {\n id: info.sender,\n window: info.window,\n packetSize: info.packetSize,\n state: 'open'\n }\n };\n\n const stream = new Channel(this, chanInfo, { server: true });\n this._chanMgr.update(localChan, stream);\n\n proto.channelOpenConfirm(info.sender,\n localChan,\n MAX_WINDOW,\n PACKET_SIZE);\n\n return stream;\n };\n\n this.emit('tcpip', accept, reject, data);\n return;\n }\n break;\n case 'direct-streamlocal@openssh.com':\n if (listenerCount(this, 'openssh.streamlocal')\n && reserveChannel()) {\n accept = () => {\n if (replied)\n return;\n replied = true;\n\n const chanInfo = {\n type: undefined,\n incoming: {\n id: localChan,\n window: MAX_WINDOW,\n packetSize: PACKET_SIZE,\n state: 'open'\n },\n outgoing: {\n id: info.sender,\n window: info.window,\n packetSize: info.packetSize,\n state: 'open'\n }\n };\n\n const stream = new Channel(this, chanInfo, { server: true });\n this._chanMgr.update(localChan, stream);\n\n proto.channelOpenConfirm(info.sender,\n localChan,\n MAX_WINDOW,\n PACKET_SIZE);\n\n return stream;\n };\n\n this.emit('openssh.streamlocal', accept, reject, data);\n return;\n }\n break;\n default:\n // Automatically reject any unsupported channel open requests\n reason = CHANNEL_OPEN_FAILURE.UNKNOWN_CHANNEL_TYPE;\n if (debug) {\n debug('Automatic rejection of unsupported incoming channel open'\n + ` type: ${info.type}`);\n }\n }\n\n if (reason === undefined) {\n reason = CHANNEL_OPEN_FAILURE.ADMINISTRATIVELY_PROHIBITED;\n if (debug) {\n debug('Automatic rejection of unexpected incoming channel open'\n + ` for: ${info.type}`);\n }\n }\n\n reject();\n },\n CHANNEL_OPEN_CONFIRMATION: (p, info) => {\n const channel = this._chanMgr.get(info.recipient);\n if (typeof channel !== 'function')\n return;\n\n const chanInfo = {\n type: channel.type,\n incoming: {\n id: info.recipient,\n window: MAX_WINDOW,\n packetSize: PACKET_SIZE,\n state: 'open'\n },\n outgoing: {\n id: info.sender,\n window: info.window,\n packetSize: info.packetSize,\n state: 'open'\n }\n };\n\n const instance = new Channel(this, chanInfo, { server: true });\n this._chanMgr.update(info.recipient, instance);\n channel(undefined, instance);\n },\n CHANNEL_OPEN_FAILURE: (p, recipient, reason, description) => {\n const channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'function')\n return;\n\n const info = { reason, description };\n onChannelOpenFailure(this, recipient, info, channel);\n },\n CHANNEL_DATA: (p, recipient, data) => {\n let channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.constructor === Session) {\n channel = channel._channel;\n if (!channel)\n return;\n }\n\n // The remote party should not be sending us data if there is no\n // window space available ...\n // TODO: raise error on data with not enough window?\n if (channel.incoming.window === 0)\n return;\n\n channel.incoming.window -= data.length;\n\n if (channel.push(data) === false) {\n channel._waitChanDrain = true;\n return;\n }\n\n if (channel.incoming.window <= WINDOW_THRESHOLD)\n windowAdjust(channel);\n },\n CHANNEL_EXTENDED_DATA: (p, recipient, data, type) => {\n // NOOP -- should not be sent by client\n },\n CHANNEL_WINDOW_ADJUST: (p, recipient, amount) => {\n let channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.constructor === Session) {\n channel = channel._channel;\n if (!channel)\n return;\n }\n\n // The other side is allowing us to send `amount` more bytes of data\n channel.outgoing.window += amount;\n\n if (channel._waitWindow) {\n channel._waitWindow = false;\n\n if (channel._chunk) {\n channel._write(channel._chunk, null, channel._chunkcb);\n } else if (channel._chunkcb) {\n channel._chunkcb();\n } else if (channel._chunkErr) {\n channel.stderr._write(channel._chunkErr,\n null,\n channel._chunkcbErr);\n } else if (channel._chunkcbErr) {\n channel._chunkcbErr();\n }\n }\n },\n CHANNEL_SUCCESS: (p, recipient) => {\n let channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.constructor === Session) {\n channel = channel._channel;\n if (!channel)\n return;\n }\n\n if (channel._callbacks.length)\n channel._callbacks.shift()(false);\n },\n CHANNEL_FAILURE: (p, recipient) => {\n let channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.constructor === Session) {\n channel = channel._channel;\n if (!channel)\n return;\n }\n\n if (channel._callbacks.length)\n channel._callbacks.shift()(true);\n },\n CHANNEL_REQUEST: (p, recipient, type, wantReply, data) => {\n const session = this._chanMgr.get(recipient);\n if (typeof session !== 'object' || session === null)\n return;\n\n let replied = false;\n let accept;\n let reject;\n\n if (session.constructor !== Session) {\n // normal Channel instance\n if (wantReply)\n proto.channelFailure(session.outgoing.id);\n return;\n }\n\n if (wantReply) {\n // \"real session\" requests will have custom accept behaviors\n if (type !== 'shell'\n && type !== 'exec'\n && type !== 'subsystem') {\n accept = () => {\n if (replied || session._ending || session._channel)\n return;\n replied = true;\n\n proto.channelSuccess(session._chanInfo.outgoing.id);\n };\n }\n\n reject = () => {\n if (replied || session._ending || session._channel)\n return;\n replied = true;\n\n proto.channelFailure(session._chanInfo.outgoing.id);\n };\n }\n\n if (session._ending) {\n reject && reject();\n return;\n }\n\n switch (type) {\n // \"pre-real session start\" requests\n case 'env':\n if (listenerCount(session, 'env')) {\n session.emit('env', accept, reject, {\n key: data.name,\n val: data.value\n });\n return;\n }\n break;\n case 'pty-req':\n if (listenerCount(session, 'pty')) {\n session.emit('pty', accept, reject, data);\n return;\n }\n break;\n case 'window-change':\n if (listenerCount(session, 'window-change'))\n session.emit('window-change', accept, reject, data);\n else\n reject && reject();\n break;\n case 'x11-req':\n if (listenerCount(session, 'x11')) {\n session.emit('x11', accept, reject, data);\n return;\n }\n break;\n // \"post-real session start\" requests\n case 'signal':\n if (listenerCount(session, 'signal')) {\n session.emit('signal', accept, reject, {\n name: data\n });\n return;\n }\n break;\n // XXX: is `auth-agent-req@openssh.com` really \"post-real session\n // start\"?\n case 'auth-agent-req@openssh.com':\n if (listenerCount(session, 'auth-agent')) {\n session.emit('auth-agent', accept, reject);\n return;\n }\n break;\n // \"real session start\" requests\n case 'shell':\n if (listenerCount(session, 'shell')) {\n accept = () => {\n if (replied || session._ending || session._channel)\n return;\n replied = true;\n\n if (wantReply)\n proto.channelSuccess(session._chanInfo.outgoing.id);\n\n const channel = new Channel(\n this, session._chanInfo, { server: true }\n );\n\n channel.subtype = session.subtype = type;\n session._channel = channel;\n\n return channel;\n };\n\n session.emit('shell', accept, reject);\n return;\n }\n break;\n case 'exec':\n if (listenerCount(session, 'exec')) {\n accept = () => {\n if (replied || session._ending || session._channel)\n return;\n replied = true;\n\n if (wantReply)\n proto.channelSuccess(session._chanInfo.outgoing.id);\n\n const channel = new Channel(\n this, session._chanInfo, { server: true }\n );\n\n channel.subtype = session.subtype = type;\n session._channel = channel;\n\n return channel;\n };\n\n session.emit('exec', accept, reject, {\n command: data\n });\n return;\n }\n break;\n case 'subsystem': {\n let useSFTP = (data === 'sftp');\n accept = () => {\n if (replied || session._ending || session._channel)\n return;\n replied = true;\n\n if (wantReply)\n proto.channelSuccess(session._chanInfo.outgoing.id);\n\n let instance;\n if (useSFTP) {\n instance = new SFTP(this, session._chanInfo, {\n server: true,\n debug,\n });\n } else {\n instance = new Channel(\n this, session._chanInfo, { server: true }\n );\n instance.subtype =\n session.subtype = `${type}:${data}`;\n }\n session._channel = instance;\n\n return instance;\n };\n\n if (data === 'sftp') {\n if (listenerCount(session, 'sftp')) {\n session.emit('sftp', accept, reject);\n return;\n }\n useSFTP = false;\n }\n if (listenerCount(session, 'subsystem')) {\n session.emit('subsystem', accept, reject, {\n name: data\n });\n return;\n }\n break;\n }\n }\n debug && debug(\n `Automatic rejection of incoming channel request: ${type}`\n );\n reject && reject();\n },\n CHANNEL_EOF: (p, recipient) => {\n let channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.constructor === Session) {\n if (!channel._ending) {\n channel._ending = true;\n channel.emit('eof');\n channel.emit('end');\n }\n channel = channel._channel;\n if (!channel)\n return;\n }\n\n if (channel.incoming.state !== 'open')\n return;\n channel.incoming.state = 'eof';\n\n if (channel.readable)\n channel.push(null);\n },\n CHANNEL_CLOSE: (p, recipient) => {\n let channel = this._chanMgr.get(recipient);\n if (typeof channel !== 'object' || channel === null)\n return;\n\n if (channel.constructor === Session) {\n channel._ending = true;\n channel.emit('close');\n channel = channel._channel;\n if (!channel)\n return;\n }\n\n onCHANNEL_CLOSE(this, recipient, channel);\n },\n // Begin service/auth-related ==========================================\n SERVICE_REQUEST: (p, service) => {\n if (exchanges === 0\n || acceptedAuthSvc\n || this.authenticated\n || service !== 'ssh-userauth') {\n proto.disconnect(DISCONNECT_REASON.SERVICE_NOT_AVAILABLE);\n socket.end();\n return;\n }\n\n acceptedAuthSvc = true;\n proto.serviceAccept(service);\n },\n USERAUTH_REQUEST: (p, username, service, method, methodData) => {\n if (exchanges === 0\n || this.authenticated\n || (authCtx\n && (authCtx.username !== username\n || authCtx.service !== service))\n // TODO: support hostbased auth\n || (method !== 'password'\n && method !== 'publickey'\n && method !== 'hostbased'\n && method !== 'keyboard-interactive'\n && method !== 'none')\n || pendingAuths.length === MAX_PENDING_AUTHS) {\n proto.disconnect(DISCONNECT_REASON.PROTOCOL_ERROR);\n socket.end();\n return;\n } else if (service !== 'ssh-connection') {\n proto.disconnect(DISCONNECT_REASON.SERVICE_NOT_AVAILABLE);\n socket.end();\n return;\n }\n\n let ctx;\n switch (method) {\n case 'keyboard-interactive':\n ctx = new KeyboardAuthContext(proto, username, service, method,\n methodData, onAuthDecide);\n break;\n case 'publickey':\n ctx = new PKAuthContext(proto, username, service, method,\n methodData, onAuthDecide);\n break;\n case 'hostbased':\n ctx = new HostbasedAuthContext(proto, username, service, method,\n methodData, onAuthDecide);\n break;\n case 'password':\n if (authCtx\n && authCtx instanceof PwdAuthContext\n && authCtx._changeCb) {\n const cb = authCtx._changeCb;\n authCtx._changeCb = undefined;\n cb(methodData.newPassword);\n return;\n }\n ctx = new PwdAuthContext(proto, username, service, method,\n methodData, onAuthDecide);\n break;\n case 'none':\n ctx = new AuthContext(proto, username, service, method,\n onAuthDecide);\n break;\n }\n\n if (authCtx) {\n if (!authCtx._initialResponse) {\n return pendingAuths.push(ctx);\n } else if (authCtx._multistep && !authCtx._finalResponse) {\n // RFC 4252 says to silently abort the current auth request if a\n // new auth request comes in before the final response from an\n // auth method that requires additional request/response exchanges\n // -- this means keyboard-interactive for now ...\n authCtx._cleanup && authCtx._cleanup();\n authCtx.emit('abort');\n }\n }\n\n authCtx = ctx;\n\n if (listenerCount(this, 'authentication'))\n this.emit('authentication', authCtx);\n else\n authCtx.reject();\n },\n USERAUTH_INFO_RESPONSE: (p, responses) => {\n if (authCtx && authCtx instanceof KeyboardAuthContext)\n authCtx._onInfoResponse(responses);\n },\n // End service/auth-related ============================================\n GLOBAL_REQUEST: (p, name, wantReply, data) => {\n const reply = {\n type: null,\n buf: null\n };\n\n function setReply(type, buf) {\n reply.type = type;\n reply.buf = buf;\n sendReplies();\n }\n\n if (wantReply)\n unsentGlobalRequestsReplies.push(reply);\n\n if ((name === 'tcpip-forward'\n || name === 'cancel-tcpip-forward'\n || name === 'no-more-sessions@openssh.com'\n || name === 'streamlocal-forward@openssh.com'\n || name === 'cancel-streamlocal-forward@openssh.com')\n && listenerCount(this, 'request')\n && this.authenticated) {\n let accept;\n let reject;\n\n if (wantReply) {\n let replied = false;\n accept = (chosenPort) => {\n if (replied)\n return;\n replied = true;\n let bufPort;\n if (name === 'tcpip-forward'\n && data.bindPort === 0\n && typeof chosenPort === 'number') {\n bufPort = Buffer.allocUnsafe(4);\n writeUInt32BE(bufPort, chosenPort, 0);\n }\n setReply('SUCCESS', bufPort);\n };\n reject = () => {\n if (replied)\n return;\n replied = true;\n setReply('FAILURE');\n };\n }\n\n if (name === 'no-more-sessions@openssh.com') {\n this.noMoreSessions = true;\n accept && accept();\n return;\n }\n\n this.emit('request', accept, reject, name, data);\n } else if (wantReply) {\n setReply('FAILURE');\n }\n },\n },\n });\n\n socket.pause();\n cryptoInit.then(() => {\n proto.start();\n socket.on('data', (data) => {\n try {\n proto.parse(data, 0, data.length);\n } catch (ex) {\n this.emit('error', ex);\n try {\n if (isWritable(socket))\n socket.end();\n } catch {}\n }\n });\n socket.resume();\n }).catch((err) => {\n this.emit('error', err);\n try {\n if (isWritable(socket))\n socket.end();\n } catch {}\n });\n socket.on('error', (err) => {\n err.level = 'socket';\n this.emit('error', err);\n }).once('end', () => {\n debug && debug('Socket ended');\n proto.cleanup();\n this.emit('end');\n }).once('close', () => {\n debug && debug('Socket closed');\n proto.cleanup();\n this.emit('close');\n\n const err = new Error('No response from server');\n\n // Simulate error for pending channels and close any open channels\n this._chanMgr.cleanup(err);\n });\n\n const onAuthDecide = (ctx, allowed, methodsLeft, isPartial) => {\n if (authCtx === ctx && !this.authenticated) {\n if (allowed) {\n authCtx = undefined;\n this.authenticated = true;\n proto.authSuccess();\n pendingAuths = [];\n this.emit('ready');\n } else {\n proto.authFailure(methodsLeft, isPartial);\n if (pendingAuths.length) {\n authCtx = pendingAuths.pop();\n if (listenerCount(this, 'authentication'))\n this.emit('authentication', authCtx);\n else\n authCtx.reject();\n }\n }\n }\n };\n\n function sendReplies() {\n while (unsentGlobalRequestsReplies.length > 0\n && unsentGlobalRequestsReplies[0].type) {\n const reply = unsentGlobalRequestsReplies.shift();\n if (reply.type === 'SUCCESS')\n proto.requestSuccess(reply.buf);\n if (reply.type === 'FAILURE')\n proto.requestFailure();\n }\n }\n }\n\n end() {\n if (this._sock && isWritable(this._sock)) {\n this._protocol.disconnect(DISCONNECT_REASON.BY_APPLICATION);\n this._sock.end();\n }\n return this;\n }\n\n x11(originAddr, originPort, cb) {\n const opts = { originAddr, originPort };\n openChannel(this, 'x11', opts, cb);\n return this;\n }\n\n forwardOut(boundAddr, boundPort, remoteAddr, remotePort, cb) {\n const opts = { boundAddr, boundPort, remoteAddr, remotePort };\n openChannel(this, 'forwarded-tcpip', opts, cb);\n return this;\n }\n\n openssh_forwardOutStreamLocal(socketPath, cb) {\n const opts = { socketPath };\n openChannel(this, 'forwarded-streamlocal@openssh.com', opts, cb);\n return this;\n }\n\n rekey(cb) {\n let error;\n\n try {\n this._protocol.rekey();\n } catch (ex) {\n error = ex;\n }\n\n // TODO: re-throw error if no callback?\n\n if (typeof cb === 'function') {\n if (error)\n process.nextTick(cb, error);\n else\n this.once('rekey', cb);\n }\n }\n\n setNoDelay(noDelay) {\n if (this._sock && typeof this._sock.setNoDelay === 'function')\n this._sock.setNoDelay(noDelay);\n\n return this;\n }\n}\n\n\nfunction openChannel(self, type, opts, cb) {\n // Ask the client to open a channel for some purpose (e.g. a forwarded TCP\n // connection)\n const initWindow = MAX_WINDOW;\n const maxPacket = PACKET_SIZE;\n\n if (typeof opts === 'function') {\n cb = opts;\n opts = {};\n }\n\n const wrapper = (err, stream) => {\n cb(err, stream);\n };\n wrapper.type = type;\n\n const localChan = self._chanMgr.add(wrapper);\n\n if (localChan === -1) {\n cb(new Error('No free channels available'));\n return;\n }\n\n switch (type) {\n case 'forwarded-tcpip':\n self._protocol.forwardedTcpip(localChan, initWindow, maxPacket, opts);\n break;\n case 'x11':\n self._protocol.x11(localChan, initWindow, maxPacket, opts);\n break;\n case 'forwarded-streamlocal@openssh.com':\n self._protocol.openssh_forwardedStreamLocal(\n localChan, initWindow, maxPacket, opts\n );\n break;\n default:\n throw new Error(`Unsupported channel type: ${type}`);\n }\n}\n\nfunction compareNumbers(a, b) {\n return a - b;\n}\n\nmodule.exports = Server;\nmodule.exports.IncomingClient = Client;\n", "'use strict';\n\nconst {\n createCipheriv,\n generateKeyPair: generateKeyPair_,\n generateKeyPairSync: generateKeyPairSync_,\n getCurves,\n randomBytes,\n} = require('crypto');\n\nconst { Ber } = require('asn1');\nconst bcrypt_pbkdf = require('bcrypt-pbkdf').pbkdf;\n\nconst { CIPHER_INFO } = require('./protocol/crypto.js');\n\nconst SALT_LEN = 16;\nconst DEFAULT_ROUNDS = 16;\n\nconst curves = getCurves();\nconst ciphers = new Map(Object.entries(CIPHER_INFO));\n\nfunction makeArgs(type, opts) {\n if (typeof type !== 'string')\n throw new TypeError('Key type must be a string');\n\n const publicKeyEncoding = { type: 'spki', format: 'der' };\n const privateKeyEncoding = { type: 'pkcs8', format: 'der' };\n\n switch (type.toLowerCase()) {\n case 'rsa': {\n if (typeof opts !== 'object' || opts === null)\n throw new TypeError('Missing options object for RSA key');\n const modulusLength = opts.bits;\n if (!Number.isInteger(modulusLength))\n throw new TypeError('RSA bits must be an integer');\n if (modulusLength <= 0 || modulusLength > 16384)\n throw new RangeError('RSA bits must be non-zero and <= 16384');\n return ['rsa', { modulusLength, publicKeyEncoding, privateKeyEncoding }];\n }\n case 'ecdsa': {\n if (typeof opts !== 'object' || opts === null)\n throw new TypeError('Missing options object for ECDSA key');\n if (!Number.isInteger(opts.bits))\n throw new TypeError('ECDSA bits must be an integer');\n let namedCurve;\n switch (opts.bits) {\n case 256:\n namedCurve = 'prime256v1';\n break;\n case 384:\n namedCurve = 'secp384r1';\n break;\n case 521:\n namedCurve = 'secp521r1';\n break;\n default:\n throw new Error('ECDSA bits must be 256, 384, or 521');\n }\n if (!curves.includes(namedCurve))\n throw new Error('Unsupported ECDSA bits value');\n return ['ec', { namedCurve, publicKeyEncoding, privateKeyEncoding }];\n }\n case 'ed25519':\n return ['ed25519', { publicKeyEncoding, privateKeyEncoding }];\n default:\n throw new Error(`Unsupported key type: ${type}`);\n }\n}\n\nfunction parseDERs(keyType, pub, priv) {\n switch (keyType) {\n case 'rsa': {\n // Note: we don't need to parse the public key since the PKCS8 private key\n // already includes the public key parameters\n\n // Parse private key\n let reader = new Ber.Reader(priv);\n reader.readSequence();\n\n // - Version\n if (reader.readInt() !== 0)\n throw new Error('Unsupported version in RSA private key');\n\n // - Algorithm\n reader.readSequence();\n if (reader.readOID() !== '1.2.840.113549.1.1.1')\n throw new Error('Bad RSA private OID');\n // - Algorithm parameters (RSA has none)\n if (reader.readByte() !== Ber.Null)\n throw new Error('Malformed RSA private key (expected null)');\n if (reader.readByte() !== 0x00) {\n throw new Error(\n 'Malformed RSA private key (expected zero-length null)'\n );\n }\n\n reader = new Ber.Reader(reader.readString(Ber.OctetString, true));\n reader.readSequence();\n if (reader.readInt() !== 0)\n throw new Error('Unsupported version in RSA private key');\n const n = reader.readString(Ber.Integer, true);\n const e = reader.readString(Ber.Integer, true);\n const d = reader.readString(Ber.Integer, true);\n const p = reader.readString(Ber.Integer, true);\n const q = reader.readString(Ber.Integer, true);\n reader.readString(Ber.Integer, true); // dmp1\n reader.readString(Ber.Integer, true); // dmq1\n const iqmp = reader.readString(Ber.Integer, true);\n\n /*\n OpenSSH RSA private key:\n string \"ssh-rsa\"\n string n -- public\n string e -- public\n string d -- private\n string iqmp -- private\n string p -- private\n string q -- private\n */\n const keyName = Buffer.from('ssh-rsa');\n const privBuf = Buffer.allocUnsafe(\n 4 + keyName.length\n + 4 + n.length\n + 4 + e.length\n + 4 + d.length\n + 4 + iqmp.length\n + 4 + p.length\n + 4 + q.length\n );\n let pos = 0;\n\n privBuf.writeUInt32BE(keyName.length, pos += 0);\n privBuf.set(keyName, pos += 4);\n privBuf.writeUInt32BE(n.length, pos += keyName.length);\n privBuf.set(n, pos += 4);\n privBuf.writeUInt32BE(e.length, pos += n.length);\n privBuf.set(e, pos += 4);\n privBuf.writeUInt32BE(d.length, pos += e.length);\n privBuf.set(d, pos += 4);\n privBuf.writeUInt32BE(iqmp.length, pos += d.length);\n privBuf.set(iqmp, pos += 4);\n privBuf.writeUInt32BE(p.length, pos += iqmp.length);\n privBuf.set(p, pos += 4);\n privBuf.writeUInt32BE(q.length, pos += p.length);\n privBuf.set(q, pos += 4);\n\n /*\n OpenSSH RSA public key:\n string \"ssh-rsa\"\n string e -- public\n string n -- public\n */\n const pubBuf = Buffer.allocUnsafe(\n 4 + keyName.length\n + 4 + e.length\n + 4 + n.length\n );\n pos = 0;\n\n pubBuf.writeUInt32BE(keyName.length, pos += 0);\n pubBuf.set(keyName, pos += 4);\n pubBuf.writeUInt32BE(e.length, pos += keyName.length);\n pubBuf.set(e, pos += 4);\n pubBuf.writeUInt32BE(n.length, pos += e.length);\n pubBuf.set(n, pos += 4);\n\n return { sshName: keyName.toString(), priv: privBuf, pub: pubBuf };\n }\n case 'ec': {\n // Parse public key\n let reader = new Ber.Reader(pub);\n reader.readSequence();\n\n reader.readSequence();\n if (reader.readOID() !== '1.2.840.10045.2.1')\n throw new Error('Bad ECDSA public OID');\n // Skip curve OID, we'll get it from the private key\n reader.readOID();\n let pubBin = reader.readString(Ber.BitString, true);\n {\n // Remove leading zero bytes\n let i = 0;\n for (; i < pubBin.length && pubBin[i] === 0x00; ++i);\n if (i > 0)\n pubBin = pubBin.slice(i);\n }\n\n // Parse private key\n reader = new Ber.Reader(priv);\n reader.readSequence();\n\n // - Version\n if (reader.readInt() !== 0)\n throw new Error('Unsupported version in ECDSA private key');\n\n reader.readSequence();\n if (reader.readOID() !== '1.2.840.10045.2.1')\n throw new Error('Bad ECDSA private OID');\n const curveOID = reader.readOID();\n let sshCurveName;\n switch (curveOID) {\n case '1.2.840.10045.3.1.7':\n // prime256v1/secp256r1\n sshCurveName = 'nistp256';\n break;\n case '1.3.132.0.34':\n // secp384r1\n sshCurveName = 'nistp384';\n break;\n case '1.3.132.0.35':\n // secp521r1\n sshCurveName = 'nistp521';\n break;\n default:\n throw new Error('Unsupported curve in ECDSA private key');\n }\n\n reader = new Ber.Reader(reader.readString(Ber.OctetString, true));\n reader.readSequence();\n\n // - Version\n if (reader.readInt() !== 1)\n throw new Error('Unsupported version in ECDSA private key');\n\n // Add leading zero byte to prevent negative bignum in private key\n const privBin = Buffer.concat([\n Buffer.from([0x00]),\n reader.readString(Ber.OctetString, true)\n ]);\n\n /*\n OpenSSH ECDSA private key:\n string \"ecdsa-sha2-<sshCurveName>\"\n string curve name\n string Q -- public\n string d -- private\n */\n const keyName = Buffer.from(`ecdsa-sha2-${sshCurveName}`);\n sshCurveName = Buffer.from(sshCurveName);\n const privBuf = Buffer.allocUnsafe(\n 4 + keyName.length\n + 4 + sshCurveName.length\n + 4 + pubBin.length\n + 4 + privBin.length\n );\n let pos = 0;\n\n privBuf.writeUInt32BE(keyName.length, pos += 0);\n privBuf.set(keyName, pos += 4);\n privBuf.writeUInt32BE(sshCurveName.length, pos += keyName.length);\n privBuf.set(sshCurveName, pos += 4);\n privBuf.writeUInt32BE(pubBin.length, pos += sshCurveName.length);\n privBuf.set(pubBin, pos += 4);\n privBuf.writeUInt32BE(privBin.length, pos += pubBin.length);\n privBuf.set(privBin, pos += 4);\n\n /*\n OpenSSH ECDSA public key:\n string \"ecdsa-sha2-<sshCurveName>\"\n string curve name\n string Q -- public\n */\n const pubBuf = Buffer.allocUnsafe(\n 4 + keyName.length\n + 4 + sshCurveName.length\n + 4 + pubBin.length\n );\n pos = 0;\n\n pubBuf.writeUInt32BE(keyName.length, pos += 0);\n pubBuf.set(keyName, pos += 4);\n pubBuf.writeUInt32BE(sshCurveName.length, pos += keyName.length);\n pubBuf.set(sshCurveName, pos += 4);\n pubBuf.writeUInt32BE(pubBin.length, pos += sshCurveName.length);\n pubBuf.set(pubBin, pos += 4);\n\n return { sshName: keyName.toString(), priv: privBuf, pub: pubBuf };\n }\n case 'ed25519': {\n // Parse public key\n let reader = new Ber.Reader(pub);\n reader.readSequence();\n\n // - Algorithm\n reader.readSequence();\n if (reader.readOID() !== '1.3.101.112')\n throw new Error('Bad ED25519 public OID');\n // - Attributes (absent for ED25519)\n\n let pubBin = reader.readString(Ber.BitString, true);\n {\n // Remove leading zero bytes\n let i = 0;\n for (; i < pubBin.length && pubBin[i] === 0x00; ++i);\n if (i > 0)\n pubBin = pubBin.slice(i);\n }\n\n // Parse private key\n reader = new Ber.Reader(priv);\n reader.readSequence();\n\n // - Version\n if (reader.readInt() !== 0)\n throw new Error('Unsupported version in ED25519 private key');\n\n // - Algorithm\n reader.readSequence();\n if (reader.readOID() !== '1.3.101.112')\n throw new Error('Bad ED25519 private OID');\n // - Attributes (absent)\n\n reader = new Ber.Reader(reader.readString(Ber.OctetString, true));\n const privBin = reader.readString(Ber.OctetString, true);\n\n /*\n OpenSSH ed25519 private key:\n string \"ssh-ed25519\"\n string public key\n string private key + public key\n */\n const keyName = Buffer.from('ssh-ed25519');\n const privBuf = Buffer.allocUnsafe(\n 4 + keyName.length\n + 4 + pubBin.length\n + 4 + (privBin.length + pubBin.length)\n );\n let pos = 0;\n\n privBuf.writeUInt32BE(keyName.length, pos += 0);\n privBuf.set(keyName, pos += 4);\n privBuf.writeUInt32BE(pubBin.length, pos += keyName.length);\n privBuf.set(pubBin, pos += 4);\n privBuf.writeUInt32BE(\n privBin.length + pubBin.length,\n pos += pubBin.length\n );\n privBuf.set(privBin, pos += 4);\n privBuf.set(pubBin, pos += privBin.length);\n\n /*\n OpenSSH ed25519 public key:\n string \"ssh-ed25519\"\n string public key\n */\n const pubBuf = Buffer.allocUnsafe(\n 4 + keyName.length\n + 4 + pubBin.length\n );\n pos = 0;\n\n pubBuf.writeUInt32BE(keyName.length, pos += 0);\n pubBuf.set(keyName, pos += 4);\n pubBuf.writeUInt32BE(pubBin.length, pos += keyName.length);\n pubBuf.set(pubBin, pos += 4);\n\n return { sshName: keyName.toString(), priv: privBuf, pub: pubBuf };\n }\n }\n}\n\nfunction convertKeys(keyType, pub, priv, opts) {\n let format = 'new';\n let encrypted;\n let comment = '';\n if (typeof opts === 'object' && opts !== null) {\n if (typeof opts.comment === 'string' && opts.comment)\n comment = opts.comment;\n if (typeof opts.format === 'string' && opts.format)\n format = opts.format;\n if (opts.passphrase) {\n let passphrase;\n if (typeof opts.passphrase === 'string')\n passphrase = Buffer.from(opts.passphrase);\n else if (Buffer.isBuffer(opts.passphrase))\n passphrase = opts.passphrase;\n else\n throw new Error('Invalid passphrase');\n\n if (opts.cipher === undefined)\n throw new Error('Missing cipher name');\n const cipher = ciphers.get(opts.cipher);\n if (cipher === undefined)\n throw new Error('Invalid cipher name');\n\n if (format === 'new') {\n let rounds = DEFAULT_ROUNDS;\n if (opts.rounds !== undefined) {\n if (!Number.isInteger(opts.rounds))\n throw new TypeError('rounds must be an integer');\n if (opts.rounds > 0)\n rounds = opts.rounds;\n }\n\n const gen = Buffer.allocUnsafe(cipher.keyLen + cipher.ivLen);\n const salt = randomBytes(SALT_LEN);\n const r = bcrypt_pbkdf(\n passphrase,\n passphrase.length,\n salt,\n salt.length,\n gen,\n gen.length,\n rounds\n );\n if (r !== 0)\n return new Error('Failed to generate information to encrypt key');\n\n /*\n string salt\n uint32 rounds\n */\n const kdfOptions = Buffer.allocUnsafe(4 + salt.length + 4);\n {\n let pos = 0;\n kdfOptions.writeUInt32BE(salt.length, pos += 0);\n kdfOptions.set(salt, pos += 4);\n kdfOptions.writeUInt32BE(rounds, pos += salt.length);\n }\n\n encrypted = {\n cipher,\n cipherName: opts.cipher,\n kdfName: 'bcrypt',\n kdfOptions,\n key: gen.slice(0, cipher.keyLen),\n iv: gen.slice(cipher.keyLen),\n };\n }\n }\n }\n\n switch (format) {\n case 'new': {\n let privateB64 = '-----BEGIN OPENSSH PRIVATE KEY-----\\n';\n let publicB64;\n /*\n byte[] \"openssh-key-v1\\0\"\n string ciphername\n string kdfname\n string kdfoptions\n uint32 number of keys N\n string publickey1\n string encrypted, padded list of private keys\n uint32 checkint\n uint32 checkint\n byte[] privatekey1\n string comment1\n byte 1\n byte 2\n byte 3\n ...\n byte padlen % 255\n */\n const cipherName = Buffer.from(encrypted ? encrypted.cipherName : 'none');\n const kdfName = Buffer.from(encrypted ? encrypted.kdfName : 'none');\n const kdfOptions = (encrypted ? encrypted.kdfOptions : Buffer.alloc(0));\n const blockLen = (encrypted ? encrypted.cipher.blockLen : 8);\n\n const parsed = parseDERs(keyType, pub, priv);\n\n const checkInt = randomBytes(4);\n const commentBin = Buffer.from(comment);\n const privBlobLen = (4 + 4 + parsed.priv.length + 4 + commentBin.length);\n let padding = [];\n for (let i = 1; ((privBlobLen + padding.length) % blockLen); ++i)\n padding.push(i & 0xFF);\n padding = Buffer.from(padding);\n\n let privBlob = Buffer.allocUnsafe(privBlobLen + padding.length);\n let extra;\n {\n let pos = 0;\n privBlob.set(checkInt, pos += 0);\n privBlob.set(checkInt, pos += 4);\n privBlob.set(parsed.priv, pos += 4);\n privBlob.writeUInt32BE(commentBin.length, pos += parsed.priv.length);\n privBlob.set(commentBin, pos += 4);\n privBlob.set(padding, pos += commentBin.length);\n }\n\n if (encrypted) {\n const options = { authTagLength: encrypted.cipher.authLen };\n const cipher = createCipheriv(\n encrypted.cipher.sslName,\n encrypted.key,\n encrypted.iv,\n options\n );\n cipher.setAutoPadding(false);\n privBlob = Buffer.concat([ cipher.update(privBlob), cipher.final() ]);\n if (encrypted.cipher.authLen > 0)\n extra = cipher.getAuthTag();\n else\n extra = Buffer.alloc(0);\n encrypted.key.fill(0);\n encrypted.iv.fill(0);\n } else {\n extra = Buffer.alloc(0);\n }\n\n const magicBytes = Buffer.from('openssh-key-v1\\0');\n const privBin = Buffer.allocUnsafe(\n magicBytes.length\n + 4 + cipherName.length\n + 4 + kdfName.length\n + 4 + kdfOptions.length\n + 4\n + 4 + parsed.pub.length\n + 4 + privBlob.length\n + extra.length\n );\n {\n let pos = 0;\n privBin.set(magicBytes, pos += 0);\n privBin.writeUInt32BE(cipherName.length, pos += magicBytes.length);\n privBin.set(cipherName, pos += 4);\n privBin.writeUInt32BE(kdfName.length, pos += cipherName.length);\n privBin.set(kdfName, pos += 4);\n privBin.writeUInt32BE(kdfOptions.length, pos += kdfName.length);\n privBin.set(kdfOptions, pos += 4);\n privBin.writeUInt32BE(1, pos += kdfOptions.length);\n privBin.writeUInt32BE(parsed.pub.length, pos += 4);\n privBin.set(parsed.pub, pos += 4);\n privBin.writeUInt32BE(privBlob.length, pos += parsed.pub.length);\n privBin.set(privBlob, pos += 4);\n privBin.set(extra, pos += privBlob.length);\n }\n\n {\n const b64 = privBin.base64Slice(0, privBin.length);\n let formatted = b64.replace(/.{64}/g, '$&\\n');\n if (b64.length & 63)\n formatted += '\\n';\n privateB64 += formatted;\n }\n\n {\n const b64 = parsed.pub.base64Slice(0, parsed.pub.length);\n publicB64 = `${parsed.sshName} ${b64}${comment ? ` ${comment}` : ''}`;\n }\n\n privateB64 += '-----END OPENSSH PRIVATE KEY-----\\n';\n return {\n private: privateB64,\n public: publicB64,\n };\n }\n default:\n throw new Error('Invalid output key format');\n }\n}\n\nfunction noop() {}\n\nmodule.exports = {\n generateKeyPair: (keyType, opts, cb) => {\n if (typeof opts === 'function') {\n cb = opts;\n opts = undefined;\n }\n if (typeof cb !== 'function')\n cb = noop;\n const args = makeArgs(keyType, opts);\n generateKeyPair_(...args, (err, pub, priv) => {\n if (err)\n return cb(err);\n let ret;\n try {\n ret = convertKeys(args[0], pub, priv, opts);\n } catch (ex) {\n return cb(ex);\n }\n cb(null, ret);\n });\n },\n generateKeyPairSync: (keyType, opts) => {\n const args = makeArgs(keyType, opts);\n const { publicKey: pub, privateKey: priv } = generateKeyPairSync_(...args);\n return convertKeys(args[0], pub, priv, opts);\n }\n};\n", "'use strict';\n\nconst {\n AgentProtocol,\n BaseAgent,\n createAgent,\n CygwinAgent,\n OpenSSHAgent,\n PageantAgent,\n} = require('./agent.js');\nconst {\n SSHTTPAgent: HTTPAgent,\n SSHTTPSAgent: HTTPSAgent,\n} = require('./http-agents.js');\nconst { parseKey } = require('./protocol/keyParser.js');\nconst {\n flagsToString,\n OPEN_MODE,\n STATUS_CODE,\n stringToFlags,\n} = require('./protocol/SFTP.js');\n\nmodule.exports = {\n AgentProtocol,\n BaseAgent,\n createAgent,\n Client: require('./client.js'),\n CygwinAgent,\n HTTPAgent,\n HTTPSAgent,\n OpenSSHAgent,\n PageantAgent,\n Server: require('./server.js'),\n utils: {\n parseKey,\n ...require('./keygen.js'),\n sftp: {\n flagsToString,\n OPEN_MODE,\n STATUS_CODE,\n stringToFlags,\n },\n },\n};\n", "export type PerfLogger = {\n\tenabled: boolean;\n\tmark: (label: string) => void;\n\tdone: (label?: string) => void;\n};\n\nfunction isTruthyEnv(value: string | undefined): boolean {\n\treturn value === \"1\" || value === \"true\";\n}\n\nfunction nowMs(): number {\n\tif (\n\t\ttypeof performance !== \"undefined\" &&\n\t\ttypeof performance.now === \"function\"\n\t) {\n\t\treturn performance.now();\n\t}\n\n\treturn Date.now();\n}\n\nexport function isPerfLoggingEnabled(): boolean {\n\treturn (\n\t\tisTruthyEnv(process.env.DEV_MODE) || isTruthyEnv(process.env.RENDER_PERF)\n\t);\n}\n\nexport function createPerfLogger(scope: string): PerfLogger {\n\tconst enabled = isPerfLoggingEnabled();\n\tif (!enabled) {\n\t\treturn {\n\t\t\tenabled,\n\t\t\tmark: () => undefined,\n\t\t\tdone: () => undefined,\n\t\t};\n\t}\n\n\tconst startedAt = nowMs();\n\n\tconst mark = (label: string): void => {\n\t\tconst elapsedMs = nowMs() - startedAt;\n\t\tconsole.log(`[perf][${scope}] ${label}: ${elapsedMs.toFixed(1)}ms`);\n\t};\n\n\tconst done = (label = \"done\"): void => {\n\t\tmark(label);\n\t};\n\n\treturn {\n\t\tenabled,\n\t\tmark,\n\t\tdone,\n\t};\n}\n\nexport async function withPerf<T>(\n\tscope: string,\n\tlabel: string,\n\twork: () => Promise<T>,\n): Promise<T> {\n\tconst perf = createPerfLogger(scope);\n\tif (!perf.enabled) {\n\t\treturn work();\n\t}\n\n\tperf.mark(`${label}:start`);\n\ttry {\n\t\treturn await work();\n\t} finally {\n\t\tperf.done(`${label}:done`);\n\t}\n}\n", "/**\n * Honeypot tracking and auditing module for virtual shell events.\n *\n * Attaches listeners to VirtualShell, VirtualFileSystem, VirtualUserManager,\n * SshMimic, and SftpMimic instances to log all activity for security auditing,\n * anomaly detection, and forensic analysis.\n *\n * @module honeypot\n */\n\nimport type { EventEmitter } from \"node:events\";\nimport type { SshMimic } from \"../SSHMimic\";\nimport type { SftpMimic } from \"../SSHMimic/sftp\";\nimport type { PerfLogger } from \"../utils/perfLogger\";\nimport { createPerfLogger } from \"../utils/perfLogger\";\nimport type VirtualFileSystem from \"../VirtualFileSystem\";\nimport type { VirtualShell } from \"../VirtualShell\";\nimport type { VirtualUserManager } from \"../VirtualUserManager\";\n\n/**\n * Audit log entry recorded for each event.\n */\nexport interface AuditLogEntry {\n\ttimestamp: string;\n\ttype: string;\n\tsource: string;\n\tdetails: Record<string, unknown>;\n}\n\n/**\n * Statistics tracker for honeypot activity.\n */\nexport interface HoneyPotStats {\n\tauthAttempts: number;\n\tauthSuccesses: number;\n\tauthFailures: number;\n\tcommands: number;\n\tfileWrites: number;\n\tfileReads: number;\n\tsessionStarts: number;\n\tsessionEnds: number;\n\tuserCreated: number;\n\tuserDeleted: number;\n\tclientConnects: number;\n\tclientDisconnects: number;\n}\n\nconst perf: PerfLogger = createPerfLogger(\"HoneyPot\");\n\n/**\n * HoneyPot audit and event tracking utility.\n *\n * Singleton-like helper that attaches listeners to virtual shell components\n * and maintains an audit log of all activity.\n */\nexport class HoneyPot {\n\tprivate auditLog: AuditLogEntry[] = [];\n\tprivate stats: HoneyPotStats = {\n\t\tauthAttempts: 0,\n\t\tauthSuccesses: 0,\n\t\tauthFailures: 0,\n\t\tcommands: 0,\n\t\tfileWrites: 0,\n\t\tfileReads: 0,\n\t\tsessionStarts: 0,\n\t\tsessionEnds: 0,\n\t\tuserCreated: 0,\n\t\tuserDeleted: 0,\n\t\tclientConnects: 0,\n\t\tclientDisconnects: 0,\n\t};\n\n\tprivate maxLogSize: number;\n\n\t/**\n\t * Creates a new HoneyPot instance.\n\t *\n\t * @param maxLogSize Maximum audit log entries to retain (default: 10000).\n\t */\n\tconstructor(maxLogSize: number = 10000) {\n\t\tperf.mark(\"constructor\");\n\t\tthis.maxLogSize = maxLogSize;\n\t}\n\n\t/**\n\t * Attaches honeypot listeners to all provided event emitters.\n\t *\n\t * @param shell VirtualShell instance.\n\t * @param vfs VirtualFileSystem instance.\n\t * @param users VirtualUserManager instance.\n\t * @param ssh SshMimic instance (optional).\n\t * @param sftp SftpMimic instance (optional).\n\t */\n\tpublic attach(\n\t\tshell: VirtualShell,\n\t\tvfs: VirtualFileSystem,\n\t\tusers: VirtualUserManager,\n\t\tssh?: SshMimic,\n\t\tsftp?: SftpMimic,\n\t): void {\n\t\tperf.mark(\"attach\");\n\t\tthis.attachVirtualShell(shell);\n\t\tthis.attachVirtualFileSystem(vfs);\n\t\tthis.attachVirtualUserManager(users);\n\t\tif (ssh) {\n\t\t\tthis.attachSshMimic(ssh);\n\t\t}\n\t\tif (sftp) {\n\t\t\tthis.attachSftpMimic(sftp);\n\t\t}\n\t}\n\n\t/**\n\t * Attaches to VirtualShell events.\n\t */\n\tprivate attachVirtualShell(shell: VirtualShell): void {\n\t\t(shell as EventEmitter).on(\"initialized\", () => {\n\t\t\tthis.log(\"VirtualShell\", \"initialized\", {});\n\t\t});\n\n\t\t(shell as EventEmitter).on(\"command\", (data: Record<string, unknown>) => {\n\t\t\tthis.stats.commands++;\n\t\t\tthis.log(\"VirtualShell\", \"command\", data);\n\t\t});\n\n\t\t(shell as EventEmitter).on(\n\t\t\t\"session:start\",\n\t\t\t(data: Record<string, unknown>) => {\n\t\t\t\tthis.stats.sessionStarts++;\n\t\t\t\tthis.log(\"VirtualShell\", \"session:start\", data);\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Attaches to VirtualFileSystem events.\n\t */\n\tprivate attachVirtualFileSystem(vfs: VirtualFileSystem): void {\n\t\t(vfs as EventEmitter).on(\"file:read\", (data: Record<string, unknown>) => {\n\t\t\tthis.stats.fileReads++;\n\t\t\tthis.log(\"VirtualFileSystem\", \"file:read\", data);\n\t\t});\n\n\t\t(vfs as EventEmitter).on(\"file:write\", (data: Record<string, unknown>) => {\n\t\t\tthis.stats.fileWrites++;\n\t\t\tthis.log(\"VirtualFileSystem\", \"file:write\", data);\n\t\t});\n\n\t\t(vfs as EventEmitter).on(\"dir:create\", (data: Record<string, unknown>) => {\n\t\t\tthis.log(\"VirtualFileSystem\", \"dir:create\", data);\n\t\t});\n\n\t\t(vfs as EventEmitter).on(\"mirror:flush\", () => {\n\t\t\tthis.log(\"VirtualFileSystem\", \"mirror:flush\", {});\n\t\t});\n\t}\n\n\t/**\n\t * Attaches to VirtualUserManager events.\n\t */\n\tprivate attachVirtualUserManager(users: VirtualUserManager): void {\n\t\t(users as EventEmitter).on(\"initialized\", () => {\n\t\t\tthis.log(\"VirtualUserManager\", \"initialized\", {});\n\t\t});\n\n\t\t(users as EventEmitter).on(\"user:add\", (data: Record<string, unknown>) => {\n\t\t\tthis.stats.userCreated++;\n\t\t\tthis.log(\"VirtualUserManager\", \"user:add\", data);\n\t\t});\n\n\t\t(users as EventEmitter).on(\n\t\t\t\"user:delete\",\n\t\t\t(data: Record<string, unknown>) => {\n\t\t\t\tthis.stats.userDeleted++;\n\t\t\t\tthis.log(\"VirtualUserManager\", \"user:delete\", data);\n\t\t\t},\n\t\t);\n\n\t\t(users as EventEmitter).on(\n\t\t\t\"session:register\",\n\t\t\t(data: Record<string, unknown>) => {\n\t\t\t\tthis.log(\"VirtualUserManager\", \"session:register\", data);\n\t\t\t},\n\t\t);\n\n\t\t(users as EventEmitter).on(\n\t\t\t\"session:unregister\",\n\t\t\t(data: Record<string, unknown>) => {\n\t\t\t\tthis.stats.sessionEnds++;\n\t\t\t\tthis.log(\"VirtualUserManager\", \"session:unregister\", data);\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Attaches to SshMimic events.\n\t */\n\tprivate attachSshMimic(ssh: SshMimic): void {\n\t\t(ssh as EventEmitter).on(\"start\", (data: Record<string, unknown>) => {\n\t\t\tthis.log(\"SshMimic\", \"start\", data);\n\t\t});\n\n\t\t(ssh as EventEmitter).on(\"stop\", () => {\n\t\t\tthis.log(\"SshMimic\", \"stop\", {});\n\t\t});\n\n\t\t(ssh as EventEmitter).on(\n\t\t\t\"auth:success\",\n\t\t\t(data: Record<string, unknown>) => {\n\t\t\t\tthis.stats.authAttempts++;\n\t\t\t\tthis.stats.authSuccesses++;\n\t\t\t\tthis.log(\"SshMimic\", \"auth:success\", data);\n\t\t\t},\n\t\t);\n\n\t\t(ssh as EventEmitter).on(\n\t\t\t\"auth:failure\",\n\t\t\t(data: Record<string, unknown>) => {\n\t\t\t\tthis.stats.authAttempts++;\n\t\t\t\tthis.stats.authFailures++;\n\t\t\t\tthis.log(\"SshMimic\", \"auth:failure\", data);\n\t\t\t},\n\t\t);\n\n\t\t(ssh as EventEmitter).on(\"client:connect\", () => {\n\t\t\tthis.stats.clientConnects++;\n\t\t\tthis.log(\"SshMimic\", \"client:connect\", {});\n\t\t});\n\n\t\t(ssh as EventEmitter).on(\n\t\t\t\"client:disconnect\",\n\t\t\t(data: Record<string, unknown>) => {\n\t\t\t\tthis.stats.clientDisconnects++;\n\t\t\t\tthis.log(\"SshMimic\", \"client:disconnect\", data);\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Attaches to SftpMimic events.\n\t */\n\tprivate attachSftpMimic(sftp: SftpMimic): void {\n\t\t(sftp as EventEmitter).on(\"start\", (data: Record<string, unknown>) => {\n\t\t\tthis.log(\"SftpMimic\", \"start\", data);\n\t\t});\n\n\t\t(sftp as EventEmitter).on(\"stop\", () => {\n\t\t\tthis.log(\"SftpMimic\", \"stop\", {});\n\t\t});\n\n\t\t(sftp as EventEmitter).on(\n\t\t\t\"auth:success\",\n\t\t\t(data: Record<string, unknown>) => {\n\t\t\t\tthis.stats.authAttempts++;\n\t\t\t\tthis.stats.authSuccesses++;\n\t\t\t\tthis.log(\"SftpMimic\", \"auth:success\", data);\n\t\t\t},\n\t\t);\n\n\t\t(sftp as EventEmitter).on(\n\t\t\t\"auth:failure\",\n\t\t\t(data: Record<string, unknown>) => {\n\t\t\t\tthis.stats.authAttempts++;\n\t\t\t\tthis.stats.authFailures++;\n\t\t\t\tthis.log(\"SftpMimic\", \"auth:failure\", data);\n\t\t\t},\n\t\t);\n\n\t\t(sftp as EventEmitter).on(\"client:connect\", () => {\n\t\t\tthis.stats.clientConnects++;\n\t\t\tthis.log(\"SftpMimic\", \"client:connect\", {});\n\t\t});\n\n\t\t(sftp as EventEmitter).on(\n\t\t\t\"client:disconnect\",\n\t\t\t(data: Record<string, unknown>) => {\n\t\t\t\tthis.stats.clientDisconnects++;\n\t\t\t\tthis.log(\"SftpMimic\", \"client:disconnect\", data);\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Records an audit log entry.\n\t *\n\t * @param source Event source (e.g., \"SshMimic\", \"VirtualFileSystem\").\n\t * @param type Event type.\n\t * @param details Event-specific data.\n\t */\n\tprivate log(\n\t\tsource: string,\n\t\ttype: string,\n\t\tdetails: Record<string, unknown>,\n\t): void {\n\t\tconst entry: AuditLogEntry = {\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\ttype,\n\t\t\tsource,\n\t\t\tdetails,\n\t\t};\n\n\t\tthis.auditLog.push(entry);\n\n\t\t// Trim log if exceeds max size\n\t\tif (this.auditLog.length > this.maxLogSize) {\n\t\t\tthis.auditLog = this.auditLog.slice(-this.maxLogSize);\n\t\t}\n\n\t\t// Console output for real-time monitoring\n\t\tconsole.log(`[AUDIT] ${entry.timestamp} | ${source} | ${type}`, details);\n\t}\n\n\t/**\n\t * Returns audit log entries matching optional filters.\n\t *\n\t * @param type Optional event type filter.\n\t * @param source Optional source filter.\n\t * @returns Filtered audit log entries.\n\t */\n\tpublic getAuditLog(type?: string, source?: string): AuditLogEntry[] {\n\t\tperf.mark(\"getAuditLog\");\n\t\treturn this.auditLog.filter(\n\t\t\t(entry) =>\n\t\t\t\t(!type || entry.type === type) && (!source || entry.source === source),\n\t\t);\n\t}\n\n\t/**\n\t * Returns current activity statistics.\n\t *\n\t * @returns Snapshot of honeypot stats.\n\t */\n\tpublic getStats(): Readonly<HoneyPotStats> {\n\t\tperf.mark(\"getStats\");\n\t\treturn Object.freeze({ ...this.stats });\n\t}\n\n\t/**\n\t * Clears audit log and resets statistics.\n\t */\n\tpublic reset(): void {\n\t\tperf.mark(\"reset\");\n\t\tthis.auditLog = [];\n\t\tthis.stats = {\n\t\t\tauthAttempts: 0,\n\t\t\tauthSuccesses: 0,\n\t\t\tauthFailures: 0,\n\t\t\tcommands: 0,\n\t\t\tfileWrites: 0,\n\t\t\tfileReads: 0,\n\t\t\tsessionStarts: 0,\n\t\t\tsessionEnds: 0,\n\t\t\tuserCreated: 0,\n\t\t\tuserDeleted: 0,\n\t\t\tclientConnects: 0,\n\t\t\tclientDisconnects: 0,\n\t\t};\n\t}\n\n\t/**\n\t * Returns recent log entries in reverse chronological order.\n\t *\n\t * @param limit Number of recent entries to return (default: 100).\n\t * @returns Recent audit log entries.\n\t */\n\tpublic getRecent(limit: number = 100): AuditLogEntry[] {\n\t\tperf.mark(\"getRecent\");\n\t\treturn this.auditLog.slice(Math.max(0, this.auditLog.length - limit));\n\t}\n\n\t/**\n\t * Detects potential security issues based on activity patterns.\n\t *\n\t * @returns Array of anomalies detected.\n\t */\n\tpublic detectAnomalies(): Array<{\n\t\ttype: string;\n\t\tseverity: \"low\" | \"medium\" | \"high\";\n\t\tmessage: string;\n\t}> {\n\t\tperf.mark(\"detectAnomalies\");\n\t\tconst anomalies: Array<{\n\t\t\ttype: string;\n\t\t\tseverity: \"low\" | \"medium\" | \"high\";\n\t\t\tmessage: string;\n\t\t}> = [];\n\n\t\t// High auth failure rate\n\t\tif (\n\t\t\tthis.stats.authAttempts > 0 &&\n\t\t\tthis.stats.authFailures / this.stats.authAttempts > 0.5\n\t\t) {\n\t\t\tanomalies.push({\n\t\t\t\ttype: \"high_auth_failure_rate\",\n\t\t\t\tseverity: \"medium\",\n\t\t\t\tmessage: `Auth failure rate: ${(\n\t\t\t\t\t(this.stats.authFailures / this.stats.authAttempts) * 100\n\t\t\t\t).toFixed(1)}%`,\n\t\t\t});\n\t\t}\n\n\t\t// Excessive auth failures in short time\n\t\tif (this.stats.authFailures > 10) {\n\t\t\tanomalies.push({\n\t\t\t\ttype: \"excessive_auth_failures\",\n\t\t\t\tseverity: \"high\",\n\t\t\t\tmessage: `${this.stats.authFailures} authentication failures detected`,\n\t\t\t});\n\t\t}\n\n\t\t// Unusual command execution volume\n\t\tif (this.stats.commands > 1000) {\n\t\t\tanomalies.push({\n\t\t\t\ttype: \"high_command_volume\",\n\t\t\t\tseverity: \"low\",\n\t\t\t\tmessage: `${this.stats.commands} commands executed`,\n\t\t\t});\n\t\t}\n\n\t\t// Unusual file write volume\n\t\tif (this.stats.fileWrites > 500) {\n\t\t\tanomalies.push({\n\t\t\t\ttype: \"high_write_volume\",\n\t\t\t\tseverity: \"medium\",\n\t\t\t\tmessage: `${this.stats.fileWrites} file write operations`,\n\t\t\t});\n\t\t}\n\n\t\treturn anomalies;\n\t}\n}\n\nexport default HoneyPot;\n", "import { runCommand } from \"../commands\";\nimport type { CommandResult } from \"../types/commands\";\nimport type { PerfLogger } from \"../utils/perfLogger\";\nimport { createPerfLogger } from \"../utils/perfLogger\";\nimport type { VirtualShell } from \"../VirtualShell\";\n\n/**\n * Programmatic client for executing shell commands against a virtual shell.\n *\n * Maintains working-directory state across invocations and runs commands as a\n * single authenticated user without SSH transport overhead.\n *\n * @example\n * ```ts\n * const shell = new VirtualShell(\"typescript-vm\");\n * const client = new SshClient(shell, \"alice\");\n * const result = await client.cd(\"/tmp\");\n * const list = await client.ls();\n * ```\n */\nconst perf: PerfLogger = createPerfLogger(\"SshClient\");\n\nexport class SshClient {\n\tprivate currentCwd = \"/\";\n\n\t/**\n\t * Creates a programmatic client bound to a virtual shell and user.\n\t *\n\t * @param shell Parent virtual shell instance.\n\t * @param username Login user for all commands.\n\t */\n\tconstructor(\n\t\tprivate shell: VirtualShell,\n\t\tprivate username: string,\n\t) {\n\t\tperf.mark(\"constructor\");\n\t}\n\n\t/**\n\t * Executes raw shell command.\n\t *\n\t * @param command Unparsed command line.\n\t * @returns Command result with stdout/stderr/exitCode.\n\t */\n\tasync exec(command: string): Promise<CommandResult> {\n\t\tperf.mark(\"exec\");\n\t\tconst vfs = this.shell.getVfs();\n\t\tconst users = this.shell.getUsers();\n\t\tconst hostname = this.shell.getHostname();\n\n\t\tif (!vfs || !users) {\n\t\t\tthrow new Error(\"SSH client not started\");\n\t\t}\n\n\t\tconst result = runCommand(\n\t\t\tcommand,\n\t\t\tthis.username,\n\t\t\thostname,\n\t\t\t\"exec\",\n\t\t\tthis.currentCwd,\n\t\t\tthis.shell,\n\t\t);\n\n\t\t// Handle async results\n\t\tif (result instanceof Promise) {\n\t\t\treturn await result;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Lists directory contents.\n\t *\n\t * @param path Target directory, defaults to cwd.\n\t * @returns Result with directory listing in stdout.\n\t */\n\tasync ls(path?: string): Promise<CommandResult> {\n\t\tperf.mark(\"ls\");\n\t\tconst target = path ?? \".\";\n\t\treturn this.exec(`ls ${target}`);\n\t}\n\n\t/**\n\t * Prints current working directory.\n\t *\n\t * @returns Result with cwd path in stdout.\n\t */\n\tasync pwd(): Promise<CommandResult> {\n\t\tperf.mark(\"pwd\");\n\t\treturn this.exec(\"pwd\");\n\t}\n\n\t/**\n\t * Changes working directory.\n\t *\n\t * @param path Target directory path.\n\t * @returns Result; updates internal cwd on success.\n\t */\n\tasync cd(path: string): Promise<CommandResult> {\n\t\tperf.mark(\"cd\");\n\t\tconst result = await this.exec(`cd ${path}`);\n\t\tif (result.nextCwd && result.exitCode !== 1) {\n\t\t\tthis.currentCwd = result.nextCwd;\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Reads file content.\n\t *\n\t * @param path File path.\n\t * @returns Result with file content in stdout.\n\t */\n\tasync cat(path: string): Promise<CommandResult> {\n\t\tperf.mark(\"cat\");\n\t\treturn this.exec(`cat ${path}`);\n\t}\n\n\t/**\n\t * Creates directory.\n\t *\n\t * @param path Directory path.\n\t * @param recursive When true, create parents.\n\t * @returns Result from mkdir command.\n\t */\n\tasync mkdir(path: string, recursive = false): Promise<CommandResult> {\n\t\tperf.mark(\"mkdir\");\n\t\tconst flag = recursive ? \"-p \" : \"\";\n\t\treturn this.exec(`mkdir ${flag}${path}`);\n\t}\n\n\t/**\n\t * Creates file (empty).\n\t *\n\t * @param path File path.\n\t * @returns Result from touch command.\n\t */\n\tasync touch(path: string): Promise<CommandResult> {\n\t\tperf.mark(\"touch\");\n\t\treturn this.exec(`touch ${path}`);\n\t}\n\n\t/**\n\t * Removes file or directory.\n\t *\n\t * @param path Target path.\n\t * @param recursive When true, delete directory tree.\n\t * @returns Result from rm command.\n\t */\n\tasync rm(path: string, recursive = false): Promise<CommandResult> {\n\t\tperf.mark(\"rm\");\n\t\tconst flag = recursive ? \"-r \" : \"\";\n\t\treturn this.exec(`rm ${flag}${path}`);\n\t}\n\n\t/**\n\t * Writes file content.\n\t *\n\t * @param path Target file path.\n\t * @param content Text to write.\n\t * @returns Result from touch/write simulation.\n\t */\n\tasync writeFile(path: string, content: string): Promise<CommandResult> {\n\t\tperf.mark(\"writeFile\");\n\t\tconst vfs = this.shell.getVfs();\n\t\tif (!vfs) {\n\t\t\tthrow new Error(\"SSH client not started\");\n\t\t}\n\n\t\ttry {\n\t\t\tthis.shell.writeFileAsUser(this.username, path, content);\n\t\t\treturn { stdout: `File '${path}' written`, exitCode: 0 };\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tstderr: `Failed to write '${path}': ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Reads file content programmatically.\n\t *\n\t * @param path Target file path.\n\t * @returns File content as string or error in result.\n\t */\n\tasync readFile(path: string): Promise<CommandResult> {\n\t\tperf.mark(\"readFile\");\n\t\tconst vfs = this.shell.getVfs();\n\t\tif (!vfs) {\n\t\t\tthrow new Error(\"SSH client not started\");\n\t\t}\n\n\t\ttry {\n\t\t\tconst content = vfs.readFile(path);\n\t\t\treturn { stdout: content, exitCode: 0 };\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tstderr: `Failed to read '${path}': ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\texitCode: 1,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Gets current working directory.\n\t *\n\t * @returns Normalized cwd path.\n\t */\n\tgetCwd(): string {\n\t\tperf.mark(\"getCwd\");\n\t\treturn this.currentCwd;\n\t}\n\n\t/**\n\t * Gets logged-in username.\n\t *\n\t * @returns Associated username.\n\t */\n\tgetUsername(): string {\n\t\tperf.mark(\"getUsername\");\n\t\treturn this.username;\n\t}\n\n\t/**\n\t * Renders tree view of directory.\n\t *\n\t * @param path Target directory, defaults to cwd.\n\t * @returns Result with ASCII tree in stdout.\n\t */\n\tasync tree(path?: string): Promise<CommandResult> {\n\t\tperf.mark(\"tree\");\n\t\tconst target = path ?? \".\";\n\t\treturn this.exec(`tree ${target}`);\n\t}\n\n\t/**\n\t * Shows current user.\n\t *\n\t * @returns Result from whoami command.\n\t */\n\tasync whoami(): Promise<CommandResult> {\n\t\tperf.mark(\"whoami\");\n\t\treturn this.exec(\"whoami\");\n\t}\n\n\t/**\n\t * Shows hostname.\n\t *\n\t * @returns Result from hostname command.\n\t */\n\tasync hostname(): Promise<CommandResult> {\n\t\tperf.mark(\"hostname\");\n\t\treturn this.exec(\"hostname\");\n\t}\n\n\t/**\n\t * Lists active users/sessions.\n\t *\n\t * @returns Result from who command.\n\t */\n\tasync who(): Promise<CommandResult> {\n\t\tperf.mark(\"who\");\n\t\treturn this.exec(\"who\");\n\t}\n}\n", "import { EventEmitter } from \"node:events\";\nimport { Server as SshServer } from \"ssh2\";\nimport { VirtualShell } from \"../VirtualShell\";\nimport { createPerfLogger, type PerfLogger } from \"../utils/perfLogger\";\nimport { runExec } from \"./exec\";\nimport { loadOrCreateHostKey } from \"./hostKey\";\n\n/**\n * SSH server facade that wires the virtual shell runtime into ssh2 sessions.\n *\n * This class is exported as `VirtualSshServer` for public API compatibility.\n * Create an instance, call {@link SshMimic.start}, and stop it with\n * {@link SshMimic.stop} when your process exits.\n */\nconst perf: PerfLogger = createPerfLogger(\"SshMimic\");\n\nclass SshMimic extends EventEmitter {\n\tport: number;\n\tserver: SshServer | null;\n\tprivate shell: VirtualShell;\n\tprivate shellHostname: string;\n\n\t/**\n\t * Creates a new SSH mimic server instance.\n\t *\n\t * @param port TCP port to bind on localhost.\n\t * @param hostname Virtual hostname used for the SSH ident and default shell label.\n\t * @param shell Optional preconfigured virtual shell instance to reuse.\n\t */\n\tconstructor({\n\t\tport,\n\t\thostname = \"typescript-vm\",\n\t\tshell = new VirtualShell(hostname),\n\t}: {\n\t\tport: number;\n\t\thostname?: string;\n\t\tshell?: VirtualShell;\n\t}) {\n\t\tsuper();\n\t\tperf.mark(\"constructor\");\n\t\tthis.port = port;\n\t\tthis.shellHostname = hostname;\n\t\tthis.server = null;\n\t\tthis.shell = shell;\n\t}\n\n\t/**\n\t * Starts server and initializes virtual filesystem, users, and handlers.\n\t *\n\t * @returns Promise resolved with bound listening port.\n\t */\n\tpublic async start(): Promise<number> {\n\t\tperf.mark(\"start\");\n\t\tconst shell = this.shell;\n\t\tconst privateKey = loadOrCreateHostKey();\n\n\t\t// Ensure VirtualShell is fully initialized before accepting connections\n\t\tawait shell.ensureInitialized();\n\n\t\tthis.server = new SshServer(\n\t\t\t{\n\t\t\t\thostKeys: [privateKey],\n\t\t\t\tident: `SSH-2.0-${shell.hostname}`,\n\t\t\t},\n\t\t\t(client) => {\n\t\t\t\tlet authUser = \"root\";\n\t\t\t\tlet remoteAddress = \"unknown\";\n\t\t\t\tlet sessionId: string | null = null;\n\n\t\t\t\tthis.emit(\"client:connect\");\n\n\t\t\t\tclient.on(\"authentication\", (ctx) => {\n\t\t\t\t\tshell;\n\t\t\t\t\tif (ctx.method === \"password\") {\n\t\t\t\t\t\tconst candidateUser = ctx.username || \"root\";\n\t\t\t\t\t\tremoteAddress = (ctx as { ip?: string }).ip ?? remoteAddress;\n\n\t\t\t\t\t\tif (!shell.users.hasPassword(candidateUser)) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`User ${candidateUser} has no password set, allowing login without verification`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tauthUser = candidateUser;\n\t\t\t\t\t\t\tsessionId = shell.users.registerSession(\n\t\t\t\t\t\t\t\tauthUser,\n\t\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\t).id;\n\t\t\t\t\t\t\tthis.emit(\"auth:success\", { username: authUser, remoteAddress });\n\n\t\t\t\t\t\t\tconst homePath = `/home/${authUser}`;\n\t\t\t\t\t\t\tif (!shell.vfs.exists(homePath)) {\n\t\t\t\t\t\t\t\tshell.vfs.mkdir(homePath, 0o755);\n\t\t\t\t\t\t\t\tshell.vfs.writeFile(\n\t\t\t\t\t\t\t\t\t`${homePath}/README.txt`,\n\t\t\t\t\t\t\t\t\t`Welcome to ${shell?.hostname ?? this.shellHostname}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tvoid shell.vfs.flushMirror();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tctx.accept();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!ctx.password ||\n\t\t\t\t\t\t\tctx.password === \"\" ||\n\t\t\t\t\t\t\t!shell.users.verifyPassword(candidateUser, ctx.password)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.emit(\"auth:failure\", {\n\t\t\t\t\t\t\t\tusername: candidateUser,\n\t\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tctx.reject();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tauthUser = candidateUser;\n\t\t\t\t\t\tsessionId = shell.users.registerSession(authUser, remoteAddress).id;\n\t\t\t\t\t\tthis.emit(\"auth:success\", { username: authUser, remoteAddress });\n\n\t\t\t\t\t\tconst homePath = `/home/${authUser}`;\n\t\t\t\t\t\tif (!shell.vfs.exists(homePath)) {\n\t\t\t\t\t\t\tshell.vfs.mkdir(homePath, 0o755);\n\t\t\t\t\t\t\tshell.vfs.writeFile(\n\t\t\t\t\t\t\t\t`${homePath}/README.txt`,\n\t\t\t\t\t\t\t\t`Welcome to ${shell?.hostname ?? this.shellHostname}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tvoid shell.vfs.flushMirror();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tctx.accept();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.reject();\n\t\t\t\t});\n\n\t\t\t\tclient.on(\"close\", () => {\n\t\t\t\t\tshell.users.unregisterSession(sessionId);\n\t\t\t\t\tthis.emit(\"client:disconnect\", { user: authUser });\n\t\t\t\t\tsessionId = null;\n\t\t\t\t});\n\n\t\t\t\tclient.on(\"ready\", () => {\n\t\t\t\t\tclient.on(\"session\", (accept) => {\n\t\t\t\t\t\tconst session = accept();\n\t\t\t\t\t\tconst terminalSize = { cols: 80, rows: 24 };\n\n\t\t\t\t\t\tsession.on(\"pty\", (acceptPty, _rejectPty, info) => {\n\t\t\t\t\t\t\tterminalSize.cols = info?.cols ?? terminalSize.cols;\n\t\t\t\t\t\t\tterminalSize.rows = info?.rows ?? terminalSize.rows;\n\t\t\t\t\t\t\tacceptPty();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tsession.on(\n\t\t\t\t\t\t\t\"window-change\",\n\t\t\t\t\t\t\t(_acceptChange, _rejectChange, info) => {\n\t\t\t\t\t\t\t\tterminalSize.cols = info?.cols ?? terminalSize.cols;\n\t\t\t\t\t\t\t\tterminalSize.rows = info?.rows ?? terminalSize.rows;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tsession.on(\"shell\", (acceptShell) => {\n\t\t\t\t\t\t\tconst stream = acceptShell();\n\t\t\t\t\t\t\tshell?.startInteractiveSession(\n\t\t\t\t\t\t\t\tstream,\n\t\t\t\t\t\t\t\tauthUser,\n\t\t\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\t\tterminalSize,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tsession.on(\"exec\", (acceptExec, _rejectExec, info) => {\n\t\t\t\t\t\t\tconst stream = acceptExec();\n\t\t\t\t\t\t\tif (stream) {\n\t\t\t\t\t\t\t\trunExec(\n\t\t\t\t\t\t\t\t\tstream,\n\t\t\t\t\t\t\t\t\tinfo.command.trim(),\n\t\t\t\t\t\t\t\t\tauthUser,\n\t\t\t\t\t\t\t\t\tshell.hostname,\n\t\t\t\t\t\t\t\t\tshell,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\n\t\treturn new Promise<number>((resolve, reject) => {\n\t\t\tthis.server?.once(\"error\", (err: unknown) => reject(err));\n\t\t\tthis.server?.listen(this.port, \"0.0.0.0\", () => {\n\t\t\t\tconsole.log(`SSH Mimic listening on port ${this.port}`);\n\t\t\t\tthis.emit(\"start\", { port: this.port });\n\t\t\t\tresolve(this.port);\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Stops server if running.\n\t */\n\tpublic stop(): void {\n\t\tperf.mark(\"stop\");\n\t\tif (this.server) {\n\t\t\tthis.server.close(() => {\n\t\t\t\tconsole.log(\"SSH Mimic stopped\");\n\t\t\t\tthis.emit(\"stop\");\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport { SftpMimic } from \"./sftp\";\nexport { SshMimic };\n", "import { EventEmitter } from \"node:events\";\nimport { createCustomCommand, registerCommand, runCommand } from \"../commands\";\nimport type { CommandContext, CommandResult } from \"../types/commands\";\nimport type { ShellStream } from \"../types/streams\";\nimport type { PerfLogger } from \"../utils/perfLogger\";\nimport { createPerfLogger } from \"../utils/perfLogger\";\nimport VirtualFileSystem from \"../VirtualFileSystem\";\nimport { VirtualUserManager } from \"../VirtualUserManager\";\nimport { startShell } from \"./shell\";\n\nexport interface ShellProperties {\n\tkernel: string;\n\tos: string;\n\tarch: string;\n}\n\nconst defaultShellProperties: ShellProperties = {\n\tkernel: \"1.0.0+itsrealfortune+1-amd64\",\n\tos: \"Fortune GNU/Linux x64\",\n\tarch: \"x86_64\",\n};\n\nconst perf: PerfLogger = createPerfLogger(\"VirtualShell\");\n\nfunction resolveAutoSudoForNewUsers(): boolean {\n\tconst configured = process.env.SSH_MIMIC_AUTO_SUDO_NEW_USERS;\n\tif (!configured) {\n\t\treturn true;\n\t}\n\n\treturn ![\"0\", \"false\", \"no\", \"off\"].includes(configured.toLowerCase());\n}\n\n/**\n * Coordinates the virtual filesystem, user manager, and command runtime.\n *\n * Instances are used both by the SSH server facade and by the programmatic\n * client API.\n */\nclass VirtualShell extends EventEmitter {\n\tbasePath: string = \".\";\n\tvfs: VirtualFileSystem;\n\tusers: VirtualUserManager;\n\thostname: string;\n\tproperties: ShellProperties;\n\tprivate initialized: Promise<void>;\n\n\t/**\n\t * Creates a new virtual shell instance.\n\t *\n\t * @param hostname Virtual hostname used for prompts and idents.\n\t * @param properties Customizable properties shown in `uname -a` and similar commands.\n\t * @param basePath Optional base path for the virtual filesystem (defaults to process.cwd()).\n\t */\n\tconstructor(\n\t\thostname: string,\n\t\tproperties?: ShellProperties,\n\t\tbasePath?: string,\n\t) {\n\t\tsuper();\n\t\tperf.mark(\"constructor\");\n\t\tthis.hostname = hostname;\n\t\tthis.properties = properties || defaultShellProperties;\n\t\tthis.basePath = basePath || \".\";\n\t\tthis.vfs = new VirtualFileSystem(this.basePath);\n\t\tthis.users = new VirtualUserManager(this.vfs, resolveAutoSudoForNewUsers());\n\n\t\t// Store references to avoid TypeScript \"used before assigned\" errors\n\t\tconst vfs = this.vfs;\n\t\tconst users = this.users;\n\n\t\t// Initialize both VFS mirror and users, ensuring all is ready before auth\n\t\tthis.initialized = (async () => {\n\t\t\tawait vfs.restoreMirror();\n\t\t\tawait users.initialize();\n\t\t\tthis.emit(\"initialized\");\n\t\t})();\n\t}\n\n\t/**\n\t * Ensures initialization is complete before allowing operations.\n\t * Call this before any authentication or command execution.\n\t */\n\tpublic async ensureInitialized(): Promise<void> {\n\t\tperf.mark(\"ensureInitialized\");\n\t\tawait this.initialized;\n\t}\n\n\t/**\n\t * Registers a new command in the shell runtime.\n\t *\n\t * @param name Case-insensitive command name (no spaces).\n\t * @param params List of parameter names for help text (no validation).\n\t * @param callback Function invoked with command context on execution.\n\t */\n\taddCommand(\n\t\tname: string,\n\t\tparams: string[],\n\t\tcallback: (ctx: CommandContext) => CommandResult | Promise<CommandResult>,\n\t): void {\n\t\tconst normalized = name.trim().toLowerCase();\n\t\tif (normalized.length === 0 || /\\s/.test(normalized)) {\n\t\t\tthrow new Error(\"Command name must be non-empty and contain no spaces\");\n\t\t}\n\n\t\tregisterCommand(createCustomCommand(normalized, params, callback));\n\t}\n\n\t/**\n\t * Executes a command line string in the context of this shell instance.\n\t *\n\t * @param rawInput\n\t * @param authUser\n\t * @param cwd\n\t */\n\texecuteCommand(rawInput: string, authUser: string, cwd: string): void {\n\t\tperf.mark(\"executeCommand\");\n\t\trunCommand(rawInput, authUser, this.hostname, \"shell\", cwd, this);\n\t\tthis.emit(\"command\", { command: rawInput, user: authUser, cwd });\n\t}\n\n\t/**\n\t * Starts an interactive session with the shell.\n\t *\n\t * @param stream The stream for the interactive session.\n\t * @param authUser The authenticated user for the session.\n\t * @param sessionId The ID of the session.\n\t * @param remoteAddress The address of the remote client.\n\t */\n\n\tstartInteractiveSession(\n\t\tstream: ShellStream,\n\t\tauthUser: string,\n\t\tsessionId: string | null,\n\t\tremoteAddress: string,\n\t\tterminalSize: { cols: number; rows: number },\n\t): void {\n\t\tperf.mark(\"startInteractiveSession\");\n\t\t// Interactive shell logic\n\t\tthis.emit(\"session:start\", { user: authUser, sessionId, remoteAddress });\n\t\tstartShell(\n\t\t\tthis.properties,\n\t\t\tstream,\n\t\t\tauthUser,\n\t\t\tthis.hostname,\n\t\t\tsessionId,\n\t\t\tremoteAddress,\n\t\t\tterminalSize,\n\t\t\tthis,\n\t\t);\n\t}\n\n\t/**\n\t * Returns virtual filesystem instance after server started.\n\t *\n\t * @returns VirtualFileSystem or null when not started.\n\t */\n\tpublic getVfs(): VirtualFileSystem | null {\n\t\treturn this?.vfs ?? null;\n\t}\n\n\t/**\n\t * Returns user manager instance after server started.\n\t *\n\t * @returns VirtualUserManager or null when not started.\n\t */\n\tpublic getUsers(): VirtualUserManager | null {\n\t\treturn this?.users ?? null;\n\t}\n\n\t/**\n\t * Returns hostname shown in prompts and idents.\n\t *\n\t * @returns Configured hostname label.\n\t */\n\tpublic getHostname(): string {\n\t\treturn this?.hostname;\n\t}\n\n\t/**\n\t * Writes a file on behalf of a user with quota enforcement.\n\t *\n\t * @param authUser User performing the write.\n\t * @param targetPath Destination path.\n\t * @param content File content.\n\t */\n\tpublic writeFileAsUser(\n\t\tauthUser: string,\n\t\ttargetPath: string,\n\t\tcontent: string | Buffer,\n\t): void {\n\t\tperf.mark(\"writeFileAsUser\");\n\t\tthis.users.assertWriteWithinQuota(authUser, targetPath, content);\n\t\tthis.vfs.writeFile(targetPath, content);\n\t}\n}\n\nexport { VirtualShell };\n", "import { EventEmitter } from \"node:events\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { gunzipSync, gzipSync } from \"node:zlib\";\nimport type {\n\tRemoveOptions,\n\tVfsNodeStats,\n\tWriteFileOptions,\n} from \"../types/vfs\";\nimport type { PerfLogger } from \"../utils/perfLogger\";\nimport { createPerfLogger } from \"../utils/perfLogger\";\nimport { normalizePath } from \"./path\";\n\n/**\n * In-memory virtual filesystem with tar.gz mirror persistence.\n *\n * Paths are normalized to POSIX-like absolute paths. Use\n * {@link VirtualFileSystem.restoreMirror} on startup and\n * {@link VirtualFileSystem.flushMirror} to persist pending changes.\n */\nconst perf: PerfLogger = createPerfLogger(\"VirtualFileSystem\");\n\nclass VirtualFileSystem extends EventEmitter {\n\tprivate readonly mirrorRoot: string;\n\n\tprivate ensureMirrorRoot(): void {\n\t\tfs.mkdirSync(this.mirrorRoot, { recursive: true, mode: 0o755 });\n\t}\n\n\tprivate resolveFsPath(targetPath: string): string {\n\t\tconst normalized = normalizePath(targetPath);\n\t\tconst relativePath = normalized.slice(1);\n\t\tconst resolved = path.resolve(this.mirrorRoot, relativePath || \".\");\n\t\tconst relative = path.relative(this.mirrorRoot, resolved);\n\n\t\tif (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n\t\t\tthrow new Error(`Invalid path '${targetPath}'.`);\n\t\t}\n\n\t\treturn resolved;\n\t}\n\n\tprivate detectGzipFile(targetPath: string): boolean {\n\t\tconst fd = fs.openSync(targetPath, \"r\");\n\t\ttry {\n\t\t\tconst header = Buffer.alloc(2);\n\t\t\tconst bytesRead = fs.readSync(fd, header, 0, 2, 0);\n\t\t\treturn bytesRead === 2 && header[0] === 0x1f && header[1] === 0x8b;\n\t\t} finally {\n\t\t\tfs.closeSync(fd);\n\t\t}\n\t}\n\n\tprivate computeDiskUsageBytes(targetPath: string): number {\n\t\tconst stats = fs.statSync(targetPath);\n\t\tif (stats.isFile()) {\n\t\t\treturn stats.size;\n\t\t}\n\n\t\tlet total = 0;\n\t\tfor (const entry of fs.readdirSync(targetPath)) {\n\t\t\ttotal += this.computeDiskUsageBytes(path.join(targetPath, entry));\n\t\t}\n\t\treturn total;\n\t}\n\n\tprivate renderTreeLines(targetPath: string, label: string): string {\n\t\tconst lines = [label];\n\n\t\tconst walk = (currentPath: string, prefix: string): void => {\n\t\t\tconst entries = fs\n\t\t\t\t.readdirSync(currentPath, { withFileTypes: true })\n\t\t\t\t.map((entry) => entry.name)\n\t\t\t\t.sort((left, right) => left.localeCompare(right));\n\n\t\t\tfor (let i = 0; i < entries.length; i += 1) {\n\t\t\t\tconst name = entries[i]!;\n\t\t\t\tconst isLast = i === entries.length - 1;\n\t\t\t\tconst connector = isLast ? \"\u2514\u2500\u2500 \" : \"\u251C\u2500\u2500 \";\n\t\t\t\tconst nextPrefix = `${prefix}${isLast ? \" \" : \"\u2502 \"}`;\n\t\t\t\tconst entryPath = path.join(currentPath, name);\n\t\t\t\tconst isDirectory = fs.statSync(entryPath).isDirectory();\n\n\t\t\t\tlines.push(`${prefix}${connector}${name}`);\n\t\t\t\tif (isDirectory) {\n\t\t\t\t\twalk(entryPath, nextPrefix);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\twalk(targetPath, \"\");\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\t/**\n\t * Creates a virtual filesystem instance.\n\t *\n\t * @param baseDir Base directory used to resolve mirror archive location.\n\t */\n\tconstructor(baseDir: string = process.cwd()) {\n\t\tsuper();\n\t\tperf.mark(\"constructor\");\n\t\tthis.mirrorRoot = path.resolve(baseDir, \".vfs\", \"mirror\");\n\t}\n\n\t/**\n\t * Restores filesystem state from mirror archive.\n\t *\n\t * If archive does not exist or cannot be read, creates fresh mirror file.\n\t */\n\tpublic async restoreMirror(): Promise<void> {\n\t\tperf.mark(\"restoreMirror\");\n\t\tthis.ensureMirrorRoot();\n\t}\n\n\t/**\n\t * Persists current filesystem state to mirror archive.\n\t *\n\t * No-op when nothing changed and archive already exists.\n\t */\n\tpublic async flushMirror(): Promise<void> {\n\t\tperf.mark(\"flushMirror\");\n\t\tthis.ensureMirrorRoot();\n\t\tthis.emit(\"mirror:flush\");\n\t}\n\n\t/**\n\t * Creates directory and any missing parent directories.\n\t *\n\t * @param targetPath Absolute or relative path to directory.\n\t * @param mode POSIX-like mode bits for new directories.\n\t */\n\tpublic mkdir(targetPath: string, mode: number = 0o755): void {\n\t\tperf.mark(\"mkdir\");\n\t\tthis.ensureMirrorRoot();\n\t\tconst fsPath = this.resolveFsPath(targetPath);\n\t\tif (fs.existsSync(fsPath) && !fs.statSync(fsPath).isDirectory()) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot create directory '${normalizePath(targetPath)}': path is a file.`,\n\t\t\t);\n\t\t}\n\t\tfs.mkdirSync(fsPath, { recursive: true, mode });\n\t\tthis.emit(\"dir:create\", { path: normalizePath(targetPath), mode });\n\t}\n\n\t/**\n\t * Writes UTF-8 text or binary content into file.\n\t *\n\t * Parent directories are created when missing.\n\t *\n\t * @param targetPath Destination file path.\n\t * @param content File content as string or Buffer.\n\t * @param options Optional write behavior (mode, compression).\n\t */\n\tpublic writeFile(\n\t\ttargetPath: string,\n\t\tcontent: string | Buffer,\n\t\toptions: WriteFileOptions = {},\n\t): void {\n\t\tperf.mark(\"writeFile\");\n\t\tthis.ensureMirrorRoot();\n\t\tconst normalized = normalizePath(targetPath);\n\t\tconst fsPath = this.resolveFsPath(normalized);\n\t\tconst parentPath = path.dirname(fsPath);\n\t\tfs.mkdirSync(parentPath, { recursive: true, mode: 0o755 });\n\n\t\tconst rawContent = Buffer.isBuffer(content)\n\t\t\t? content\n\t\t\t: Buffer.from(content, \"utf8\");\n\t\tconst shouldCompress = options.compress ?? false;\n\t\tconst storedContent = shouldCompress ? gzipSync(rawContent) : rawContent;\n\n\t\tif (fs.existsSync(fsPath) && fs.statSync(fsPath).isDirectory()) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot write file '${normalized}': path is a directory.`,\n\t\t\t);\n\t\t}\n\n\t\tfs.writeFileSync(fsPath, storedContent);\n\t\tfs.chmodSync(fsPath, options.mode ?? 0o644);\n\t\tthis.emit(\"file:write\", { path: normalized, size: storedContent.length });\n\t}\n\n\t/**\n\t * Reads file content as UTF-8 text.\n\t *\n\t * Compressed files are transparently decompressed.\n\t *\n\t * @param targetPath Path to file.\n\t * @returns UTF-8 string content.\n\t */\n\tpublic readFile(targetPath: string): string {\n\t\tperf.mark(\"readFile\");\n\t\tthis.ensureMirrorRoot();\n\t\tconst fsPath = this.resolveFsPath(targetPath);\n\t\tif (!fs.existsSync(fsPath) || !fs.statSync(fsPath).isFile()) {\n\t\t\tthrow new Error(`Cannot read '${targetPath}': not a file.`);\n\t\t}\n\n\t\tconst stored = fs.readFileSync(fsPath);\n\t\tconst raw = this.detectGzipFile(fsPath) ? gunzipSync(stored) : stored;\n\t\tconst normalized = normalizePath(targetPath);\n\t\tthis.emit(\"file:read\", { path: normalized, size: raw.length });\n\t\treturn raw.toString(\"utf8\");\n\t}\n\n\t/**\n\t * Checks whether node exists at path.\n\t *\n\t * @param targetPath Node path.\n\t * @returns True when file or directory exists.\n\t */\n\tpublic exists(targetPath: string): boolean {\n\t\tperf.mark(\"exists\");\n\t\ttry {\n\t\t\tconst fsPath = this.resolveFsPath(targetPath);\n\t\t\treturn fs.existsSync(fsPath);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Updates mode bits for file or directory.\n\t *\n\t * @param targetPath Node path.\n\t * @param mode New POSIX-like mode.\n\t */\n\tpublic chmod(targetPath: string, mode: number): void {\n\t\tperf.mark(\"chmod\");\n\t\tconst fsPath = this.resolveFsPath(targetPath);\n\t\tif (!fs.existsSync(fsPath)) {\n\t\t\tthrow new Error(`Path '${normalizePath(targetPath)}' does not exist.`);\n\t\t}\n\t\tfs.chmodSync(fsPath, mode);\n\t}\n\n\t/**\n\t * Returns metadata for file or directory.\n\t *\n\t * @param targetPath Node path.\n\t * @returns Typed stat object based on node type.\n\t */\n\tpublic stat(targetPath: string): VfsNodeStats {\n\t\tperf.mark(\"stat\");\n\t\tthis.ensureMirrorRoot();\n\t\tconst normalized = normalizePath(targetPath);\n\t\tconst fsPath = this.resolveFsPath(normalized);\n\n\t\tif (!fs.existsSync(fsPath)) {\n\t\t\tthrow new Error(`Path '${normalized}' does not exist.`);\n\t\t}\n\n\t\tconst stats = fs.statSync(fsPath);\n\t\tconst mode = stats.mode & 0o777;\n\t\tconst name = normalized === \"/\" ? \"\" : path.posix.basename(normalized);\n\n\t\tif (stats.isFile()) {\n\t\t\treturn {\n\t\t\t\ttype: \"file\",\n\t\t\t\tname,\n\t\t\t\tpath: normalized,\n\t\t\t\tmode,\n\t\t\t\tcreatedAt: stats.birthtime,\n\t\t\t\tupdatedAt: stats.mtime,\n\t\t\t\tcompressed: this.detectGzipFile(fsPath),\n\t\t\t\tsize: stats.size,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\ttype: \"directory\",\n\t\t\tname,\n\t\t\tpath: normalized,\n\t\t\tmode,\n\t\t\tcreatedAt: stats.birthtime,\n\t\t\tupdatedAt: stats.mtime,\n\t\t\tchildrenCount: fs.readdirSync(fsPath).length,\n\t\t};\n\t}\n\n\t/**\n\t * Lists direct children names of directory.\n\t *\n\t * @param dirPath Directory path, defaults to root.\n\t * @returns Sorted child names.\n\t */\n\tpublic list(dirPath: string = \"/\"): string[] {\n\t\tperf.mark(\"list\");\n\t\tconst fsPath = this.resolveFsPath(dirPath);\n\t\tif (!fs.existsSync(fsPath) || !fs.statSync(fsPath).isDirectory()) {\n\t\t\tthrow new Error(`Cannot list '${dirPath}': not a directory.`);\n\t\t}\n\n\t\treturn fs.readdirSync(fsPath).sort();\n\t}\n\n\t/**\n\t * Renders ASCII tree view of directory hierarchy.\n\t *\n\t * @param dirPath Directory path, defaults to root.\n\t * @returns Multi-line tree string.\n\t */\n\tpublic tree(dirPath: string = \"/\"): string {\n\t\tperf.mark(\"tree\");\n\t\tconst fsPath = this.resolveFsPath(dirPath);\n\t\tif (!fs.existsSync(fsPath) || !fs.statSync(fsPath).isDirectory()) {\n\t\t\tthrow new Error(`Cannot render tree for '${dirPath}': not a directory.`);\n\t\t}\n\n\t\tconst rootLabel =\n\t\t\tdirPath === \"/\" ? \"/\" : path.posix.basename(normalizePath(dirPath));\n\t\treturn this.renderTreeLines(fsPath, rootLabel);\n\t}\n\n\t/**\n\t * Computes total stored file bytes under a path.\n\t *\n\t * File usage is based on in-memory stored bytes, including compressed\n\t * payload size when files are marked as compressed.\n\t *\n\t * @param targetPath File or directory path to measure, defaults to root.\n\t * @returns Total byte usage for file content under target path.\n\t */\n\tpublic getUsageBytes(targetPath: string = \"/\"): number {\n\t\tperf.mark(\"getUsageBytes\");\n\t\tconst fsPath = this.resolveFsPath(targetPath);\n\t\tif (!fs.existsSync(fsPath)) {\n\t\t\tthrow new Error(`Path '${normalizePath(targetPath)}' does not exist.`);\n\t\t}\n\t\treturn this.computeDiskUsageBytes(fsPath);\n\t}\n\n\t/**\n\t * Compresses file content with gzip and flags node as compressed.\n\t *\n\t * @param targetPath Path to file.\n\t */\n\tpublic compressFile(targetPath: string): void {\n\t\tperf.mark(\"compressFile\");\n\t\tconst fsPath = this.resolveFsPath(targetPath);\n\t\tif (!fs.existsSync(fsPath) || !fs.statSync(fsPath).isFile()) {\n\t\t\tthrow new Error(`Cannot compress '${targetPath}': not a file.`);\n\t\t}\n\n\t\tif (!this.detectGzipFile(fsPath)) {\n\t\t\tconst content = fs.readFileSync(fsPath);\n\t\t\tfs.writeFileSync(fsPath, gzipSync(content));\n\t\t}\n\t}\n\n\t/**\n\t * Decompresses gzip-compressed file content.\n\t *\n\t * @param targetPath Path to file.\n\t */\n\tpublic decompressFile(targetPath: string): void {\n\t\tperf.mark(\"decompressFile\");\n\t\tconst fsPath = this.resolveFsPath(targetPath);\n\t\tif (!fs.existsSync(fsPath) || !fs.statSync(fsPath).isFile()) {\n\t\t\tthrow new Error(`Cannot decompress '${targetPath}': not a file.`);\n\t\t}\n\n\t\tif (this.detectGzipFile(fsPath)) {\n\t\t\tconst content = fs.readFileSync(fsPath);\n\t\t\tfs.writeFileSync(fsPath, gunzipSync(content));\n\t\t}\n\t}\n\n\t/**\n\t * Removes file or directory node.\n\t *\n\t * @param targetPath Path to remove.\n\t * @param options Removal options, including recursive delete.\n\t */\n\tpublic remove(targetPath: string, options: RemoveOptions = {}): void {\n\t\tperf.mark(\"remove\");\n\t\tconst normalized = normalizePath(targetPath);\n\t\tif (normalized === \"/\") {\n\t\t\tthrow new Error(\"Cannot remove root directory.\");\n\t\t}\n\t\tconst fsPath = this.resolveFsPath(normalized);\n\n\t\tif (!fs.existsSync(fsPath)) {\n\t\t\tthrow new Error(`Path '${normalized}' does not exist.`);\n\t\t}\n\n\t\tconst stats = fs.statSync(fsPath);\n\t\tif (stats.isDirectory() && !options.recursive) {\n\t\t\tconst entries = fs.readdirSync(fsPath);\n\t\t\tif (entries.length > 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Directory '${normalized}' is not empty. Use recursive option.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (stats.isDirectory()) {\n\t\t\tfs.rmSync(fsPath, { recursive: options.recursive ?? false });\n\t\t} else {\n\t\t\tfs.rmSync(fsPath);\n\t\t}\n\t}\n\n\t/**\n\t * Moves or renames node to destination path.\n\t *\n\t * @param fromPath Existing source path.\n\t * @param toPath Destination path.\n\t */\n\tpublic move(fromPath: string, toPath: string): void {\n\t\tperf.mark(\"move\");\n\t\tconst fromNormalized = normalizePath(fromPath);\n\t\tconst toNormalized = normalizePath(toPath);\n\n\t\tif (fromNormalized === \"/\" || toNormalized === \"/\") {\n\t\t\tthrow new Error(\"Cannot move root directory.\");\n\t\t}\n\n\t\tconst fromFsPath = this.resolveFsPath(fromNormalized);\n\t\tconst toFsPath = this.resolveFsPath(toNormalized);\n\n\t\tif (!fs.existsSync(fromFsPath)) {\n\t\t\tthrow new Error(`Path '${fromNormalized}' does not exist.`);\n\t\t}\n\n\t\tif (fs.existsSync(toFsPath)) {\n\t\t\tthrow new Error(`Destination '${toNormalized}' already exists.`);\n\t\t}\n\n\t\tfs.mkdirSync(path.dirname(toFsPath), { recursive: true, mode: 0o755 });\n\t\tfs.renameSync(fromFsPath, toFsPath);\n\t}\n}\n\nexport default VirtualFileSystem;\n", "import * as path from \"node:path\";\nimport type { InternalDirectoryNode, InternalNode } from \"./internalTypes\";\n\nexport function normalizePath(rawPath: string): string {\n\tif (!rawPath || rawPath.trim() === \"\") {\n\t\treturn \"/\";\n\t}\n\n\tconst normalized = path.posix.normalize(\n\t\trawPath.startsWith(\"/\") ? rawPath : `/${rawPath}`,\n\t);\n\treturn normalized === \"\" ? \"/\" : normalized;\n}\n\nexport function splitPath(normalizedPath: string): string[] {\n\treturn normalizedPath.split(\"/\").filter(Boolean);\n}\n\nexport function getNode(\n\troot: InternalDirectoryNode,\n\ttargetPath: string,\n): InternalNode {\n\tconst normalized = normalizePath(targetPath);\n\tif (normalized === \"/\") {\n\t\treturn root;\n\t}\n\n\tconst parts = splitPath(normalized);\n\tlet current: InternalNode = root;\n\n\tfor (const part of parts) {\n\t\tif (current.type !== \"directory\") {\n\t\t\tthrow new Error(`Path '${normalized}' does not exist.`);\n\t\t}\n\n\t\tconst next = current.children.get(part);\n\t\tif (!next) {\n\t\t\tthrow new Error(`Path '${normalized}' does not exist.`);\n\t\t}\n\t\tcurrent = next;\n\t}\n\n\treturn current;\n}\n\nexport function getParentDirectory(\n\troot: InternalDirectoryNode,\n\ttargetPath: string,\n\tcreateIfMissing: boolean,\n\tcreatePath: (pathToCreate: string) => void,\n): { parent: InternalDirectoryNode; name: string } {\n\tconst normalized = normalizePath(targetPath);\n\tif (normalized === \"/\") {\n\t\tthrow new Error(\"Root path has no parent directory.\");\n\t}\n\n\tconst parentPath = path.posix.dirname(normalized);\n\tconst name = path.posix.basename(normalized);\n\n\tif (!name) {\n\t\tthrow new Error(`Invalid path '${targetPath}'.`);\n\t}\n\n\tif (createIfMissing) {\n\t\tcreatePath(parentPath);\n\t}\n\n\tconst parentNode = getNode(root, parentPath);\n\tif (parentNode.type !== \"directory\") {\n\t\tthrow new Error(`Parent path '${parentPath}' is not a directory.`);\n\t}\n\n\treturn { parent: parentNode, name };\n}\n", "import { createHash, randomBytes, randomUUID, scryptSync } from \"node:crypto\";\nimport { EventEmitter } from \"node:events\";\nimport * as path from \"node:path\";\nimport type { PerfLogger } from \"../utils/perfLogger\";\nimport { createPerfLogger } from \"../utils/perfLogger\";\nimport type VirtualFileSystem from \"../VirtualFileSystem\";\n\n/** Persisted virtual user credential record. */\nexport interface VirtualUserRecord {\n\t/** Unique login name. */\n\tusername: string;\n\t/** Per-user random salt used for password hashing. */\n\tsalt: string;\n\t/** Scrypt-derived password hash in hex encoding. */\n\tpasswordHash: string;\n}\n\n/** Runtime representation of authenticated SSH session. */\nexport interface VirtualActiveSession {\n\t/** Stable session identifier (UUID). */\n\tid: string;\n\t/** Username bound to session. */\n\tusername: string;\n\t/** Virtual terminal identifier (pts/*). */\n\ttty: string;\n\t/** Remote client IP or host label. */\n\tremoteAddress: string;\n\t/** ISO-8601 start timestamp. */\n\tstartedAt: string;\n}\n\nfunction resolveFastPasswordHash(): boolean {\n\tconst configured = process.env.SSH_MIMIC_FAST_PASSWORD_HASH;\n\treturn (\n\t\t!!configured &&\n\t\t![\"0\", \"false\", \"no\", \"off\"].includes(configured.toLowerCase())\n\t);\n}\n\nconst perf: PerfLogger = createPerfLogger(\"VirtualUserManager\");\n\n/**\n * Persistent user, sudoers, and active-session manager for the shell runtime.\n *\n * Passwords are hashed with scrypt by default and stored in the backing virtual filesystem.\n */\nexport class VirtualUserManager extends EventEmitter {\n\tprivate static readonly recordCache = new Map<string, VirtualUserRecord>();\n\tprivate static readonly fastPasswordHash = resolveFastPasswordHash();\n\tprivate readonly usersPath = \"/virtual-env-js/.auth/htpasswd\";\n\tprivate readonly sudoersPath = \"/virtual-env-js/.auth/sudoers\";\n\tprivate readonly quotasPath = \"/virtual-env-js/.auth/quotas\";\n\tprivate readonly authDirPath = \"/virtual-env-js/.auth\";\n\tprivate readonly users = new Map<string, VirtualUserRecord>();\n\tprivate readonly sudoers = new Set<string>();\n\tprivate readonly quotas = new Map<string, number>();\n\tprivate readonly activeSessions = new Map<string, VirtualActiveSession>();\n\tprivate nextTty = 0;\n\n\t/**\n\t * Creates a user manager instance backed by a virtual filesystem.\n\t *\n\t * @param vfs Backing virtual filesystem used for persistence.\n\t * @param defaultRootPassword Initial root password used when root is created.\n\t * @param autoSudoForNewUsers Whether newly created users are added to sudoers.\n\t */\n\tconstructor(\n\t\tprivate readonly vfs: VirtualFileSystem,\n\t\t// private readonly defaultRootPassword: string = process.env\n\t\t// .SSH_MIMIC_ROOT_PASSWORD || \"root\",\n\t\tprivate readonly autoSudoForNewUsers: boolean = true,\n\t) {\n\t\tsuper();\n\t\tperf.mark(\"constructor\");\n\t}\n\n\t/**\n\t * Loads users/sudoers from disk and ensures root account exists.\n\t * Also creates the current system user if not already present.\n\t */\n\tpublic async initialize(): Promise<void> {\n\t\tperf.mark(\"initialize\");\n\t\tthis.loadFromVfs();\n\t\tthis.loadSudoersFromVfs();\n\t\tthis.loadQuotasFromVfs();\n\n\t\tlet changed = false;\n\t\tif (!this.users.has(\"root\")) {\n\t\t\tthis.users.set(\"root\", this.createRecord(\"root\", \"\"));\n\t\t\tchanged = true;\n\t\t}\n\n\t\tthis.sudoers.add(\"root\");\n\n\t\t// Auto-create current system user for easier authentication\n\t\t// const currentUser = process.env.USER || process.env.USERNAME;\n\t\t// if (currentUser && currentUser !== \"root\" && !this.users.has(currentUser)) {\n\t\t// \tconst userPassword = this.defaultRootPassword;\n\t\t// \tthis.users.set(currentUser, this.createRecord(currentUser, userPassword));\n\t\t// \tthis.sudoers.add(currentUser);\n\t\t// \tchanged = true;\n\n\t\t// \tconst homePath = `/home/${currentUser}`;\n\t\t// \tif (!this.vfs.exists(homePath)) {\n\t\t// \t\tthis.vfs.mkdir(homePath, 0o755);\n\t\t// \t\tthis.vfs.writeFile(\n\t\t// \t\t\t`${homePath}/README.txt`,\n\t\t// \t\t\t`Welcome to the virtual environment, ${currentUser}`,\n\t\t// \t\t);\n\t\t// \t}\n\t\t// }\n\n\t\tif (changed) {\n\t\t\tawait this.persist();\n\t\t}\n\t\tthis.emit(\"initialized\");\n\t}\n\n\t/**\n\t * Sets max allowed bytes under /home/<username>.\n\t *\n\t * @param username Target username.\n\t * @param maxBytes Quota ceiling in bytes.\n\t */\n\tpublic async setQuotaBytes(\n\t\tusername: string,\n\t\tmaxBytes: number,\n\t): Promise<void> {\n\t\tperf.mark(\"setQuotaBytes\");\n\t\tthis.validateUsername(username);\n\t\tif (!this.users.has(username)) {\n\t\t\tthrow new Error(`quota: user '${username}' does not exist`);\n\t\t}\n\n\t\tif (!Number.isFinite(maxBytes) || maxBytes < 0) {\n\t\t\tthrow new Error(\"quota: maxBytes must be a non-negative number\");\n\t\t}\n\n\t\tthis.quotas.set(username, Math.floor(maxBytes));\n\t\tawait this.persist();\n\t}\n\n\t/**\n\t * Removes quota for a user.\n\t *\n\t * @param username Target username.\n\t */\n\tpublic async clearQuota(username: string): Promise<void> {\n\t\tperf.mark(\"clearQuota\");\n\t\tthis.validateUsername(username);\n\t\tthis.quotas.delete(username);\n\t\tawait this.persist();\n\t}\n\n\t/**\n\t * Gets configured quota in bytes for a user.\n\t *\n\t * @param username Target username.\n\t * @returns Quota in bytes, or null when unlimited.\n\t */\n\tpublic getQuotaBytes(username: string): number | null {\n\t\tperf.mark(\"getQuotaBytes\");\n\t\treturn this.quotas.get(username) ?? null;\n\t}\n\n\t/**\n\t * Computes current usage under /home/<username>.\n\t *\n\t * @param username Target username.\n\t * @returns Current usage in bytes.\n\t */\n\tpublic getUsageBytes(username: string): number {\n\t\tperf.mark(\"getUsageBytes\");\n\t\tconst homePath = `/home/${username}`;\n\t\tif (!this.vfs.exists(homePath)) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn this.vfs.getUsageBytes(homePath);\n\t}\n\n\t/**\n\t * Validates that writing file content would not exceed user quota.\n\t *\n\t * Quotas are enforced only for writes inside /home/<username>.\n\t *\n\t * @param username Authenticated user.\n\t * @param targetPath Target file path.\n\t * @param nextContent New file content.\n\t */\n\tpublic assertWriteWithinQuota(\n\t\tusername: string,\n\t\ttargetPath: string,\n\t\tnextContent: string | Buffer,\n\t): void {\n\t\tperf.mark(\"assertWriteWithinQuota\");\n\t\tconst quota = this.quotas.get(username);\n\t\tif (quota === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst normalizedPath = normalizeVfsPath(targetPath);\n\t\tconst homePath = normalizeVfsPath(`/home/${username}`);\n\t\tconst inUserHome =\n\t\t\tnormalizedPath === homePath || normalizedPath.startsWith(`${homePath}/`);\n\t\tif (!inUserHome) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentUsage = this.getUsageBytes(username);\n\t\tlet existingSize = 0;\n\t\tif (this.vfs.exists(normalizedPath)) {\n\t\t\tconst existing = this.vfs.stat(normalizedPath);\n\t\t\tif (existing.type === \"file\") {\n\t\t\t\texistingSize = existing.size;\n\t\t\t}\n\t\t}\n\n\t\tconst incomingSize = Buffer.isBuffer(nextContent)\n\t\t\t? nextContent.length\n\t\t\t: Buffer.byteLength(nextContent, \"utf8\");\n\t\tconst projectedUsage = currentUsage - existingSize + incomingSize;\n\n\t\tif (projectedUsage > quota) {\n\t\t\tthrow new Error(\n\t\t\t\t`quota exceeded for '${username}': ${projectedUsage}/${quota} bytes`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Verifies plaintext password against stored record.\n\t *\n\t * @param username User login name.\n\t * @param password Plaintext password candidate.\n\t * @returns True when credentials are valid.\n\t */\n\tpublic verifyPassword(username: string, password: string): boolean {\n\t\tperf.mark(\"verifyPassword\");\n\t\tconst record = this.users.get(username);\n\t\tif (!record) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this.hashPassword(password) === record.passwordHash;\n\t}\n\n\t/**\n\t * Creates user, home directory, and sudo access entry.\n\t *\n\t * @param username New username.\n\t * @param password Initial plaintext password.\n\t */\n\tpublic async addUser(username: string, password: string): Promise<void> {\n\t\tperf.mark(\"addUser\");\n\t\tthis.validateUsername(username);\n\t\tthis.validatePassword(password);\n\n\t\tif (this.users.has(username)) {\n\t\t\treturn;\n\t\t\t// throw new Error(`adduser: user '${username}' already exists`);\n\t\t}\n\n\t\tthis.users.set(username, this.createRecord(username, password));\n\t\tif (this.autoSudoForNewUsers) {\n\t\t\tthis.sudoers.add(username);\n\t\t}\n\t\tconst homePath = `/home/${username}`;\n\t\tif (!this.vfs.exists(homePath)) {\n\t\t\tthis.vfs.mkdir(homePath, 0o755);\n\t\t\tthis.vfs.writeFile(\n\t\t\t\t`${homePath}/README.txt`,\n\t\t\t\t`Welcome to the virtual environment, ${username}`,\n\t\t\t);\n\t\t}\n\t\tawait this.persist();\n\t\tthis.emit(\"user:add\", { username });\n\t}\n\n\t/**\n\t * Retrieves stored password hash for a user, or null if user does not exist.\n\t *\n\t * @param username Target username.\n\t * @returns Password hash in hex encoding, or null when user is not found.\n\t */\n\tpublic getPasswordHash(username: string): string | null {\n\t\tperf.mark(\"getPasswordHash\");\n\t\tconst record = this.users.get(username);\n\t\treturn record ? record.passwordHash : null;\n\t}\n\n\t/**\n\t * Updates password for an existing user account.\n\t *\n\t * @param username Username to update.\n\t * @param password New plaintext password.\n\t */\n\tpublic async setPassword(username: string, password: string): Promise<void> {\n\t\tperf.mark(\"setPassword\");\n\t\tthis.validateUsername(username);\n\t\tthis.validatePassword(password);\n\n\t\tif (!this.users.has(username)) {\n\t\t\tthrow new Error(`passwd: user '${username}' does not exist`);\n\t\t}\n\n\t\tthis.users.set(username, this.createRecord(username, password));\n\t\tawait this.persist();\n\t}\n\n\t/**\n\t * Deletes existing non-root user account.\n\t *\n\t * @param username Username to remove.\n\t */\n\tpublic async deleteUser(username: string): Promise<void> {\n\t\tperf.mark(\"deleteUser\");\n\t\tthis.validateUsername(username);\n\n\t\tif (username === \"root\") {\n\t\t\tthrow new Error(\"deluser: cannot delete root\");\n\t\t}\n\n\t\tif (!this.users.delete(username)) {\n\t\t\tthrow new Error(`deluser: user '${username}' does not exist`);\n\t\t}\n\n\t\tthis.sudoers.delete(username);\n\n\t\tthis.emit(\"user:delete\", { username });\n\t\tawait this.persist();\n\t}\n\n\t/**\n\t * Checks whether user is member of sudoers set.\n\t *\n\t * @param username Username to test.\n\t * @returns True when user can run sudo.\n\t */\n\tpublic isSudoer(username: string): boolean {\n\t\tperf.mark(\"isSudoer\");\n\t\treturn this.sudoers.has(username);\n\t}\n\n\t/**\n\t * Grants sudo access to existing user.\n\t *\n\t * @param username Username to promote.\n\t */\n\tpublic async addSudoer(username: string): Promise<void> {\n\t\tperf.mark(\"addSudoer\");\n\t\tthis.validateUsername(username);\n\t\tif (!this.users.has(username)) {\n\t\t\tthrow new Error(`sudoers: user '${username}' does not exist`);\n\t\t}\n\n\t\tthis.sudoers.add(username);\n\t\tawait this.persist();\n\t}\n\n\t/**\n\t * Revokes sudo access from user.\n\t *\n\t * @param username Username to demote.\n\t */\n\tpublic async removeSudoer(username: string): Promise<void> {\n\t\tperf.mark(\"removeSudoer\");\n\t\tthis.validateUsername(username);\n\t\tif (username === \"root\") {\n\t\t\tthrow new Error(\"sudoers: cannot remove root\");\n\t\t}\n\n\t\tthis.sudoers.delete(username);\n\t\tawait this.persist();\n\t}\n\n\t/**\n\t * Registers active session and allocates tty id.\n\t *\n\t * @param username Session username.\n\t * @param remoteAddress Session source address.\n\t * @returns Registered session descriptor.\n\t */\n\tpublic registerSession(\n\t\tusername: string,\n\t\tremoteAddress: string,\n\t): VirtualActiveSession {\n\t\tperf.mark(\"registerSession\");\n\t\tconst session: VirtualActiveSession = {\n\t\t\tid: randomUUID(),\n\t\t\tusername,\n\t\t\ttty: `pts/${this.nextTty++}`,\n\t\t\tremoteAddress,\n\t\t\tstartedAt: new Date().toISOString(),\n\t\t};\n\t\tthis.activeSessions.set(session.id, session);\n\t\tthis.emit(\"session:register\", {\n\t\t\tsessionId: session.id,\n\t\t\tusername,\n\t\t\tremoteAddress,\n\t\t});\n\t\treturn session;\n\t}\n\n\t/**\n\t * Unregisters active session when connection closes.\n\t *\n\t * @param sessionId Session identifier; ignored when nullish.\n\t */\n\tpublic unregisterSession(sessionId: string | null | undefined): void {\n\t\tperf.mark(\"unregisterSession\");\n\t\tif (!sessionId) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst session = this.activeSessions.get(sessionId);\n\t\tthis.activeSessions.delete(sessionId);\n\t\tif (session) {\n\t\t\tthis.emit(\"session:unregister\", {\n\t\t\t\tsessionId,\n\t\t\t\tusername: session.username,\n\t\t\t});\n\t\t}\n\t\tthis.activeSessions.delete(sessionId);\n\t}\n\n\t/**\n\t * Updates username/address metadata for existing session.\n\t *\n\t * @param sessionId Session identifier; ignored when nullish.\n\t * @param username New username value.\n\t * @param remoteAddress New remote address value.\n\t */\n\tpublic updateSession(\n\t\tsessionId: string | null | undefined,\n\t\tusername: string,\n\t\tremoteAddress: string,\n\t): void {\n\t\tperf.mark(\"updateSession\");\n\t\tif (!sessionId) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst session = this.activeSessions.get(sessionId);\n\t\tif (!session) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.activeSessions.set(sessionId, {\n\t\t\t...session,\n\t\t\tusername,\n\t\t\tremoteAddress,\n\t\t});\n\t}\n\n\t/**\n\t * Lists active sessions sorted by start time.\n\t *\n\t * @returns Snapshot of active session descriptors.\n\t */\n\tpublic listActiveSessions(): VirtualActiveSession[] {\n\t\tperf.mark(\"listActiveSessions\");\n\t\treturn Array.from(this.activeSessions.values()).sort((left, right) =>\n\t\t\tleft.startedAt.localeCompare(right.startedAt),\n\t\t);\n\t}\n\n\tprivate loadFromVfs(): void {\n\t\tthis.users.clear();\n\n\t\tif (!this.vfs.exists(this.usersPath)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst raw = this.vfs.readFile(this.usersPath);\n\t\tfor (const line of raw.split(\"\\n\")) {\n\t\t\tconst trimmed = line.trim();\n\t\t\tif (trimmed.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst parts = trimmed.split(\":\");\n\t\t\tif (parts.length < 3) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [username, salt, passwordHash] = parts;\n\t\t\tif (!username || !salt || !passwordHash) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.users.set(username, { username, salt, passwordHash });\n\t\t}\n\t}\n\n\tprivate loadSudoersFromVfs(): void {\n\t\tthis.sudoers.clear();\n\n\t\tif (!this.vfs.exists(this.sudoersPath)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst raw = this.vfs.readFile(this.sudoersPath);\n\t\tfor (const line of raw.split(\"\\n\")) {\n\t\t\tconst username = line.trim();\n\t\t\tif (username.length > 0) {\n\t\t\t\tthis.sudoers.add(username);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate loadQuotasFromVfs(): void {\n\t\tthis.quotas.clear();\n\n\t\tif (!this.vfs.exists(this.quotasPath)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst raw = this.vfs.readFile(this.quotasPath);\n\t\tfor (const line of raw.split(\"\\n\")) {\n\t\t\tconst trimmed = line.trim();\n\t\t\tif (trimmed.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [username, value] = trimmed.split(\":\");\n\t\t\tconst bytes = Number.parseInt(value ?? \"\", 10);\n\t\t\tif (!username || !Number.isFinite(bytes) || bytes < 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.quotas.set(username, bytes);\n\t\t}\n\t}\n\n\tprivate async persist(): Promise<void> {\n\t\tif (!this.vfs.exists(this.authDirPath)) {\n\t\t\tthis.vfs.mkdir(this.authDirPath, 0o700);\n\t\t}\n\n\t\tconst authContent = Array.from(this.users.values())\n\t\t\t.sort((left, right) => left.username.localeCompare(right.username))\n\t\t\t.map((record) =>\n\t\t\t\t[record.username, record.salt, record.passwordHash].join(\":\"),\n\t\t\t)\n\t\t\t.join(\"\\n\");\n\t\tconst sudoersContent = Array.from(this.sudoers.values()).sort().join(\"\\n\");\n\t\tconst quotasContent = Array.from(this.quotas.entries())\n\t\t\t.sort(([left], [right]) => left.localeCompare(right))\n\t\t\t.map(([username, maxBytes]) => `${username}:${maxBytes}`)\n\t\t\t.join(\"\\n\");\n\n\t\tlet changed = false;\n\t\tchanged =\n\t\t\tthis.writeIfChanged(\n\t\t\t\tthis.usersPath,\n\t\t\t\tauthContent.length > 0 ? `${authContent}\\n` : \"\",\n\t\t\t\t0o600,\n\t\t\t) || changed;\n\t\tchanged =\n\t\t\tthis.writeIfChanged(\n\t\t\t\tthis.sudoersPath,\n\t\t\t\tsudoersContent.length > 0 ? `${sudoersContent}\\n` : \"\",\n\t\t\t\t0o600,\n\t\t\t) || changed;\n\t\tchanged =\n\t\t\tthis.writeIfChanged(\n\t\t\t\tthis.quotasPath,\n\t\t\t\tquotasContent.length > 0 ? `${quotasContent}\\n` : \"\",\n\t\t\t\t0o600,\n\t\t\t) || changed;\n\n\t\tif (changed) {\n\t\t\tawait this.vfs.flushMirror();\n\t\t}\n\t}\n\n\tprivate writeIfChanged(\n\t\ttargetPath: string,\n\t\tcontent: string,\n\t\tmode: number,\n\t): boolean {\n\t\tif (this.vfs.exists(targetPath)) {\n\t\t\tconst existing = this.vfs.readFile(targetPath);\n\t\t\tif (existing === content) {\n\t\t\t\tthis.vfs.chmod(targetPath, mode);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis.vfs.writeFile(targetPath, content, { mode });\n\t\treturn true;\n\t}\n\n\tprivate createRecord(username: string, password: string): VirtualUserRecord {\n\t\tconst cacheKey = `${username}:${password}`;\n\t\tconst cached = VirtualUserManager.recordCache.get(cacheKey);\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tconst salt = randomBytes(16).toString(\"hex\");\n\t\tconst record = {\n\t\t\tusername,\n\t\t\tsalt,\n\t\t\tpasswordHash: this.hashPassword(password),\n\t\t};\n\n\t\tVirtualUserManager.recordCache.set(cacheKey, record);\n\t\treturn record;\n\t}\n\n\tpublic hasPassword(username: string): boolean {\n\t\tperf.mark(\"hasPassword\");\n\t\tif (this.getPasswordHash(username) === this.hashPassword(\"\")) {\n\t\t\treturn false;\n\t\t}\n\t\tconst record = this.users.get(username);\n\t\treturn !!record && !!record.passwordHash;\n\t}\n\n\t/**\n\t * Hashes plaintext password with per-user salt using scrypt.\n\t *\n\t * @param password Plaintext password.\n\t * @returns Hex-encoded password hash.\n\t */\n\tpublic hashPassword(password: string): string {\n\t\tif (VirtualUserManager.fastPasswordHash) {\n\t\t\treturn createHash(\"sha256\").update(`${password}`).digest(\"hex\");\n\t\t}\n\n\t\treturn scryptSync(password, \"\", 32).toString(\"hex\");\n\t}\n\n\tprivate validateUsername(username: string): void {\n\t\tif (!username || username.trim() === \"\") {\n\t\t\tthrow new Error(\"invalid username\");\n\t\t}\n\n\t\tif (!/^[a-z_][a-z0-9_-]{0,31}$/i.test(username)) {\n\t\t\tthrow new Error(\"invalid username\");\n\t\t}\n\t}\n\n\tprivate validatePassword(password: string): void {\n\t\tif (!password || password.trim() === \"\") {\n\t\t\tthrow new Error(\"invalid password\");\n\t\t}\n\t}\n}\n\nfunction normalizeVfsPath(targetPath: string): string {\n\tconst normalized = path.posix.normalize(targetPath);\n\treturn normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n}\n", "import type { ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { readFile, unlink, writeFile } from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { ShellProperties, VirtualShell } from \".\";\nimport { getCommandNames, runCommand } from \"../commands\";\nimport {\n\tspawnHtopProcess,\n\tspawnNanoEditorProcess,\n} from \"../modules/shellInteractive\";\nimport {\n\tgetVisibleHtopPidList,\n\tresolvePath,\n\ttype TerminalSize,\n\ttoTtyLines,\n} from \"../modules/shellRuntime\";\nimport { formatLoginDate } from \"../SSHMimic/loginFormat\";\nimport { buildPrompt } from \"../SSHMimic/prompt\";\nimport type { ShellStream } from \"../types/streams\";\nimport type VirtualFileSystem from \"../VirtualFileSystem\";\n\ninterface NanoSession {\n\tkind: \"nano\" | \"htop\";\n\ttargetPath: string;\n\ttempPath: string;\n\tprocess: ChildProcessWithoutNullStreams;\n}\n\ninterface PendingSudo {\n\tusername: string;\n\ttargetUser: string;\n\tcommandLine: string | null;\n\tloginShell: boolean;\n\tprompt: string;\n\tbuffer: string;\n}\n\nexport function startShell(\n\tproperties: ShellProperties,\n\tstream: ShellStream,\n\tauthUser: string,\n\thostname: string,\n\tsessionId: string | null,\n\tremoteAddress = \"unknown\",\n\tterminalSize: TerminalSize = { cols: 80, rows: 24 },\n\tshell: VirtualShell,\n): void {\n\tlet lineBuffer = \"\";\n\tlet cursorPos = 0;\n\tlet history = loadHistory(shell.vfs);\n\tlet historyIndex: number | null = null;\n\tlet historyDraft = \"\";\n\tlet cwd = `/home/${authUser}`;\n\tlet nanoSession: NanoSession | null = null;\n\tlet pendingSudo: PendingSudo | null = null;\n\tconst buildCurrentPrompt = (): string => {\n\t\tconst homePath = `/home/${authUser}`;\n\t\tconst cwdLabel = cwd === homePath ? \"~\" : path.posix.basename(cwd) || \"/\";\n\t\treturn buildPrompt(authUser, hostname, cwdLabel);\n\t};\n\tconst commandNames = Array.from(new Set(getCommandNames())).sort();\n\tconsole.log(\n\t\t`[${sessionId}] Shell started for user '${authUser}' at ${remoteAddress}`,\n\t);\n\n\tfunction renderLine(): void {\n\t\tconst prompt = buildCurrentPrompt();\n\t\tstream.write(`\\r${prompt}${lineBuffer}\\u001b[K`);\n\n\t\tconst moveLeft = lineBuffer.length - cursorPos;\n\t\tif (moveLeft > 0) {\n\t\t\tstream.write(`\\u001b[${moveLeft}D`);\n\t\t}\n\t}\n\n\tfunction clearCurrentLine(): void {\n\t\tstream.write(\"\\r\\u001b[K\");\n\t}\n\n\tfunction startSudoPrompt(challenge: {\n\t\tusername: string;\n\t\ttargetUser: string;\n\t\tcommandLine: string | null;\n\t\tloginShell: boolean;\n\t\tprompt: string;\n\t}): void {\n\t\tpendingSudo = {\n\t\t\t...challenge,\n\t\t\tbuffer: \"\",\n\t\t};\n\t\tclearCurrentLine();\n\t\tstream.write(challenge.prompt);\n\t}\n\n\tasync function finishSudoPrompt(success: boolean): Promise<void> {\n\t\tif (!pendingSudo) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst challenge = pendingSudo;\n\t\tpendingSudo = null;\n\n\t\tif (!success) {\n\t\t\tstream.write(\"\\r\\nSorry, try again.\\r\\n\");\n\t\t\trenderLine();\n\t\t\treturn;\n\t\t}\n\n\t\tif (!challenge.commandLine) {\n\t\t\tauthUser = challenge.targetUser;\n\t\t\tcwd = `/home/${authUser}`;\n\t\t\tshell.users.updateSession(sessionId, authUser, remoteAddress);\n\t\t\tstream.write(\"\\r\\n\");\n\t\t\trenderLine();\n\t\t\treturn;\n\t\t}\n\n\t\tconst runCwd = challenge.loginShell ? `/home/${challenge.targetUser}` : cwd;\n\t\tconst result = await Promise.resolve(\n\t\t\trunCommand(\n\t\t\t\tchallenge.commandLine,\n\t\t\t\tchallenge.targetUser,\n\t\t\t\thostname,\n\t\t\t\t\"shell\",\n\t\t\t\trunCwd,\n\t\t\t\tshell,\n\t\t\t),\n\t\t);\n\n\t\tstream.write(\"\\r\\n\");\n\n\t\tif (result.openEditor) {\n\t\t\tawait startNanoEditor(\n\t\t\t\tresult.openEditor.targetPath,\n\t\t\t\tresult.openEditor.initialContent,\n\t\t\t\tresult.openEditor.tempPath,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (result.openHtop) {\n\t\t\tawait startHtop();\n\t\t\treturn;\n\t\t}\n\n\t\tif (result.clearScreen) {\n\t\t\tstream.write(\"\\u001b[2J\\u001b[H\");\n\t\t}\n\n\t\tif (result.stdout) {\n\t\t\tstream.write(`${toTtyLines(result.stdout)}\\r\\n`);\n\t\t}\n\n\t\tif (result.stderr) {\n\t\t\tstream.write(`${toTtyLines(result.stderr)}\\r\\n`);\n\t\t}\n\n\t\tif (result.switchUser) {\n\t\t\tauthUser = result.switchUser;\n\t\t\tcwd = result.nextCwd ?? `/home/${authUser}`;\n\t\t\tshell.users.updateSession(sessionId, authUser, remoteAddress);\n\t\t} else if (result.nextCwd) {\n\t\t\tcwd = result.nextCwd;\n\t\t}\n\n\t\tawait shell.vfs.flushMirror();\n\t\trenderLine();\n\t}\n\n\tasync function finishNanoEditor(): Promise<void> {\n\t\tif (!nanoSession) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst activeSession = nanoSession;\n\n\t\tif (activeSession.kind === \"nano\") {\n\t\t\ttry {\n\t\t\t\tconst updatedContent = await readFile(activeSession.tempPath, \"utf8\");\n\t\t\t\tshell.writeFileAsUser(\n\t\t\t\t\tauthUser,\n\t\t\t\t\tactiveSession.targetPath,\n\t\t\t\t\tupdatedContent,\n\t\t\t\t);\n\t\t\t\tawait shell.vfs.flushMirror();\n\t\t\t} catch {\n\t\t\t\t// If temp file does not exist, nano exited without writing.\n\t\t\t}\n\n\t\t\tawait unlink(activeSession.tempPath).catch(() => undefined);\n\t\t}\n\n\t\tnanoSession = null;\n\t\tlineBuffer = \"\";\n\t\tcursorPos = 0;\n\t\tstream.write(\"\\r\\n\");\n\t\trenderLine();\n\t}\n\n\tasync function startNanoEditor(\n\t\ttargetPath: string,\n\t\tinitialContent: string,\n\t\ttempPath: string,\n\t): Promise<void> {\n\t\tif (shell.vfs.exists(targetPath)) {\n\t\t\tawait writeFile(tempPath, initialContent, \"utf8\");\n\t\t}\n\n\t\tconst editor = spawnNanoEditorProcess(tempPath, terminalSize, stream);\n\n\t\teditor.on(\"error\", (error: Error) => {\n\t\t\tstream.write(`nano: ${error.message}\\r\\n`);\n\t\t\tvoid finishNanoEditor();\n\t\t});\n\n\t\teditor.on(\"close\", () => {\n\t\t\tvoid finishNanoEditor();\n\t\t});\n\n\t\tnanoSession = {\n\t\t\tkind: \"nano\",\n\t\t\ttargetPath,\n\t\t\ttempPath,\n\t\t\tprocess: editor,\n\t\t};\n\t}\n\n\tasync function startHtop(): Promise<void> {\n\t\tconst pidList = await getVisibleHtopPidList();\n\t\tif (!pidList) {\n\t\t\tstream.write(\"htop: no child_process processes to display\\r\\n\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst monitor = spawnHtopProcess(pidList, terminalSize, stream);\n\n\t\tmonitor.on(\"error\", (error: Error) => {\n\t\t\tstream.write(`htop: ${error.message}\\r\\n`);\n\t\t\tvoid finishNanoEditor();\n\t\t});\n\n\t\tmonitor.on(\"close\", () => {\n\t\t\tvoid finishNanoEditor();\n\t\t});\n\n\t\tnanoSession = {\n\t\t\tkind: \"htop\",\n\t\t\ttargetPath: \"\",\n\t\t\ttempPath: \"\",\n\t\t\tprocess: monitor,\n\t\t};\n\t}\n\n\tfunction applyHistoryLine(nextLine: string): void {\n\t\tlineBuffer = nextLine;\n\t\tcursorPos = lineBuffer.length;\n\t\trenderLine();\n\t}\n\n\tfunction insertText(text: string): void {\n\t\tlineBuffer = `${lineBuffer.slice(0, cursorPos)}${text}${lineBuffer.slice(cursorPos)}`;\n\t\tcursorPos += text.length;\n\t\trenderLine();\n\t}\n\n\tfunction getTokenRange(\n\t\tline: string,\n\t\tcursor: number,\n\t): { start: number; end: number } {\n\t\tlet start = cursor;\n\t\twhile (start > 0 && !/\\s/.test(line[start - 1]!)) {\n\t\t\tstart -= 1;\n\t\t}\n\n\t\tlet end = cursor;\n\t\twhile (end < line.length && !/\\s/.test(line[end]!)) {\n\t\t\tend += 1;\n\t\t}\n\n\t\treturn { start, end };\n\t}\n\n\tfunction listPathCompletions(prefix: string): string[] {\n\t\tconst slashIndex = prefix.lastIndexOf(\"/\");\n\t\tconst dirPart = slashIndex >= 0 ? prefix.slice(0, slashIndex + 1) : \"\";\n\t\tconst namePart = slashIndex >= 0 ? prefix.slice(slashIndex + 1) : prefix;\n\t\tconst basePath = resolvePath(cwd, dirPart || \".\");\n\n\t\ttry {\n\t\t\treturn shell.vfs\n\t\t\t\t.list(basePath)\n\t\t\t\t.filter((entry) => !entry.startsWith(\".\"))\n\t\t\t\t.filter((entry) => entry.startsWith(namePart))\n\t\t\t\t.map((entry) => {\n\t\t\t\t\tconst fullPath = path.posix.join(basePath, entry);\n\t\t\t\t\tconst st = shell.vfs.stat(fullPath);\n\t\t\t\t\tconst suffix = st.type === \"directory\" ? \"/\" : \"\";\n\t\t\t\t\treturn `${dirPart}${entry}${suffix}`;\n\t\t\t\t})\n\t\t\t\t.sort();\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tfunction handleTabCompletion(): void {\n\t\tconst { start, end } = getTokenRange(lineBuffer, cursorPos);\n\t\tconst token = lineBuffer.slice(start, cursorPos);\n\n\t\tif (token.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst firstToken = lineBuffer.slice(0, start).trim().length === 0;\n\t\tconst commandCandidates = firstToken\n\t\t\t? commandNames.filter((name) => name.startsWith(token))\n\t\t\t: [];\n\t\tconst pathCandidates = listPathCompletions(token);\n\t\tconst candidates = Array.from(\n\t\t\tnew Set([...commandCandidates, ...pathCandidates]),\n\t\t).sort();\n\n\t\tif (candidates.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (candidates.length === 1) {\n\t\t\tconst completed = candidates[0]!;\n\t\t\tconst suffix = completed.endsWith(\"/\") ? \"\" : \" \";\n\t\t\tlineBuffer = `${lineBuffer.slice(0, start)}${completed}${suffix}${lineBuffer.slice(end)}`;\n\t\t\tcursorPos = start + completed.length + suffix.length;\n\t\t\trenderLine();\n\t\t\treturn;\n\t\t}\n\n\t\tstream.write(\"\\r\\n\");\n\t\tstream.write(`${candidates.join(\" \")}\\r\\n`);\n\t\trenderLine();\n\t}\n\n\tfunction pushHistory(cmd: string): void {\n\t\tif (cmd.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\thistory.push(cmd);\n\t\tif (history.length > 500) {\n\t\t\thistory = history.slice(history.length - 500);\n\t\t}\n\n\t\tconst data = history.length > 0 ? `${history.join(\"\\n\")}\\n` : \"\";\n\t\tshell.vfs.writeFile(\"/virtual-env-js/.bash_history\", data);\n\t}\n\n\tfunction readLastLogin(): { at: string; from: string } | null {\n\t\tconst lastlogPath = `/virtual-env-js/.lastlog/${authUser}.json`;\n\t\tif (!shell.vfs.exists(lastlogPath)) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\treturn JSON.parse(shell.vfs.readFile(lastlogPath)) as {\n\t\t\t\tat: string;\n\t\t\t\tfrom: string;\n\t\t\t};\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tfunction writeLastLogin(nowIso: string): void {\n\t\tconst dir = \"/virtual-env-js/.lastlog\";\n\t\tif (!shell.vfs.exists(dir)) {\n\t\t\tshell.vfs.mkdir(dir, 0o700);\n\t\t}\n\n\t\tconst lastlogPath = `${dir}/${authUser}.json`;\n\t\tshell.vfs.writeFile(\n\t\t\tlastlogPath,\n\t\t\tJSON.stringify({ at: nowIso, from: remoteAddress }),\n\t\t);\n\t}\n\n\tfunction renderLoginBanner(): void {\n\t\tconst last = readLastLogin();\n\t\tconst nowIso = new Date().toISOString();\n\n\t\tstream.write(\n\t\t\t`Linux ${hostname} ${properties.kernel} ${properties.arch}\\r\\n`,\n\t\t);\n\t\tstream.write(\"\\r\\n\");\n\t\tstream.write(\n\t\t\t\"The programs included with the Fortune GNU/Linux system are free software;\\r\\n\",\n\t\t);\n\t\tstream.write(\n\t\t\t\"the exact distribution terms for each program are described in the\\r\\n\",\n\t\t);\n\t\tstream.write(\"individual files in /usr/share/doc/*/copyright.\\r\\n\");\n\t\tstream.write(\"\\r\\n\");\n\t\tstream.write(\n\t\t\t\"Fortune GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent\\r\\n\",\n\t\t);\n\t\tstream.write(\"permitted by applicable law.\\r\\n\");\n\n\t\tif (last) {\n\t\t\tconst when = new Date(last.at);\n\t\t\tconst displayed = Number.isNaN(when.getTime())\n\t\t\t\t? last.at\n\t\t\t\t: formatLoginDate(when);\n\t\t\tstream.write(\n\t\t\t\t`Last login: ${displayed} from ${last.from || \"unknown\"}\\r\\n`,\n\t\t\t);\n\t\t}\n\n\t\tstream.write(\"\\r\\n\");\n\t\twriteLastLogin(nowIso);\n\t}\n\n\trenderLoginBanner();\n\trenderLine();\n\n\tstream.on(\"data\", async (chunk: Buffer) => {\n\t\tif (nanoSession) {\n\t\t\tnanoSession.process.stdin.write(chunk);\n\t\t\treturn;\n\t\t}\n\n\t\tif (pendingSudo) {\n\t\t\tconst input = chunk.toString(\"utf8\");\n\n\t\t\tfor (let i = 0; i < input.length; i += 1) {\n\t\t\t\tconst ch = input[i]!;\n\n\t\t\t\tif (ch === \"\\u0003\") {\n\t\t\t\t\tpendingSudo = null;\n\t\t\t\t\tstream.write(\"^C\\r\\n\");\n\t\t\t\t\trenderLine();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (ch === \"\\u007f\" || ch === \"\\b\") {\n\t\t\t\t\tpendingSudo.buffer = pendingSudo.buffer.slice(0, -1);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (ch === \"\\r\" || ch === \"\\n\") {\n\t\t\t\t\tconst password = pendingSudo.buffer;\n\t\t\t\t\tpendingSudo.buffer = \"\";\n\t\t\t\t\tconst valid = shell.users.verifyPassword(\n\t\t\t\t\t\tpendingSudo.username,\n\t\t\t\t\t\tpassword,\n\t\t\t\t\t);\n\t\t\t\t\tawait finishSudoPrompt(valid);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (ch >= \" \") {\n\t\t\t\t\tpendingSudo.buffer += ch;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst input = chunk.toString(\"utf8\");\n\n\t\tfor (let i = 0; i < input.length; i += 1) {\n\t\t\tconst ch = input[i]!;\n\n\t\t\tif (ch === \"\\u0004\") {\n\t\t\t\tlineBuffer = \"\";\n\t\t\t\tcursorPos = 0;\n\t\t\t\thistoryIndex = null;\n\t\t\t\thistoryDraft = \"\";\n\t\t\t\tstream.write(\"bye\\r\\n\");\n\t\t\t\tpushHistory(\"bye\");\n\t\t\t\tawait shell.vfs.flushMirror();\n\t\t\t\tstream.write(\"logout\\r\\n\");\n\t\t\t\tstream.exit(0);\n\t\t\t\tstream.end();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (ch === \"\\t\") {\n\t\t\t\thandleTabCompletion();\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ch === \"\\u001b\") {\n\t\t\t\tconst next = input[i + 1];\n\t\t\t\tconst third = input[i + 2];\n\t\t\t\tconst fourth = input[i + 3];\n\n\t\t\t\tif (next === \"[\" && third) {\n\t\t\t\t\tif (third === \"A\") {\n\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\tif (history.length > 0) {\n\t\t\t\t\t\t\tif (historyIndex === null) {\n\t\t\t\t\t\t\t\thistoryDraft = lineBuffer;\n\t\t\t\t\t\t\t\thistoryIndex = history.length - 1;\n\t\t\t\t\t\t\t} else if (historyIndex > 0) {\n\t\t\t\t\t\t\t\thistoryIndex -= 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tapplyHistoryLine(history[historyIndex] ?? \"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (third === \"B\") {\n\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\tif (historyIndex !== null) {\n\t\t\t\t\t\t\tif (historyIndex < history.length - 1) {\n\t\t\t\t\t\t\t\thistoryIndex += 1;\n\t\t\t\t\t\t\t\tapplyHistoryLine(history[historyIndex] ?? \"\");\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\thistoryIndex = null;\n\t\t\t\t\t\t\t\tapplyHistoryLine(historyDraft);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (third === \"C\") {\n\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\tif (cursorPos < lineBuffer.length) {\n\t\t\t\t\t\t\tcursorPos += 1;\n\t\t\t\t\t\t\tstream.write(\"\\u001b[C\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (third === \"D\") {\n\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\tif (cursorPos > 0) {\n\t\t\t\t\t\t\tcursorPos -= 1;\n\t\t\t\t\t\t\tstream.write(\"\\u001b[D\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (third === \"3\" && fourth === \"~\") {\n\t\t\t\t\t\ti += 3;\n\t\t\t\t\t\tif (cursorPos < lineBuffer.length) {\n\t\t\t\t\t\t\tlineBuffer = `${lineBuffer.slice(0, cursorPos)}${lineBuffer.slice(cursorPos + 1)}`;\n\t\t\t\t\t\t\trenderLine();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ch === \"\\u0003\") {\n\t\t\t\tlineBuffer = \"\";\n\t\t\t\tcursorPos = 0;\n\t\t\t\thistoryIndex = null;\n\t\t\t\thistoryDraft = \"\";\n\t\t\t\tstream.write(\"^C\\r\\n\");\n\t\t\t\trenderLine();\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ch === \"\\r\" || ch === \"\\n\") {\n\t\t\t\tconst line = lineBuffer.trim();\n\t\t\t\tlineBuffer = \"\";\n\t\t\t\tcursorPos = 0;\n\t\t\t\thistoryIndex = null;\n\t\t\t\thistoryDraft = \"\";\n\t\t\t\tstream.write(\"\\r\\n\");\n\n\t\t\t\tif (line.length > 0) {\n\t\t\t\t\tconst result = await Promise.resolve(\n\t\t\t\t\t\trunCommand(line, authUser, hostname, \"shell\", cwd, shell),\n\t\t\t\t\t);\n\n\t\t\t\t\tpushHistory(line);\n\n\t\t\t\t\tif (result.openEditor) {\n\t\t\t\t\t\tawait startNanoEditor(\n\t\t\t\t\t\t\tresult.openEditor.targetPath,\n\t\t\t\t\t\t\tresult.openEditor.initialContent,\n\t\t\t\t\t\t\tresult.openEditor.tempPath,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.openHtop) {\n\t\t\t\t\t\tawait startHtop();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.sudoChallenge) {\n\t\t\t\t\t\tstartSudoPrompt(result.sudoChallenge);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.clearScreen) {\n\t\t\t\t\t\tstream.write(\"\\u001b[2J\\u001b[H\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.stdout) {\n\t\t\t\t\t\tstream.write(`${toTtyLines(result.stdout)}\\r\\n`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.stderr) {\n\t\t\t\t\t\tstream.write(`${toTtyLines(result.stderr)}\\r\\n`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.closeSession) {\n\t\t\t\t\t\tstream.write(\"logout\\r\\n\");\n\t\t\t\t\t\tstream.exit(result.exitCode ?? 0);\n\t\t\t\t\t\tstream.end();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.nextCwd) {\n\t\t\t\t\t\tcwd = result.nextCwd;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (result.switchUser) {\n\t\t\t\t\t\tauthUser = result.switchUser;\n\t\t\t\t\t\tcwd = result.nextCwd ?? `/home/${authUser}`;\n\t\t\t\t\t\tshell.users.updateSession(sessionId, authUser, remoteAddress);\n\t\t\t\t\t\tlineBuffer = \"\";\n\t\t\t\t\t\tcursorPos = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait shell.vfs.flushMirror();\n\t\t\t\t}\n\n\t\t\t\trenderLine();\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ch === \"\\u007f\" || ch === \"\\b\") {\n\t\t\t\tif (cursorPos > 0) {\n\t\t\t\t\tlineBuffer = `${lineBuffer.slice(0, cursorPos - 1)}${lineBuffer.slice(cursorPos)}`;\n\t\t\t\t\tcursorPos -= 1;\n\t\t\t\t\trenderLine();\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tinsertText(ch);\n\t\t}\n\t});\n\n\tstream.on(\"close\", () => {\n\t\tif (nanoSession) {\n\t\t\tnanoSession.process.kill(\"SIGTERM\");\n\t\t\tnanoSession = null;\n\t\t}\n\t});\n}\n\nfunction loadHistory(vfs: VirtualFileSystem): string[] {\n\tconst historyPath = \"/virtual-env-js/.bash_history\";\n\tif (!vfs.exists(historyPath)) {\n\t\tvfs.writeFile(historyPath, \"\");\n\t\treturn [];\n\t}\n\n\tconst raw = vfs.readFile(historyPath);\n\treturn raw\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.filter((line) => line.length > 0);\n}\n", "import { type ChildProcessWithoutNullStreams, spawn } from \"node:child_process\";\nimport type { ShellStream } from \"../types/streams\";\nimport {\n\tshellQuote,\n\ttype TerminalSize,\n\twithTerminalSize,\n} from \"./shellRuntime\";\n\nfunction spawnScriptProcess(\n\tcommand: string,\n\tterminalSize: TerminalSize,\n\tstream: ShellStream,\n): ChildProcessWithoutNullStreams {\n\tconst formatted = withTerminalSize(command, terminalSize);\n\tconst proc = spawn(\"script\", [\"-qfec\", formatted, \"/dev/null\"], {\n\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\tenv: {\n\t\t\t...process.env,\n\t\t\t// biome-ignore lint/style/useNamingConvention: env variable should be uppercase\n\t\t\tTERM: process.env.TERM ?? \"xterm-256color\",\n\t\t},\n\t});\n\n\tproc.stdout.on(\"data\", (data: Buffer) => {\n\t\tstream.write(data.toString(\"utf8\"));\n\t});\n\n\tproc.stderr.on(\"data\", (data: Buffer) => {\n\t\tstream.write(data.toString(\"utf8\"));\n\t});\n\n\treturn proc;\n}\n\nexport function spawnNanoEditorProcess(\n\ttempPath: string,\n\tterminalSize: TerminalSize,\n\tstream: ShellStream,\n): ChildProcessWithoutNullStreams {\n\treturn spawnScriptProcess(\n\t\t`nano -- ${shellQuote(tempPath)}`,\n\t\tterminalSize,\n\t\tstream,\n\t);\n}\n\nexport function spawnHtopProcess(\n\tpidList: string,\n\tterminalSize: TerminalSize,\n\tstream: ShellStream,\n): ChildProcessWithoutNullStreams {\n\treturn spawnScriptProcess(\n\t\t`htop -p ${shellQuote(pidList)}`,\n\t\tterminalSize,\n\t\tstream,\n\t);\n}\n", "import { readFile } from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nexport interface TerminalSize {\n\tcols: number;\n\trows: number;\n}\n\nexport function shellQuote(value: string): string {\n\treturn `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nexport function toTtyLines(text: string): string {\n\treturn text\n\t\t.replace(/\\r\\n/g, \"\\n\")\n\t\t.replace(/\\r/g, \"\\n\")\n\t\t.replace(/\\n/g, \"\\r\\n\");\n}\n\nexport function withTerminalSize(\n\tcommand: string,\n\tterminalSize: TerminalSize,\n): string {\n\tconst cols =\n\t\tNumber.isFinite(terminalSize.cols) && terminalSize.cols > 0\n\t\t\t? Math.floor(terminalSize.cols)\n\t\t\t: 80;\n\tconst rows =\n\t\tNumber.isFinite(terminalSize.rows) && terminalSize.rows > 0\n\t\t\t? Math.floor(terminalSize.rows)\n\t\t\t: 24;\n\treturn `stty cols ${cols} rows ${rows} 2>/dev/null; ${command}`;\n}\n\nexport function resolvePath(base: string, inputPath: string): string {\n\tif (!inputPath || inputPath.trim() === \"\" || inputPath === \".\") {\n\t\treturn base;\n\t}\n\treturn inputPath.startsWith(\"/\")\n\t\t? path.posix.normalize(inputPath)\n\t\t: path.posix.normalize(path.posix.join(base, inputPath));\n}\n\nexport async function collectChildPids(parentPid: number): Promise<number[]> {\n\ttry {\n\t\tconst childrenRaw = await readFile(\n\t\t\t`/proc/${parentPid}/task/${parentPid}/children`,\n\t\t\t\"utf8\",\n\t\t);\n\t\tconst directChildren = childrenRaw\n\t\t\t.trim()\n\t\t\t.split(/\\s+/)\n\t\t\t.filter(Boolean)\n\t\t\t.map((value) => Number.parseInt(value, 10))\n\t\t\t.filter((pid) => Number.isInteger(pid) && pid > 0);\n\n\t\tconst nested = await Promise.all(\n\t\t\tdirectChildren.map((pid) => collectChildPids(pid)),\n\t\t);\n\t\treturn [...directChildren, ...nested.flat()];\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nexport async function getVisibleHtopPidList(\n\trootPid = process.pid,\n): Promise<string | null> {\n\tconst descendants = await collectChildPids(rootPid);\n\tconst unique = Array.from(new Set(descendants)).sort((a, b) => a - b);\n\tif (unique.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn unique.join(\",\");\n}\n", "export function buildPrompt(\n\tuser: string,\n\thost: string,\n\tcwdName: string,\n): string {\n\tconst isRoot = user === \"root\";\n\tconst colorUser = isRoot ? \"\\u001b[31;1m\" : \"\\u001b[35;1m\";\n\tconst colorWhite = \"\\u001b[37;1m\";\n\tconst colorBlue = \"\\u001b[34;1m\";\n\tconst colorReset = \"\\u001b[0m\";\n\tconst symbol = isRoot ? \"#\" : \"$\";\n\n\treturn `${colorWhite}[${colorUser}${user}${colorWhite}@${colorBlue}${host}${colorReset} ${cwdName}${colorWhite}]${colorReset}${symbol} `;\n}\n", "import { runCommand } from \"../commands\";\nimport type { ExecStream } from \"../types/streams\";\nimport type { VirtualShell } from \"../VirtualShell\";\n\nfunction toTtyLines(text: string): string {\n\treturn text\n\t\t.replace(/\\r\\n/g, \"\\n\")\n\t\t.replace(/\\r/g, \"\\n\")\n\t\t.replace(/\\n/g, \"\\r\\n\");\n}\n\nexport function runExec(\n\tstream: ExecStream,\n\tcmd: string,\n\tauthUser: string,\n\thostname: string,\n\tshell: VirtualShell,\n): void {\n\tPromise.resolve(\n\t\trunCommand(cmd, authUser, hostname, \"exec\", `/home/${authUser}`, shell),\n\t)\n\t\t.then((result) => {\n\t\t\tif (result.stdout) {\n\t\t\t\tstream.write(`${toTtyLines(result.stdout)}\\r\\n`);\n\t\t\t}\n\n\t\t\tif (result.stderr) {\n\t\t\t\tstream.stderr.write(`${toTtyLines(result.stderr)}\\r\\n`);\n\t\t\t}\n\n\t\t\tstream.exit(result.exitCode ?? 0);\n\t\t\tvoid shell.vfs.flushMirror();\n\t\t\tstream.end();\n\t\t})\n\t\t.catch((error) => {\n\t\t\tconsole.error(\"Exec error:\", error);\n\t\t\tstream.stderr.write(`Error: ${String(error)}\\r\\n`);\n\t\t\tstream.exit(1);\n\t\t\tstream.end();\n\t\t});\n}\n", "import { generateKeyPairSync } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\n\nexport function loadOrCreateHostKey(baseDir: string = process.cwd()): string {\n\tconst hostKeyPath = resolve(baseDir, \".ssh-mimic\", \"host_rsa\");\n\n\tif (existsSync(hostKeyPath)) {\n\t\treturn readFileSync(hostKeyPath, \"utf8\");\n\t}\n\n\tconst privateKey = generateKeyPairSync(\"rsa\", {\n\t\tmodulusLength: 2048,\n\t\tprivateKeyEncoding: { type: \"pkcs1\", format: \"pem\" },\n\t\tpublicKeyEncoding: { type: \"pkcs1\", format: \"pem\" },\n\t}).privateKey;\n\n\tmkdirSync(dirname(hostKeyPath), { recursive: true });\n\twriteFileSync(hostKeyPath, privateKey, { mode: 0o600 });\n\treturn privateKey;\n}\n", "/** biome-ignore-all lint/style/useNamingConvention: const as enum */\nimport { EventEmitter } from \"node:events\";\nimport * as path from \"node:path\";\nimport type { AuthenticationType, KeyboardAuthContext } from \"ssh2\";\nimport { Server as SshServer } from \"ssh2\";\nimport type { VfsNodeStats } from \"../types/vfs\";\nimport type { PerfLogger } from \"../utils/perfLogger\";\nimport { createPerfLogger } from \"../utils/perfLogger\";\nimport type VirtualFileSystem from \"../VirtualFileSystem\";\nimport { VirtualShell } from \"../VirtualShell\";\nimport type { VirtualUserManager } from \"../VirtualUserManager\";\nimport { loadOrCreateHostKey } from \"./hostKey\";\n\nconst SFTP_STATUS_CODE = {\n\tOK: 0,\n\tEOF: 1,\n\tNO_SUCH_FILE: 2,\n\tPERMISSION_DENIED: 3,\n\tFAILURE: 4,\n\tBAD_MESSAGE: 5,\n\tNO_CONNECTION: 6,\n\tCONNECTION_LOST: 7,\n\tOP_UNSUPPORTED: 8,\n};\n\nconst OPEN_MODE = {\n\tREAD: 0x00000001,\n\tWRITE: 0x00000002,\n\tAPPEND: 0x00000004,\n\tCREAT: 0x00000008,\n\tTRUNC: 0x00000010,\n\tEXCL: 0x00000020,\n};\n\nconst perf: PerfLogger = createPerfLogger(\"SftpMimic\");\n\ninterface SftpFileHandle {\n\ttype: \"file\";\n\tpath: string;\n\tflags: number;\n\tbuffer: Buffer;\n}\n\ninterface SftpDirHandle {\n\ttype: \"dir\";\n\tpath: string;\n\tentries: string[];\n\tindex: number;\n}\n\ntype SftpHandle = SftpFileHandle | SftpDirHandle;\n\ninterface SftpAttributes {\n\tmode: number;\n\tuid: number;\n\tgid: number;\n\tsize: number;\n\tatime: number | Date;\n\tmtime: number | Date;\n}\n\ninterface SftpServerStream {\n\ton(\n\t\tevent: \"OPEN\",\n\t\tlistener: (reqid: number, filename: string, flags: number) => void,\n\t): this;\n\ton(\n\t\tevent: \"READ\",\n\t\tlistener: (\n\t\t\treqid: number,\n\t\t\thandle: Buffer,\n\t\t\toffset: number,\n\t\t\tlength: number,\n\t\t) => void,\n\t): this;\n\ton(\n\t\tevent: \"WRITE\",\n\t\tlistener: (\n\t\t\treqid: number,\n\t\t\thandle: Buffer,\n\t\t\toffset: number,\n\t\t\tdata: Buffer,\n\t\t) => void,\n\t): this;\n\ton(event: \"FSTAT\", listener: (reqid: number, handle: Buffer) => void): this;\n\ton(event: \"CLOSE\", listener: (reqid: number, handle: Buffer) => void): this;\n\ton(event: \"OPENDIR\", listener: (reqid: number, path: string) => void): this;\n\ton(event: \"READDIR\", listener: (reqid: number, handle: Buffer) => void): this;\n\ton(event: \"STAT\", listener: (reqid: number, path: string) => void): this;\n\ton(event: \"LSTAT\", listener: (reqid: number, path: string) => void): this;\n\ton(\n\t\tevent: \"FSETSTAT\",\n\t\tlistener: (\n\t\t\treqid: number,\n\t\t\thandle: Buffer,\n\t\t\tattrs: Partial<SftpAttributes>,\n\t\t) => void,\n\t): this;\n\ton(\n\t\tevent: \"SETSTAT\",\n\t\tlistener: (\n\t\t\treqid: number,\n\t\t\tpath: string,\n\t\t\tattrs: Partial<SftpAttributes>,\n\t\t) => void,\n\t): this;\n\ton(event: \"REALPATH\", listener: (reqid: number, path: string) => void): this;\n\ton(event: \"MKDIR\", listener: (reqid: number, path: string) => void): this;\n\ton(event: \"RMDIR\", listener: (reqid: number, path: string) => void): this;\n\ton(event: \"REMOVE\", listener: (reqid: number, path: string) => void): this;\n\ton(\n\t\tevent: \"RENAME\",\n\t\tlistener: (reqid: number, oldPath: string, newPath: string) => void,\n\t): this;\n\ton(event: \"READLINK\", listener: (reqid: number) => void): this;\n\ton(event: \"SYMLINK\", listener: (reqid: number) => void): this;\n\ton(event: \"END\", listener: () => void): this;\n\ton(event: \"end\", listener: () => void): this;\n\ton(event: \"error\", listener: (error: Error) => void): this;\n\ton(event: \"close\", listener: () => void): this;\n\tstatus(reqid: number, code: number): void;\n\tattrs(reqid: number, attrs: SftpAttributes): void;\n\thandle(reqid: number, handle: Buffer): void;\n\tdata(reqid: number, data: Buffer): void;\n\tname(\n\t\treqid: number,\n\t\tentries: Array<{\n\t\t\tfilename: string;\n\t\t\tlongname: string;\n\t\t\tattrs: SftpAttributes;\n\t\t}>,\n\t): void;\n}\n\nexport interface SftpMimicOptions {\n\tport: number;\n\thostname?: string;\n\tshell?: VirtualShell;\n\tvfs?: VirtualFileSystem;\n\tusers?: VirtualUserManager;\n}\n\nexport class SftpMimic extends EventEmitter {\n\tport: number;\n\tserver: SshServer | null;\n\tprivate readonly hostname: string;\n\tprivate readonly shell: VirtualShell | null;\n\tprivate readonly vfs: VirtualFileSystem;\n\tprivate readonly users: VirtualUserManager;\n\tprivate nextHandleId = 0;\n\tprivate handles = new Map<string, SftpHandle>();\n\n\tconstructor({\n\t\tport,\n\t\thostname = \"typescript-vm\",\n\t\tshell,\n\t\tvfs,\n\t\tusers,\n\t}: SftpMimicOptions) {\n\t\tsuper();\n\t\tperf.mark(\"constructor\");\n\t\tthis.port = port;\n\t\tthis.server = null;\n\t\tthis.hostname = hostname;\n\t\tthis.shell = null;\n\n\t\tif (shell) {\n\t\t\tthis.vfs = shell.vfs;\n\t\t\tthis.users = shell.users;\n\t\t\tthis.hostname = shell.hostname;\n\t\t\tthis.shell = shell;\n\t\t} else if (vfs && users) {\n\t\t\tthis.vfs = vfs;\n\t\t\tthis.users = users;\n\t\t} else {\n\t\t\tconst defaultShell = new VirtualShell(hostname);\n\t\t\tthis.vfs = defaultShell.vfs;\n\t\t\tthis.users = defaultShell.users;\n\t\t\tthis.shell = defaultShell;\n\t\t}\n\t}\n\n\tprivate getVfs(): VirtualFileSystem {\n\t\treturn this.shell?.vfs ?? this.vfs;\n\t}\n\n\tprivate getUsers(): VirtualUserManager {\n\t\treturn this.shell?.users ?? this.users;\n\t}\n\n\tpublic async start(): Promise<number> {\n\t\tperf.mark(\"start\");\n\t\tconst privateKey = loadOrCreateHostKey();\n\n\t\t// Ensure VirtualShell is fully initialized before accepting connections\n\t\tif (this.shell) {\n\t\t\tawait this.shell.ensureInitialized();\n\t\t} else {\n\t\t\t// If using standalone VFS+Users, initialize users now\n\t\t\tawait this.users.initialize();\n\t\t}\n\n\t\tthis.server = new SshServer(\n\t\t\t{\n\t\t\t\thostKeys: [privateKey],\n\t\t\t\tident: `SSH-2.0-${this.hostname}`,\n\t\t\t},\n\t\t\t(client) => {\n\t\t\t\tconst allowedAuthMethods: AuthenticationType[] = [\n\t\t\t\t\t\"password\",\n\t\t\t\t\t\"keyboard-interactive\",\n\t\t\t\t];\n\t\t\t\tlet authUser = \"root\";\n\t\t\t\tlet sessionId: string | null = null;\n\t\t\t\tlet remoteAddress = \"unknown\";\n\n\t\t\t\tthis.emit(\"client:connect\");\n\n\t\t\t\t// Add error handling for the client\n\t\t\t\tclient.on(\"error\", (error: unknown) => {\n\t\t\t\t\tconsole.error(`[SFTP] Client error:`, error);\n\t\t\t\t});\n\n\t\t\t\tconst acceptSession = (username: string): void => {\n\t\t\t\t\tauthUser = username;\n\t\t\t\t\tsessionId = this.getUsers().registerSession(\n\t\t\t\t\t\tauthUser,\n\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t).id;\n\n\t\t\t\t\tconst homeRoot = \"/home\";\n\t\t\t\t\tif (!this.getVfs().exists(homeRoot)) {\n\t\t\t\t\t\tthis.getVfs().mkdir(homeRoot, 0o755);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst homePath = `/home/${authUser}`;\n\t\t\t\t\tif (!this.getVfs().exists(homePath)) {\n\t\t\t\t\t\tthis.getVfs().mkdir(homePath, 0o755);\n\t\t\t\t\t\tthis.getVfs().writeFile(\n\t\t\t\t\t\t\t`${homePath}/README.txt`,\n\t\t\t\t\t\t\t`Welcome to ${this.hostname}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tvoid this.getVfs().flushMirror();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tclient.on(\"authentication\", (ctx) => {\n\t\t\t\t\tconst candidateUser = ctx.username || \"root\";\n\t\t\t\t\tremoteAddress = (ctx as { ip?: string }).ip ?? remoteAddress;\n\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`[SFTP] Auth attempt: user=${candidateUser}, method=${ctx.method}, ip=${remoteAddress}`,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (ctx.method === \"password\") {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!this.getUsers().verifyPassword(candidateUser, ctx.password ?? \"\")\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.emit(\"auth:failure\", {\n\t\t\t\t\t\t\t\tusername: candidateUser,\n\t\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tctx.reject(allowedAuthMethods);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tacceptSession(candidateUser);\n\t\t\t\t\t\tthis.emit(\"auth:success\", { username: authUser, remoteAddress });\n\t\t\t\t\t\tctx.accept();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ctx.method === \"keyboard-interactive\") {\n\t\t\t\t\t\tconst keyboardCtx = ctx as KeyboardAuthContext;\n\t\t\t\t\t\tkeyboardCtx.prompt(\n\t\t\t\t\t\t\t[{ prompt: \"Password: \", echo: false }],\n\t\t\t\t\t\t\t(answers) => {\n\t\t\t\t\t\t\t\tconst password = answers[0] ?? \"\";\n\t\t\t\t\t\t\t\tif (!this.getUsers().verifyPassword(candidateUser, password)) {\n\t\t\t\t\t\t\t\t\tthis.emit(\"auth:failure\", {\n\t\t\t\t\t\t\t\t\t\tusername: candidateUser,\n\t\t\t\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tkeyboardCtx.reject(allowedAuthMethods);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tacceptSession(candidateUser);\n\t\t\t\t\t\t\t\tthis.emit(\"auth:success\", {\n\t\t\t\t\t\t\t\t\tusername: authUser,\n\t\t\t\t\t\t\t\t\tremoteAddress,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tkeyboardCtx.accept();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.reject(allowedAuthMethods);\n\t\t\t\t});\n\n\t\t\t\tclient.on(\"close\", () => {\n\t\t\t\t\tthis.getUsers().unregisterSession(sessionId);\n\t\t\t\t\tthis.emit(\"client:disconnect\", { user: authUser });\n\t\t\t\t\tsessionId = null;\n\t\t\t\t});\n\n\t\t\t\tclient.on(\"ready\", () => {\n\t\t\t\t\tclient.on(\"session\", (accept, _reject) => {\n\t\t\t\t\t\tconst session = accept();\n\n\t\t\t\t\t\t// Add error handling for the session\n\t\t\t\t\t\tsession.on(\"error\", (error: unknown) => {\n\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t`[SFTP] Session error for user=${authUser}:`,\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tsession.on(\"sftp\", (acceptSftp) => {\n\t\t\t\t\t\t\tconst sftp = acceptSftp();\n\t\t\t\t\t\t\tthis.attachSftpHandlers(sftp, authUser);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\n\t\treturn new Promise<number>((resolve, reject) => {\n\t\t\tthis.server?.once(\"error\", (err: unknown) => reject(err));\n\t\t\tthis.server?.listen(this.port, \"0.0.0.0\", () => {\n\t\t\t\tconst address = this.server?.address();\n\t\t\t\tconst actualPort =\n\t\t\t\t\taddress && typeof address === \"object\" && \"port\" in address\n\t\t\t\t\t\t? address.port\n\t\t\t\t\t\t: this.port;\n\t\t\t\tconsole.log(`SFTP Mimic listening on port ${actualPort}`);\n\t\t\t\tthis.emit(\"start\", { port: actualPort });\n\t\t\t\tresolve(actualPort as number);\n\t\t\t});\n\t\t});\n\t}\n\n\tpublic stop(): void {\n\t\tperf.mark(\"stop\");\n\t\tif (this.server) {\n\t\t\tthis.server.close(() => {\n\t\t\t\tconsole.log(\"SFTP Mimic stopped\");\n\t\t\t\tthis.emit(\"stop\");\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Resolves SFTP request paths with proper handling of relative paths.\n\t * Relative paths (including \".\") are resolved relative to the user's home directory.\n\t * This is standard SFTP behavior where the \"working directory\" is always the home.\n\t */\n\tprivate resolveRequestPath(requestPath: string, authUser: string): string {\n\t\tconst homePath = `/home/${authUser}`;\n\n\t\t// Empty path or \".\" \u2192 resolve to home directory\n\t\tif (!requestPath || requestPath === \".\") {\n\t\t\treturn homePath;\n\t\t}\n\n\t\t// Relative path (doesn't start with \"/\") \u2192 resolve relative to home\n\t\tif (!requestPath.startsWith(\"/\")) {\n\t\t\tconst joined = path.posix.join(homePath, requestPath);\n\t\t\treturn path.posix.normalize(joined);\n\t\t}\n\n\t\t// Absolute path \u2192 just normalize it\n\t\treturn path.posix.normalize(requestPath);\n\t}\n\t/**\n\t * Verifies that a target path is confined within the user's home directory.\n\t * This implements chroot-like behavior for security.\n\t * @param targetPath - The normalized target path\n\t * @param authUser - The authenticated username\n\t * @returns true if path is within home, false if traversal attempt detected\n\t */\n\tprivate isPathWithinHome(targetPath: string, authUser: string): boolean {\n\t\tconst homePath = `/home/${authUser}`;\n\t\tconst normalized = path.posix.normalize(targetPath);\n\n\t\t// Allow access to home directory itself\n\t\tif (normalized === homePath) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Check if path is within home directory (starts with /home/username/)\n\t\tif (normalized.startsWith(`${homePath}/`)) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Reject any attempt to escape home directory\n\t\treturn false;\n\t}\n\n\tprivate createAttrs(node: VfsNodeStats): SftpAttributes {\n\t\tconst permissions = node.mode & 0o777;\n\t\tconst fileType = node.type === \"directory\" ? 0o040000 : 0o100000;\n\n\t\treturn {\n\t\t\tmode: fileType | permissions,\n\t\t\tsize: node.type === \"file\" ? node.size : 0,\n\t\t\tuid: 0,\n\t\t\tgid: 0,\n\t\t\tatime: Math.floor(node.createdAt.getTime() / 1000),\n\t\t\tmtime: Math.floor(node.updatedAt.getTime() / 1000),\n\t\t};\n\t}\n\n\tprivate openHandle(handleValue: SftpHandle): Buffer {\n\t\tconst handleId = ++this.nextHandleId;\n\t\tconst handle = Buffer.alloc(4);\n\t\thandle.writeUInt32BE(handleId, 0);\n\t\tthis.handles.set(handle.toString(\"hex\"), handleValue);\n\t\treturn handle;\n\t}\n\n\tprivate getHandle(handle: Buffer): SftpHandle | undefined {\n\t\treturn this.handles.get(handle.toString(\"hex\")) as SftpHandle | undefined;\n\t}\n\n\tprivate closeHandle(handle: Buffer): void {\n\t\tthis.handles.delete(handle.toString(\"hex\"));\n\t}\n\n\tprivate attachSftpHandlers(sftp: SftpServerStream, authUser: string): void {\n\t\tconst getVfs = () => this.getVfs();\n\t\tconst getUsers = () => this.getUsers();\n\n\t\tsftp.on(\"OPEN\", (reqid: number, filename: string, flags: number) => {\n\t\t\tconst targetPath = this.resolveRequestPath(filename, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst openMode = flags;\n\t\t\tconst _canRead = Boolean(openMode & OPEN_MODE.READ);\n\t\t\tconst _canWrite = Boolean(\n\t\t\t\topenMode & OPEN_MODE.WRITE || openMode & OPEN_MODE.APPEND,\n\t\t\t);\n\t\t\tconst canCreate = Boolean(openMode & OPEN_MODE.CREAT);\n\t\t\tconst shouldTruncate = Boolean(openMode & OPEN_MODE.TRUNC);\n\n\t\t\ttry {\n\t\t\t\tif (!getVfs().exists(targetPath)) {\n\t\t\t\t\tif (!canCreate) {\n\t\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.NO_SUCH_FILE);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tgetVfs().writeFile(targetPath, Buffer.alloc(0));\n\t\t\t\t}\n\n\t\t\t\tconst stats = getVfs().stat(targetPath);\n\t\t\t\tif (stats.type === \"directory\") {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlet buffer = Buffer.from(getVfs().readFile(targetPath), \"utf8\");\n\t\t\t\tif (shouldTruncate) {\n\t\t\t\t\tbuffer = Buffer.alloc(0);\n\t\t\t\t}\n\n\t\t\t\tif (openMode & OPEN_MODE.APPEND) {\n\t\t\t\t\tconst handle = this.openHandle({\n\t\t\t\t\t\ttype: \"file\",\n\t\t\t\t\t\tpath: targetPath,\n\t\t\t\t\t\tflags: openMode,\n\t\t\t\t\t\tbuffer,\n\t\t\t\t\t});\n\t\t\t\t\tsftp.handle(reqid, handle);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst handle = this.openHandle({\n\t\t\t\t\ttype: \"file\",\n\t\t\t\t\tpath: targetPath,\n\t\t\t\t\tflags: openMode,\n\t\t\t\t\tbuffer,\n\t\t\t\t});\n\t\t\t\tsftp.handle(reqid, handle);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"SFTP OPEN error:\", error);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\n\t\t\t\"READ\",\n\t\t\t(reqid: number, handle: Buffer, offset: number, length: number) => {\n\t\t\t\tconst entry = this.getHandle(handle);\n\t\t\t\tif (!entry || entry.type !== \"file\") {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (offset >= entry.buffer.length) {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.EOF);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst chunk = entry.buffer.slice(offset, offset + length);\n\t\t\t\tsftp.data(reqid, chunk);\n\t\t\t},\n\t\t);\n\n\t\tsftp.on(\n\t\t\t\"WRITE\",\n\t\t\tasync (reqid: number, handle: Buffer, offset: number, data: Buffer) => {\n\t\t\t\tconst entry = this.getHandle(handle);\n\t\t\t\tif (!entry || entry.type !== \"file\") {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst end = offset + data.length;\n\t\t\t\tif (end > entry.buffer.length) {\n\t\t\t\t\tconst nextBuffer = Buffer.alloc(end);\n\t\t\t\t\tentry.buffer.copy(nextBuffer, 0, 0, entry.buffer.length);\n\t\t\t\t\tentry.buffer = nextBuffer;\n\t\t\t\t}\n\n\t\t\t\tdata.copy(entry.buffer, offset);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t\t},\n\t\t);\n\n\t\tsftp.on(\"FSTAT\", (reqid: number, handle: Buffer) => {\n\t\t\tconst entry = this.getHandle(handle);\n\t\t\tif (!entry) {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst stats = getVfs().stat(entry.path);\n\t\t\t\tsftp.attrs(reqid, this.createAttrs(stats));\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\"CLOSE\", async (reqid: number, handle: Buffer) => {\n\t\t\tconst entry = this.getHandle(handle);\n\t\t\tif (!entry) {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (entry.type === \"file\") {\n\t\t\t\ttry {\n\t\t\t\t\tgetUsers().assertWriteWithinQuota(authUser, entry.path, entry.buffer);\n\t\t\t\t\tgetVfs().writeFile(entry.path, entry.buffer);\n\t\t\t\t\tvoid getVfs().flushMirror();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(\"SFTP CLOSE write error:\", error);\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t\tthis.closeHandle(handle);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.closeHandle(handle);\n\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t});\n\n\t\tsftp.on(\"OPENDIR\", (reqid: number, requestPath: string) => {\n\t\t\tconst targetPath = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst stats = getVfs().stat(targetPath);\n\t\t\t\tif (stats.type !== \"directory\") {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst entries = getVfs().list(targetPath);\n\t\t\t\tconst handle = this.openHandle({\n\t\t\t\t\ttype: \"dir\",\n\t\t\t\t\tpath: targetPath,\n\t\t\t\t\tentries,\n\t\t\t\t\tindex: 0,\n\t\t\t\t});\n\n\t\t\t\tsftp.handle(reqid, handle);\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.NO_SUCH_FILE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\"READDIR\", (reqid: number, handle: Buffer) => {\n\t\t\tconst entry = this.getHandle(handle);\n\t\t\tif (!entry || entry.type !== \"dir\") {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (entry.index >= entry.entries.length) {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.EOF);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst filename = entry.entries[entry.index++]!;\n\t\t\tconst filePath = path.posix.join(entry.path, filename);\n\t\t\tconst stats = getVfs().stat(filePath);\n\t\t\tconst attrs = this.createAttrs(stats);\n\t\t\tconst longname = `${stats.type === \"directory\" ? \"d\" : \"-\"}${(stats.mode & 0o777).toString(8)} ${filename}`;\n\t\t\treturn sftp.name(reqid, [{ filename, longname, attrs }]);\n\t\t});\n\n\t\tsftp.on(\"STAT\", (reqid: number, requestPath: string) => {\n\t\t\tconst targetPath = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst stats = getVfs().stat(targetPath);\n\t\t\t\tsftp.attrs(reqid, this.createAttrs(stats));\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.NO_SUCH_FILE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\"LSTAT\", (reqid: number, requestPath: string) => {\n\t\t\tconst targetPath = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst stats = getVfs().stat(targetPath);\n\t\t\t\tsftp.attrs(reqid, this.createAttrs(stats));\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.NO_SUCH_FILE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\n\t\t\t\"FSETSTAT\",\n\t\t\t(reqid: number, handle: Buffer, attrs: { mode?: number }) => {\n\t\t\t\tconst entry = this.getHandle(handle);\n\t\t\t\tif (!entry) {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tif (attrs.mode !== undefined) {\n\t\t\t\t\t\tgetVfs().chmod(entry.path, attrs.mode);\n\t\t\t\t\t}\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t\t\t} catch {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\tsftp.on(\n\t\t\t\"SETSTAT\",\n\t\t\t(reqid: number, requestPath: string, attrs: { mode?: number }) => {\n\t\t\t\tconst targetPath = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t\t// Security: Confine to home directory\n\t\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t\t);\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tif (attrs.mode !== undefined) {\n\t\t\t\t\t\tgetVfs().chmod(targetPath, attrs.mode);\n\t\t\t\t\t}\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t\t\t} catch {\n\t\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\tsftp.on(\"REALPATH\", (reqid: number, requestPath: string) => {\n\t\t\tconst normalized = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(normalized, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${normalized}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsftp.name(reqid, [\n\t\t\t\t{\n\t\t\t\t\tfilename: normalized,\n\t\t\t\t\tlongname: normalized,\n\t\t\t\t\tattrs: {\n\t\t\t\t\t\tmode: 0o040755,\n\t\t\t\t\t\tuid: 0,\n\t\t\t\t\t\tgid: 0,\n\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t\tatime: 0,\n\t\t\t\t\t\tmtime: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tsftp.on(\"MKDIR\", (reqid: number, requestPath: string) => {\n\t\t\tconst targetPath = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tgetVfs().mkdir(targetPath, 0o755);\n\t\t\t\tvoid getVfs().flushMirror();\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\"RMDIR\", (reqid: number, requestPath: string) => {\n\t\t\tconst targetPath = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tgetVfs().remove(targetPath, { recursive: false });\n\t\t\t\tvoid getVfs().flushMirror();\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\"REMOVE\", (reqid: number, requestPath: string) => {\n\t\t\tconst targetPath = this.resolveRequestPath(requestPath, authUser);\n\n\t\t\t// Security: Confine to home directory\n\t\t\tif (!this.isPathWithinHome(targetPath, authUser)) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, path=${targetPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tgetVfs().remove(targetPath, { recursive: false });\n\t\t\t\tvoid getVfs().flushMirror();\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\"RENAME\", (reqid: number, oldPath: string, newPath: string) => {\n\t\t\tconst fromPath = this.resolveRequestPath(oldPath, authUser);\n\t\t\tconst toPath = this.resolveRequestPath(newPath, authUser);\n\n\t\t\t// Security: Confine both source and destination to home directory\n\t\t\tif (\n\t\t\t\t!this.isPathWithinHome(fromPath, authUser) ||\n\t\t\t\t!this.isPathWithinHome(toPath, authUser)\n\t\t\t) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[SFTP] Path traversal attempt blocked: user=${authUser}, from=${fromPath}, to=${toPath}`,\n\t\t\t\t);\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.PERMISSION_DENIED);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tgetVfs().move(fromPath, toPath);\n\t\t\t\tvoid getVfs().flushMirror();\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OK);\n\t\t\t} catch {\n\t\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.FAILURE);\n\t\t\t}\n\t\t});\n\n\t\tsftp.on(\"READLINK\", (reqid: number) => {\n\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OP_UNSUPPORTED);\n\t\t});\n\n\t\tsftp.on(\"SYMLINK\", (reqid: number) => {\n\t\t\tsftp.status(reqid, SFTP_STATUS_CODE.OP_UNSUPPORTED);\n\t\t});\n\n\t\tsftp.on(\"error\", (error: Error) => {\n\t\t\tconsole.error(`[SFTP] Stream error for user=${authUser}:`, error);\n\t\t});\n\n\t\tsftp.on(\"close\", () => {\n\t\t\tconsole.log(`[SFTP] Stream closed for user=${authUser}`);\n\t\t\tthis.handles.clear();\n\t\t});\n\n\t\tsftp.on(\"end\", () => {\n\t\t\tconsole.log(`[SFTP] end event for user=${authUser}`);\n\t\t\tthis.handles.clear();\n\t\t});\n\n\t\tsftp.on(\"END\", () => {\n\t\t\tconsole.log(`[SFTP] END event for user=${authUser}`);\n\t\t\tthis.handles.clear();\n\t\t});\n\t}\n}\n", "import { HoneyPot } from \"./Honeypot/index\";\nimport { SshClient } from \"./SSHClient/index\";\nimport { SftpMimic, SshMimic } from \"./SSHMimic/index\";\nimport VirtualFileSystem from \"./VirtualFileSystem/index\";\nimport { VirtualShell } from \"./VirtualShell/index\";\nimport { VirtualUserManager } from \"./VirtualUserManager/index\";\n\nexport type {\n\tAuditLogEntry,\n\tHoneyPotStats,\n} from \"./Honeypot/index\";\nexport type {\n\tCommandContext,\n\tCommandMode,\n\tCommandOutcome,\n\tCommandResult,\n\tNanoEditorSession,\n\tShellModule,\n\tSudoChallenge,\n} from \"./types/commands\";\nexport type { ExecStream, ShellStream } from \"./types/streams\";\nexport type {\n\tRemoveOptions,\n\tVfsBaseNode,\n\tVfsDirectoryNode,\n\tVfsFileNode,\n\tVfsNodeStats,\n\tVfsNodeType,\n\tVfsSnapshot,\n\tVfsSnapshotBaseNode,\n\tVfsSnapshotDirectoryNode,\n\tVfsSnapshotFileNode,\n\tVfsSnapshotNode,\n\tWriteFileOptions,\n} from \"./types/vfs\";\n\nexport {\n\tHoneyPot,\n\tSshClient,\n\tVirtualFileSystem,\n\tSftpMimic as VirtualSftpServer,\n\tVirtualShell,\n\tSshMimic as VirtualSshServer,\n\tVirtualUserManager,\n};\n\nexport {\n\tgetArg,\n\tgetFlag,\n\tifFlag,\n} from \"./commands/command-helpers\";\n", "import { VirtualSftpServer, VirtualShell, VirtualSshServer } from \".\";\n\nconst hostname = process.env.SSH_MIMIC_HOSTNAME ?? \"typescript-vm\";\nconst virtualShell = new VirtualShell(hostname);\n\nvirtualShell.addCommand(\"demo\", [], () => {\n\treturn {\n\t\tstdout: \"This is a demo command. It does nothing useful.\",\n\t\texitCode: 0,\n\t};\n});\n\nnew VirtualSshServer({\n\tport: 2222,\n\thostname,\n\tshell: virtualShell,\n})\n\t.start()\n\t.catch((error: unknown) => {\n\t\tconsole.error(\"Failed to start SSH Mimic:\", error);\n\t\tprocess.exit(1);\n\t});\n\nnew VirtualSftpServer({ port: 2223, hostname, shell: virtualShell })\n\t.start()\n\t.catch((error: unknown) => {\n\t\tconsole.error(\"Failed to start SFTP Mimic:\", error);\n\t\tprocess.exit(1);\n\t});\n\nprocess.on(\"uncaughtException\", (error) => {\n\tconsole.log(\"Oh my god, something terrible happened: \", error);\n});\n\nprocess.on(\"unhandledRejection\", (error, promise) => {\n\tconsole.log(\n\t\t\" Oh Lord! We forgot to handle a promise rejection here: \",\n\t\tpromise,\n\t);\n\tconsole.log(\" The error was: \", error);\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["adduserCommand", "init_adduser", "__esmMin", "authUser", "shell", "args", "username", "password", "toFlagList", "flags", "matchFlagToken", "token", "flag", "prefix", "collectPositionals", "args", "options", "boolFlags", "valueFlags", "positionals", "passthrough", "index", "arg", "consumed", "matched", "match", "ifFlag", "allFlags", "getFlag", "next", "getArg", "parseArgs", "flagsWithValues", "inlineFlag", "init_command_helpers", "__esmMin", "normalizeTerminalOutput", "text", "line", "resolvePath", "cwd", "inputPath", "isProtectedPath", "targetPath", "normalized", "PROTECTED_PREFIXES", "prefix", "assertPathAccess", "authUser", "operation", "stripUrlFilename", "url", "lastPart", "runHostCommand", "binary", "args", "resolve", "childProcess", "error", "stdout", "stderr", "stdoutStream", "stderrStream", "chunk", "errorCode", "code", "levenshtein", "a", "b", "dp", "i", "j", "cost", "resolveReadablePath", "vfs", "exactPath", "parent", "fileName", "siblings", "caseInsensitive", "name", "near", "joinListWithType", "items", "statAt", "childPath", "import_node_child_process", "path", "init_helpers", "__esmMin", "catCommand", "init_cat", "__esmMin", "init_command_helpers", "init_helpers", "authUser", "shell", "cwd", "args", "fileArg", "getArg", "target", "resolveReadablePath", "assertPathAccess", "cdCommand", "init_cd", "__esmMin", "init_helpers", "authUser", "shell", "cwd", "args", "mode", "target", "resolvePath", "assertPathAccess", "clearCommand", "init_clear", "__esmMin", "curlCommand", "init_curl", "__esmMin", "init_command_helpers", "init_helpers", "authUser", "cwd", "args", "shell", "flagsWithValues", "positionals", "parseArgs", "outputPath", "passthroughArgs", "result", "runHostCommand", "normalizeTerminalOutput", "target", "resolvePath", "assertPathAccess", "deluserCommand", "init_deluser", "__esmMin", "authUser", "args", "shell", "username", "getEnvVar", "name", "envVars", "setEnvVar", "value", "getAllEnvVars", "authUser", "setCommand", "init_set", "__esmMin", "init_command_helpers", "args", "key", "assignments", "index", "arg", "getArg", "varName", "varValue", "expandEnvVars", "input", "env", "_", "name", "echoCommand", "init_echo", "__esmMin", "init_command_helpers", "init_set", "args", "authUser", "stdin", "flags", "positionals", "parseArgs", "newline", "rawText", "getAllEnvVars", "text", "envCommand", "init_env", "__esmMin", "init_set", "authUser", "allVars", "getAllEnvVars", "key", "value", "exitCommand", "init_exit", "__esmMin", "exportCommand", "init_export", "__esmMin", "init_command_helpers", "init_set", "args", "index", "arg", "getArg", "varName", "varValue", "setEnvVar", "getEnvVar", "grepCommand", "init_grep", "__esmMin", "init_command_helpers", "init_helpers", "authUser", "shell", "cwd", "args", "stdin", "flags", "positionals", "parseArgs", "caseInsensitive", "invertMatch", "pattern", "files", "regex", "results", "lines", "line", "matches", "file", "target", "resolvePath", "assertPathAccess", "createHelpCommand", "getNames", "init_help", "__esmMin", "hostnameCommand", "init_hostname", "__esmMin", "hostname", "htopCommand", "init_htop", "__esmMin", "mode", "formatPermissions", "mode", "isDirectory", "fileType", "permissions", "bit", "symbol", "formatDate", "date", "lsCommand", "init_ls", "__esmMin", "init_command_helpers", "init_helpers", "authUser", "shell", "cwd", "args", "longFormat", "ifFlag", "targetArg", "getArg", "target", "resolvePath", "assertPathAccess", "items", "name", "childPath", "stat", "size", "joinListWithType", "p", "mkdirCommand", "init_mkdir", "__esmMin", "init_command_helpers", "init_helpers", "authUser", "shell", "cwd", "args", "index", "dir", "getArg", "target", "resolvePath", "assertPathAccess", "path", "nanoCommand", "init_nano", "__esmMin", "init_helpers", "authUser", "shell", "cwd", "args", "fileArg", "targetPath", "resolvePath", "assertPathAccess", "initialContent", "safeName", "tempPath", "formatUptime", "seconds", "totalMinutes", "days", "hours", "minutes", "parts", "colorBlock", "code", "buildColorBars", "normal", "bright", "colorizeLogoLine", "line", "index", "total", "start", "end", "ratio", "r", "g", "b", "colorizeDetailLine", "colonIndex", "applyHorizontalGradient", "title", "value", "text", "ansiRegex", "cleaned", "result", "i", "toMiB", "bytes", "readOsPrettyName", "data", "readFirstLine", "filePath", "resolveHostLabel", "fallback", "vendor", "product", "countDpkgPackages", "candidates", "countSnapPackages", "dirPath", "entry", "resolvePackagesLabel", "dpkgCount", "snapCount", "resolveCpuLabel", "cpus", "first", "ghz", "resolveShellLabel", "shell", "resolveDefaults", "info", "totalMem", "freeMem", "usedMem", "shellProps", "processUptime", "buildNeofetchOutput", "fields", "uptime", "colorBars", "distroLogo", "details", "width", "lines", "rawLeft", "right", "left", "coloredRight", "import_node_fs", "os", "path", "init_neofetch", "__esmMin", "neofetchCommand", "init_neofetch", "__esmMin", "init_command_helpers", "init_set", "args", "authUser", "hostname", "shell", "env", "getAllEnvVars", "ifFlag", "buildNeofetchOutput", "passwdCommand", "init_passwd", "__esmMin", "authUser", "args", "shell", "username", "password", "pwdCommand", "init_pwd", "__esmMin", "cwd", "rmCommand", "init_rm", "__esmMin", "init_command_helpers", "init_helpers", "authUser", "shell", "cwd", "args", "recursive", "ifFlag", "targets", "index", "target", "getArg", "resolvedTarget", "resolvePath", "assertPathAccess", "shCommand", "init_sh", "__esmMin", "init_command_helpers", "init_commands", "ctx", "args", "authUser", "hostname", "mode", "cwd", "getFlag", "script", "getArg", "scriptArgs", "lines", "line", "output", "exitCode", "command", "i", "arg", "result", "runCommand", "suCommand", "init_su", "__esmMin", "init_command_helpers", "authUser", "shell", "args", "users", "targetUser", "getArg", "parseSudoArgs", "args", "flags", "flagsWithValues", "positionals", "parseArgs", "loginShell", "targetUser", "commandLine", "sudoCommand", "init_sudo", "__esmMin", "init_command_helpers", "init_commands", "authUser", "hostname", "mode", "cwd", "shell", "effectiveUser", "prompt", "runCommand", "touchCommand", "init_touch", "__esmMin", "init_helpers", "authUser", "shell", "cwd", "args", "file", "target", "resolvePath", "assertPathAccess", "treeCommand", "init_tree", "__esmMin", "init_command_helpers", "init_helpers", "authUser", "shell", "cwd", "args", "target", "resolvePath", "getArg", "assertPathAccess", "unsetCommand", "init_unset", "__esmMin", "init_set", "args", "varName", "setEnvVar", "runHostWget", "args", "resolve", "childProcess", "error", "stdout", "stderr", "stdoutStream", "stderrStream", "chunk", "errorCode", "code", "import_node_child_process", "import_promises", "import_node_os", "import_node_path", "wgetCommand", "init_wget", "__esmMin", "init_command_helpers", "init_helpers", "authUser", "cwd", "shell", "flagsWithValues", "positionals", "parseArgs", "outputPath", "url", "ifFlag", "result", "normalizeTerminalOutput", "tempDir", "tempFile", "hostArgs", "runHostCommand", "content", "target", "resolvePath", "stripUrlFilename", "assertPathAccess", "formatLoginDate", "date", "weekday", "month", "day", "hh", "mm", "ss", "year", "init_loginFormat", "__esmMin", "whoCommand", "init_who", "__esmMin", "init_loginFormat", "shell", "session", "loginAt", "displayDate", "formatLoginDate", "whoamiCommand", "init_whoami", "__esmMin", "authUser", "shellParser_exports", "__export", "parseShellPipeline", "rawInput", "trimmed", "commands", "tokenized", "tokenizePipeline", "pipeTokens", "token", "cmd", "parseCommandWithRedirections", "input", "tokens", "current", "inQuotes", "quoteChar", "i", "ch", "parts", "tokenizeCommand", "cmdParts", "inputFile", "outputFile", "appendOutput", "part", "name", "args", "next", "init_shellParser", "__esmMin", "executor_exports", "__export", "executePipeline", "pipeline", "authUser", "hostname", "mode", "cwd", "shell", "executeSingleCommandWithRedirections", "executePipelineChain", "cmd", "stdin", "inputPath", "resolvePath", "rawInput", "result", "runCommand", "outputPath", "output", "existing", "commands", "currentOutput", "exitCode", "i", "init_executor", "__esmMin", "init_commands", "init_helpers", "buildCache", "mod", "getCommandModules", "commandRegistry", "alias", "cachedCommandNames", "BASE_COMMANDS", "customCommands", "helpCommand", "registerCommand", "module", "normalized", "names", "name", "createCustomCommand", "params", "run", "getCommandNames", "resolveModule", "splitArgsRespectingQuotes", "input", "tokens", "current", "inQuotes", "quoteChar", "i", "ch", "prev", "parseInput", "rawInput", "parts", "runCommand", "authUser", "hostname", "mode", "cwd", "shell", "stdin", "trimmed", "parseShellPipeline", "executePipeline", "pipeline", "error", "commandName", "args", "init_commands", "__esmMin", "init_adduser", "init_cat", "init_cd", "init_clear", "init_curl", "init_deluser", "init_echo", "init_env", "init_exit", "init_export", "init_grep", "init_help", "init_hostname", "init_htop", "init_ls", "init_mkdir", "init_nano", "init_neofetch", "init_passwd", "init_pwd", "init_rm", "init_set", "init_sh", "init_su", "init_sudo", "init_touch", "init_tree", "init_unset", "init_wget", "init_who", "init_whoami", "pwdCommand", "whoamiCommand", "whoCommand", "hostnameCommand", "lsCommand", "cdCommand", "catCommand", "echoCommand", "mkdirCommand", "touchCommand", "rmCommand", "treeCommand", "nanoCommand", "neofetchCommand", "htopCommand", "adduserCommand", "passwdCommand", "deluserCommand", "sudoCommand", "suCommand", "curlCommand", "envCommand", "wgetCommand", "grepCommand", "exportCommand", "setCommand", "unsetCommand", "shCommand", "clearCommand", "exitCommand", "createHelpCommand", "cmd", "require_errors", "__commonJSMin", "exports", "module", "msg", "e", "require_types", "__commonJSMin", "exports", "module", "require_safer", "__commonJSMin", "exports", "module", "buffer", "Buffer", "safer", "key", "Safer", "value", "encodingOrOffset", "length", "size", "fill", "encoding", "buf", "require_reader", "__commonJSMin", "exports", "module", "assert", "Buffer", "ASN1", "errors", "newInvalidAsn1Error", "Reader", "data", "peek", "b", "offset", "lenB", "i", "tag", "seq", "o", "retbuf", "str", "values", "value", "byte", "fb", "require_writer", "__commonJSMin", "exports", "module", "assert", "Buffer", "ASN1", "errors", "newInvalidAsn1Error", "DEFAULT_OPTS", "merge", "from", "to", "keys", "key", "value", "Writer", "options", "b", "i", "tag", "sz", "s", "len", "buf", "strings", "self", "encodeOctet", "bytes", "octet", "tmp", "seq", "start", "shift", "require_ber", "__commonJSMin", "exports", "module", "errors", "types", "Reader", "Writer", "t", "e", "require_lib", "__commonJSMin", "exports", "module", "Ber", "require_nacl_fast", "__commonJSMin", "exports", "module", "nacl", "gf", "init", "i", "r", "randombytes", "_0", "_9", "gf0", "gf1", "_121665", "D", "D2", "X", "Y", "I", "ts64", "x", "h", "l", "vn", "xi", "y", "yi", "n", "d", "crypto_verify_16", "crypto_verify_32", "core_salsa20", "o", "p", "k", "c", "j0", "j1", "j2", "j3", "j4", "j5", "j6", "j7", "j8", "j9", "j10", "j11", "j12", "j13", "j14", "j15", "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "u", "core_hsalsa20", "crypto_core_salsa20", "out", "inp", "crypto_core_hsalsa20", "sigma", "crypto_stream_salsa20_xor", "cpos", "m", "mpos", "b", "z", "crypto_stream_salsa20", "crypto_stream", "s", "sn", "crypto_stream_xor", "poly1305", "key", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", "bytes", "hibit", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7", "h8", "h9", "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "mac", "macpos", "g", "mask", "f", "want", "crypto_onetimeauth", "outpos", "crypto_onetimeauth_verify", "hpos", "crypto_secretbox", "crypto_secretbox_open", "set25519", "a", "car25519", "v", "sel25519", "q", "t", "pack25519", "j", "neq25519", "par25519", "unpack25519", "A", "Z", "M", "t8", "t9", "t10", "t11", "t12", "t13", "t14", "t15", "t16", "t17", "t18", "t19", "t20", "t21", "t22", "t23", "t24", "t25", "t26", "t27", "t28", "t29", "t30", "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15", "S", "inv25519", "pow2523", "crypto_scalarmult", "e", "x32", "x16", "crypto_scalarmult_base", "crypto_box_keypair", "crypto_box_beforenm", "crypto_box_afternm", "crypto_box_open_afternm", "crypto_box", "crypto_box_open", "K", "crypto_hashblocks_hl", "hh", "hl", "wh", "wl", "bh0", "bh1", "bh2", "bh3", "bh4", "bh5", "bh6", "bh7", "bl0", "bl1", "bl2", "bl3", "bl4", "bl5", "bl6", "bl7", "th", "tl", "ah0", "ah1", "ah2", "ah3", "ah4", "ah5", "ah6", "ah7", "al0", "al1", "al2", "al3", "al4", "al5", "al6", "al7", "pos", "crypto_hash", "add", "cswap", "pack", "tx", "ty", "zi", "scalarmult", "scalarbase", "crypto_sign_keypair", "pk", "sk", "seeded", "L", "modL", "carry", "reduce", "crypto_sign", "sm", "smlen", "unpackneg", "chk", "num", "den", "den2", "den4", "den6", "crypto_sign_open", "mlen", "crypto_secretbox_KEYBYTES", "crypto_secretbox_NONCEBYTES", "crypto_secretbox_ZEROBYTES", "crypto_secretbox_BOXZEROBYTES", "crypto_scalarmult_BYTES", "crypto_scalarmult_SCALARBYTES", "crypto_box_PUBLICKEYBYTES", "crypto_box_SECRETKEYBYTES", "crypto_box_BEFORENMBYTES", "crypto_box_NONCEBYTES", "crypto_box_ZEROBYTES", "crypto_box_BOXZEROBYTES", "crypto_sign_BYTES", "crypto_sign_PUBLICKEYBYTES", "crypto_sign_SECRETKEYBYTES", "crypto_sign_SEEDBYTES", "crypto_hash_BYTES", "checkLengths", "checkBoxLengths", "checkArrayTypes", "cleanup", "arr", "msg", "nonce", "box", "publicKey", "secretKey", "signedMsg", "tmp", "sig", "seed", "fn", "crypto", "QUOTA", "require_bcrypt_pbkdf", "__commonJSMin", "exports", "module", "crypto_hash_sha512", "BLF_J", "Blowfish", "F", "S", "x8", "i", "x", "t", "stream2word", "data", "databytes", "temp", "key", "keybytes", "d", "k", "d8", "blocks", "BCRYPT_BLOCKS", "BCRYPT_HASHSIZE", "bcrypt_hash", "sha2pass", "sha2salt", "out", "state", "cdata", "ciphertext", "bcrypt_pbkdf", "pass", "passlen", "salt", "saltlen", "keylen", "rounds", "tmpout", "countsalt", "j", "amt", "stride", "dest", "count", "origkeylen", "require_constants", "__commonJSMin", "exports", "module", "crypto", "cpuInfo", "bindingAvailable", "CIPHER_INFO", "MAC_INFO", "eddsaSupported", "key", "data", "sig", "verified", "curve25519Supported", "DEFAULT_KEX", "SUPPORTED_KEX", "DEFAULT_SERVER_HOST_KEY", "SUPPORTED_SERVER_HOST_KEY", "canUseCipher", "ciphers", "name", "DEFAULT_CIPHER", "SUPPORTED_CIPHER", "canUseMAC", "hashes", "DEFAULT_MAC", "SUPPORTED_MAC", "DEFAULT_COMPRESSION", "SUPPORTED_COMPRESSION", "COMPAT", "cur", "val", "obj", "value", "require_utils", "__commonJSMin", "exports", "module", "Ber", "DISCONNECT_REASON", "FastBuffer", "TypedArrayFill", "readUInt32BE", "buf", "offset", "bufferCopy", "src", "dest", "srcStart", "srcEnd", "destStart", "nb", "destLeft", "bufferSlice", "start", "end", "makeBufferParser", "pos", "buffer", "self", "behavior", "n", "len", "list", "maxLen", "makeError", "msg", "level", "fatal", "err", "writeUInt32BE", "value", "utilBufferParser", "protocol", "reason", "left", "sig", "type", "asnWriter", "s", "rNew", "sNew", "r", "signature", "keyType", "asnReader", "rOffset", "sOffset", "newSig", "proto", "packet", "bypass", "require_poly1305", "__commonJSMin", "exports", "module", "createPoly1305", "_scriptDir", "b", "q", "r", "a", "c", "u", "w", "x", "y", "z", "B", "C", "D", "E", "F", "G", "d", "H", "assert", "e", "f", "l", "ba", "I", "J", "noExitRuntime", "K", "L", "M", "N", "ca", "g", "p", "n", "O", "k", "h", "P", "v", "m", "oa", "Q", "A", "t", "aa", "da", "ea", "fa", "ha", "ia", "R", "ja", "ka", "la", "ma", "T", "U", "V", "W", "na", "pa", "qa", "X", "ra", "sa", "Y", "ta", "Z", "require_crypto", "__commonJSMin", "exports", "module", "createCipheriv", "createDecipheriv", "createHmac", "randomFillSync", "timingSafeEqual", "readUInt32BE", "writeUInt32BE", "FastBuffer", "MAX_SEQNO", "EMPTY_BUFFER", "BUF_INT", "DISCARD_CACHE", "MAX_PACKET_SIZE", "binding", "AESGCMCipher", "ChaChaPolyCipher", "GenericCipher", "AESGCMDecipher", "ChaChaPolyDecipher", "GenericDecipher", "CIPHER_STREAM", "CIPHER_INFO", "info", "sslName", "blockLen", "keyLen", "ivLen", "authLen", "discardLen", "flags", "MAC_INFO", "len", "actualLen", "isETM", "NullCipher", "seqno", "onWrite", "payloadLen", "pktLen", "padLen", "packet", "POLY1305_ZEROS", "POLY1305_OUT_COMPUTE", "POLY1305_WASM_MODULE", "POLY1305_RESULT_MALLOC", "poly1305_auth", "ChaChaPolyCipherNative", "config", "enc", "polyKey", "pktLenEnc", "payloadEnc", "mac", "ChaChaPolyCipherBinding", "AESGCMCipherNative", "cipher", "lenData", "encrypted", "final", "tag", "ivIncrement", "AESGCMCipherBinding", "GenericCipherNative", "discard", "lenBytes", "digest", "GenericCipherBinding", "NullDecipher", "onPayload", "data", "p", "dataLen", "nb", "chunk", "payload", "ret", "ChaChaPolyDecipherNative", "dec", "decLenBytes", "ChaChaPolyDecipherBinding", "AESGCMDecipherNative", "intToBytes", "decrypted", "AESGCMDecipherBinding", "GenericDecipherNative", "need", "calculated", "timingSafeEquals", "GenericDecipherBinding", "iv", "n", "a", "b", "createCipher", "outbound", "forceNative", "createDecipher", "inbound", "resolve", "reject", "ex", "require_keyParser", "__commonJSMin", "exports", "module", "createDecipheriv", "createECDH", "createHash", "createHmac", "createSign", "createVerify", "getCiphers", "sign_", "verify_", "supportedOpenSSLCiphers", "Ber", "bcrypt_pbkdf", "CIPHER_INFO", "eddsaSupported", "SUPPORTED_CIPHER", "bufferSlice", "makeBufferParser", "readString", "readUInt32BE", "writeUInt32BE", "SYM_HASH_ALGO", "SYM_PRIV_PEM", "SYM_PUB_PEM", "SYM_PUB_SSH", "SYM_DECRYPTED", "CIPHER_INFO_OPENSSL", "keys", "i", "cipherName", "binaryKeyParser", "makePEM", "type", "data", "formatted", "combineBuffers", "buf1", "buf2", "result", "skipFields", "buf", "nfields", "bufLen", "pos", "left", "len", "genOpenSSLRSAPub", "e", "asnWriter", "genOpenSSHRSAPub", "publicKey", "genOpenSSLRSAPriv", "genRSAASN1Buf", "n", "d", "p", "q", "dmp1", "dmq1", "iqmp", "bigIntFromBuffer", "bigIntToBuffer", "bn", "hex", "sigbit", "bn_d", "genOpenSSLDSAPub", "g", "y", "genOpenSSHDSAPub", "genOpenSSLDSAPriv", "x", "genOpenSSLEdPub", "pub", "genOpenSSHEdPub", "genOpenSSLEdPriv", "priv", "genOpenSSLECDSAPub", "oid", "Q", "genOpenSSHECDSAPub", "curveName", "genOpenSSLECDSAPriv", "genOpenSSLECDSAPubFromPriv", "tempECDH", "BaseKey", "algo", "pem", "ex", "signature", "verifier", "key", "parsed", "parseKey", "OpenSSH_Private", "comment", "privPEM", "pubPEM", "pubSSH", "decrypted", "parseOpenSSHPrivKeys", "nkeys", "check1", "check2", "edpub", "edpriv", "ecpub", "ecpriv", "privComment", "cnt", "regexp", "str", "passphrase", "m", "ret", "magic", "kdfName", "encInfo", "cipherKey", "cipherIV", "kdfOptions", "salt", "rounds", "gen", "keyCount", "pubData", "privBlob", "options", "decipher", "OpenSSH_Old_Private", "headers", "header", "sepIdx", "val", "ivSlice", "reader", "errMsg", "ecSSLName", "ecPriv", "ecOID", "offset", "pubBlob", "PPK_Private", "EMPTY_PASSPHRASE", "PPK_IV", "PPK_PP1", "PPK_PP2", "encrypted", "mac", "typeLen", "cipherNameLen", "commentLen", "pubLen", "privLen", "macData", "OpenSSH_Public", "fullType", "baseType", "parseDER", "RFC4716_Public", "RE_DATA", "RE_HEADER", "RE_HEADER_ENDS", "body", "dataStart", "headerName", "headerValue", "isSupportedKeyType", "isParsedKey", "origBuffer", "require_agent", "__commonJSMin", "exports", "module", "Socket", "Duplex", "resolve", "readFile", "execFile", "spawn", "isParsedKey", "parseKey", "makeBufferParser", "readUInt32BE", "writeUInt32BE", "writeUInt32LE", "once", "cb", "called", "args", "concat", "buf1", "buf2", "combined", "noop", "EMPTY_BUF", "binaryParser", "BaseAgent", "pubKey", "data", "options", "OpenSSHAgent", "socketPath", "sock", "onFail", "err", "stream", "protocol", "AgentProtocol", "keys", "sig", "PageantAgent", "EXEPATH", "ERROR", "destroy", "PageantSocket", "n", "encoding", "newBuffer", "len", "error", "proc", "code", "CygwinAgent", "RE_CYGWIN_SOCK", "triedCygpath", "readCygsocket", "stdout", "stderr", "m", "state", "bc", "isRetrying", "inBuf", "credsBuf", "port", "secret", "secretBuf", "i", "j", "tryConnect", "_onconnect", "_ondata", "WINDOWS_PIPE_REGEX", "createAgent", "path", "processResponses", "ret", "SYM_REQS", "nextResponse", "SYM_RESP", "SYM_TYPE", "SYM_CTX", "AgentInboundRequest", "type", "ctx", "respond", "req", "cleanup", "SYM_BUFFER", "SYM_MODE", "reqs", "SYM_ENDED", "SYM_CLOSED", "onClose", "onEnd", "SYM_MSGLEN", "isClient", "buffer", "bufferLen", "p", "msgType", "numKeys", "comment", "signature", "flagsVal", "flags", "keyLen", "dataLen", "buf", "totalKeysLen", "newKeys", "entry", "sigFormat", "sigFormatLen", "SYM_AGENT", "SYM_AGENT_KEYS", "SYM_AGENT_KEYS_IDX", "SYM_AGENT_CBS", "AgentContext", "agent", "isAgent", "doCbs", "cbs", "key", "val", "require_zlib", "__commonJSMin", "exports", "module", "kMaxLength", "createInflate", "DEFLATE", "INFLATE", "Z_DEFAULT_CHUNK", "Z_DEFAULT_COMPRESSION", "Z_DEFAULT_MEMLEVEL", "Z_DEFAULT_STRATEGY", "Z_DEFAULT_WINDOWBITS", "Z_PARTIAL_FLUSH", "ZlibHandle", "processCallback", "zlibOnError", "message", "errno", "code", "self", "error", "_close", "engine", "Zlib", "mode", "windowBits", "level", "memLevel", "strategy", "dictionary", "chunk", "retChunks", "handle", "availInBefore", "availOutBefore", "inOff", "availOutAfter", "availInAfter", "buffers", "nread", "state", "buffer", "offset", "chunkSize", "inDelta", "have", "out", "output", "i", "p", "buf", "ZlibPacketWriter", "protocol", "payloadSize", "force", "payload", "packet", "PacketWriter", "ZlibPacketReader", "data", "PacketReader", "require_handlers_misc", "__commonJSMin", "exports", "module", "bufferSlice", "bufferParser", "doFatalError", "sigSSHToASN1", "writeUInt32BE", "CHANNEL_OPEN_FAILURE", "COMPAT", "MESSAGE", "TERMINAL_MODE", "parseKey", "TERMINAL_MODE_BY_VALUE", "obj", "key", "value", "self", "payload", "reason", "desc", "lang", "handler", "seqno", "display", "msg", "name", "numExts", "exts", "i", "data", "algs", "user", "service", "method", "methodData", "methodDesc", "isChange", "newPassword", "hasSig", "keyAlgo", "realKeyAlgo", "hashAlgo", "blobEnd", "signature", "sessionID", "blob", "localHostname", "localUsername", "authMethods", "partialSuccess", "prompt", "instructions", "numPrompts", "prompts", "echo", "numResponses", "responses", "response", "wantReply", "bindAddr", "bindPort", "socketPath", "keyRaw", "type", "sender", "window", "packetSize", "channelInfo", "destIP", "destPort", "srcIP", "srcPort", "recipient", "description", "bytesToAdd", "signal", "coreDumped", "num", "errorMessage", "term", "cols", "rows", "width", "height", "modesBinary", "modes", "opcode", "single", "protocol", "cookie", "screen", "require_handlers", "__commonJSMin", "exports", "module", "MESSAGE_HANDLERS", "handlers", "type", "handler", "require_kex", "__commonJSMin", "exports", "module", "createDiffieHellman", "createDiffieHellmanGroup", "createECDH", "createHash", "createPublicKey", "diffieHellman", "generateKeyPairSync", "randomFillSync", "Ber", "COMPAT", "curve25519Supported", "DEFAULT_KEX", "DEFAULT_SERVER_HOST_KEY", "DEFAULT_CIPHER", "DEFAULT_MAC", "DEFAULT_COMPRESSION", "DISCONNECT_REASON", "MESSAGE", "CIPHER_INFO", "createCipher", "createDecipher", "MAC_INFO", "parseDERKey", "bufferFill", "bufferParser", "convertSignature", "doFatalError", "FastBuffer", "sigSSHToASN1", "writeUInt32BE", "PacketReader", "PacketWriter", "ZlibPacketReader", "ZlibPacketWriter", "MESSAGE_HANDLERS", "GEX_MIN_BITS", "GEX_MAX_BITS", "EMPTY_BUFFER", "kexinit", "self", "payload", "entry", "kex", "found", "i", "len", "newKexBuf", "all", "rest", "p", "packet", "handleKexInit", "init", "pos", "firstFollows", "local", "remote", "localKex", "clientList", "serverList", "debug", "remoteExtInfoEnabled", "localSrvHostKey", "localCSCipher", "localSCCipher", "localCSMAC", "localSCMAC", "localCSCompress", "localSCCompress", "onKEXPayload", "createKeyExchange", "convertToMpint", "buf", "idx", "length", "newBuf", "KeyExchange", "negotiated", "protocol", "remoteKexinit", "scOnly", "isServer", "pubKey", "secret", "hash", "hashString", "serverPublicHostKey", "params", "num", "serverPublicKey", "exchangeHash", "hashAlgo", "signature", "sigType", "sigTypeLen", "sigLen", "type", "sigValue", "parsedHostKey", "name", "hostKey", "verified", "trySendNEWKEYS", "hsCipherConfig", "hsWrite", "completeHandshake", "partial", "newSecret", "csCipherInfo", "scCipherInfo", "csIV", "generateKEXVal", "scIV", "csKey", "scKey", "csMacInfo", "csMacKey", "scMacInfo", "scMacKey", "config", "rw", "key", "newKey", "otherPublicKey", "ex", "dhData", "hostPubKey", "sig", "hostPubKeyType", "checked", "ret", "permitted", "Curve25519Exchange", "hashName", "args", "asnWriter", "ECDHExchange", "curveName", "DHGroupExchange", "dhEstimate", "prime", "generator", "gen", "pubkey", "DHExchange", "groupName", "kexType", "KexInit", "KEX_PROPERTY_NAMES", "obj", "lists", "totalSize", "prop", "base", "val", "desc", "parent", "allPos", "data", "offset", "src", "LEN", "sessionID", "char", "digest", "chunk", "extended", "state", "neg", "csCipher", "scCipher", "bits", "require_package", "__commonJSMin", "exports", "module", "require_Protocol", "__commonJSMin", "exports", "module", "inspect", "bindingAvailable", "NullCipher", "NullDecipher", "COMPAT_CHECKS", "DISCONNECT_REASON", "eddsaSupported", "MESSAGE", "SIGNALS", "TERMINAL_MODE", "DEFAULT_KEXINIT_CLIENT", "DEFAULT_KEXINIT_SERVER", "KexInit", "kexinit", "onKEXPayload", "parseKey", "MESSAGE_HANDLERS", "bufferCopy", "bufferFill", "bufferSlice", "convertSignature", "sendPacket", "writeUInt32BE", "PacketReader", "PacketWriter", "ZlibPacketReader", "ZlibPacketWriter", "MODULE_VER", "VALID_DISCONNECT_REASONS", "IDENT_RAW", "IDENT", "MAX_LINE_LEN", "MAX_LINES", "PING_PAYLOAD", "NO_TERMINAL_MODES_BUFFER", "noop", "Protocol", "config", "onWrite", "data", "onError", "err", "debug", "msg", "onHeader", "args", "onPacket", "onHandshakeComplete", "firstHandshake", "oldQueue", "i", "finalized", "packet", "sendExtInfo", "messageHandlers", "onPayload", "greeting", "offer", "parseHeader", "sentIdent", "fullIdent", "reason", "chunk", "len", "p", "end", "chan", "amount", "isBuffer", "dataLen", "type", "remote", "local", "initWindow", "maxPacket", "desc", "descLen", "name", "nameLen", "username", "password", "newPassword", "userLen", "passLen", "newPassLen", "pubKey", "keyAlgo", "cbSign", "keyType", "algoLen", "pubKeyLen", "sessionID", "sesLen", "payloadLen", "signature", "sigLen", "hostname", "userlocal", "hostnameLen", "userlocalLen", "reqDataLen", "responses", "responsesTotalLen", "responseLens", "bindAddr", "bindPort", "wantReply", "addrLen", "socketPath", "socketPathLen", "cfg", "srcLen", "dstLen", "pathLen", "rows", "cols", "height", "width", "term", "modes", "modesToBytes", "termLen", "modesLen", "cmd", "isBuf", "cmdLen", "signal", "origSignal", "signalLen", "key", "val", "keyLen", "valLen", "protocol", "cookie", "isBufProto", "protoLen", "isBufCookie", "cookieLen", "keys", "keysTotal", "publicKeys", "publicKey", "buf", "svcName", "svcNameLen", "banner", "bannerLen", "boundAddrLen", "remoteAddrLen", "status", "coreDumped", "msgLen", "authMethods", "isPartial", "methods", "methodsLen", "keyAlgoLen", "prompt", "promptLen", "instructions", "prompts", "promptsLen", "instrLen", "RE_IDENT", "chunkOffset", "op", "start", "needNL", "lineLen", "lines", "ch", "full", "identRaw", "m", "header", "getCompatFlags", "parsePacket", "payload", "handler", "software", "flags", "rule", "bytes", "b", "opcode", "proto", "serverSigAlgs", "algsLen", "require_node_fs_compat", "__commonJSMin", "exports", "assert", "inspect", "addNumericalSeparator", "val", "res", "i", "start", "oneOf", "expected", "thing", "len", "ERR_INTERNAL_ASSERTION", "message", "suffix", "MAX_32BIT_INT", "MAX_32BIT_BIGINT", "ERR_OUT_OF_RANGE", "str", "range", "input", "replaceDefaultBoolean", "msg", "received", "ERR_INVALID_ARG_TYPE", "_ERR_INVALID_ARG_TYPE", "name", "actual", "determiner", "type", "value", "require_SFTP", "__commonJSMin", "exports", "module", "EventEmitter", "fs", "constants", "ReadableStream", "WritableStream", "inherits", "isDate", "FastBuffer", "bufferCopy", "bufferSlice", "makeBufferParser", "writeUInt32BE", "ATTR", "ATTRS_BUF", "STATUS_CODE", "VALID_STATUS_CODES", "STATUS_CODE_STR", "REQUEST", "RESPONSE", "OPEN_MODE", "PKT_RW_OVERHEAD", "MAX_REQID", "CLIENT_VERSION_BUFFER", "SERVER_VERSION_BUFFER", "RE_OPENSSH", "OPENSSH_MAX_PKT_LEN", "bufferParser", "fakeStderr", "data", "noop", "SFTP", "client", "chanInfo", "cfg", "remoteIdentRaw", "cleanupRequests", "p", "nb", "doFatalSFTPError", "max", "type", "payload", "handler", "SERVER_HANDLERS", "CLIENT_HANDLERS", "sendOrBuffer", "path", "options", "ReadStream", "WriteStream", "flags_", "attrs", "cb", "flags", "stringToFlags", "attrsFlags", "attrsLen", "attrsToBytes", "pathLen", "buf", "reqid", "isBuffered", "handle", "handleLen", "off", "len", "position", "read_", "maxDataLen", "overflow", "origPosition", "out", "i", "err", "isSent", "how", "remotePath", "localPath", "opts", "fastXfer", "callback_", "callback", "encoding", "size", "buffer", "buffers", "pos", "bytesRead", "flag", "read", "afterRead", "er", "nbytes", "eof", "close", "handle_", "tryStat", "st", "er_", "st_", "openErr", "writeAll", "filename", "fnameLen", "oldPath", "newPath", "oldLen", "newLen", "where", "doFilter", "entries", "e", "reread", "list", "atime", "mtime", "toUnixTimestamp", "uid", "gid", "mode", "names", "targetPath", "linkPath", "linkLen", "targetLen", "ext", "which", "status", "srcHandle", "srcOffset", "dstHandle", "dstOffset", "username", "usernameLen", "uids", "gids", "val", "code", "message", "msgLen", "isBuffer", "isUTF8", "dataLen", "count", "namesLen", "nameAttrs", "name", "longname", "bytes", "attr", "tryCreateBuffer", "ex", "self", "req_", "req", "src", "dst", "srcPath", "dstPath", "concurrency", "chunkSize", "onstep", "fileSize", "modeNum", "fsize", "pdst", "total", "hadError", "readbuf", "bufsize", "onerror", "left", "cbfinal", "sourceHandle", "err_", "attrs_", "destHandle", "tryAgain", "startReads", "onread", "dstpos", "datapos", "origChunkLen", "writeCb", "singleRead", "chunk", "makeCb", "psrc", "reads", "sftp", "offset", "length", "writeErr", "written", "Stats", "initial", "time", "stringFlagMap", "str", "flagsToString", "stringFlagMapKeys", "key", "readAttrs", "biOpt", "extended", "ret", "tryWritePayload", "outgoing", "drainBuffer", "actualLen", "msg", "noDebug", "keys", "reqs", "requestLimits", "extensions", "version", "extName", "extData", "limits", "reqID", "errorCode", "errorMsg", "jsonMsg", "stats", "usernameCount", "usernames", "groupnameCount", "groupnames", "pflags", "handled", "ERR_INVALID_ARG_TYPE", "ERR_OUT_OF_RANGE", "validateNumber", "kMinPoolSpace", "pool", "poolFragments", "allocNewPool", "poolSize", "checkPosition", "roundUpToMultipleOf8", "thisPool", "toRead", "start", "b", "alignedEnd", "alignedStart", "closeStream", "stream", "onclose", "writesLeft", "onwrite", "require_Channel", "__commonJSMin", "exports", "module", "DuplexStream", "ReadableStream", "WritableStream", "STDERR", "bufferSlice", "PACKET_SIZE", "MAX_WINDOW", "WINDOW_THRESHOLD", "ClientStderr", "channel", "streamOpts", "n", "windowAdjust", "ServerStderr", "data", "encoding", "cb", "protocol", "outgoing", "packetSize", "id", "window", "len", "p", "sliceLen", "Channel", "client", "info", "opts", "server", "onFinish", "onEnd", "rows", "cols", "height", "width", "signalName", "statusOrSignal", "coreDumped", "msg", "self", "amt", "require_utils", "__commonJSMin", "exports", "module", "SFTP", "MAX_CHANNEL", "onChannelOpenFailure", "self", "recipient", "info", "cb", "err", "onCHANNEL_CLOSE", "channel", "dead", "readState", "writeState", "chanCallbacks", "i", "doClose", "exit", "errReadState", "ChannelManager", "client", "val", "id", "channels", "chanIDs", "isRegExp", "toString", "generateAlgorithmList", "algoList", "defaultList", "supportedList", "keys", "list", "key", "j", "append", "k", "algo", "prepend", "search", "idx", "stream", "require_client", "__commonJSMin", "exports", "module", "createHash", "getHashes", "randomFillSync", "Socket", "dnsLookup", "EventEmitter", "HASHES", "COMPAT", "STDERR", "CHANNEL_OPEN_FAILURE", "DEFAULT_CIPHER", "DEFAULT_COMPRESSION", "DEFAULT_KEX", "DEFAULT_MAC", "DEFAULT_SERVER_HOST_KEY", "DISCONNECT_REASON", "DISCONNECT_REASON_BY_VALUE", "SUPPORTED_CIPHER", "SUPPORTED_COMPRESSION", "SUPPORTED_KEX", "SUPPORTED_MAC", "SUPPORTED_SERVER_HOST_KEY", "cryptoInit", "Protocol", "parseKey", "SFTP", "bufferCopy", "makeBufferParser", "makeError", "readUInt32BE", "sigSSHToASN1", "writeUInt32BE", "AgentContext", "createAgent", "isAgent", "Channel", "MAX_WINDOW", "PACKET_SIZE", "windowAdjust", "WINDOW_THRESHOLD", "ChannelManager", "generateAlgorithmList", "isWritable", "onChannelOpenFailure", "onCHANNEL_CLOSE", "bufferParser", "sigParser", "RE_OPENSSH", "noop", "err", "Client", "cfg", "algorithms", "allOfferDefaults", "authHandler", "debug", "callbacks", "privateKey", "hostVerifier", "hashCb", "hashAlgo", "key", "verify", "ret", "sock", "ready", "sawHeader", "DEBUG_HANDLER", "p", "display", "msg", "serverSigAlgs", "proto", "data", "header", "negotiated", "reason", "desc", "name", "tryNextAuth", "exts", "ext", "resetKA", "authMethods", "partialSuccess", "curAuth", "oldKeyAlgo", "keyAlgo", "buf", "cb", "signature", "pos", "tryNextAgentKey", "curPartial", "curAuthsLeft", "prompt", "newPassword", "opts", "signed", "instructions", "prompts", "answers", "wantReply", "hostKeysProve", "keys", "info", "onCHANNEL_OPEN", "channel", "isSFTP", "chanInfo", "instance", "recipient", "description", "type", "amount", "exit", "kainterval", "kacountmax", "kacount", "katimer", "sendKA", "onDone", "called", "wasConnected", "onConnect", "ex", "callbacks_", "i", "authsAllowed", "makeSimpleAuthHandler", "hasSentAuth", "doNextAuth", "nextAuth", "skipAuth", "username", "args", "password", "localHostname", "localUsername", "agent", "getKeyAlgos", "auth", "startTimeout", "host", "forceIPv4", "forceIPv6", "doConnect", "address", "family", "error", "cmd", "extraOpts", "openChannel", "chan", "todo", "reqCb", "reqAgentFwd", "reqEnv", "reqPty", "reqX11", "reqExec", "wndopts", "reqShell", "reqSubsystem", "stream", "bindAddr", "bindPort", "had_err", "realPort", "srcIP", "srcPort", "dstIP", "dstPort", "socketPath", "env", "sftp", "reqSubsystemCb", "sftp_", "removeListeners", "onReady", "onError", "onExit", "code", "signal", "noDelay", "self", "initWindow", "maxPacket", "wrapper", "localChan", "screen", "randomCookie", "rows", "cols", "width", "height", "term", "modes", "val", "accept", "reject", "reserveChannel", "upstream", "buffer", "authList", "a", "authsLeft", "client", "keys_", "parsed", "keyIdx", "keyPublic", "sigEntry", "value", "algo", "sessionID", "verifyData", "require_http_agents", "__commonJSMin", "exports", "HttpAgent", "HttpsAgent", "tlsConnect", "Client", "ctor", "SSHAgent", "connectCfg", "agentOptions", "options", "cb", "srcIP", "srcPort", "dstIP", "dstPort", "client", "triedForward", "err", "stream", "decorateStream", "noop", "wrapped", "onClose", "called", "require_server", "__commonJSMin", "exports", "module", "netServer", "EventEmitter", "listenerCount", "CHANNEL_OPEN_FAILURE", "DEFAULT_CIPHER", "DEFAULT_COMPRESSION", "DEFAULT_KEX", "DEFAULT_MAC", "DEFAULT_SERVER_HOST_KEY", "DISCONNECT_REASON", "DISCONNECT_REASON_BY_VALUE", "SUPPORTED_CIPHER", "SUPPORTED_COMPRESSION", "SUPPORTED_KEX", "SUPPORTED_MAC", "SUPPORTED_SERVER_HOST_KEY", "cryptoInit", "KexInit", "parseKey", "Protocol", "SFTP", "writeUInt32BE", "Channel", "MAX_WINDOW", "PACKET_SIZE", "windowAdjust", "WINDOW_THRESHOLD", "ChannelManager", "generateAlgorithmList", "isWritable", "onChannelOpenFailure", "onCHANNEL_CLOSE", "MAX_PENDING_AUTHS", "AuthContext", "protocol", "username", "service", "method", "cb", "allowed", "methodsLeft", "isPartial", "KeyboardAuthContext", "submethods", "responses", "callback", "prompts", "title", "instructions", "i", "PKAuthContext", "pkInfo", "HostbasedAuthContext", "PwdAuthContext", "password", "prompt", "Session", "client", "info", "localChan", "Server", "cfg", "listener", "hostKeys", "hostKeyAlgoOrder", "hostKeys_", "cfgAlgos", "hostKeyAlgos", "privateKey", "sha1Pos", "sha256Pos", "sha512Pos", "compareNumbers", "pos", "type", "algorithms", "origDebug", "ident", "offer", "socket", "debug", "debugPrefix", "msg", "Client", "err", "args", "server", "srvCfg", "exchanges", "acceptedAuthSvc", "pendingAuths", "authCtx", "kaTimer", "onPacket", "unsentGlobalRequestsReplies", "onClientPreHeaderError", "DEBUG_HANDLER", "p", "display", "kaIntvl", "kaCountMax", "kaCurCount", "onClose", "proto", "data", "header", "negotiated", "reason", "desc", "reasonCode", "replied", "accept", "reject", "reserveChannel", "instance", "chanInfo", "stream", "channel", "recipient", "description", "amount", "wantReply", "session", "useSFTP", "methodData", "ctx", "onAuthDecide", "name", "reply", "setReply", "buf", "sendReplies", "chosenPort", "bufPort", "ex", "originAddr", "originPort", "openChannel", "boundAddr", "boundPort", "remoteAddr", "remotePort", "socketPath", "error", "noDelay", "self", "opts", "initWindow", "maxPacket", "wrapper", "a", "b", "require_keygen", "__commonJSMin", "exports", "module", "createCipheriv", "generateKeyPair_", "generateKeyPairSync_", "getCurves", "randomBytes", "Ber", "bcrypt_pbkdf", "CIPHER_INFO", "SALT_LEN", "DEFAULT_ROUNDS", "curves", "ciphers", "makeArgs", "type", "opts", "publicKeyEncoding", "privateKeyEncoding", "modulusLength", "namedCurve", "parseDERs", "keyType", "pub", "priv", "reader", "n", "e", "d", "p", "q", "iqmp", "keyName", "privBuf", "pos", "pubBuf", "pubBin", "i", "curveOID", "sshCurveName", "privBin", "convertKeys", "format", "encrypted", "comment", "passphrase", "cipher", "rounds", "gen", "salt", "kdfOptions", "privateB64", "publicB64", "cipherName", "kdfName", "blockLen", "parsed", "checkInt", "commentBin", "privBlobLen", "padding", "privBlob", "extra", "options", "magicBytes", "b64", "formatted", "noop", "cb", "args", "err", "ret", "ex", "require_lib", "__commonJSMin", "exports", "module", "AgentProtocol", "BaseAgent", "createAgent", "CygwinAgent", "OpenSSHAgent", "PageantAgent", "HTTPAgent", "HTTPSAgent", "parseKey", "flagsToString", "OPEN_MODE", "STATUS_CODE", "stringToFlags", "isTruthyEnv", "value", "nowMs", "isPerfLoggingEnabled", "createPerfLogger", "scope", "enabled", "startedAt", "mark", "label", "elapsedMs", "perf", "createPerfLogger", "init_commands", "perf", "createPerfLogger", "import_node_events", "import_ssh2", "import_node_events", "init_commands", "import_node_events", "fs", "path", "import_node_zlib", "path", "normalizePath", "rawPath", "normalized", "perf", "createPerfLogger", "VirtualFileSystem", "targetPath", "relativePath", "normalizePath", "resolved", "relative", "fd", "header", "stats", "total", "entry", "label", "lines", "walk", "currentPath", "prefix", "entries", "left", "right", "i", "name", "isLast", "connector", "nextPrefix", "entryPath", "isDirectory", "baseDir", "mode", "fsPath", "content", "options", "normalized", "parentPath", "rawContent", "storedContent", "stored", "raw", "dirPath", "rootLabel", "fromPath", "toPath", "fromNormalized", "toNormalized", "fromFsPath", "toFsPath", "VirtualFileSystem_default", "import_node_crypto", "import_node_events", "path", "resolveFastPasswordHash", "configured", "perf", "createPerfLogger", "VirtualUserManager", "_VirtualUserManager", "vfs", "autoSudoForNewUsers", "changed", "username", "maxBytes", "homePath", "targetPath", "nextContent", "quota", "normalizedPath", "normalizeVfsPath", "currentUsage", "existingSize", "existing", "incomingSize", "projectedUsage", "password", "record", "remoteAddress", "session", "sessionId", "left", "right", "raw", "line", "trimmed", "parts", "salt", "passwordHash", "value", "bytes", "authContent", "sudoersContent", "quotasContent", "content", "mode", "cacheKey", "cached", "normalized", "import_promises", "path", "init_commands", "import_node_child_process", "import_promises", "path", "shellQuote", "value", "toTtyLines", "text", "withTerminalSize", "command", "terminalSize", "cols", "rows", "resolvePath", "base", "inputPath", "collectChildPids", "parentPid", "directChildren", "pid", "nested", "getVisibleHtopPidList", "rootPid", "descendants", "unique", "a", "b", "spawnScriptProcess", "command", "terminalSize", "stream", "formatted", "withTerminalSize", "proc", "data", "spawnNanoEditorProcess", "tempPath", "shellQuote", "spawnHtopProcess", "pidList", "init_loginFormat", "buildPrompt", "user", "host", "cwdName", "isRoot", "colorUser", "colorWhite", "colorBlue", "colorReset", "startShell", "properties", "stream", "authUser", "hostname", "sessionId", "remoteAddress", "terminalSize", "shell", "lineBuffer", "cursorPos", "history", "loadHistory", "historyIndex", "historyDraft", "cwd", "nanoSession", "pendingSudo", "buildCurrentPrompt", "homePath", "cwdLabel", "buildPrompt", "commandNames", "getCommandNames", "renderLine", "prompt", "moveLeft", "clearCurrentLine", "startSudoPrompt", "challenge", "finishSudoPrompt", "success", "runCwd", "result", "runCommand", "startNanoEditor", "startHtop", "toTtyLines", "finishNanoEditor", "activeSession", "updatedContent", "targetPath", "initialContent", "tempPath", "editor", "spawnNanoEditorProcess", "error", "pidList", "getVisibleHtopPidList", "monitor", "spawnHtopProcess", "applyHistoryLine", "nextLine", "insertText", "text", "getTokenRange", "line", "cursor", "start", "end", "listPathCompletions", "prefix", "slashIndex", "dirPart", "namePart", "basePath", "resolvePath", "entry", "fullPath", "suffix", "handleTabCompletion", "token", "commandCandidates", "name", "pathCandidates", "candidates", "completed", "pushHistory", "cmd", "data", "readLastLogin", "lastlogPath", "writeLastLogin", "nowIso", "dir", "renderLoginBanner", "last", "when", "displayed", "formatLoginDate", "chunk", "input", "i", "ch", "password", "valid", "next", "third", "fourth", "vfs", "historyPath", "defaultShellProperties", "perf", "createPerfLogger", "resolveAutoSudoForNewUsers", "configured", "VirtualShell", "hostname", "properties", "basePath", "VirtualFileSystem_default", "VirtualUserManager", "vfs", "users", "name", "params", "callback", "normalized", "registerCommand", "createCustomCommand", "rawInput", "authUser", "cwd", "runCommand", "stream", "sessionId", "remoteAddress", "terminalSize", "startShell", "targetPath", "content", "init_commands", "toTtyLines", "text", "runExec", "stream", "cmd", "authUser", "hostname", "shell", "runCommand", "result", "error", "import_node_crypto", "import_node_fs", "import_node_path", "loadOrCreateHostKey", "baseDir", "hostKeyPath", "privateKey", "import_node_events", "path", "import_ssh2", "SFTP_STATUS_CODE", "OPEN_MODE", "perf", "createPerfLogger", "SftpMimic", "port", "hostname", "shell", "vfs", "users", "defaultShell", "VirtualShell", "privateKey", "loadOrCreateHostKey", "SshServer", "client", "allowedAuthMethods", "authUser", "sessionId", "remoteAddress", "error", "acceptSession", "username", "homeRoot", "homePath", "ctx", "candidateUser", "keyboardCtx", "answers", "password", "accept", "_reject", "session", "acceptSftp", "sftp", "resolve", "reject", "err", "address", "actualPort", "requestPath", "joined", "targetPath", "normalized", "node", "permissions", "handleValue", "handleId", "handle", "getVfs", "getUsers", "reqid", "filename", "flags", "openMode", "_canRead", "_canWrite", "canCreate", "shouldTruncate", "buffer", "offset", "length", "entry", "chunk", "data", "end", "nextBuffer", "stats", "entries", "filePath", "attrs", "longname", "oldPath", "newPath", "fromPath", "toPath", "perf", "createPerfLogger", "SshMimic", "port", "hostname", "shell", "VirtualShell", "privateKey", "loadOrCreateHostKey", "SshServer", "client", "authUser", "remoteAddress", "sessionId", "ctx", "candidateUser", "homePath", "accept", "session", "terminalSize", "acceptPty", "_rejectPty", "info", "_acceptChange", "_rejectChange", "acceptShell", "stream", "acceptExec", "_rejectExec", "runExec", "resolve", "reject", "err", "init_command_helpers", "hostname", "virtualShell", "VirtualShell", "SshMimic", "error", "SftpMimic", "promise"]
|
|
7
|
+
}
|