From 1a534ae97fc1d9e75384d8df44fef7f788c3629d Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Tue, 22 Jan 2002 23:26:13 +1100 Subject: - provos@cvs.openbsd.org 2002/01/13 17:27:07 [ssh-agent.c] change to use queue.h macros; okay markus@ --- ChangeLog | 5 +- ssh-agent.c | 151 +++++++++++++++++++++++++++--------------------------------- 2 files changed, 73 insertions(+), 83 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9931a8a41..a07bd21c6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -152,6 +152,9 @@ - markus@cvs.openbsd.org 2002/01/12 13:10:29 [auth-skey.c] undo local change + - provos@cvs.openbsd.org 2002/01/13 17:27:07 + [ssh-agent.c] + change to use queue.h macros; okay markus@ 20020121 @@ -7300,4 +7303,4 @@ - Wrote replacements for strlcpy and mkdtemp - Released 1.0pre1 -$Id: ChangeLog,v 1.1766 2002/01/22 12:25:46 djm Exp $ +$Id: ChangeLog,v 1.1767 2002/01/22 12:26:13 djm Exp $ diff --git a/ssh-agent.c b/ssh-agent.c index f5849cee4..84cff1282 100644 --- a/ssh-agent.c +++ b/ssh-agent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-agent.c,v 1.77 2001/12/29 21:56:01 stevesk Exp $ */ +/* $OpenBSD: ssh-agent.c,v 1.78 2002/01/13 17:27:07 provos Exp $ */ /* * Author: Tatu Ylonen @@ -36,7 +36,8 @@ */ #include "includes.h" -RCSID("$OpenBSD: ssh-agent.c,v 1.77 2001/12/29 21:56:01 stevesk Exp $"); +#include +RCSID("$OpenBSD: ssh-agent.c,v 1.78 2002/01/13 17:27:07 provos Exp $"); #include #include @@ -77,14 +78,15 @@ typedef struct { u_int sockets_alloc = 0; SocketEntry *sockets = NULL; -typedef struct { +typedef struct identity { + TAILQ_ENTRY(identity) next; Key *key; char *comment; } Identity; typedef struct { int nentries; - Identity *identities; + TAILQ_HEAD(idqueue, identity) idlist; } Idtab; /* private key table, one per protocol version */ @@ -110,7 +112,7 @@ idtab_init(void) { int i; for (i = 0; i <=2; i++) { - idtable[i].identities = NULL; + TAILQ_INIT(&idtable[i].idlist); idtable[i].nentries = 0; } } @@ -125,19 +127,25 @@ idtab_lookup(int version) } /* return matching private key for given public key */ -static Key * -lookup_private_key(Key *key, int *idx, int version) +static Identity * +lookup_identity(Key *key, int version) { - int i; + Identity *id; + Idtab *tab = idtab_lookup(version); - for (i = 0; i < tab->nentries; i++) { - if (key_equal(key, tab->identities[i].key)) { - if (idx != NULL) - *idx = i; - return tab->identities[i].key; - } + TAILQ_FOREACH(id, &tab->idlist, next) { + if (key_equal(key, id->key)) + return (id); } - return NULL; + return (NULL); +} + +static void +free_identity(Identity *id) +{ + key_free(id->key); + xfree(id->comment); + xfree(id); } /* send list of supported public keys to 'client' */ @@ -146,14 +154,13 @@ process_request_identities(SocketEntry *e, int version) { Idtab *tab = idtab_lookup(version); Buffer msg; - int i; + Identity *id; buffer_init(&msg); buffer_put_char(&msg, (version == 1) ? SSH_AGENT_RSA_IDENTITIES_ANSWER : SSH2_AGENT_IDENTITIES_ANSWER); buffer_put_int(&msg, tab->nentries); - for (i = 0; i < tab->nentries; i++) { - Identity *id = &tab->identities[i]; + TAILQ_FOREACH(id, &tab->idlist, next) { if (id->key->type == KEY_RSA1) { buffer_put_int(&msg, BN_num_bits(id->key->rsa->n)); buffer_put_bignum(&msg, id->key->rsa->e); @@ -176,7 +183,8 @@ process_request_identities(SocketEntry *e, int version) static void process_authentication_challenge1(SocketEntry *e) { - Key *key, *private; + Identity *id; + Key *key; BIGNUM *challenge; int i, len; Buffer msg; @@ -202,8 +210,9 @@ process_authentication_challenge1(SocketEntry *e) if (response_type != 1) goto failure; - private = lookup_private_key(key, NULL, 1); - if (private != NULL) { + id = lookup_identity(key, 1); + if (id != NULL) { + Key *private = id->key; /* Decrypt the challenge using the private key. */ if (rsa_private_decrypt(challenge, challenge, private->rsa) <= 0) goto failure; @@ -244,7 +253,7 @@ static void process_sign_request2(SocketEntry *e) { extern int datafellows; - Key *key, *private; + Key *key; u_char *blob, *data, *signature = NULL; u_int blen, dlen, slen = 0; int flags; @@ -262,9 +271,9 @@ process_sign_request2(SocketEntry *e) key = key_from_blob(blob, blen); if (key != NULL) { - private = lookup_private_key(key, NULL, 2); - if (private != NULL) - ok = key_sign(private, &signature, &slen, data, dlen); + Identity *id = lookup_identity(key, 2); + if (id != NULL) + ok = key_sign(id->key, &signature, &slen, data, dlen); } key_free(key); buffer_init(&msg); @@ -288,7 +297,7 @@ process_sign_request2(SocketEntry *e) static void process_remove_identity(SocketEntry *e, int version) { - Key *key = NULL, *private; + Key *key = NULL; u_char *blob; u_int blen; u_int bits; @@ -312,9 +321,8 @@ process_remove_identity(SocketEntry *e, int version) break; } if (key != NULL) { - int idx; - private = lookup_private_key(key, &idx, version); - if (private != NULL) { + Identity *id = lookup_identity(key, version); + if (id != NULL) { /* * We have this key. Free the old key. Since we * don\'t want to leave empty slots in the middle of @@ -323,19 +331,12 @@ process_remove_identity(SocketEntry *e, int version) * of the array. */ Idtab *tab = idtab_lookup(version); - key_free(tab->identities[idx].key); - xfree(tab->identities[idx].comment); if (tab->nentries < 1) fatal("process_remove_identity: " "internal error: tab->nentries %d", tab->nentries); - if (idx != tab->nentries - 1) { - int i; - for (i = idx; i < tab->nentries - 1; i++) - tab->identities[i] = tab->identities[i+1]; - } - tab->identities[tab->nentries - 1].key = NULL; - tab->identities[tab->nentries - 1].comment = NULL; + TAILQ_REMOVE(&tab->idlist, id, next); + free_identity(id); tab->nentries--; success = 1; } @@ -349,13 +350,14 @@ process_remove_identity(SocketEntry *e, int version) static void process_remove_all_identities(SocketEntry *e, int version) { - u_int i; Idtab *tab = idtab_lookup(version); + Identity *id; /* Loop over all identities and clear the keys. */ - for (i = 0; i < tab->nentries; i++) { - key_free(tab->identities[i].key); - xfree(tab->identities[i].comment); + for (id = TAILQ_FIRST(&tab->idlist); id; + id = TAILQ_FIRST(&tab->idlist)) { + TAILQ_REMOVE(&tab->idlist, id, next); + free_identity(id); } /* Mark that there are no identities. */ @@ -429,14 +431,11 @@ process_add_identity(SocketEntry *e, int version) goto send; } success = 1; - if (lookup_private_key(k, NULL, version) == NULL) { - if (tab->nentries == 0) - tab->identities = xmalloc(sizeof(Identity)); - else - tab->identities = xrealloc(tab->identities, - (tab->nentries + 1) * sizeof(Identity)); - tab->identities[tab->nentries].key = k; - tab->identities[tab->nentries].comment = comment; + if (lookup_identity(k, version) == NULL) { + Identity *id = xmalloc(sizeof(Identity)); + id->key = k; + id->comment = comment; + TAILQ_INSERT_TAIL(&tab->idlist, id, next); /* Increment the number of identities. */ tab->nentries++; } else { @@ -471,36 +470,28 @@ process_add_smartcard_key (SocketEntry *e) tab = idtab_lookup(1); k->type = KEY_RSA1; - if (lookup_private_key(k, NULL, 1) == NULL) { - if (tab->nentries == 0) - tab->identities = xmalloc(sizeof(Identity)); - else - tab->identities = xrealloc(tab->identities, - (tab->nentries + 1) * sizeof(Identity)); + if (lookup_identity(k, 1) == NULL) { + Identity *id = xmalloc(sizeof(Identity)); n = key_new(KEY_RSA1); BN_copy(n->rsa->n, k->rsa->n); BN_copy(n->rsa->e, k->rsa->e); RSA_set_method(n->rsa, sc_get_engine()); - tab->identities[tab->nentries].key = n; - tab->identities[tab->nentries].comment = - xstrdup("rsa1 smartcard"); + id->key = n; + id->comment = xstrdup("rsa1 smartcard"); + TAILQ_INSERT_TAIL(&tab->idlist, id, next); tab->nentries++; } k->type = KEY_RSA; tab = idtab_lookup(2); - if (lookup_private_key(k, NULL, 2) == NULL) { - if (tab->nentries == 0) - tab->identities = xmalloc(sizeof(Identity)); - else - tab->identities = xrealloc(tab->identities, - (tab->nentries + 1) * sizeof(Identity)); + 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()); - tab->identities[tab->nentries].key = n; - tab->identities[tab->nentries].comment = - xstrdup("rsa smartcard"); + id->key = n; + id->comment = xstrdup("rsa smartcard"); + TAILQ_INSERT_TAIL(&tab->idlist, id, next); tab->nentries++; } key_free(k); @@ -513,8 +504,7 @@ send: static void process_remove_smartcard_key(SocketEntry *e) { - Key *k = NULL, *private; - int idx; + Key *k = NULL; int success = 0; char *sc_reader_id = NULL; @@ -525,25 +515,22 @@ process_remove_smartcard_key(SocketEntry *e) if (k == NULL) { error("sc_get_pubkey failed"); } else { + Identity *id; k->type = KEY_RSA1; - private = lookup_private_key(k, &idx, 1); - if (private != NULL) { + id = lookup_identity(k, 1); + if (id != NULL) { Idtab *tab = idtab_lookup(1); - key_free(tab->identities[idx].key); - xfree(tab->identities[idx].comment); - if (idx != tab->nentries) - tab->identities[idx] = tab->identities[tab->nentries]; + TAILQ_REMOVE(&tab->idlist, id, next); + free_identity(id); tab->nentries--; success = 1; } k->type = KEY_RSA; - private = lookup_private_key(k, &idx, 2); - if (private != NULL) { + id = lookup_identity(k, 2); + if (id != NULL) { Idtab *tab = idtab_lookup(2); - key_free(tab->identities[idx].key); - xfree(tab->identities[idx].comment); - if (idx != tab->nentries) - tab->identities[idx] = tab->identities[tab->nentries]; + TAILQ_REMOVE(&tab->idlist, id, next); + free_identity(id); tab->nentries--; success = 1; } -- cgit v1.2.3