diff --git a/lib/tpm2_attr_util.c b/lib/tpm2_attr_util.c index a9eaf434b..857500ed8 100644 --- a/lib/tpm2_attr_util.c +++ b/lib/tpm2_attr_util.c @@ -632,3 +632,13 @@ char *tpm2_attr_util_nv_attrtostr(TPMA_NV nvattrs) { char *tpm2_attr_util_obj_attrtostr(TPMA_OBJECT objattrs) { return tpm2_attr_util_common_attrtostr(objattrs.val, obj_attr_table, ARRAY_LEN(obj_attr_table)); } + +bool tpm2_attr_util_obj_from_optarg(char *argvalue, TPMA_OBJECT *objattrs) { + + bool res = tpm2_util_string_to_uint32(argvalue, &objattrs->val); + if (!res) { + res = tpm2_attr_util_obj_strtoattr(argvalue, objattrs); + } + + return res; +} diff --git a/lib/tpm2_attr_util.h b/lib/tpm2_attr_util.h index 524c67274..2487982d8 100644 --- a/lib/tpm2_attr_util.h +++ b/lib/tpm2_attr_util.h @@ -62,6 +62,19 @@ bool tpm2_attr_util_nv_strtoattr(char *attribute_list, TPMA_NV *nvattrs); */ bool tpm2_attr_util_obj_strtoattr(char *attribute_list, TPMA_OBJECT *objattrs); +/** + * Converts a numerical or friendly string described object attribute into the + * TPMA_OBJECT. Similar to tpm2_alg_util_from_optarg(). + * @param argvalue + * Either a raw numeric for a UINT32 or a friendly name object attribute list + * as in tpm2_attr_util_nv_strtoattr(). + * @param objattrs + * The converted bits for a TPMA_OBJECT + * @return + * true on success or false on error. + */ +bool tpm2_attr_util_obj_from_optarg(char *argvalue, TPMA_OBJECT *objattrs); + /** * Converts a TPMA_NV structure to a friendly name style string. * @param nvattrs diff --git a/test/unit/test_tpm2_attr_util.c b/test/unit/test_tpm2_attr_util.c index 11ed54845..892bd2b48 100644 --- a/test/unit/test_tpm2_attr_util.c +++ b/test/unit/test_tpm2_attr_util.c @@ -356,6 +356,22 @@ static void test_tpm2_attr_util_obj_strtoattr_token_unknown(void **state) { res = tpm2_attr_util_obj_strtoattr(arg1, &objattrrs); assert_false(res); } + +static void test_tpm2_attr_util_obj_from_optarg_good(void **state) { + (void) state; + + TPMA_OBJECT objattrs = { .val = 0, }; + bool res = tpm2_attr_util_obj_from_optarg("0x00000002", &objattrs); + assert_true(res); + assert_int_equal(0x02, objattrs.val); + + objattrs.val = 0; + char buf[] = "fixedtpm"; + res = tpm2_attr_util_obj_from_optarg(buf, &objattrs); + assert_true(res); + assert_int_equal(TPMA_OBJECT_FIXEDTPM, objattrs.val); +} + int main(int argc, char* argv[]) { (void) argc; (void) argv; @@ -464,6 +480,9 @@ int main(int argc, char* argv[]) { /* negative tests */ cmocka_unit_test(test_tpm2_attr_util_obj_strtoattr_token_unknown), + + /* test from an optarg */ + cmocka_unit_test(test_tpm2_attr_util_obj_from_optarg_good) }; return cmocka_run_group_tests(tests, NULL, NULL); }