Added private key support to in-memory credential set

This commit is contained in:
Martin Willi
2010-08-25 10:28:23 +02:00
parent 72c6335de9
commit 3dd06bd4ed
2 changed files with 77 additions and 1 deletions
+70 -1
View File
@@ -45,6 +45,11 @@ struct private_mem_cred_t {
*/
linked_list_t *untrusted;
/**
* List of private keys, private_key_t
*/
linked_list_t *keys;
/**
* List of shared keys, as shared_entry_t
*/
@@ -146,6 +151,67 @@ METHOD(mem_cred_t, add_cert, void,
this->lock->unlock(this->lock);
}
/**
* Data for key enumerator
*/
typedef struct {
rwlock_t *lock;
key_type_t type;
identification_t *id;
} key_data_t;
/**
* Destroy key enumerator data
*/
static void key_data_destroy(key_data_t *data)
{
data->lock->unlock(data->lock);
free(data);
}
/**
* filter function for private key enumerator
*/
static bool key_filter(key_data_t *data, private_key_t **in, private_key_t **out)
{
private_key_t *key;
key = *in;
if (data->type == KEY_ANY || data->type == key->get_type(key))
{
if (data->id == NULL ||
key->has_fingerprint(key, data->id->get_encoding(data->id)))
{
*out = key;
return TRUE;
}
}
return FALSE;
}
METHOD(credential_set_t, create_private_enumerator, enumerator_t*,
private_mem_cred_t *this, key_type_t type, identification_t *id)
{
key_data_t *data;
INIT(data,
.lock = this->lock,
.type = type,
.id = id,
);
this->lock->read_lock(this->lock);
return enumerator_create_filter(this->keys->create_enumerator(this->keys),
(void*)key_filter, data, (void*)key_data_destroy);
}
METHOD(mem_cred_t, add_key, void,
private_mem_cred_t *this, private_key_t *key)
{
this->lock->write_lock(this->lock);
this->keys->insert_last(this->keys, key);
this->lock->unlock(this->lock);
}
/**
* Shared key entry
*/
@@ -302,6 +368,7 @@ METHOD(mem_cred_t, destroy, void,
offsetof(certificate_t, destroy));
this->untrusted->destroy_offset(this->untrusted,
offsetof(certificate_t, destroy));
this->keys->destroy_offset(this->keys, offsetof(private_key_t, destroy));
this->shared->destroy_function(this->shared, (void*)shared_entry_destroy);
this->lock->destroy(this->lock);
free(this);
@@ -318,17 +385,19 @@ mem_cred_t *mem_cred_create()
.public = {
.set = {
.create_shared_enumerator = _create_shared_enumerator,
.create_private_enumerator = (void*)return_null,
.create_private_enumerator = _create_private_enumerator,
.create_cert_enumerator = _create_cert_enumerator,
.create_cdp_enumerator = (void*)return_null,
.cache_cert = (void*)nop,
},
.add_cert = _add_cert,
.add_key = _add_key,
.add_shared = _add_shared,
.destroy = _destroy,
},
.trusted = linked_list_create(),
.untrusted = linked_list_create(),
.keys = linked_list_create(),
.shared = linked_list_create(),
.lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
);
@@ -43,6 +43,13 @@ struct mem_cred_t {
*/
void (*add_cert)(mem_cred_t *this, bool trusted, certificate_t *cert);
/**
* Add a private key to the credential set.
*
* @param key key, reference gets owned by set
*/
void (*add_key)(mem_cred_t *this, private_key_t *key);
/**
* Add a shared key to the credential set.
*