version 1.54.2.2, 2002/03/09 00:20:45 |
version 1.54.2.3, 2002/06/02 22:56:11 |
|
|
#include "log.h" |
#include "log.h" |
|
|
#ifdef SMARTCARD |
#ifdef SMARTCARD |
#include <openssl/engine.h> |
|
#include "scard.h" |
#include "scard.h" |
#endif |
#endif |
|
|
|
|
static void |
static void |
process_add_smartcard_key (SocketEntry *e) |
process_add_smartcard_key (SocketEntry *e) |
{ |
{ |
|
Identity *id; |
Idtab *tab; |
Idtab *tab; |
Key *n = NULL, *k = NULL; |
Key **keys, *k; |
char *sc_reader_id = NULL; |
char *sc_reader_id = NULL, *pin; |
int success = 0; |
int i, version, success = 0; |
|
|
sc_reader_id = buffer_get_string(&e->input, NULL); |
sc_reader_id = buffer_get_string(&e->input, NULL); |
k = sc_get_key(sc_reader_id); |
pin = buffer_get_string(&e->input, NULL); |
|
keys = sc_get_keys(sc_reader_id, pin); |
xfree(sc_reader_id); |
xfree(sc_reader_id); |
|
xfree(pin); |
|
|
if (k == NULL) { |
if (keys == NULL || keys[0] == NULL) { |
error("sc_get_pubkey failed"); |
error("sc_get_keys failed"); |
goto send; |
goto send; |
} |
} |
success = 1; |
for (i = 0; keys[i] != NULL; i++) { |
|
k = keys[i]; |
tab = idtab_lookup(1); |
version = k->type == KEY_RSA1 ? 1 : 2; |
k->type = KEY_RSA1; |
tab = idtab_lookup(version); |
if (lookup_identity(k, 1) == NULL) { |
if (lookup_identity(k, version) == NULL) { |
Identity *id = xmalloc(sizeof(Identity)); |
id = xmalloc(sizeof(Identity)); |
n = key_new(KEY_RSA1); |
id->key = k; |
BN_copy(n->rsa->n, k->rsa->n); |
id->comment = xstrdup("smartcard key"); |
BN_copy(n->rsa->e, k->rsa->e); |
TAILQ_INSERT_TAIL(&tab->idlist, id, next); |
RSA_set_method(n->rsa, sc_get_engine()); |
tab->nentries++; |
id->key = n; |
success = 1; |
id->comment = xstrdup("rsa1 smartcard"); |
} else { |
TAILQ_INSERT_TAIL(&tab->idlist, id, next); |
key_free(k); |
tab->nentries++; |
} |
|
keys[i] = NULL; |
} |
} |
k->type = KEY_RSA; |
xfree(keys); |
tab = idtab_lookup(2); |
|
if (lookup_identity(k, 2) == NULL) { |
|
Identity *id = xmalloc(sizeof(Identity)); |
|
n = key_new(KEY_RSA); |
|
BN_copy(n->rsa->n, k->rsa->n); |
|
BN_copy(n->rsa->e, k->rsa->e); |
|
RSA_set_method(n->rsa, sc_get_engine()); |
|
id->key = n; |
|
id->comment = xstrdup("rsa smartcard"); |
|
TAILQ_INSERT_TAIL(&tab->idlist, id, next); |
|
tab->nentries++; |
|
} |
|
key_free(k); |
|
send: |
send: |
buffer_put_int(&e->output, 1); |
buffer_put_int(&e->output, 1); |
buffer_put_char(&e->output, |
buffer_put_char(&e->output, |
|
|
static void |
static void |
process_remove_smartcard_key(SocketEntry *e) |
process_remove_smartcard_key(SocketEntry *e) |
{ |
{ |
Key *k = NULL; |
Identity *id; |
int success = 0; |
Idtab *tab; |
char *sc_reader_id = NULL; |
Key **keys, *k = NULL; |
|
char *sc_reader_id = NULL, *pin; |
|
int i, version, success = 0; |
|
|
sc_reader_id = buffer_get_string(&e->input, NULL); |
sc_reader_id = buffer_get_string(&e->input, NULL); |
k = sc_get_key(sc_reader_id); |
pin = buffer_get_string(&e->input, NULL); |
|
keys = sc_get_keys(sc_reader_id, pin); |
xfree(sc_reader_id); |
xfree(sc_reader_id); |
|
xfree(pin); |
|
|
if (k == NULL) { |
if (keys == NULL || keys[0] == NULL) { |
error("sc_get_pubkey failed"); |
error("sc_get_keys failed"); |
} else { |
goto send; |
Identity *id; |
} |
k->type = KEY_RSA1; |
for (i = 0; keys[i] != NULL; i++) { |
id = lookup_identity(k, 1); |
k = keys[i]; |
if (id != NULL) { |
version = k->type == KEY_RSA1 ? 1 : 2; |
Idtab *tab = idtab_lookup(1); |
if ((id = lookup_identity(k, version)) != NULL) { |
TAILQ_REMOVE(&tab->idlist, id, next); |
tab = idtab_lookup(version); |
free_identity(id); |
TAILQ_REMOVE(&tab->idlist, id, next); |
tab->nentries--; |
tab->nentries--; |
success = 1; |
|
} |
|
k->type = KEY_RSA; |
|
id = lookup_identity(k, 2); |
|
if (id != NULL) { |
|
Idtab *tab = idtab_lookup(2); |
|
TAILQ_REMOVE(&tab->idlist, id, next); |
|
free_identity(id); |
free_identity(id); |
tab->nentries--; |
|
success = 1; |
success = 1; |
} |
} |
key_free(k); |
key_free(k); |
|
keys[i] = NULL; |
} |
} |
|
xfree(keys); |
|
send: |
buffer_put_int(&e->output, 1); |
buffer_put_int(&e->output, 1); |
buffer_put_char(&e->output, |
buffer_put_char(&e->output, |
success ? SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE); |
success ? SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE); |
|
|
if (ac > 0 && (c_flag || k_flag || s_flag || d_flag)) |
if (ac > 0 && (c_flag || k_flag || s_flag || d_flag)) |
usage(); |
usage(); |
|
|
if (ac == 0 && !c_flag && !k_flag && !s_flag && !d_flag) { |
if (ac == 0 && !c_flag && !s_flag) { |
shell = getenv("SHELL"); |
shell = getenv("SHELL"); |
if (shell != NULL && strncmp(shell + strlen(shell) - 3, "csh", 3) == 0) |
if (shell != NULL && strncmp(shell + strlen(shell) - 3, "csh", 3) == 0) |
c_flag = 1; |
c_flag = 1; |