Load a multiple load-tester CA certificates from a directory

This commit is contained in:
Martin Willi
2012-10-16 13:43:54 +02:00
parent 24eb73b4fa
commit 3f6e13f553
@@ -16,6 +16,7 @@
#include "load_tester_creds.h" #include "load_tester_creds.h"
#include <time.h> #include <time.h>
#include <sys/stat.h>
#include <daemon.h> #include <daemon.h>
#include <credentials/keys/shared_key.h> #include <credentials/keys/shared_key.h>
@@ -43,6 +44,11 @@ struct private_load_tester_creds_t {
*/ */
certificate_t *ca; certificate_t *ca;
/**
* Trusted CA certificates, including issuer CA
*/
linked_list_t *cas;
/** /**
* serial number to issue certificates * serial number to issue certificates
*/ */
@@ -224,6 +230,42 @@ static certificate_t *load_issuer_cert(private_load_tester_creds_t *this)
BUILD_FROM_FILE, path, BUILD_END); BUILD_FROM_FILE, path, BUILD_END);
} }
/**
* Load (intermediate) CA certificates, hard-coded or from a file
*/
static void load_ca_certs(private_load_tester_creds_t *this)
{
enumerator_t *enumerator;
certificate_t *cert;
struct stat st;
char *path;
path = lib->settings->get_str(lib->settings,
"%s.plugins.load-tester.ca_dir", NULL, charon->name);
if (path)
{
enumerator = enumerator_create_directory(path);
if (enumerator)
{
while (enumerator->enumerate(enumerator, NULL, &path, &st))
{
if (S_ISREG(st.st_mode))
{
DBG1(DBG_CFG, "loading load-tester CA cert from '%s'", path);
cert = lib->creds->create(lib->creds,
CRED_CERTIFICATE, CERT_X509,
BUILD_FROM_FILE, path, BUILD_END);
if (cert)
{
this->cas->insert_last(this->cas, cert);
}
}
}
enumerator->destroy(enumerator);
}
}
}
METHOD(credential_set_t, create_private_enumerator, enumerator_t*, METHOD(credential_set_t, create_private_enumerator, enumerator_t*,
private_load_tester_creds_t *this, key_type_t type, identification_t *id) private_load_tester_creds_t *this, key_type_t type, identification_t *id)
{ {
@@ -249,7 +291,8 @@ METHOD(credential_set_t, create_cert_enumerator, enumerator_t*,
private_load_tester_creds_t *this, certificate_type_t cert, key_type_t key, private_load_tester_creds_t *this, certificate_type_t cert, key_type_t key,
identification_t *id, bool trusted) identification_t *id, bool trusted)
{ {
certificate_t *peer_cert; enumerator_t *enumerator;
certificate_t *peer_cert, *ca_cert;
public_key_t *peer_key, *ca_key; public_key_t *peer_key, *ca_key;
u_int32_t serial; u_int32_t serial;
time_t now; time_t now;
@@ -268,7 +311,7 @@ METHOD(credential_set_t, create_cert_enumerator, enumerator_t*,
} }
if (!id) if (!id)
{ {
return enumerator_create_single(this->ca, NULL); return this->cas->create_enumerator(this->cas);
} }
ca_key = this->ca->get_public_key(this->ca); ca_key = this->ca->get_public_key(this->ca);
if (ca_key) if (ca_key)
@@ -280,10 +323,17 @@ METHOD(credential_set_t, create_cert_enumerator, enumerator_t*,
} }
ca_key->destroy(ca_key); ca_key->destroy(ca_key);
} }
if (this->ca->has_subject(this->ca, id)) enumerator = this->cas->create_enumerator(this->cas);
while (enumerator->enumerate(enumerator, &ca_cert))
{ {
return enumerator_create_single(this->ca, NULL); if (ca_cert->has_subject(ca_cert, id))
{
enumerator->destroy(enumerator);
return enumerator_create_single(ca_cert, NULL);
}
} }
enumerator->destroy(enumerator);
if (!trusted) if (!trusted)
{ {
/* peer certificate, generate on demand */ /* peer certificate, generate on demand */
@@ -350,6 +400,7 @@ METHOD(credential_set_t, create_shared_enumerator, enumerator_t*,
METHOD(load_tester_creds_t, destroy, void, METHOD(load_tester_creds_t, destroy, void,
private_load_tester_creds_t *this) private_load_tester_creds_t *this)
{ {
this->cas->destroy_offset(this->cas, offsetof(certificate_t, destroy));
DESTROY_IF(this->private); DESTROY_IF(this->private);
DESTROY_IF(this->ca); DESTROY_IF(this->ca);
this->psk->destroy(this->psk); this->psk->destroy(this->psk);
@@ -380,12 +431,20 @@ load_tester_creds_t *load_tester_creds_create()
}, },
.private = load_issuer_key(this), .private = load_issuer_key(this),
.ca = load_issuer_cert(this), .ca = load_issuer_cert(this),
.cas = linked_list_create(),
.psk = shared_key_create(SHARED_IKE, .psk = shared_key_create(SHARED_IKE,
chunk_clone(chunk_create(psk, strlen(psk)))), chunk_clone(chunk_create(psk, strlen(psk)))),
.pwd = shared_key_create(SHARED_EAP, .pwd = shared_key_create(SHARED_EAP,
chunk_clone(chunk_create(pwd, strlen(pwd)))), chunk_clone(chunk_create(pwd, strlen(pwd)))),
); );
if (this->ca)
{
this->cas->insert_last(this->cas, this->ca->get_ref(this->ca));
}
load_ca_certs(this);
return &this->public; return &this->public;
} }