111 lines
3.0 KiB
JavaScript
111 lines
3.0 KiB
JavaScript
'use strict'
|
|
|
|
try {
|
|
require('bare-process/global')
|
|
} catch {
|
|
/* Node.js */
|
|
}
|
|
|
|
const assert = require('./assert-compat.js')
|
|
const { spawnSync } = require('child_process')
|
|
|
|
const debug = false
|
|
const SPAWN_OPTS = { windowsHide: true }
|
|
|
|
// TODO: figure out why this test is failing on Windows
|
|
if (process.platform === 'win32') {
|
|
console.log('Skipping ssh-agent test on Windows')
|
|
process.exit(0)
|
|
}
|
|
|
|
if (process.argv[2] === 'child') {
|
|
const { fixtureKey, mustCall, setup } = require('./common.js')
|
|
|
|
const serverCfg = { hostKeys: [fixtureKey('ssh_host_rsa_key').raw] }
|
|
|
|
const clientKey = fixtureKey('openssh_new_rsa')
|
|
|
|
// Add key to the agent first
|
|
{
|
|
const { error, status } = spawnSync('ssh-add', [clientKey.fullPath], SPAWN_OPTS)
|
|
if (error || status !== 0) {
|
|
console.error('Failed to add key to agent')
|
|
process.exit(1)
|
|
}
|
|
}
|
|
|
|
const username = 'Agent User'
|
|
const { server } = setup('Agent authentication', {
|
|
client: { username, agent: process.env.SSH_AUTH_SOCK },
|
|
server: serverCfg,
|
|
|
|
debug
|
|
})
|
|
|
|
server.on(
|
|
'connection',
|
|
mustCall((conn) => {
|
|
let authAttempt = 0
|
|
conn
|
|
.on(
|
|
'authentication',
|
|
mustCall((ctx) => {
|
|
assert(ctx.username === username, `Wrong username: ${ctx.username}`)
|
|
switch (++authAttempt) {
|
|
case 1:
|
|
assert(ctx.method === 'none', `Wrong auth method: ${ctx.method}`)
|
|
return ctx.reject()
|
|
case 3:
|
|
assert(ctx.signature, 'Missing publickey signature')
|
|
// FALLTHROUGH
|
|
case 2:
|
|
assert(ctx.method === 'publickey', `Wrong auth method: ${ctx.method}`)
|
|
assert(ctx.key.algo === clientKey.key.type, `Wrong key algo: ${ctx.key.algo}`)
|
|
assert.deepStrictEqual(
|
|
clientKey.key.getPublicSSH(),
|
|
ctx.key.data,
|
|
'Public key mismatch'
|
|
)
|
|
break
|
|
}
|
|
if (ctx.signature) {
|
|
const result = clientKey.key.verify(ctx.blob, ctx.signature, ctx.hashAlgo)
|
|
assert(result === true, 'Could not verify publickey signature')
|
|
}
|
|
ctx.accept()
|
|
}, 3)
|
|
)
|
|
.on(
|
|
'ready',
|
|
mustCall(() => {
|
|
conn.end()
|
|
})
|
|
)
|
|
})
|
|
)
|
|
} else {
|
|
{
|
|
const { error, status } = spawnSync('which', ['ssh-agent'], SPAWN_OPTS)
|
|
|
|
if (error || status !== 0) {
|
|
console.log('No ssh-agent available, skipping agent test ...')
|
|
process.exit(0)
|
|
}
|
|
}
|
|
|
|
{
|
|
const { error, status } = spawnSync('which', ['ssh-add'], SPAWN_OPTS)
|
|
|
|
if (error || status !== 0) {
|
|
console.log('No ssh-add available, skipping agent test ...')
|
|
process.exit(0)
|
|
}
|
|
}
|
|
|
|
const { error, status } = spawnSync('ssh-agent', [process.execPath, __filename, 'child'], {
|
|
...SPAWN_OPTS,
|
|
stdio: 'inherit'
|
|
})
|
|
if (error || status !== 0) throw new Error('Agent test failed')
|
|
}
|