attest can query components
This commit is contained in:
@@ -27,7 +27,7 @@ attest_SOURCES = attest.c \
|
|||||||
attest_db.h attest_db.c \
|
attest_db.h attest_db.c \
|
||||||
tables.sql data.sql
|
tables.sql data.sql
|
||||||
attest_LDADD = \
|
attest_LDADD = \
|
||||||
$(top_builddir)/src/libpts/libpts.la \
|
|
||||||
$(top_builddir)/src/libimcv/libimcv.la \
|
$(top_builddir)/src/libimcv/libimcv.la \
|
||||||
|
$(top_builddir)/src/libpts/libpts.la \
|
||||||
$(top_builddir)/src/libstrongswan/libstrongswan.la
|
$(top_builddir)/src/libstrongswan/libstrongswan.la
|
||||||
attest.o : $(top_builddir)/config.status
|
attest.o : $(top_builddir)/config.status
|
||||||
|
|||||||
@@ -19,14 +19,63 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
|
||||||
#include <library.h>
|
#include <library.h>
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <imcv.h>
|
||||||
|
#include <libpts.h>
|
||||||
#include <pts/pts_meas_algo.h>
|
#include <pts/pts_meas_algo.h>
|
||||||
|
|
||||||
#include "attest_db.h"
|
#include "attest_db.h"
|
||||||
#include "attest_usage.h"
|
#include "attest_usage.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* global debug output variables
|
||||||
|
*/
|
||||||
|
static int debug_level = 0;
|
||||||
|
static bool stderr_quiet = TRUE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* attest dbg function
|
||||||
|
*/
|
||||||
|
static void attest_dbg(debug_t group, level_t level, char *fmt, ...)
|
||||||
|
{
|
||||||
|
int priority = LOG_INFO;
|
||||||
|
char buffer[8192];
|
||||||
|
char *current = buffer, *next;
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
if (level <= debug_level)
|
||||||
|
{
|
||||||
|
if (!stderr_quiet)
|
||||||
|
{
|
||||||
|
va_start(args, fmt);
|
||||||
|
vfprintf(stderr, fmt, args);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write in memory buffer first */
|
||||||
|
va_start(args, fmt);
|
||||||
|
vsnprintf(buffer, sizeof(buffer), fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
/* do a syslog with every line */
|
||||||
|
while (current)
|
||||||
|
{
|
||||||
|
next = strchr(current, '\n');
|
||||||
|
if (next)
|
||||||
|
{
|
||||||
|
*(next++) = '\0';
|
||||||
|
}
|
||||||
|
syslog(priority, "%s\n", current);
|
||||||
|
current = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* global attestation database object
|
* global attestation database object
|
||||||
*/
|
*/
|
||||||
@@ -46,6 +95,7 @@ static void do_args(int argc, char *argv[])
|
|||||||
OP_UNDEF,
|
OP_UNDEF,
|
||||||
OP_USAGE,
|
OP_USAGE,
|
||||||
OP_FILES,
|
OP_FILES,
|
||||||
|
OP_COMPONENTS,
|
||||||
OP_PRODUCTS,
|
OP_PRODUCTS,
|
||||||
OP_HASHES,
|
OP_HASHES,
|
||||||
OP_ADD,
|
OP_ADD,
|
||||||
@@ -61,6 +111,7 @@ static void do_args(int argc, char *argv[])
|
|||||||
|
|
||||||
struct option long_opts[] = {
|
struct option long_opts[] = {
|
||||||
{ "help", no_argument, NULL, 'h' },
|
{ "help", no_argument, NULL, 'h' },
|
||||||
|
{ "components", no_argument, NULL, 'c' },
|
||||||
{ "files", no_argument, NULL, 'f' },
|
{ "files", no_argument, NULL, 'f' },
|
||||||
{ "products", no_argument, NULL, 'p' },
|
{ "products", no_argument, NULL, 'p' },
|
||||||
{ "hashes", no_argument, NULL, 'H' },
|
{ "hashes", no_argument, NULL, 'H' },
|
||||||
@@ -93,6 +144,9 @@ static void do_args(int argc, char *argv[])
|
|||||||
case 'h':
|
case 'h':
|
||||||
op = OP_USAGE;
|
op = OP_USAGE;
|
||||||
break;
|
break;
|
||||||
|
case 'c':
|
||||||
|
op = OP_COMPONENTS;
|
||||||
|
continue;
|
||||||
case 'f':
|
case 'f':
|
||||||
op = OP_FILES;
|
op = OP_FILES;
|
||||||
continue;
|
continue;
|
||||||
@@ -180,6 +234,9 @@ static void do_args(int argc, char *argv[])
|
|||||||
case OP_PRODUCTS:
|
case OP_PRODUCTS:
|
||||||
attest->list_products(attest);
|
attest->list_products(attest);
|
||||||
break;
|
break;
|
||||||
|
case OP_COMPONENTS:
|
||||||
|
attest->list_components(attest);
|
||||||
|
break;
|
||||||
case OP_FILES:
|
case OP_FILES:
|
||||||
attest->list_files(attest);
|
attest->list_files(attest);
|
||||||
break;
|
break;
|
||||||
@@ -205,6 +262,10 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
char *uri;
|
char *uri;
|
||||||
|
|
||||||
|
/* enable attest debugging hook */
|
||||||
|
dbg = attest_dbg;
|
||||||
|
openlog("attest", 0, LOG_DEBUG);
|
||||||
|
|
||||||
atexit(library_deinit);
|
atexit(library_deinit);
|
||||||
|
|
||||||
/* initialize library */
|
/* initialize library */
|
||||||
@@ -230,9 +291,15 @@ int main(int argc, char *argv[])
|
|||||||
exit(SS_RC_INITIALIZATION_FAILED);
|
exit(SS_RC_INITIALIZATION_FAILED);
|
||||||
}
|
}
|
||||||
atexit(cleanup);
|
atexit(cleanup);
|
||||||
|
libimcv_init();
|
||||||
|
libpts_init();
|
||||||
|
|
||||||
do_args(argc, argv);
|
do_args(argc, argv);
|
||||||
|
|
||||||
|
libpts_deinit();
|
||||||
|
libimcv_deinit();
|
||||||
|
closelog();
|
||||||
|
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,9 @@
|
|||||||
|
|
||||||
#include "attest_db.h"
|
#include "attest_db.h"
|
||||||
|
|
||||||
|
#include "libpts.h"
|
||||||
|
#include "pts/components/pts_comp_func_name.h"
|
||||||
|
|
||||||
typedef struct private_attest_db_t private_attest_db_t;
|
typedef struct private_attest_db_t private_attest_db_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -318,6 +321,62 @@ METHOD(attest_db_t, set_algo, void,
|
|||||||
this->algo = algo;
|
this->algo = algo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
METHOD(attest_db_t, list_components, void,
|
||||||
|
private_attest_db_t *this)
|
||||||
|
{
|
||||||
|
enumerator_t *e;
|
||||||
|
enum_name_t *names, *types;
|
||||||
|
pts_comp_func_name_t *cfn;
|
||||||
|
int type, cid, vid, name, qualifier, count = 0;
|
||||||
|
char flags[8];
|
||||||
|
|
||||||
|
if (this->pid)
|
||||||
|
{
|
||||||
|
e = this->db->query(this->db,
|
||||||
|
"SELECT c.id, c.vendor_id, c.name, c.qualifier "
|
||||||
|
"FROM components AS c "
|
||||||
|
"JOIN product_component AS pc ON c.id = pc.component "
|
||||||
|
"WHERE pc.product = ? ORDER BY c.vendor_id, c.name, c.qualifier",
|
||||||
|
DB_INT, this->pid, DB_INT, DB_INT, DB_INT, DB_INT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
e = this->db->query(this->db,
|
||||||
|
"SELECT id, vendor_id, name, qualifier FROM components "
|
||||||
|
"ORDER BY vendor_id, name, qualifier",
|
||||||
|
DB_INT, DB_INT, DB_INT, DB_INT);
|
||||||
|
}
|
||||||
|
if (e)
|
||||||
|
{
|
||||||
|
while (e->enumerate(e, &cid, &vid, &name, &qualifier))
|
||||||
|
{
|
||||||
|
printf("%3d: 0x%06x/0x%08x-0x%02x", cid, vid, name, qualifier);
|
||||||
|
|
||||||
|
cfn = pts_comp_func_name_create(vid, name, qualifier);
|
||||||
|
names = pts_components->get_comp_func_names(pts_components, vid);
|
||||||
|
types = pts_components->get_qualifier_type_names(pts_components, vid);
|
||||||
|
type = pts_components->get_qualifier(pts_components, cfn, flags);
|
||||||
|
if (names && types)
|
||||||
|
{
|
||||||
|
printf(" %N '%N' [%s] '%N'", pen_names, vid, names, name, flags,
|
||||||
|
types, type);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
cfn->destroy(cfn);
|
||||||
|
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
e->destroy(e);
|
||||||
|
|
||||||
|
printf("%d component%s found", count, (count == 1) ? "" : "s");
|
||||||
|
if (this->product)
|
||||||
|
{
|
||||||
|
printf(" for product '%s'", this->product);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
METHOD(attest_db_t, list_files, void,
|
METHOD(attest_db_t, list_files, void,
|
||||||
private_attest_db_t *this)
|
private_attest_db_t *this)
|
||||||
{
|
{
|
||||||
@@ -383,7 +442,7 @@ METHOD(attest_db_t, list_products, void,
|
|||||||
{
|
{
|
||||||
while (e->enumerate(e, &pid, &product))
|
while (e->enumerate(e, &pid, &product))
|
||||||
{
|
{
|
||||||
printf("%3d: %s\n", pid, product);
|
printf("%3d: %s\n", pid, product);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
e->destroy(e);
|
e->destroy(e);
|
||||||
@@ -647,6 +706,7 @@ attest_db_t *attest_db_create(char *uri)
|
|||||||
.set_algo = _set_algo,
|
.set_algo = _set_algo,
|
||||||
.list_products = _list_products,
|
.list_products = _list_products,
|
||||||
.list_files = _list_files,
|
.list_files = _list_files,
|
||||||
|
.list_components = _list_components,
|
||||||
.list_hashes = _list_hashes,
|
.list_hashes = _list_hashes,
|
||||||
.add = _add,
|
.add = _add,
|
||||||
.delete = _delete,
|
.delete = _delete,
|
||||||
|
|||||||
@@ -101,6 +101,11 @@ struct attest_db_t {
|
|||||||
*/
|
*/
|
||||||
void (*list_files)(attest_db_t *this);
|
void (*list_files)(attest_db_t *this);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List all components stored in the database
|
||||||
|
*/
|
||||||
|
void (*list_components)(attest_db_t *this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List selected measurement hashes stored in the database
|
* List selected measurement hashes stored in the database
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -24,12 +24,16 @@ void usage(void)
|
|||||||
{
|
{
|
||||||
printf("\
|
printf("\
|
||||||
Usage:\n\
|
Usage:\n\
|
||||||
ipsec attest --files|--products|--hashes [options]\n\
|
ipsec attest --files|--components|--products|--hashes [options]\n\
|
||||||
\n\
|
\n\
|
||||||
ipsec attest --files [--product <name>|--pid <id>]\n\
|
ipsec attest --files [--product <name>|--pid <id>]\n\
|
||||||
Show a list of files with a software product name or\n\
|
Show a list of files with a software product name or\n\
|
||||||
its primary key as an optional selector.\n\
|
its primary key as an optional selector.\n\
|
||||||
\n\
|
\n\
|
||||||
|
ipsec attest --components [--product <name>|--pid <id>]\n\
|
||||||
|
Show a list of components with a software product name or\n\
|
||||||
|
its primary key as an optional selector.\n\
|
||||||
|
\n\
|
||||||
ipsec attest --products [--file <path>|--fid <id>]\n\
|
ipsec attest --products [--file <path>|--fid <id>]\n\
|
||||||
Show a list of supported software products with a file path or\n\
|
Show a list of supported software products with a file path or\n\
|
||||||
its primary key as an optional selector.\n\
|
its primary key as an optional selector.\n\
|
||||||
|
|||||||
Reference in New Issue
Block a user