2 * Copyright (C) 2011 Andreas Steffen
3 * HSR Hochschule fuer Technik Rapperswil
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
29 #include <pts/pts_meas_algo.h>
31 #include "attest_db.h"
32 #include "attest_usage.h"
35 * global debug output variables
37 static int debug_level
= 0;
38 static bool stderr_quiet
= TRUE
;
43 static void attest_dbg(debug_t group
, level_t level
, char *fmt
, ...)
45 int priority
= LOG_INFO
;
47 char *current
= buffer
, *next
;
50 if (level
<= debug_level
)
55 vfprintf(stderr
, fmt
, args
);
56 fprintf(stderr
, "\n");
60 /* write in memory buffer first */
62 vsnprintf(buffer
, sizeof(buffer
), fmt
, args
);
65 /* do a syslog with every line */
68 next
= strchr(current
, '\n');
73 syslog(priority
, "%s\n", current
);
80 * global attestation database object
85 * atexit handler to close db on shutdown
87 static void cleanup(void)
89 attest
->destroy(attest
);
95 static void do_args(int argc
, char *argv
[])
110 /* reinit getopt state */
117 struct option long_opts
[] = {
118 { "help", no_argument
, NULL
, 'h' },
119 { "components", no_argument
, NULL
, 'c' },
120 { "files", no_argument
, NULL
, 'f' },
121 { "keys", no_argument
, NULL
, 'k' },
122 { "products", no_argument
, NULL
, 'p' },
123 { "hashes", no_argument
, NULL
, 'H' },
124 { "measurements", no_argument
, NULL
, 'M' },
125 { "add", no_argument
, NULL
, 'a' },
126 { "delete", no_argument
, NULL
, 'd' },
127 { "del", no_argument
, NULL
, 'd' },
128 { "component", required_argument
, NULL
, 'C' },
129 { "comp", required_argument
, NULL
, 'C' },
130 { "directory", required_argument
, NULL
, 'D' },
131 { "dir", required_argument
, NULL
, 'D' },
132 { "file", required_argument
, NULL
, 'F' },
133 { "key", required_argument
, NULL
, 'K' },
134 { "owner", required_argument
, NULL
, 'O' },
135 { "product", required_argument
, NULL
, 'P' },
136 { "sha1", no_argument
, NULL
, '1' },
137 { "sha256", no_argument
, NULL
, '2' },
138 { "sha384", no_argument
, NULL
, '3' },
139 { "did", required_argument
, NULL
, '4' },
140 { "fid", required_argument
, NULL
, '5' },
141 { "pid", required_argument
, NULL
, '6' },
142 { "cid", required_argument
, NULL
, '7' },
143 { "kid", required_argument
, NULL
, '8' },
147 c
= getopt_long(argc
, argv
, "", long_opts
, NULL
);
171 op
= OP_MEASUREMENTS
;
180 if (!attest
->set_component(attest
, optarg
, op
== OP_ADD
))
186 if (!attest
->set_directory(attest
, optarg
, op
== OP_ADD
))
192 if (!attest
->set_file(attest
, optarg
, op
== OP_ADD
))
198 if (!attest
->set_key(attest
, optarg
, op
== OP_ADD
))
204 attest
->set_owner(attest
, optarg
);
207 if (!attest
->set_product(attest
, optarg
, op
== OP_ADD
))
213 attest
->set_algo(attest
, PTS_MEAS_ALGO_SHA1
);
216 attest
->set_algo(attest
, PTS_MEAS_ALGO_SHA256
);
219 attest
->set_algo(attest
, PTS_MEAS_ALGO_SHA384
);
222 if (!attest
->set_did(attest
, atoi(optarg
)))
228 if (!attest
->set_fid(attest
, atoi(optarg
)))
234 if (!attest
->set_pid(attest
, atoi(optarg
)))
240 if (!attest
->set_cid(attest
, atoi(optarg
)))
246 if (!attest
->set_kid(attest
, atoi(optarg
)))
261 attest
->list_products(attest
);
264 attest
->list_keys(attest
);
267 attest
->list_components(attest
);
270 attest
->list_files(attest
);
273 attest
->list_hashes(attest
);
275 case OP_MEASUREMENTS
:
276 attest
->list_measurements(attest
);
282 attest
->delete(attest
);
290 int main(int argc
, char *argv
[])
294 /* enable attest debugging hook */
296 openlog("attest", 0, LOG_DEBUG
);
298 atexit(library_deinit
);
300 /* initialize library */
301 if (!library_init(NULL
))
303 exit(SS_RC_LIBSTRONGSWAN_INTEGRITY
);
305 if (!lib
->plugins
->load(lib
->plugins
, NULL
,
306 lib
->settings
->get_str(lib
->settings
, "attest.load", PLUGINS
)))
308 exit(SS_RC_INITIALIZATION_FAILED
);
311 uri
= lib
->settings
->get_str(lib
->settings
, "attest.database", NULL
);
314 fprintf(stderr
, "database URI attest.database not set.\n");
315 exit(SS_RC_INITIALIZATION_FAILED
);
317 attest
= attest_db_create(uri
);
320 exit(SS_RC_INITIALIZATION_FAILED
);