version 1.95, 2002/06/19 00:27:55 |
version 1.96, 2002/06/23 10:29:52 |
|
|
idtab_init(void) |
idtab_init(void) |
{ |
{ |
int i; |
int i; |
|
|
for (i = 0; i <=2; i++) { |
for (i = 0; i <=2; i++) { |
TAILQ_INIT(&idtable[i].idlist); |
TAILQ_INIT(&idtable[i].idlist); |
idtable[i].nentries = 0; |
idtable[i].nentries = 0; |
|
|
process_request_identities(SocketEntry *e, int version) |
process_request_identities(SocketEntry *e, int version) |
{ |
{ |
Idtab *tab = idtab_lookup(version); |
Idtab *tab = idtab_lookup(version); |
Buffer msg; |
|
Identity *id; |
Identity *id; |
|
Buffer msg; |
|
|
buffer_init(&msg); |
buffer_init(&msg); |
buffer_put_char(&msg, (version == 1) ? |
buffer_put_char(&msg, (version == 1) ? |
|
|
static void |
static void |
process_authentication_challenge1(SocketEntry *e) |
process_authentication_challenge1(SocketEntry *e) |
{ |
{ |
Identity *id; |
u_char buf[32], mdbuf[16], session_id[16]; |
Key *key; |
u_int response_type; |
BIGNUM *challenge; |
BIGNUM *challenge; |
|
Identity *id; |
int i, len; |
int i, len; |
Buffer msg; |
Buffer msg; |
MD5_CTX md; |
MD5_CTX md; |
u_char buf[32], mdbuf[16], session_id[16]; |
Key *key; |
u_int response_type; |
|
|
|
buffer_init(&msg); |
buffer_init(&msg); |
key = key_new(KEY_RSA1); |
key = key_new(KEY_RSA1); |
|
|
static void |
static void |
process_sign_request2(SocketEntry *e) |
process_sign_request2(SocketEntry *e) |
{ |
{ |
extern int datafellows; |
|
Key *key; |
|
u_char *blob, *data, *signature = NULL; |
u_char *blob, *data, *signature = NULL; |
u_int blen, dlen, slen = 0; |
u_int blen, dlen, slen = 0; |
int flags; |
extern int datafellows; |
|
int ok = -1, flags; |
Buffer msg; |
Buffer msg; |
int ok = -1; |
Key *key; |
|
|
datafellows = 0; |
datafellows = 0; |
|
|
|
|
static void |
static void |
process_remove_identity(SocketEntry *e, int version) |
process_remove_identity(SocketEntry *e, int version) |
{ |
{ |
|
u_int blen, bits; |
|
int success = 0; |
Key *key = NULL; |
Key *key = NULL; |
u_char *blob; |
u_char *blob; |
u_int blen; |
|
u_int bits; |
|
int success = 0; |
|
|
|
switch (version) { |
switch (version) { |
case 1: |
case 1: |
|
|
buffer_get_bignum(&e->request, key->rsa->n); |
buffer_get_bignum(&e->request, key->rsa->n); |
|
|
if (bits != key_size(key)) |
if (bits != key_size(key)) |
log("Warning: identity keysize mismatch: actual %d, announced %d", |
log("Warning: identity keysize mismatch: actual %u, announced %u", |
key_size(key), bits); |
key_size(key), bits); |
break; |
break; |
case 2: |
case 2: |
|
|
static void |
static void |
reaper(void) |
reaper(void) |
{ |
{ |
Idtab *tab; |
u_int now = time(NULL); |
Identity *id, *nxt; |
Identity *id, *nxt; |
int version; |
int version; |
u_int now = time(NULL); |
Idtab *tab; |
|
|
for (version = 1; version < 3; version++) { |
for (version = 1; version < 3; version++) { |
tab = idtab_lookup(version); |
tab = idtab_lookup(version); |
|
|
static void |
static void |
process_add_identity(SocketEntry *e, int version) |
process_add_identity(SocketEntry *e, int version) |
{ |
{ |
Key *k = NULL; |
|
char *type_name; |
|
char *comment; |
|
int type, success = 0, death = 0; |
|
Idtab *tab = idtab_lookup(version); |
Idtab *tab = idtab_lookup(version); |
|
int type, success = 0, death = 0; |
|
char *type_name, *comment; |
|
Key *k = NULL; |
|
|
switch (version) { |
switch (version) { |
case 1: |
case 1: |
|
|
static void |
static void |
process_lock_agent(SocketEntry *e, int lock) |
process_lock_agent(SocketEntry *e, int lock) |
{ |
{ |
char *passwd; |
|
int success = 0; |
int success = 0; |
|
char *passwd; |
|
|
passwd = buffer_get_string(&e->request, NULL); |
passwd = buffer_get_string(&e->request, NULL); |
if (locked && !lock && strcmp(passwd, lock_passwd) == 0) { |
if (locked && !lock && strcmp(passwd, lock_passwd) == 0) { |
|
|
static void |
static void |
process_add_smartcard_key (SocketEntry *e) |
process_add_smartcard_key (SocketEntry *e) |
{ |
{ |
Identity *id; |
|
Idtab *tab; |
|
Key **keys, *k; |
|
char *sc_reader_id = NULL, *pin; |
char *sc_reader_id = NULL, *pin; |
int i, version, success = 0; |
int i, version, success = 0; |
|
Key **keys, *k; |
|
Identity *id; |
|
Idtab *tab; |
|
|
sc_reader_id = buffer_get_string(&e->request, NULL); |
sc_reader_id = buffer_get_string(&e->request, NULL); |
pin = buffer_get_string(&e->request, NULL); |
pin = buffer_get_string(&e->request, NULL); |
|
|
static void |
static void |
process_remove_smartcard_key(SocketEntry *e) |
process_remove_smartcard_key(SocketEntry *e) |
{ |
{ |
Identity *id; |
|
Idtab *tab; |
|
Key **keys, *k = NULL; |
|
char *sc_reader_id = NULL, *pin; |
char *sc_reader_id = NULL, *pin; |
int i, version, success = 0; |
int i, version, success = 0; |
|
Key **keys, *k = NULL; |
|
Identity *id; |
|
Idtab *tab; |
|
|
sc_reader_id = buffer_get_string(&e->request, NULL); |
sc_reader_id = buffer_get_string(&e->request, NULL); |
pin = buffer_get_string(&e->request, NULL); |
pin = buffer_get_string(&e->request, NULL); |
|
|
static void |
static void |
process_message(SocketEntry *e) |
process_message(SocketEntry *e) |
{ |
{ |
u_int msg_len; |
u_int msg_len, type; |
u_int type; |
|
u_char *cp; |
u_char *cp; |
|
|
/* kill dead keys */ |
/* kill dead keys */ |
|
|
if (msg_len > 256 * 1024) { |
if (msg_len > 256 * 1024) { |
shutdown(e->fd, SHUT_RDWR); |
shutdown(e->fd, SHUT_RDWR); |
close(e->fd); |
close(e->fd); |
|
e->fd = -1; |
e->type = AUTH_UNUSED; |
e->type = AUTH_UNUSED; |
buffer_free(&e->input); |
buffer_free(&e->input); |
buffer_free(&e->output); |
buffer_free(&e->output); |
|
|
new_socket(sock_type type, int fd) |
new_socket(sock_type type, int fd) |
{ |
{ |
u_int i, old_alloc; |
u_int i, old_alloc; |
|
|
if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) |
if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) |
error("fcntl O_NONBLOCK: %s", strerror(errno)); |
error("fcntl O_NONBLOCK: %s", strerror(errno)); |
|
|
|
|
static void |
static void |
after_select(fd_set *readset, fd_set *writeset) |
after_select(fd_set *readset, fd_set *writeset) |
{ |
{ |
u_int i; |
struct sockaddr_un sunaddr; |
int len, sock; |
|
socklen_t slen; |
socklen_t slen; |
char buf[1024]; |
char buf[1024]; |
struct sockaddr_un sunaddr; |
int len, sock; |
|
u_int i; |
|
|
for (i = 0; i < sockets_alloc; i++) |
for (i = 0; i < sockets_alloc; i++) |
switch (sockets[i].type) { |
switch (sockets[i].type) { |
|
|
if (len <= 0) { |
if (len <= 0) { |
shutdown(sockets[i].fd, SHUT_RDWR); |
shutdown(sockets[i].fd, SHUT_RDWR); |
close(sockets[i].fd); |
close(sockets[i].fd); |
|
sockets[i].fd = -1; |
sockets[i].type = AUTH_UNUSED; |
sockets[i].type = AUTH_UNUSED; |
buffer_free(&sockets[i].input); |
buffer_free(&sockets[i].input); |
buffer_free(&sockets[i].output); |
buffer_free(&sockets[i].output); |
|
|
if (len <= 0) { |
if (len <= 0) { |
shutdown(sockets[i].fd, SHUT_RDWR); |
shutdown(sockets[i].fd, SHUT_RDWR); |
close(sockets[i].fd); |
close(sockets[i].fd); |
|
sockets[i].fd = -1; |
sockets[i].type = AUTH_UNUSED; |
sockets[i].type = AUTH_UNUSED; |
buffer_free(&sockets[i].input); |
buffer_free(&sockets[i].input); |
buffer_free(&sockets[i].output); |
buffer_free(&sockets[i].output); |
|
|
main(int ac, char **av) |
main(int ac, char **av) |
{ |
{ |
int sock, c_flag = 0, d_flag = 0, k_flag = 0, s_flag = 0, ch, nalloc; |
int sock, c_flag = 0, d_flag = 0, k_flag = 0, s_flag = 0, ch, nalloc; |
|
char *shell, *format, *pidstr, *agentsocket = NULL; |
|
fd_set *readsetp = NULL, *writesetp = NULL; |
struct sockaddr_un sunaddr; |
struct sockaddr_un sunaddr; |
struct rlimit rlim; |
struct rlimit rlim; |
pid_t pid; |
|
char *shell, *format, *pidstr, pidstrbuf[1 + 3 * sizeof pid]; |
|
char *agentsocket = NULL; |
|
extern int optind; |
extern int optind; |
fd_set *readsetp = NULL, *writesetp = NULL; |
pid_t pid; |
|
char pidstrbuf[1 + 3 * sizeof pid]; |
|
|
SSLeay_add_all_algorithms(); |
SSLeay_add_all_algorithms(); |
|
|