version 1.87, 2002/06/05 16:48:54 |
version 1.88, 2002/06/05 19:57:12 |
|
|
char socket_name[1024]; |
char socket_name[1024]; |
char socket_dir[1024]; |
char socket_dir[1024]; |
|
|
|
/* locking */ |
|
int locked = 0; |
|
char *lock_passwd = NULL; |
|
|
extern char *__progname; |
extern char *__progname; |
|
|
static void |
static void |
|
|
success ? SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE); |
success ? SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE); |
} |
} |
|
|
|
/* XXX todo: encrypt sensitive data with passphrase */ |
|
static void |
|
process_lock_agent(SocketEntry *e, int lock) |
|
{ |
|
char *passwd; |
|
int success = 0; |
|
|
|
passwd = buffer_get_string(&e->request, NULL); |
|
if (locked && !lock && strcmp(passwd, lock_passwd) == 0) { |
|
locked = 0; |
|
memset(lock_passwd, 0, strlen(lock_passwd)); |
|
xfree(lock_passwd); |
|
lock_passwd = NULL; |
|
success = 1; |
|
} else if (!locked && lock) { |
|
locked = 1; |
|
lock_passwd = xstrdup(passwd); |
|
success = 1; |
|
} |
|
memset(passwd, 0, strlen(passwd)); |
|
xfree(passwd); |
|
|
|
buffer_put_int(&e->output, 1); |
|
buffer_put_char(&e->output, |
|
success ? SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE); |
|
return; |
|
} |
|
|
|
static void |
|
no_identities(SocketEntry *e, u_int type) |
|
{ |
|
Buffer msg; |
|
|
|
buffer_init(&msg); |
|
buffer_put_char(&msg, |
|
(type == SSH_AGENTC_REQUEST_RSA_IDENTITIES) ? |
|
SSH_AGENT_RSA_IDENTITIES_ANSWER : SSH2_AGENT_IDENTITIES_ANSWER); |
|
buffer_put_int(&msg, 0); |
|
buffer_put_int(&e->output, buffer_len(&msg)); |
|
buffer_append(&e->output, buffer_ptr(&msg), buffer_len(&msg)); |
|
buffer_free(&msg); |
|
} |
|
|
#ifdef SMARTCARD |
#ifdef SMARTCARD |
static void |
static void |
process_add_smartcard_key (SocketEntry *e) |
process_add_smartcard_key (SocketEntry *e) |
|
|
buffer_consume(&e->input, msg_len); |
buffer_consume(&e->input, msg_len); |
type = buffer_get_char(&e->request); |
type = buffer_get_char(&e->request); |
|
|
|
/* check wheter agent is locked */ |
|
if (locked && type != SSH_AGENTC_UNLOCK) { |
|
buffer_clear(&e->request); |
|
switch (type) { |
|
case SSH_AGENTC_REQUEST_RSA_IDENTITIES: |
|
case SSH2_AGENTC_REQUEST_IDENTITIES: |
|
/* send empty lists */ |
|
no_identities(e, type); |
|
break; |
|
default: |
|
/* send a fail message for all other request types */ |
|
buffer_put_int(&e->output, 1); |
|
buffer_put_char(&e->output, SSH_AGENT_FAILURE); |
|
} |
|
return; |
|
} |
|
|
debug("type %d", type); |
debug("type %d", type); |
switch (type) { |
switch (type) { |
|
case SSH_AGENTC_LOCK: |
|
case SSH_AGENTC_UNLOCK: |
|
process_lock_agent(e, type == SSH_AGENTC_LOCK); |
|
break; |
/* ssh1 */ |
/* ssh1 */ |
case SSH_AGENTC_RSA_CHALLENGE: |
case SSH_AGENTC_RSA_CHALLENGE: |
process_authentication_challenge1(e); |
process_authentication_challenge1(e); |