-/* $OpenBSD: channels.c,v 1.456 2026/03/03 09:57:25 dtucker Exp $ */
+/* $OpenBSD: channels.c,v 1.457 2026/03/05 05:40:35 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
}
void
-channel_request_start(struct ssh *ssh, int id, char *service, int wantconfirm)
+channel_request_start(struct ssh *ssh, int id, const char *service,
+ int wantconfirm)
{
Channel *c = channel_lookup(ssh, id);
int r;
SSH_CHANNEL_OPENING, newsock, newsock, -1,
c->local_window_max, c->local_maxpacket,
0, "accepted auth socket", 1);
- open_preamble(ssh, __func__, nc, "auth-agent@openssh.com");
+ open_preamble(ssh, __func__, nc,
+ c->agent_new ? "agent-connect" : "auth-agent@openssh.com");
if ((r = sshpkt_send(ssh)) != 0)
fatal_fr(r, "channel %i", c->self);
}
-/* $OpenBSD: channels.h,v 1.163 2026/03/03 09:57:25 dtucker Exp $ */
+/* $OpenBSD: channels.h,v 1.164 2026/03/05 05:40:35 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
u_int local_consumed;
u_int local_maxpacket;
int extended_usage;
+ int agent_new; /* For agent listeners, use RFC XXX reqests */
int single_connection;
char *ctype; /* const type - NB. not freed on channel_free */
void channel_set_xtype(struct ssh *, int, const char *);
void channel_send_open(struct ssh *, int);
-void channel_request_start(struct ssh *, int, char *, int);
+void channel_request_start(struct ssh *, int, const char *, int);
void channel_register_cleanup(struct ssh *, int,
channel_callback_fn *, int);
void channel_register_open_confirm(struct ssh *, int,
int chan_is_dead(struct ssh *, Channel *, int);
void chan_mark_dead(struct ssh *, Channel *);
+/* agent forwarding */
+void client_channel_reqest_agent_forwarding(struct ssh *, int);
+
/* channel events */
void chan_rcvd_oclose(struct ssh *, Channel *);
-/* $OpenBSD: clientloop.c,v 1.421 2026/03/03 09:57:25 dtucker Exp $ */
+/* $OpenBSD: clientloop.c,v 1.422 2026/03/05 05:40:35 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
c = client_request_forwarded_streamlocal(ssh, ctype, rchan);
} else if (strcmp(ctype, "x11") == 0) {
c = client_request_x11(ssh, ctype, rchan);
- } else if (strcmp(ctype, "auth-agent@openssh.com") == 0) {
+ } else if (strcmp(ctype, "auth-agent@openssh.com") == 0 ||
+ strcmp(ctype, "agent-connect") == 0) {
c = client_request_agent(ssh, ctype, rchan);
}
if (c != NULL && c->type == SSH_CHANNEL_MUX_CLIENT) {
client_repledge();
}
+void
+client_channel_reqest_agent_forwarding(struct ssh *ssh, int id)
+{
+ const char *req = "auth-agent-req@openssh.com";
+ int r;
+
+ if (ssh->kex != NULL && (ssh->kex->flags & KEX_HAS_NEWAGENT) != 0)
+ req = "agent-req"; /* XXX RFC XXX */
+ debug("Requesting agent forwarding on channel %d via %s", id, req);
+ channel_request_start(ssh, id, req, 0);
+ if ((r = sshpkt_send(ssh)) != 0)
+ fatal_fr(r, "send");
+}
+
static void
client_init_dispatch(struct ssh *ssh)
{
-/* $OpenBSD: kex.c,v 1.192 2026/03/03 09:57:25 dtucker Exp $ */
+/* $OpenBSD: kex.c,v 1.193 2026/03/05 05:40:35 djm Exp $ */
/*
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
*
if (ssh->kex->server_sig_algs == NULL &&
(ssh->kex->server_sig_algs = sshkey_alg_list(0, 1, 1, ',')) == NULL)
return SSH_ERR_ALLOC_FAIL;
- if ((r = sshbuf_put_u32(m, 3)) != 0 ||
+ if ((r = sshbuf_put_u32(m, 4)) != 0 ||
(r = sshbuf_put_cstring(m, "server-sig-algs")) != 0 ||
(r = sshbuf_put_cstring(m, ssh->kex->server_sig_algs)) != 0 ||
(r = sshbuf_put_cstring(m,
"publickey-hostbound@openssh.com")) != 0 ||
(r = sshbuf_put_cstring(m, "0")) != 0 ||
(r = sshbuf_put_cstring(m, "ping@openssh.com")) != 0 ||
+ (r = sshbuf_put_cstring(m, "0")) != 0 ||
+ (r = sshbuf_put_cstring(m, "agent-forward")) != 0 ||
(r = sshbuf_put_cstring(m, "0")) != 0) {
error_fr(r, "compose");
return r;
"0", KEX_HAS_PING)) != 0) {
return r;
}
+ } else if (ssh->kex->ext_info_received == 1 &&
+ strcmp(name, "agent-forward") == 0) {
+ if ((r = kex_ext_info_check_ver(ssh->kex, name, value, vlen,
+ "0", KEX_HAS_NEWAGENT)) != 0) {
+ return r;
+ }
} else
debug_f("%s (unrecognised)", name);
-/* $OpenBSD: kex.h,v 1.128 2026/03/03 09:57:25 dtucker Exp $ */
+/* $OpenBSD: kex.h,v 1.129 2026/03/05 05:40:36 djm Exp $ */
/*
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
#define KEX_RSA_SHA2_512_SUPPORTED 0x0010 /* only set in server for now */
#define KEX_HAS_PING 0x0020
#define KEX_HAS_EXT_INFO_IN_AUTH 0x0040
+#define KEX_HAS_NEWAGENT 0x0080 /* only set in client */
/* kex->pq */
#define KEX_NOT_PQ 0
-/* $OpenBSD: mux.c,v 1.111 2026/03/03 09:57:25 dtucker Exp $ */
+/* $OpenBSD: mux.c,v 1.112 2026/03/05 05:40:36 djm Exp $ */
/*
* Copyright (c) 2002-2008 Damien Miller <djm@openbsd.org>
*
}
}
- if (cctx->want_agent_fwd && options.forward_agent) {
- debug("Requesting authentication agent forwarding.");
- channel_request_start(ssh, id, "auth-agent-req@openssh.com", 0);
- if ((r = sshpkt_send(ssh)) != 0)
- fatal_fr(r, "send");
- }
+ if (cctx->want_agent_fwd && options.forward_agent)
+ client_channel_reqest_agent_forwarding(ssh, id);
client_session2_setup(ssh, id, cctx->want_tty, cctx->want_subsys,
cctx->term, &cctx->tio, c->rfd, cctx->cmd, cctx->env);
-/* $OpenBSD: session.c,v 1.347 2026/02/08 15:28:01 dtucker Exp $ */
+/* $OpenBSD: session.c,v 1.348 2026/03/05 05:40:36 djm Exp $ */
/*
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
* All rights reserved
}
static int
-auth_input_request_forwarding(struct ssh *ssh, struct passwd * pw)
+auth_input_request_forwarding(struct ssh *ssh, struct passwd *pw, int agent_new)
{
Channel *nc;
int sock = -1;
CHAN_X11_WINDOW_DEFAULT, CHAN_X11_PACKET_DEFAULT,
0, "auth socket", 1);
nc->path = xstrdup(auth_sock_name);
+ nc->agent_new = agent_new;
return 1;
authsock_err:
}
static int
-session_auth_agent_req(struct ssh *ssh, Session *s)
+session_auth_agent_req(struct ssh *ssh, Session *s, int agent_new)
{
static int called = 0;
int r;
debug_f("agent forwarding disabled");
return 0;
}
- if (called) {
+ if (called)
return 0;
- } else {
- called = 1;
- return auth_input_request_forwarding(ssh, s->pw);
- }
+
+ called = 1;
+ return auth_input_request_forwarding(ssh, s->pw, agent_new);
}
int
} else if (strcmp(rtype, "x11-req") == 0) {
success = session_x11_req(ssh, s);
} else if (strcmp(rtype, "auth-agent-req@openssh.com") == 0) {
- success = session_auth_agent_req(ssh, s);
+ success = session_auth_agent_req(ssh, s, 0);
+ } else if (strcmp(rtype, "agent-req") == 0) {
+ success = session_auth_agent_req(ssh, s, 1);
} else if (strcmp(rtype, "subsystem") == 0) {
success = session_subsystem_req(ssh, s);
} else if (strcmp(rtype, "env") == 0) {
-/* $OpenBSD: ssh.c,v 1.627 2026/03/03 09:57:25 dtucker Exp $ */
+/* $OpenBSD: ssh.c,v 1.628 2026/03/05 05:40:36 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
{
extern char **environ;
const char *display, *term;
- int r;
char *proto = NULL, *data = NULL;
if (!success)
}
check_agent_present();
- if (options.forward_agent) {
- debug("Requesting authentication agent forwarding.");
- channel_request_start(ssh, id, "auth-agent-req@openssh.com", 0);
- if ((r = sshpkt_send(ssh)) != 0)
- fatal_fr(r, "send packet");
- }
+ if (options.forward_agent)
+ client_channel_reqest_agent_forwarding(ssh, id);
if ((term = lookup_env_in_list("TERM", options.setenv,
options.num_setenv)) == NULL || *term == '\0')