diff options
author | djm@openbsd.org <djm@openbsd.org> | 2015-02-20 22:17:21 +0000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2015-02-21 09:20:28 +1100 |
commit | 44732de06884238049f285f1455b2181baa7dc82 (patch) | |
tree | deb3c48176195cfc4028b55d2a1a71607e9f7fb0 /clientloop.c | |
parent | 13a39414d25646f93e6d355521d832a03aaaffe2 (diff) |
upstream commit
UpdateHostKeys fixes:
I accidentally changed the format of the hostkeys@openssh.com messages
last week without changing the extension name, and this has been causing
connection failures for people who are running -current. First reported
by sthen@
s/hostkeys@openssh.com/hostkeys-00@openssh.com/
Change the name of the proof message too, and reorder it a little.
Also, UpdateHostKeys=ask is incompatible with ControlPersist (no TTY
available to read the response) so disable UpdateHostKeys if it is in
ask mode and ControlPersist is active (and document this)
Diffstat (limited to 'clientloop.c')
-rw-r--r-- | clientloop.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/clientloop.c b/clientloop.c index a19d9d06f..ca3a4595b 100644 --- a/clientloop.c +++ b/clientloop.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: clientloop.c,v 1.269 2015/02/16 22:13:32 djm Exp $ */ | 1 | /* $OpenBSD: clientloop.c,v 1.270 2015/02/20 22:17:21 djm Exp $ */ |
2 | /* | 2 | /* |
3 | * Author: Tatu Ylonen <ylo@cs.hut.fi> | 3 | * Author: Tatu Ylonen <ylo@cs.hut.fi> |
4 | * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland | 4 | * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland |
@@ -2265,10 +2265,10 @@ client_global_hostkeys_private_confirm(int type, u_int32_t seq, void *_ctx) | |||
2265 | continue; | 2265 | continue; |
2266 | /* Prepare data to be signed: session ID, unique string, key */ | 2266 | /* Prepare data to be signed: session ID, unique string, key */ |
2267 | sshbuf_reset(signdata); | 2267 | sshbuf_reset(signdata); |
2268 | if ((r = sshbuf_put_string(signdata, ssh->kex->session_id, | 2268 | if ( (r = sshbuf_put_cstring(signdata, |
2269 | "hostkeys-prove-00@openssh.com")) != 0 || | ||
2270 | (r = sshbuf_put_string(signdata, ssh->kex->session_id, | ||
2269 | ssh->kex->session_id_len)) != 0 || | 2271 | ssh->kex->session_id_len)) != 0 || |
2270 | (r = sshbuf_put_cstring(signdata, | ||
2271 | "hostkeys-prove@openssh.com")) != 0 || | ||
2272 | (r = sshkey_puts(ctx->keys[i], signdata)) != 0) | 2272 | (r = sshkey_puts(ctx->keys[i], signdata)) != 0) |
2273 | fatal("%s: failed to prepare signature: %s", | 2273 | fatal("%s: failed to prepare signature: %s", |
2274 | __func__, ssh_err(r)); | 2274 | __func__, ssh_err(r)); |
@@ -2300,7 +2300,7 @@ client_global_hostkeys_private_confirm(int type, u_int32_t seq, void *_ctx) | |||
2300 | } | 2300 | } |
2301 | 2301 | ||
2302 | /* | 2302 | /* |
2303 | * Handle hostkeys@openssh.com global request to inform the client of all | 2303 | * Handle hostkeys-00@openssh.com global request to inform the client of all |
2304 | * the server's hostkeys. The keys are checked against the user's | 2304 | * the server's hostkeys. The keys are checked against the user's |
2305 | * HostkeyAlgorithms preference before they are accepted. | 2305 | * HostkeyAlgorithms preference before they are accepted. |
2306 | */ | 2306 | */ |
@@ -2335,8 +2335,10 @@ client_input_hostkeys(void) | |||
2335 | __func__, ssh_err(r)); | 2335 | __func__, ssh_err(r)); |
2336 | goto out; | 2336 | goto out; |
2337 | } | 2337 | } |
2338 | if ((r = sshkey_from_blob(blob, len, &key)) != 0) | 2338 | if ((r = sshkey_from_blob(blob, len, &key)) != 0) { |
2339 | fatal("%s: parse key: %s", __func__, ssh_err(r)); | 2339 | error("%s: parse key: %s", __func__, ssh_err(r)); |
2340 | goto out; | ||
2341 | } | ||
2340 | fp = sshkey_fingerprint(key, options.fingerprint_hash, | 2342 | fp = sshkey_fingerprint(key, options.fingerprint_hash, |
2341 | SSH_FP_DEFAULT); | 2343 | SSH_FP_DEFAULT); |
2342 | debug3("%s: received %s key %s", __func__, | 2344 | debug3("%s: received %s key %s", __func__, |
@@ -2376,9 +2378,10 @@ client_input_hostkeys(void) | |||
2376 | } | 2378 | } |
2377 | 2379 | ||
2378 | if (ctx->nkeys == 0) { | 2380 | if (ctx->nkeys == 0) { |
2379 | error("%s: server sent no hostkeys", __func__); | 2381 | debug("%s: server sent no hostkeys", __func__); |
2380 | goto out; | 2382 | goto out; |
2381 | } | 2383 | } |
2384 | |||
2382 | if ((ctx->keys_seen = calloc(ctx->nkeys, | 2385 | if ((ctx->keys_seen = calloc(ctx->nkeys, |
2383 | sizeof(*ctx->keys_seen))) == NULL) | 2386 | sizeof(*ctx->keys_seen))) == NULL) |
2384 | fatal("%s: calloc failed", __func__); | 2387 | fatal("%s: calloc failed", __func__); |
@@ -2418,7 +2421,7 @@ client_input_hostkeys(void) | |||
2418 | __func__, ctx->nnew); | 2421 | __func__, ctx->nnew); |
2419 | if ((r = sshpkt_start(ssh, SSH2_MSG_GLOBAL_REQUEST)) != 0 || | 2422 | if ((r = sshpkt_start(ssh, SSH2_MSG_GLOBAL_REQUEST)) != 0 || |
2420 | (r = sshpkt_put_cstring(ssh, | 2423 | (r = sshpkt_put_cstring(ssh, |
2421 | "hostkeys-prove@openssh.com")) != 0 || | 2424 | "hostkeys-prove-00@openssh.com")) != 0 || |
2422 | (r = sshpkt_put_u8(ssh, 1)) != 0) /* bool: want reply */ | 2425 | (r = sshpkt_put_u8(ssh, 1)) != 0) /* bool: want reply */ |
2423 | fatal("%s: cannot prepare packet: %s", | 2426 | fatal("%s: cannot prepare packet: %s", |
2424 | __func__, ssh_err(r)); | 2427 | __func__, ssh_err(r)); |
@@ -2465,7 +2468,7 @@ client_input_global_request(int type, u_int32_t seq, void *ctxt) | |||
2465 | want_reply = packet_get_char(); | 2468 | want_reply = packet_get_char(); |
2466 | debug("client_input_global_request: rtype %s want_reply %d", | 2469 | debug("client_input_global_request: rtype %s want_reply %d", |
2467 | rtype, want_reply); | 2470 | rtype, want_reply); |
2468 | if (strcmp(rtype, "hostkeys@openssh.com") == 0) | 2471 | if (strcmp(rtype, "hostkeys-00@openssh.com") == 0) |
2469 | success = client_input_hostkeys(); | 2472 | success = client_input_hostkeys(); |
2470 | if (want_reply) { | 2473 | if (want_reply) { |
2471 | packet_start(success ? | 2474 | packet_start(success ? |