123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- 'use strict';
- const assert = require('assert');
- 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) {
- assert(clientKey.key.verify(ctx.blob, ctx.signature) === 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');
- }
|