vici: Support of raw public keys

This commit is contained in:
Andreas Steffen
2016-01-09 07:23:29 +01:00
parent bffbf2f5fd
commit 87371460f6
9 changed files with 110 additions and 20 deletions
+1
View File
@@ -1,5 +1,6 @@
AM_CPPFLAGS = \
-I$(top_srcdir)/src/libstrongswan \
-I$(top_srcdir)/src/libstrongswan/plugins/pubkey \
-I$(top_srcdir)/src/libhydra \
-I$(top_srcdir)/src/libcharon \
-DIPSEC_PIDDIR=\"${piddir}\"
+52 -6
View File
@@ -48,6 +48,8 @@
#include <collections/array.h>
#include <collections/linked_list.h>
#include <pubkey_cert.h>
#include <stdio.h>
/**
@@ -97,6 +99,11 @@ struct private_vici_config_t {
*/
rwlock_t *lock;
/**
* Credential backend managed by VICI used for our certificates
*/
vici_cred_t *cred;
/**
* Auxiliary certification authority information
*/
@@ -1057,6 +1064,7 @@ CALLBACK(parse_group, bool,
static bool parse_cert(auth_data_t *auth, auth_rule_t rule, chunk_t v)
{
vici_authority_t *authority;
vici_cred_t *cred;
certificate_t *cert;
cert = lib->creds->create(lib->creds, CRED_CERTIFICATE, CERT_X509,
@@ -1068,6 +1076,8 @@ static bool parse_cert(auth_data_t *auth, auth_rule_t rule, chunk_t v)
authority = auth->request->this->authority;
authority->check_for_hash_and_url(authority, cert);
}
cred = auth->request->this->cred;
cert = cred->add_cert(cred, cert);
auth->cfg->add(auth->cfg, rule, cert);
return TRUE;
}
@@ -1092,6 +1102,27 @@ CALLBACK(parse_cacerts, bool,
return parse_cert(auth, AUTH_RULE_CA_CERT, v);
}
/**
* Parse raw public keys
*/
CALLBACK(parse_pubkeys, bool,
auth_data_t *auth, chunk_t v)
{
vici_cred_t *cred;
certificate_t *cert;
cert = lib->creds->create(lib->creds, CRED_CERTIFICATE, CERT_TRUSTED_PUBKEY,
BUILD_BLOB_PEM, v, BUILD_END);
if (cert)
{
cred = auth->request->this->cred;
cert = cred->add_cert(cred, cert);
auth->cfg->add(auth->cfg, AUTH_RULE_SUBJECT_CERT, cert);
return TRUE;
}
return FALSE;
}
/**
* Parse revocation status
*/
@@ -1287,6 +1318,7 @@ CALLBACK(auth_li, bool,
{ "groups", parse_group, auth->cfg },
{ "certs", parse_certs, auth },
{ "cacerts", parse_cacerts, auth },
{ "pubkeys", parse_pubkeys, auth },
};
return parse_rules(rules, countof(rules), name, value,
@@ -1510,20 +1542,32 @@ CALLBACK(peer_sn, bool,
.request = peer->request,
.cfg = auth_cfg_create(),
};
certificate_t *cert;
identification_t *id;
if (!message->parse(message, ctx, NULL, auth_kv, auth_li, &auth))
{
auth.cfg->destroy(auth.cfg);
return FALSE;
}
cert = auth.cfg->get(auth.cfg, AUTH_RULE_SUBJECT_CERT);
id = auth.cfg->get(auth.cfg, AUTH_RULE_IDENTITY);
if (!auth.cfg->get(auth.cfg, AUTH_RULE_IDENTITY))
if (cert)
{
identification_t *id;
certificate_t *cert;
if (id)
{
if (cert->get_type(cert) == CERT_TRUSTED_PUBKEY &&
id->get_type != ID_ANY)
{
pubkey_cert_t *pubkey_cert;
cert = auth.cfg->get(auth.cfg, AUTH_RULE_SUBJECT_CERT);
if (cert)
/* the id is set for informational purposes, only */
pubkey_cert = (pubkey_cert_t*)cert;
pubkey_cert->set_subject(pubkey_cert, id);
}
}
else
{
id = cert->get_subject(cert);
DBG1(DBG_CFG, " id not specified, defaulting to cert id '%Y'",
@@ -2121,7 +2165,8 @@ METHOD(vici_config_t, destroy, void,
* See header
*/
vici_config_t *vici_config_create(vici_dispatcher_t *dispatcher,
vici_authority_t *authority)
vici_authority_t *authority,
vici_cred_t *cred)
{
private_vici_config_t *this;
@@ -2138,6 +2183,7 @@ vici_config_t *vici_config_create(vici_dispatcher_t *dispatcher,
.conns = linked_list_create(),
.lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
.authority = authority,
.cred = cred,
);
manage_commands(this, TRUE);
+4 -1
View File
@@ -26,6 +26,7 @@
#include "vici_dispatcher.h"
#include "vici_authority.h"
#include "vici_cred.h"
#include <config/backend.h>
@@ -51,9 +52,11 @@ struct vici_config_t {
*
* @param dispatcher dispatcher to receive requests from
* @param authority Auxiliary certification authority information
* @param cred in-memory credential backend managed by VICI
* @return config backend
*/
vici_config_t *vici_config_create(vici_dispatcher_t *dispatcher,
vici_authority_t *authority);
vici_authority_t *authority,
vici_cred_t *cred);
#endif /** VICI_CONFIG_H_ @}*/
+1 -1
View File
@@ -308,7 +308,7 @@ static void manage_commands(private_vici_cred_t *this, bool reg)
METHOD(vici_cred_t, add_cert, certificate_t*,
private_vici_cred_t *this, certificate_t *cert)
{
return this->creds->get_cert_ref(this->creds, cert);
return this->creds->add_cert_ref(this->creds, TRUE, cert);
}
METHOD(vici_cred_t, destroy, void,
+2 -1
View File
@@ -131,7 +131,8 @@ static bool register_vici(private_vici_plugin_t *this,
this->authority = vici_authority_create(this->dispatcher,
this->cred);
lib->credmgr->add_set(lib->credmgr, &this->authority->set);
this->config = vici_config_create(this->dispatcher, this->authority);
this->config = vici_config_create(this->dispatcher, this->authority,
this->cred);
this->attrs = vici_attribute_create(this->dispatcher);
this->logger = vici_logger_create(this->dispatcher);