pki: --verify command optionally takes directories for CAs and CRLs
This commit is contained in:
+88
-18
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2016 Tobias Brunner
|
* Copyright (C) 2016-2018 Tobias Brunner
|
||||||
* Copyright (C) 2009 Martin Willi
|
* Copyright (C) 2009 Martin Willi
|
||||||
* HSR Hochschule fuer Technik Rapperswil
|
* HSR Hochschule fuer Technik Rapperswil
|
||||||
*
|
*
|
||||||
@@ -14,6 +14,9 @@
|
|||||||
* for more details.
|
* for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include "pki.h"
|
#include "pki.h"
|
||||||
@@ -22,6 +25,84 @@
|
|||||||
#include <credentials/certificates/x509.h>
|
#include <credentials/certificates/x509.h>
|
||||||
#include <credentials/sets/mem_cred.h>
|
#include <credentials/sets/mem_cred.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a CA or CRL and add it to the credential set
|
||||||
|
*/
|
||||||
|
static bool load_cert(mem_cred_t *creds, char *path, certificate_type_t subtype)
|
||||||
|
{
|
||||||
|
certificate_t *cert;
|
||||||
|
char *credname;
|
||||||
|
|
||||||
|
switch (subtype)
|
||||||
|
{
|
||||||
|
case CERT_X509:
|
||||||
|
credname = "CA certificate";
|
||||||
|
break;
|
||||||
|
case CERT_X509_CRL:
|
||||||
|
credname = "CRL";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
cert = lib->creds->create(lib->creds,
|
||||||
|
CRED_CERTIFICATE, subtype,
|
||||||
|
BUILD_FROM_FILE, path, BUILD_END);
|
||||||
|
if (!cert)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "parsing %s from '%s' failed\n", credname, path);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (subtype == CERT_X509_CRL)
|
||||||
|
{
|
||||||
|
creds->add_crl(creds, (crl_t*)cert);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
creds->add_cert(creds, TRUE, cert);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load CA cert or CRL either from a file or a path
|
||||||
|
*/
|
||||||
|
static bool load_certs(mem_cred_t *creds, char *path,
|
||||||
|
certificate_type_t subtype)
|
||||||
|
{
|
||||||
|
enumerator_t *enumerator;
|
||||||
|
struct stat st;
|
||||||
|
bool loaded = FALSE;
|
||||||
|
|
||||||
|
if (stat(path, &st))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "failed to access '%s': %s\n", path, strerror(errno));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (S_ISDIR(st.st_mode))
|
||||||
|
{
|
||||||
|
enumerator = enumerator_create_directory(path);
|
||||||
|
if (!enumerator)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "directory '%s' can not be opened: %s",
|
||||||
|
path, strerror(errno));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
while (enumerator->enumerate(enumerator, NULL, &path, &st))
|
||||||
|
{
|
||||||
|
if (S_ISREG(st.st_mode) && load_cert(creds, path, subtype))
|
||||||
|
{
|
||||||
|
loaded = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
loaded = load_cert(creds, path, subtype);
|
||||||
|
}
|
||||||
|
return loaded;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify a certificate signature
|
* Verify a certificate signature
|
||||||
*/
|
*/
|
||||||
@@ -49,28 +130,16 @@ static int verify()
|
|||||||
file = arg;
|
file = arg;
|
||||||
continue;
|
continue;
|
||||||
case 'c':
|
case 'c':
|
||||||
cert = lib->creds->create(lib->creds,
|
if (load_certs(creds, arg, CERT_X509))
|
||||||
CRED_CERTIFICATE, CERT_X509,
|
|
||||||
BUILD_FROM_FILE, arg, BUILD_END);
|
|
||||||
if (!cert)
|
|
||||||
{
|
{
|
||||||
fprintf(stderr, "parsing CA certificate failed\n");
|
has_ca = TRUE;
|
||||||
goto end;
|
|
||||||
}
|
}
|
||||||
has_ca = TRUE;
|
|
||||||
creds->add_cert(creds, TRUE, cert);
|
|
||||||
continue;
|
continue;
|
||||||
case 'l':
|
case 'l':
|
||||||
cert = lib->creds->create(lib->creds,
|
if (load_certs(creds, arg, CERT_X509_CRL))
|
||||||
CRED_CERTIFICATE, CERT_X509_CRL,
|
|
||||||
BUILD_FROM_FILE, arg, BUILD_END);
|
|
||||||
if (!cert)
|
|
||||||
{
|
{
|
||||||
fprintf(stderr, "parsing CRL failed\n");
|
online = TRUE;
|
||||||
goto end;
|
|
||||||
}
|
}
|
||||||
online = TRUE;
|
|
||||||
creds->add_crl(creds, (crl_t*)cert);
|
|
||||||
continue;
|
continue;
|
||||||
case 'o':
|
case 'o':
|
||||||
online = TRUE;
|
online = TRUE;
|
||||||
@@ -108,7 +177,7 @@ static int verify()
|
|||||||
fprintf(stderr, "parsing certificate failed\n");
|
fprintf(stderr, "parsing certificate failed\n");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
creds->add_cert(creds, !has_ca, cert);
|
cert = creds->add_cert_ref(creds, !has_ca, cert);
|
||||||
|
|
||||||
enumerator = lib->credmgr->create_trusted_enumerator(lib->credmgr,
|
enumerator = lib->credmgr->create_trusted_enumerator(lib->credmgr,
|
||||||
KEY_ANY, cert->get_subject(cert), online);
|
KEY_ANY, cert->get_subject(cert), online);
|
||||||
@@ -153,6 +222,7 @@ static int verify()
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
|
cert->destroy(cert);
|
||||||
|
|
||||||
if (!trusted)
|
if (!trusted)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -47,10 +47,13 @@ X.509 certificate to verify. If not given it is read from \fISTDIN\fR.
|
|||||||
.TP
|
.TP
|
||||||
.BI "\-c, \-\-cacert " file
|
.BI "\-c, \-\-cacert " file
|
||||||
CA certificate to use for trustchain verification. If not given the certificate
|
CA certificate to use for trustchain verification. If not given the certificate
|
||||||
is assumed to be self\-signed.
|
is assumed to be self\-signed. May optionally be a path to a directory from
|
||||||
|
which CA certificates are loaded. Can be used multiple times.
|
||||||
.TP
|
.TP
|
||||||
.BI "\-l, \-\-crl " file
|
.BI "\-l, \-\-crl " file
|
||||||
Local CRL to use for trustchain verification. Implies \fB-o\fR.
|
Local CRL to use for trustchain verification. May optionally be a path to a
|
||||||
|
directory from which CRLs are loaded. Can be used multiple times.
|
||||||
|
Implies \fB-o\fR.
|
||||||
.TP
|
.TP
|
||||||
.BI "\-o, \-\-online
|
.BI "\-o, \-\-online
|
||||||
Enable online CRL/OCSP revocation checking.
|
Enable online CRL/OCSP revocation checking.
|
||||||
|
|||||||
Reference in New Issue
Block a user