mirror of
https://github.com/PowerShell/openssh-portable.git
synced 2025-07-27 07:44:29 +02:00
- provos@cvs.openbsd.org 2002/01/13 17:27:07
[ssh-agent.c] change to use queue.h macros; okay markus@
This commit is contained in:
parent
df224031ca
commit
1a534ae97f
@ -152,6 +152,9 @@
|
|||||||
- markus@cvs.openbsd.org 2002/01/12 13:10:29
|
- markus@cvs.openbsd.org 2002/01/12 13:10:29
|
||||||
[auth-skey.c]
|
[auth-skey.c]
|
||||||
undo local change
|
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
|
20020121
|
||||||
@ -7300,4 +7303,4 @@
|
|||||||
- Wrote replacements for strlcpy and mkdtemp
|
- Wrote replacements for strlcpy and mkdtemp
|
||||||
- Released 1.0pre1
|
- 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 $
|
||||||
|
151
ssh-agent.c
151
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 <ylo@cs.hut.fi>
|
* Author: Tatu Ylonen <ylo@cs.hut.fi>
|
||||||
@ -36,7 +36,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
RCSID("$OpenBSD: ssh-agent.c,v 1.77 2001/12/29 21:56:01 stevesk Exp $");
|
#include <sys/queue.h>
|
||||||
|
RCSID("$OpenBSD: ssh-agent.c,v 1.78 2002/01/13 17:27:07 provos Exp $");
|
||||||
|
|
||||||
#include <openssl/evp.h>
|
#include <openssl/evp.h>
|
||||||
#include <openssl/md5.h>
|
#include <openssl/md5.h>
|
||||||
@ -77,14 +78,15 @@ typedef struct {
|
|||||||
u_int sockets_alloc = 0;
|
u_int sockets_alloc = 0;
|
||||||
SocketEntry *sockets = NULL;
|
SocketEntry *sockets = NULL;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct identity {
|
||||||
|
TAILQ_ENTRY(identity) next;
|
||||||
Key *key;
|
Key *key;
|
||||||
char *comment;
|
char *comment;
|
||||||
} Identity;
|
} Identity;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int nentries;
|
int nentries;
|
||||||
Identity *identities;
|
TAILQ_HEAD(idqueue, identity) idlist;
|
||||||
} Idtab;
|
} Idtab;
|
||||||
|
|
||||||
/* private key table, one per protocol version */
|
/* private key table, one per protocol version */
|
||||||
@ -110,7 +112,7 @@ idtab_init(void)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i <=2; i++) {
|
for (i = 0; i <=2; i++) {
|
||||||
idtable[i].identities = NULL;
|
TAILQ_INIT(&idtable[i].idlist);
|
||||||
idtable[i].nentries = 0;
|
idtable[i].nentries = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -125,19 +127,25 @@ idtab_lookup(int version)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* return matching private key for given public key */
|
/* return matching private key for given public key */
|
||||||
static Key *
|
static Identity *
|
||||||
lookup_private_key(Key *key, int *idx, int version)
|
lookup_identity(Key *key, int version)
|
||||||
{
|
{
|
||||||
int i;
|
Identity *id;
|
||||||
|
|
||||||
Idtab *tab = idtab_lookup(version);
|
Idtab *tab = idtab_lookup(version);
|
||||||
for (i = 0; i < tab->nentries; i++) {
|
TAILQ_FOREACH(id, &tab->idlist, next) {
|
||||||
if (key_equal(key, tab->identities[i].key)) {
|
if (key_equal(key, id->key))
|
||||||
if (idx != NULL)
|
return (id);
|
||||||
*idx = i;
|
|
||||||
return tab->identities[i].key;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
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' */
|
/* send list of supported public keys to 'client' */
|
||||||
@ -146,14 +154,13 @@ process_request_identities(SocketEntry *e, int version)
|
|||||||
{
|
{
|
||||||
Idtab *tab = idtab_lookup(version);
|
Idtab *tab = idtab_lookup(version);
|
||||||
Buffer msg;
|
Buffer msg;
|
||||||
int i;
|
Identity *id;
|
||||||
|
|
||||||
buffer_init(&msg);
|
buffer_init(&msg);
|
||||||
buffer_put_char(&msg, (version == 1) ?
|
buffer_put_char(&msg, (version == 1) ?
|
||||||
SSH_AGENT_RSA_IDENTITIES_ANSWER : SSH2_AGENT_IDENTITIES_ANSWER);
|
SSH_AGENT_RSA_IDENTITIES_ANSWER : SSH2_AGENT_IDENTITIES_ANSWER);
|
||||||
buffer_put_int(&msg, tab->nentries);
|
buffer_put_int(&msg, tab->nentries);
|
||||||
for (i = 0; i < tab->nentries; i++) {
|
TAILQ_FOREACH(id, &tab->idlist, next) {
|
||||||
Identity *id = &tab->identities[i];
|
|
||||||
if (id->key->type == KEY_RSA1) {
|
if (id->key->type == KEY_RSA1) {
|
||||||
buffer_put_int(&msg, BN_num_bits(id->key->rsa->n));
|
buffer_put_int(&msg, BN_num_bits(id->key->rsa->n));
|
||||||
buffer_put_bignum(&msg, id->key->rsa->e);
|
buffer_put_bignum(&msg, id->key->rsa->e);
|
||||||
@ -176,7 +183,8 @@ process_request_identities(SocketEntry *e, int version)
|
|||||||
static void
|
static void
|
||||||
process_authentication_challenge1(SocketEntry *e)
|
process_authentication_challenge1(SocketEntry *e)
|
||||||
{
|
{
|
||||||
Key *key, *private;
|
Identity *id;
|
||||||
|
Key *key;
|
||||||
BIGNUM *challenge;
|
BIGNUM *challenge;
|
||||||
int i, len;
|
int i, len;
|
||||||
Buffer msg;
|
Buffer msg;
|
||||||
@ -202,8 +210,9 @@ process_authentication_challenge1(SocketEntry *e)
|
|||||||
if (response_type != 1)
|
if (response_type != 1)
|
||||||
goto failure;
|
goto failure;
|
||||||
|
|
||||||
private = lookup_private_key(key, NULL, 1);
|
id = lookup_identity(key, 1);
|
||||||
if (private != NULL) {
|
if (id != NULL) {
|
||||||
|
Key *private = id->key;
|
||||||
/* Decrypt the challenge using the private key. */
|
/* Decrypt the challenge using the private key. */
|
||||||
if (rsa_private_decrypt(challenge, challenge, private->rsa) <= 0)
|
if (rsa_private_decrypt(challenge, challenge, private->rsa) <= 0)
|
||||||
goto failure;
|
goto failure;
|
||||||
@ -244,7 +253,7 @@ static void
|
|||||||
process_sign_request2(SocketEntry *e)
|
process_sign_request2(SocketEntry *e)
|
||||||
{
|
{
|
||||||
extern int datafellows;
|
extern int datafellows;
|
||||||
Key *key, *private;
|
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;
|
int flags;
|
||||||
@ -262,9 +271,9 @@ process_sign_request2(SocketEntry *e)
|
|||||||
|
|
||||||
key = key_from_blob(blob, blen);
|
key = key_from_blob(blob, blen);
|
||||||
if (key != NULL) {
|
if (key != NULL) {
|
||||||
private = lookup_private_key(key, NULL, 2);
|
Identity *id = lookup_identity(key, 2);
|
||||||
if (private != NULL)
|
if (id != NULL)
|
||||||
ok = key_sign(private, &signature, &slen, data, dlen);
|
ok = key_sign(id->key, &signature, &slen, data, dlen);
|
||||||
}
|
}
|
||||||
key_free(key);
|
key_free(key);
|
||||||
buffer_init(&msg);
|
buffer_init(&msg);
|
||||||
@ -288,7 +297,7 @@ process_sign_request2(SocketEntry *e)
|
|||||||
static void
|
static void
|
||||||
process_remove_identity(SocketEntry *e, int version)
|
process_remove_identity(SocketEntry *e, int version)
|
||||||
{
|
{
|
||||||
Key *key = NULL, *private;
|
Key *key = NULL;
|
||||||
u_char *blob;
|
u_char *blob;
|
||||||
u_int blen;
|
u_int blen;
|
||||||
u_int bits;
|
u_int bits;
|
||||||
@ -312,9 +321,8 @@ process_remove_identity(SocketEntry *e, int version)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (key != NULL) {
|
if (key != NULL) {
|
||||||
int idx;
|
Identity *id = lookup_identity(key, version);
|
||||||
private = lookup_private_key(key, &idx, version);
|
if (id != NULL) {
|
||||||
if (private != NULL) {
|
|
||||||
/*
|
/*
|
||||||
* We have this key. Free the old key. Since we
|
* We have this key. Free the old key. Since we
|
||||||
* don\'t want to leave empty slots in the middle of
|
* 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.
|
* of the array.
|
||||||
*/
|
*/
|
||||||
Idtab *tab = idtab_lookup(version);
|
Idtab *tab = idtab_lookup(version);
|
||||||
key_free(tab->identities[idx].key);
|
|
||||||
xfree(tab->identities[idx].comment);
|
|
||||||
if (tab->nentries < 1)
|
if (tab->nentries < 1)
|
||||||
fatal("process_remove_identity: "
|
fatal("process_remove_identity: "
|
||||||
"internal error: tab->nentries %d",
|
"internal error: tab->nentries %d",
|
||||||
tab->nentries);
|
tab->nentries);
|
||||||
if (idx != tab->nentries - 1) {
|
TAILQ_REMOVE(&tab->idlist, id, next);
|
||||||
int i;
|
free_identity(id);
|
||||||
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;
|
|
||||||
tab->nentries--;
|
tab->nentries--;
|
||||||
success = 1;
|
success = 1;
|
||||||
}
|
}
|
||||||
@ -349,13 +350,14 @@ process_remove_identity(SocketEntry *e, int version)
|
|||||||
static void
|
static void
|
||||||
process_remove_all_identities(SocketEntry *e, int version)
|
process_remove_all_identities(SocketEntry *e, int version)
|
||||||
{
|
{
|
||||||
u_int i;
|
|
||||||
Idtab *tab = idtab_lookup(version);
|
Idtab *tab = idtab_lookup(version);
|
||||||
|
Identity *id;
|
||||||
|
|
||||||
/* Loop over all identities and clear the keys. */
|
/* Loop over all identities and clear the keys. */
|
||||||
for (i = 0; i < tab->nentries; i++) {
|
for (id = TAILQ_FIRST(&tab->idlist); id;
|
||||||
key_free(tab->identities[i].key);
|
id = TAILQ_FIRST(&tab->idlist)) {
|
||||||
xfree(tab->identities[i].comment);
|
TAILQ_REMOVE(&tab->idlist, id, next);
|
||||||
|
free_identity(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mark that there are no identities. */
|
/* Mark that there are no identities. */
|
||||||
@ -429,14 +431,11 @@ process_add_identity(SocketEntry *e, int version)
|
|||||||
goto send;
|
goto send;
|
||||||
}
|
}
|
||||||
success = 1;
|
success = 1;
|
||||||
if (lookup_private_key(k, NULL, version) == NULL) {
|
if (lookup_identity(k, version) == NULL) {
|
||||||
if (tab->nentries == 0)
|
Identity *id = xmalloc(sizeof(Identity));
|
||||||
tab->identities = xmalloc(sizeof(Identity));
|
id->key = k;
|
||||||
else
|
id->comment = comment;
|
||||||
tab->identities = xrealloc(tab->identities,
|
TAILQ_INSERT_TAIL(&tab->idlist, id, next);
|
||||||
(tab->nentries + 1) * sizeof(Identity));
|
|
||||||
tab->identities[tab->nentries].key = k;
|
|
||||||
tab->identities[tab->nentries].comment = comment;
|
|
||||||
/* Increment the number of identities. */
|
/* Increment the number of identities. */
|
||||||
tab->nentries++;
|
tab->nentries++;
|
||||||
} else {
|
} else {
|
||||||
@ -471,36 +470,28 @@ process_add_smartcard_key (SocketEntry *e)
|
|||||||
|
|
||||||
tab = idtab_lookup(1);
|
tab = idtab_lookup(1);
|
||||||
k->type = KEY_RSA1;
|
k->type = KEY_RSA1;
|
||||||
if (lookup_private_key(k, NULL, 1) == NULL) {
|
if (lookup_identity(k, 1) == NULL) {
|
||||||
if (tab->nentries == 0)
|
Identity *id = xmalloc(sizeof(Identity));
|
||||||
tab->identities = xmalloc(sizeof(Identity));
|
|
||||||
else
|
|
||||||
tab->identities = xrealloc(tab->identities,
|
|
||||||
(tab->nentries + 1) * sizeof(Identity));
|
|
||||||
n = key_new(KEY_RSA1);
|
n = key_new(KEY_RSA1);
|
||||||
BN_copy(n->rsa->n, k->rsa->n);
|
BN_copy(n->rsa->n, k->rsa->n);
|
||||||
BN_copy(n->rsa->e, k->rsa->e);
|
BN_copy(n->rsa->e, k->rsa->e);
|
||||||
RSA_set_method(n->rsa, sc_get_engine());
|
RSA_set_method(n->rsa, sc_get_engine());
|
||||||
tab->identities[tab->nentries].key = n;
|
id->key = n;
|
||||||
tab->identities[tab->nentries].comment =
|
id->comment = xstrdup("rsa1 smartcard");
|
||||||
xstrdup("rsa1 smartcard");
|
TAILQ_INSERT_TAIL(&tab->idlist, id, next);
|
||||||
tab->nentries++;
|
tab->nentries++;
|
||||||
}
|
}
|
||||||
k->type = KEY_RSA;
|
k->type = KEY_RSA;
|
||||||
tab = idtab_lookup(2);
|
tab = idtab_lookup(2);
|
||||||
if (lookup_private_key(k, NULL, 2) == NULL) {
|
if (lookup_identity(k, 2) == NULL) {
|
||||||
if (tab->nentries == 0)
|
Identity *id = xmalloc(sizeof(Identity));
|
||||||
tab->identities = xmalloc(sizeof(Identity));
|
|
||||||
else
|
|
||||||
tab->identities = xrealloc(tab->identities,
|
|
||||||
(tab->nentries + 1) * sizeof(Identity));
|
|
||||||
n = key_new(KEY_RSA);
|
n = key_new(KEY_RSA);
|
||||||
BN_copy(n->rsa->n, k->rsa->n);
|
BN_copy(n->rsa->n, k->rsa->n);
|
||||||
BN_copy(n->rsa->e, k->rsa->e);
|
BN_copy(n->rsa->e, k->rsa->e);
|
||||||
RSA_set_method(n->rsa, sc_get_engine());
|
RSA_set_method(n->rsa, sc_get_engine());
|
||||||
tab->identities[tab->nentries].key = n;
|
id->key = n;
|
||||||
tab->identities[tab->nentries].comment =
|
id->comment = xstrdup("rsa smartcard");
|
||||||
xstrdup("rsa smartcard");
|
TAILQ_INSERT_TAIL(&tab->idlist, id, next);
|
||||||
tab->nentries++;
|
tab->nentries++;
|
||||||
}
|
}
|
||||||
key_free(k);
|
key_free(k);
|
||||||
@ -513,8 +504,7 @@ send:
|
|||||||
static void
|
static void
|
||||||
process_remove_smartcard_key(SocketEntry *e)
|
process_remove_smartcard_key(SocketEntry *e)
|
||||||
{
|
{
|
||||||
Key *k = NULL, *private;
|
Key *k = NULL;
|
||||||
int idx;
|
|
||||||
int success = 0;
|
int success = 0;
|
||||||
char *sc_reader_id = NULL;
|
char *sc_reader_id = NULL;
|
||||||
|
|
||||||
@ -525,25 +515,22 @@ process_remove_smartcard_key(SocketEntry *e)
|
|||||||
if (k == NULL) {
|
if (k == NULL) {
|
||||||
error("sc_get_pubkey failed");
|
error("sc_get_pubkey failed");
|
||||||
} else {
|
} else {
|
||||||
|
Identity *id;
|
||||||
k->type = KEY_RSA1;
|
k->type = KEY_RSA1;
|
||||||
private = lookup_private_key(k, &idx, 1);
|
id = lookup_identity(k, 1);
|
||||||
if (private != NULL) {
|
if (id != NULL) {
|
||||||
Idtab *tab = idtab_lookup(1);
|
Idtab *tab = idtab_lookup(1);
|
||||||
key_free(tab->identities[idx].key);
|
TAILQ_REMOVE(&tab->idlist, id, next);
|
||||||
xfree(tab->identities[idx].comment);
|
free_identity(id);
|
||||||
if (idx != tab->nentries)
|
|
||||||
tab->identities[idx] = tab->identities[tab->nentries];
|
|
||||||
tab->nentries--;
|
tab->nentries--;
|
||||||
success = 1;
|
success = 1;
|
||||||
}
|
}
|
||||||
k->type = KEY_RSA;
|
k->type = KEY_RSA;
|
||||||
private = lookup_private_key(k, &idx, 2);
|
id = lookup_identity(k, 2);
|
||||||
if (private != NULL) {
|
if (id != NULL) {
|
||||||
Idtab *tab = idtab_lookup(2);
|
Idtab *tab = idtab_lookup(2);
|
||||||
key_free(tab->identities[idx].key);
|
TAILQ_REMOVE(&tab->idlist, id, next);
|
||||||
xfree(tab->identities[idx].comment);
|
free_identity(id);
|
||||||
if (idx != tab->nentries)
|
|
||||||
tab->identities[idx] = tab->identities[tab->nentries];
|
|
||||||
tab->nentries--;
|
tab->nentries--;
|
||||||
success = 1;
|
success = 1;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user