Added private key support to in-memory credential set
This commit is contained in:
@@ -45,6 +45,11 @@ struct private_mem_cred_t {
|
|||||||
*/
|
*/
|
||||||
linked_list_t *untrusted;
|
linked_list_t *untrusted;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of private keys, private_key_t
|
||||||
|
*/
|
||||||
|
linked_list_t *keys;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of shared keys, as shared_entry_t
|
* List of shared keys, as shared_entry_t
|
||||||
*/
|
*/
|
||||||
@@ -146,6 +151,67 @@ METHOD(mem_cred_t, add_cert, void,
|
|||||||
this->lock->unlock(this->lock);
|
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
|
* Shared key entry
|
||||||
*/
|
*/
|
||||||
@@ -302,6 +368,7 @@ METHOD(mem_cred_t, destroy, void,
|
|||||||
offsetof(certificate_t, destroy));
|
offsetof(certificate_t, destroy));
|
||||||
this->untrusted->destroy_offset(this->untrusted,
|
this->untrusted->destroy_offset(this->untrusted,
|
||||||
offsetof(certificate_t, destroy));
|
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->shared->destroy_function(this->shared, (void*)shared_entry_destroy);
|
||||||
this->lock->destroy(this->lock);
|
this->lock->destroy(this->lock);
|
||||||
free(this);
|
free(this);
|
||||||
@@ -318,17 +385,19 @@ mem_cred_t *mem_cred_create()
|
|||||||
.public = {
|
.public = {
|
||||||
.set = {
|
.set = {
|
||||||
.create_shared_enumerator = _create_shared_enumerator,
|
.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_cert_enumerator = _create_cert_enumerator,
|
||||||
.create_cdp_enumerator = (void*)return_null,
|
.create_cdp_enumerator = (void*)return_null,
|
||||||
.cache_cert = (void*)nop,
|
.cache_cert = (void*)nop,
|
||||||
},
|
},
|
||||||
.add_cert = _add_cert,
|
.add_cert = _add_cert,
|
||||||
|
.add_key = _add_key,
|
||||||
.add_shared = _add_shared,
|
.add_shared = _add_shared,
|
||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
},
|
},
|
||||||
.trusted = linked_list_create(),
|
.trusted = linked_list_create(),
|
||||||
.untrusted = linked_list_create(),
|
.untrusted = linked_list_create(),
|
||||||
|
.keys = linked_list_create(),
|
||||||
.shared = linked_list_create(),
|
.shared = linked_list_create(),
|
||||||
.lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
|
.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);
|
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.
|
* Add a shared key to the credential set.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user