version 1.99.2.2, 2002/10/11 14:51:53 |
version 1.99.2.3, 2003/04/03 22:35:18 |
|
|
|
|
/* start key exchange */ |
/* start key exchange */ |
kex = kex_setup(myproposal); |
kex = kex_setup(myproposal); |
|
kex->kex[KEX_DH_GRP1_SHA1] = kexdh_client; |
|
kex->kex[KEX_DH_GEX_SHA1] = kexgex_client; |
kex->client_version_string=client_version_string; |
kex->client_version_string=client_version_string; |
kex->server_version_string=server_version_string; |
kex->server_version_string=server_version_string; |
kex->verify_host_key=&verify_host_key_callback; |
kex->verify_host_key=&verify_host_key_callback; |
|
|
packet_send(); |
packet_send(); |
packet_write_wait(); |
packet_write_wait(); |
#endif |
#endif |
debug("done: ssh_kex2."); |
|
} |
} |
|
|
/* |
/* |
|
|
if (options.challenge_response_authentication) |
if (options.challenge_response_authentication) |
options.kbd_interactive_authentication = 1; |
options.kbd_interactive_authentication = 1; |
|
|
debug("send SSH2_MSG_SERVICE_REQUEST"); |
|
packet_start(SSH2_MSG_SERVICE_REQUEST); |
packet_start(SSH2_MSG_SERVICE_REQUEST); |
packet_put_cstring("ssh-userauth"); |
packet_put_cstring("ssh-userauth"); |
packet_send(); |
packet_send(); |
|
debug("SSH2_MSG_SERVICE_REQUEST sent"); |
packet_write_wait(); |
packet_write_wait(); |
type = packet_read(); |
type = packet_read(); |
if (type != SSH2_MSG_SERVICE_ACCEPT) { |
if (type != SSH2_MSG_SERVICE_ACCEPT) |
fatal("denied SSH2_MSG_SERVICE_ACCEPT: %d", type); |
fatal("Server denied authentication request: %d", type); |
} |
|
if (packet_remaining() > 0) { |
if (packet_remaining() > 0) { |
char *reply = packet_get_string(NULL); |
char *reply = packet_get_string(NULL); |
debug("service_accept: %s", reply); |
debug2("service_accept: %s", reply); |
xfree(reply); |
xfree(reply); |
} else { |
} else { |
debug("buggy server: service_accept w/o service"); |
debug2("buggy server: service_accept w/o service"); |
} |
} |
packet_check_eom(); |
packet_check_eom(); |
debug("got SSH2_MSG_SERVICE_ACCEPT"); |
debug("SSH2_MSG_SERVICE_ACCEPT received"); |
|
|
if (options.preferred_authentications == NULL) |
if (options.preferred_authentications == NULL) |
options.preferred_authentications = authmethods_get(); |
options.preferred_authentications = authmethods_get(); |
|
|
if (authctxt.agent != NULL) |
if (authctxt.agent != NULL) |
ssh_close_authentication_connection(authctxt.agent); |
ssh_close_authentication_connection(authctxt.agent); |
|
|
debug("ssh-userauth2 successful: method %s", authctxt.method->name); |
debug("Authentication succeeded (%s).", authctxt.method->name); |
} |
} |
void |
void |
userauth(Authctxt *authctxt, char *authlist) |
userauth(Authctxt *authctxt, char *authlist) |
|
|
|
|
if (partial != 0) |
if (partial != 0) |
log("Authenticated with partial success."); |
log("Authenticated with partial success."); |
debug("authentications that can continue: %s", authlist); |
debug("Authentications that can continue: %s", authlist); |
|
|
clear_auth_state(authctxt); |
clear_auth_state(authctxt); |
userauth(authctxt, authlist); |
userauth(authctxt, authlist); |
|
|
} |
} |
packet_check_eom(); |
packet_check_eom(); |
|
|
debug("input_userauth_pk_ok: pkalg %s blen %u lastkey %p hint %d", |
debug("Server accepts key: pkalg %s blen %u lastkey %p hint %d", |
pkalg, blen, authctxt->last_key, authctxt->last_key_hint); |
pkalg, blen, authctxt->last_key, authctxt->last_key_hint); |
|
|
do { |
do { |
|
|
if (k == NULL) { |
if (k == NULL) { |
debug2("userauth_pubkey_agent: no more keys"); |
debug2("userauth_pubkey_agent: no more keys"); |
} else { |
} else { |
debug("userauth_pubkey_agent: testing agent key %s", comment); |
debug("Offering agent key: %s", comment); |
xfree(comment); |
xfree(comment); |
ret = send_pubkey_test(authctxt, k, agent_sign_cb, -1); |
ret = send_pubkey_test(authctxt, k, agent_sign_cb, -1); |
if (ret == 0) |
if (ret == 0) |
|
|
key = options.identity_keys[idx]; |
key = options.identity_keys[idx]; |
filename = options.identity_files[idx]; |
filename = options.identity_files[idx]; |
if (key == NULL) { |
if (key == NULL) { |
debug("try privkey: %s", filename); |
debug("Trying private key: %s", filename); |
key = load_identity_file(filename); |
key = load_identity_file(filename); |
if (key != NULL) { |
if (key != NULL) { |
sent = sign_and_send_pubkey(authctxt, key, |
sent = sign_and_send_pubkey(authctxt, key, |
|
|
key_free(key); |
key_free(key); |
} |
} |
} else if (key->type != KEY_RSA1) { |
} else if (key->type != KEY_RSA1) { |
debug("try pubkey: %s", filename); |
debug("Offering public key: %s", filename); |
sent = send_pubkey_test(authctxt, key, |
sent = send_pubkey_test(authctxt, key, |
identity_sign_cb, idx); |
identity_sign_cb, idx); |
} |
} |
|
|
pid_t pid; |
pid_t pid; |
int to[2], from[2], status, version = 2; |
int to[2], from[2], status, version = 2; |
|
|
debug("ssh_keysign called"); |
debug2("ssh_keysign called"); |
|
|
if (stat(_PATH_SSH_KEY_SIGN, &st) < 0) { |
if (stat(_PATH_SSH_KEY_SIGN, &st) < 0) { |
error("ssh_keysign: no installed: %s", strerror(errno)); |
error("ssh_keysign: no installed: %s", strerror(errno)); |
|
|
buffer_init(&b); |
buffer_init(&b); |
buffer_put_int(&b, packet_get_connection_in()); /* send # of socket */ |
buffer_put_int(&b, packet_get_connection_in()); /* send # of socket */ |
buffer_put_string(&b, data, datalen); |
buffer_put_string(&b, data, datalen); |
msg_send(to[1], version, &b); |
ssh_msg_send(to[1], version, &b); |
|
|
if (msg_recv(from[0], &b) < 0) { |
if (ssh_msg_recv(from[0], &b) < 0) { |
error("ssh_keysign: no reply"); |
error("ssh_keysign: no reply"); |
buffer_clear(&b); |
buffer_clear(&b); |
return -1; |
return -1; |
|
|
} |
} |
} |
} |
if (!found) { |
if (!found) { |
debug("userauth_hostbased: no more client hostkeys"); |
debug("No more client hostkeys for hostbased authentication."); |
return 0; |
return 0; |
} |
} |
if (key_to_blob(private, &blob, &blen) == 0) { |
if (key_to_blob(private, &blob, &blen) == 0) { |
|
|
strlcpy(chost, p, len); |
strlcpy(chost, p, len); |
strlcat(chost, ".", len); |
strlcat(chost, ".", len); |
debug2("userauth_hostbased: chost %s", chost); |
debug2("userauth_hostbased: chost %s", chost); |
|
xfree(p); |
|
|
service = datafellows & SSH_BUG_HBSERVICE ? "ssh-userauth" : |
service = datafellows & SSH_BUG_HBSERVICE ? "ssh-userauth" : |
authctxt->service; |
authctxt->service; |
|
|
static Authmethod * |
static Authmethod * |
authmethod_get(char *authlist) |
authmethod_get(char *authlist) |
{ |
{ |
|
|
char *name = NULL; |
char *name = NULL; |
u_int next; |
u_int next; |
|
|
|
|
|
|
for (;;) { |
for (;;) { |
if ((name = match_list(preferred, supported, &next)) == NULL) { |
if ((name = match_list(preferred, supported, &next)) == NULL) { |
debug("no more auth methods to try"); |
debug("No more authentication methods to try."); |
current = NULL; |
current = NULL; |
return NULL; |
return NULL; |
} |
} |
|
|
if ((current = authmethod_lookup(name)) != NULL && |
if ((current = authmethod_lookup(name)) != NULL && |
authmethod_is_enabled(current)) { |
authmethod_is_enabled(current)) { |
debug3("authmethod_is_enabled %s", name); |
debug3("authmethod_is_enabled %s", name); |
debug("next auth method to try is %s", name); |
debug("Next authentication method: %s", name); |
return current; |
return current; |
} |
} |
} |
} |