pluto and scepclient now use the x509 plugin for certificates

This commit is contained in:
Andreas Steffen
2009-09-27 23:09:30 +02:00
parent 727b0f11e2
commit 0eff9f6539
27 changed files with 1136 additions and 1640 deletions
+115 -104
View File
@@ -48,7 +48,6 @@ fetch_req_t empty_fetch_req = {
0 , /* trials */
{ NULL, 0}, /* issuer */
{ NULL, 0}, /* authKeyID */
{ NULL, 0}, /* authKeySerialNumber */
NULL /* distributionPoints */
};
@@ -251,10 +250,9 @@ void wake_fetch_thread(const char *who)
*/
static void free_fetch_request(fetch_req_t *req)
{
req->distributionPoints->destroy_function(req->distributionPoints, free);
free(req->issuer.ptr);
free(req->authKeySerialNumber.ptr);
free(req->authKeyID.ptr);
free_generalNames(req->distributionPoints, TRUE);
free(req);
}
@@ -286,47 +284,39 @@ x509crl_t* fetch_crl(char *url)
/**
* Complete a distributionPoint URI with ca information
*/
static char* complete_uri(chunk_t distPoint, const char *ldaphost)
static char* complete_uri(char *distPoint, const char *ldaphost)
{
char *uri;
char *ptr = distPoint.ptr;
size_t len = distPoint.len;
char *symbol = strchr(distPoint, ':');
char *symbol = memchr(ptr, ':', len);
if (symbol != NULL)
if (symbol)
{
size_t type_len = symbol - ptr;
int type_len = symbol - distPoint;
if (type_len >= 4 && strncasecmp(ptr, "ldap", 4) == 0)
if (type_len >= 4 && strncasecmp(distPoint, "ldap", 4) == 0)
{
ptr = symbol + 1;
len -= (type_len + 1);
char *ptr = symbol + 1;
int len = strlen(distPoint) - (type_len + 1);
if (len > 2 && *ptr++ == '/' && *ptr++ == '/')
{
len -= 2;
symbol = memchr(ptr, '/', len);
symbol = strchr(ptr, '/');
if (symbol != NULL && symbol - ptr == 0 && ldaphost != NULL)
if (symbol && symbol - ptr == 0 && ldaphost)
{
uri = malloc(distPoint.len + strlen(ldaphost) + 1);
char uri[BUF_LEN];
/* insert the ldaphost into the uri */
sprintf(uri, "%.*s%s%.*s"
, (int)(distPoint.len - len), distPoint.ptr
, ldaphost
, (int)len, symbol);
return uri;
snprintf(uri, BUF_LEN, "%.*s%s%.*s", strlen(distPoint)-len,
distPoint, ldaphost, len, symbol);
return strdup(uri);
}
}
}
}
/* default action: copy distributionPoint without change */
uri = malloc(distPoint.len + 1);
sprintf(uri, "%.*s", (int)distPoint.len, distPoint.ptr);
return uri;
return strdup(distPoint);
}
/**
@@ -343,40 +333,40 @@ static void fetch_crls(bool cache_crls)
while (req != NULL)
{
enumerator_t *enumerator;
char *point;
bool valid_crl = FALSE;
generalName_t *gn = req->distributionPoints;
const char *ldaphost;
ca_info_t *ca;
lock_ca_info_list("fetch_crls");
ca = get_ca_info(req->issuer, req->authKeySerialNumber, req->authKeyID);
ca = get_ca_info(req->issuer, req->authKeyID);
ldaphost = (ca == NULL)? NULL : ca->ldaphost;
while (gn != NULL)
enumerator = req->distributionPoints->create_enumerator(req->distributionPoints);
while (enumerator->enumerate(enumerator, &point))
{
char *uri = complete_uri(gn->name, ldaphost);
x509crl_t *crl;
char *uri;
uri = complete_uri(point, ldaphost);
crl = fetch_crl(uri);
free(uri);
if (crl)
{
chunk_t crl_uri = chunk_clone(gn->name);
if (insert_crl(crl, crl_uri, cache_crls))
if (insert_crl(crl, point, cache_crls))
{
DBG(DBG_CONTROL,
DBG_log("we have a valid crl")
)
valid_crl = TRUE;
free(uri);
break;
}
}
free(uri);
gn = gn->next;
}
enumerator->destroy(enumerator);
unlock_ca_info_list("fetch_crls");
if (valid_crl)
@@ -401,19 +391,11 @@ static void fetch_crls(bool cache_crls)
static void fetch_ocsp_status(ocsp_location_t* location)
{
chunk_t request, response;
char *uri;
chunk_t request = build_ocsp_request(location);
chunk_t response = chunk_empty;
request = build_ocsp_request(location);
response = chunk_empty;
/* we need a null terminated string for curl */
uri = malloc(location->uri.len + 1);
memcpy(uri, location->uri.ptr, location->uri.len);
*(uri + location->uri.len) = '\0';
DBG1(" requesting ocsp status from '%s' ...", uri);
if (lib->fetcher->fetch(lib->fetcher, uri, &response,
DBG1(" requesting ocsp status from '%s' ...", location->uri);
if (lib->fetcher->fetch(lib->fetcher, location->uri, &response,
FETCH_REQUEST_DATA, request,
FETCH_REQUEST_TYPE, "application/ocsp-request",
FETCH_END) == SUCCESS)
@@ -422,10 +404,9 @@ static void fetch_ocsp_status(ocsp_location_t* location)
}
else
{
DBG1("ocsp request to %s failed", uri);
DBG1("ocsp request to %s failed", location->uri);
}
free(uri);
free(request.ptr);
chunk_free(&location->nonce);
@@ -554,62 +535,95 @@ void free_ocsp_fetch(void)
/**
* Add additional distribution points
* Add an additional distribution point
*/
void add_distribution_points(const generalName_t *newPoints ,generalName_t **distributionPoints)
void add_distribution_point(linked_list_t *points, char *new_point)
{
while (newPoints != NULL)
char *point;
bool add = TRUE;
enumerator_t *enumerator;
if (new_point == NULL || *new_point == '\0')
{
/* skip empty distribution point */
if (newPoints->name.len > 0)
return;
}
enumerator = points->create_enumerator(points);
while (enumerator->enumerate(enumerator, &point))
{
if (streq(point, new_point))
{
bool add = TRUE;
generalName_t *gn = *distributionPoints;
while (gn != NULL)
{
if (gn->kind == newPoints->kind
&& gn->name.len == newPoints->name.len
&& memeq(gn->name.ptr, newPoints->name.ptr, gn->name.len))
{
/* skip if the distribution point is already present */
add = FALSE;
break;
}
gn = gn->next;
}
if (add)
{
/* clone additional distribution point */
gn = clone_thing(*newPoints);
gn->name = chunk_clone(newPoints->name);
/* insert additional CRL distribution point */
gn->next = *distributionPoints;
*distributionPoints = gn;
}
add = FALSE;
break;
}
newPoints = newPoints->next;
}
enumerator->destroy(enumerator);
if (add)
{
points->insert_last(points, strdup(new_point));
}
}
fetch_req_t* build_crl_fetch_request(chunk_t issuer, chunk_t authKeySerialNumber,
chunk_t authKeyID, const generalName_t *gn)
/**
* Add additional distribution points
*/
void add_distribution_points(linked_list_t *points, linked_list_t *new_points)
{
char *new_point;
enumerator_t *enumerator;
enumerator = new_points->create_enumerator(new_points);
while (enumerator->enumerate(enumerator, &new_point))
{
bool add = TRUE;
char *point;
enumerator_t *enumerator;
enumerator = points->create_enumerator(points);
while (enumerator->enumerate(enumerator, &point))
{
if (streq(point, new_point))
{
add = FALSE;
break;
}
}
enumerator->destroy(enumerator);
if (add)
{
points->insert_last(points, strdup(new_point));
}
}
enumerator->destroy(enumerator);
}
fetch_req_t* build_crl_fetch_request(chunk_t issuer, chunk_t authKeyID,
linked_list_t *distributionPoints)
{
char *point;
enumerator_t *enumerator;
fetch_req_t *req = malloc_thing(fetch_req_t);
*req = empty_fetch_req;
memset(req, 0, sizeof(fetch_req_t));
req->distributionPoints = linked_list_create();
/* note current time */
req->installed = time(NULL);
/* clone fields */
req->issuer = chunk_clone(issuer);
req->authKeySerialNumber = chunk_clone(authKeySerialNumber);
req->authKeyID = chunk_clone(authKeyID);
/* copy distribution points */
add_distribution_points(gn, &req->distributionPoints);
enumerator = distributionPoints->create_enumerator(distributionPoints);
while (enumerator->enumerate(enumerator, &point))
{
req->distributionPoints->insert_last(req->distributionPoints,
strdup(point));
}
enumerator->destroy(enumerator);
return req;
}
@@ -626,9 +640,8 @@ void add_crl_fetch_request(fetch_req_t *req)
while (r != NULL)
{
if ((req->authKeyID.ptr != NULL)? same_keyid(req->authKeyID, r->authKeyID)
: (same_dn(req->issuer, r->issuer)
&& same_serial(req->authKeySerialNumber, r->authKeySerialNumber)))
if (req->authKeyID.ptr ? same_keyid(req->authKeyID, r->authKeyID) :
same_dn(req->issuer, r->issuer))
{
/* there is already a fetch request */
DBG(DBG_CONTROL,
@@ -636,7 +649,8 @@ void add_crl_fetch_request(fetch_req_t *req)
)
/* there might be new distribution points */
add_distribution_points(req->distributionPoints, &r->distributionPoints);
add_distribution_points(r->distributionPoints,
req->distributionPoints);
unlock_crl_fetch_list("add_crl_fetch_request");
free_fetch_request(req);
@@ -672,17 +686,20 @@ void add_ocsp_fetch_request(ocsp_location_t *location, chunk_t serialNumber)
/**
* List all distribution points
*/
void list_distribution_points(const generalName_t *gn)
void list_distribution_points(linked_list_t *distributionPoints)
{
bool first_gn = TRUE;
char *point;
bool first_point = TRUE;
enumerator_t *enumerator;
while (gn != NULL)
enumerator = distributionPoints->create_enumerator(distributionPoints);
while (enumerator->enumerate(enumerator, &point))
{
whack_log(RC_COMMENT, " %s '%.*s'", (first_gn)? "distPts: "
:" ", (int)gn->name.len, gn->name.ptr);
first_gn = FALSE;
gn = gn->next;
whack_log(RC_COMMENT, " %s '%s'",
(first_point)? "distPts: " : " ", point);
first_point = FALSE;
}
enumerator->destroy(enumerator);
}
/**
@@ -716,12 +733,6 @@ void list_crl_fetch_requests(bool utc)
, buf, BUF_LEN);
whack_log(RC_COMMENT, " authkey: %s", buf);
}
if (req->authKeySerialNumber.ptr != NULL)
{
datatot(req->authKeySerialNumber.ptr, req->authKeySerialNumber.len, ':'
, buf, BUF_LEN);
whack_log(RC_COMMENT, " aserial: %s", buf);
}
list_distribution_points(req->distributionPoints);
req = req->next;
}