10 #if defined(WITH_LIBTPM)
15 #define TPM_MAXIMUM_KEY_SIZE 4096
17 #define TPM_USE_TAG_IN_STRUCTURE 1
20 #include <tpm_error.h>
24 #define _RPMTPM_INTERNAL
31 #define TPMDBG(_l) if (_rpmtpm_debug) fprintf _l
39 uint32_t
err = rc & (mask ? mask : 0xffffffff);
42 #if defined(WITH_LIBTPM)
44 if (!strncmp(msg,
"TSS_",
sizeof(
"TSS_")-1)
45 || !strncmp(msg,
"TPM_",
sizeof(
"TPMC_")-1)
46 || !strncmp(msg,
"TPM_",
sizeof(
"TPM_")-1))
47 fprintf (stderr,
"*** %s rc %u: %s\n", msg, rc,
48 (err ? TPM_GetErrMsg(rc) :
"Success"));
50 fprintf (stderr,
"*** TPM_%s rc %u: %s\n", msg, rc,
51 (err ? TPM_GetErrMsg(rc) :
"Success"));
63 fprintf(fp,
"%s: ", msg);
65 for (i = 0; i < nb; i++)
66 fprintf(fp,
"%02x", b[i]);
76 #if defined(WITH_LIBTPM)
77 STACK_TPM_BUFFER( subcap );
78 STACK_TPM_BUFFER( resp );
79 STACK_TPM_BUFFER( tb );
80 TPM_PERMANENT_FLAGS permanentFlags;
82 STORE32(subcap.buffer, 0, TPM_CAP_FLAG_PERMANENT);
86 TPM_GetCapability(TPM_CAP_FLAG, &subcap, &resp));
90 TSS_SetTPMBuffer(&tb, resp.buffer, resp.used);
92 xx =
rpmtpmErr(tpm,
"ReadPermanentFlags", 0,
93 TPM_ReadPermanentFlags(&tb, 0, &permanentFlags, resp.used));
97 tpm->enabled = permanentFlags.physicalPresenceCMDEnable;
107 #if defined(WITH_LIBTPM)
117 static void rpmtpmInitPopt(
rpmtpm tpm,
int ac,
char ** av, poptOption tbl)
123 if (av == NULL || av[0] == NULL || av[1] == NULL)
127 _tpm->keysize = 2048;
137 _tpm->size = 0xffffffff;
138 _tpm->val = 0xffffffff;
139 _tpm->type = 0xffffffff;
141 con = poptGetContext(av[0], ac, (
const char **)av, tbl,
145 while ((rc = poptGetNextOpt(con)) > 0) {
146 const char *
arg = poptGetOptArg(con);
150 fprintf(stderr,
_(
"%s: option table misconfigured (%d)\n"),
157 fprintf(stderr,
"%s: poptGetNextOpt rc(%d): %s\n", __FUNCTION__, rc, poptStrerror(rc));
166 con = poptFreeContext(con);
170 memcpy(((
char *) tpm)+
sizeof(tpm->_item),
171 ((
char *)
_tpm)+
sizeof(tpm->_item),
172 sizeof(*tpm)-
sizeof(tpm->_item));
173 memset(((
char *)
_tpm)+
sizeof(tpm->_item),
175 sizeof(*tpm)-
sizeof(tpm->_item));
185 TPMDBG((stderr,
"<== %s(%p, %p[%u], %p)\n", __FUNCTION__, tpm, av, (
unsigned)ac, tbl));
195 tpm->digest =
_free(tpm->digest);
199 tpm->con = poptFreeContext(tpm->con);
206 tpm->ic_str =
_free(tpm->ic_str);
209 tpm->label =
_free(tpm->label);
211 tpm->b =
_free(tpm->b);
214 tpm->ifn =
_free(tpm->ifn);
215 tpm->ofn =
_free(tpm->ofn);
216 tpm->kfn =
_free(tpm->kfn);
217 tpm->sfn =
_free(tpm->sfn);
218 tpm->msafn =
_free(tpm->msafn);
220 tpm->ownerpass =
_free(tpm->ownerpass);
221 tpm->keypass =
_free(tpm->keypass);
222 tpm->parpass =
_free(tpm->parpass);
223 tpm->certpass =
_free(tpm->certpass);
224 tpm->newpass =
_free(tpm->newpass);
225 tpm->areapass =
_free(tpm->areapass);
226 tpm->sigpass =
_free(tpm->sigpass);
227 tpm->migpass =
_free(tpm->migpass);
228 tpm->datpass =
_free(tpm->datpass);
230 tpm->hk_str =
_free(tpm->hk_str);
231 tpm->hp_str =
_free(tpm->hp_str);
232 tpm->hc_str =
_free(tpm->hc_str);
233 tpm->hs_str =
_free(tpm->hs_str);
234 tpm->hm_str =
_free(tpm->hm_str);
235 tpm->ha_str =
_free(tpm->ha_str);
236 tpm->ix_str =
_free(tpm->ix_str);
238 tpm->cap_str =
_free(tpm->cap_str);
239 tpm->scap_str =
_free(tpm->scap_str);
240 tpm->scapd_str =
_free(tpm->scapd_str);
242 tpm->per1_str =
_free(tpm->per1_str);
243 tpm->per2_str =
_free(tpm->per2_str);
245 tpm->es_str =
_free(tpm->es_str);
246 tpm->bm_str =
_free(tpm->bm_str);
247 tpm->kt_str =
_free(tpm->kt_str);
260 if (_rpmtpmPool == NULL) {
266 memset(((
char *)tpm)+
sizeof(tpm->_item), 0,
sizeof(*tpm)-
sizeof(tpm->_item));
274 #if defined(WITH_LIBTPM)
276 rpmtpmInitPopt(tpm, ac, av, tbl);
280 if (tpm->ownerpass) {
281 TSS_sha1(tpm->ownerpass, strlen(tpm->ownerpass), tpm->pwdohash);
282 tpm->pwdo = tpm->pwdohash;
285 TSS_sha1(tpm->keypass, strlen(tpm->keypass), tpm->pwdkhash);
286 tpm->pwdk = tpm->pwdkhash;
289 TSS_sha1(tpm->parpass, strlen(tpm->parpass), tpm->pwdphash);
290 tpm->pwdp = tpm->pwdphash;
293 TSS_sha1(tpm->certpass, strlen(tpm->certpass), tpm->pwdchash);
294 tpm->pwdc = tpm->pwdchash;
297 TSS_sha1(tpm->newpass, strlen(tpm->newpass), tpm->pwdnhash);
298 tpm->pwdn = tpm->pwdnhash;
301 TSS_sha1(tpm->areapass, strlen(tpm->areapass), tpm->pwdahash);
302 tpm->pwda = tpm->pwdahash;
305 TSS_sha1(tpm->sigpass, strlen(tpm->sigpass), tpm->pwdshash);
306 tpm->pwds = tpm->pwdshash;
309 TSS_sha1(tpm->migpass, strlen(tpm->migpass), tpm->pwdmhash);
310 tpm->pwdm = tpm->pwdmhash;
313 TSS_sha1(tpm->datpass, strlen(tpm->datpass), tpm->pwddhash);
314 tpm->pwdd = tpm->pwddhash;
316 if (tpm->hk_str) sscanf(tpm->hk_str,
"%x", &tpm->keyhandle);
317 if (tpm->hp_str) sscanf(tpm->hp_str,
"%x", &tpm->parhandle);
318 if (tpm->hc_str) sscanf(tpm->hc_str,
"%x", &tpm->certhandle);
319 if (tpm->hs_str) sscanf(tpm->hs_str,
"%x", &tpm->sighandle);
320 if (tpm->hm_str) sscanf(tpm->hm_str,
"%x", &tpm->mighandle);
321 if (tpm->ha_str) sscanf(tpm->ha_str,
"%x", &tpm->handle);
322 if (tpm->ix_str) sscanf(tpm->ix_str,
"%x", &tpm->ix);
324 if (tpm->bm_str) sscanf(tpm->bm_str,
"%x", &tpm->restrictions);
325 if (tpm->kt_str) tpm->keytype = tpm->kt_str[0];
327 if (tpm->cap_str) sscanf(tpm->cap_str,
"%x", &tpm->cap);
328 if (tpm->scap_str) sscanf(tpm->scap_str,
"%x", &tpm->scap);
329 if (tpm->scapd_str) sscanf(tpm->scapd_str,
"%d", &tpm->scap);
331 if (tpm->per1_str) sscanf(tpm->per1_str,
"%x", &tpm->per1);
332 if (tpm->per2_str) sscanf(tpm->per2_str,
"%x", &tpm->per2);
rpmtpm rpmtpmLink(rpmtpm tpm)
Reference a TPM wrapper instance.
int argvAppend(ARGV_t *argvp, ARGV_t av)
Append one argv array to another.
rpmtpm rpmtpmNew(int ac, char **av, struct poptOption *tbl, uint32_t flags)
Create and load a TPM wrapper.
static void rpmtpmFini(void *_tpm)
rpmioItem rpmioGetPool(rpmioPool pool, size_t size)
Get unused item from pool, or alloc a new item.
int argvCount(const ARGV_t argv)
Return no.
ARGV_t argvFree(ARGV_t argv)
Destroy an argv array.
int rpmtpmErr(rpmtpm tpm, const char *msg, uint32_t mask, uint32_t rc)
const char const char int arg
const char const bson int mongo_write_concern int flags
void argvPrint(const char *msg, ARGV_t argv, FILE *fp)
Print argv array elements.
static int rpmtpmGetPhysicalCMDEnable(rpmtpm tpm)
int _rpmio_popt_context_flags
void rpmtpmDump(rpmtpm tpm, const char *msg, unsigned char *b, size_t nb)
rpmioPool rpmioNewPool(const char *name, size_t size, int limit, int flags, char *(*dbg)(void *item), void(*init)(void *item), void(*fini)(void *item))
Create a memory pool.
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
static rpmtpm rpmtpmGetPool(rpmioPool pool)