From de8616f30f9038940352ccd71ea72db0a6e5d84d Mon Sep 17 00:00:00 2001 From: Christian Plappert Date: Tue, 22 Jun 2021 10:43:05 +0200 Subject: [PATCH] Add user-level mu-api call for key derivation This commit introduces a new user-level mu-api call (Tss2_MU_TPMT_PUBLIC_DERIVE_Marshal) that allows to create a Derived Object with the command TPM2_CreateLoaded. Signed-off-by: Christian Plappert --- include/tss2/tss2_mu.h | 59 ++++++++++++++++++++++++++++++++++ include/tss2/tss2_tpm2_types.h | 6 ++++ lib/tss2-mu.def | 2 ++ lib/tss2-mu.map | 2 ++ src/tss2-mu/tpm2b-types.c | 2 ++ src/tss2-mu/tpms-types.c | 8 +++++ src/tss2-mu/tpmt-types.c | 14 ++++++++ src/tss2-mu/tpmu-types.c | 11 +++++++ 8 files changed, 104 insertions(+) diff --git a/include/tss2/tss2_mu.h b/include/tss2/tss2_mu.h index 39e7077c46..94381b547f 100644 --- a/include/tss2/tss2_mu.h +++ b/include/tss2/tss2_mu.h @@ -468,6 +468,21 @@ Tss2_MU_TPM2B_ECC_POINT_Unmarshal( size_t *offset, TPM2B_ECC_POINT *dest); +TSS2_RC +Tss2_MU_TPM2B_LABEL_Marshal( + TPM2B_LABEL const *src, + uint8_t buffer[], + size_t buffer_size, + size_t *offset); + +TSS2_RC +Tss2_MU_TPM2B_LABEL_Unmarshal( + uint8_t const buffer[], + size_t buffer_size, + size_t *offset, + TPM2B_LABEL *dest); + + TSS2_RC Tss2_MU_TPM2B_NV_PUBLIC_Marshal( TPM2B_NV_PUBLIC const *src, @@ -720,6 +735,20 @@ Tss2_MU_TPMS_ECC_POINT_Unmarshal( size_t *offset, TPMS_ECC_POINT *dest); +TSS2_RC +Tss2_MU_TPMS_DERIVE_Marshal( + TPMS_DERIVE const *src, + uint8_t buffer[], + size_t buffer_size, + size_t *offset); + +TSS2_RC +Tss2_MU_TPMS_DERIVE_Unmarshal( + uint8_t const buffer[], + size_t buffer_size, + size_t *offset, + TPMS_DERIVE *dest); + TSS2_RC Tss2_MU_TPMS_NV_PUBLIC_Marshal( TPMS_NV_PUBLIC const *src, @@ -1686,6 +1715,22 @@ Tss2_MU_TPMU_PUBLIC_ID_Unmarshal( uint32_t selector_value, TPMU_PUBLIC_ID *dest); +TSS2_RC +Tss2_MU_TPMU_PUBLIC_ID_DERIVE_Marshal( + TPMU_PUBLIC_ID_DERIVE const *src, + uint32_t selector_value, + uint8_t buffer[], + size_t buffer_size, + size_t *offset); + +TSS2_RC +Tss2_MU_TPMU_PUBLIC_ID_DERIVE_Unmarshal( + uint8_t const buffer[], + size_t buffer_size, + size_t *offset, + uint32_t selector_value, + TPMU_PUBLIC_ID_DERIVE *dest); + TSS2_RC Tss2_MU_TPMU_NAME_Marshal( TPMU_NAME const *src, @@ -1884,6 +1929,20 @@ Tss2_MU_TPMT_PUBLIC_Unmarshal( size_t *offset, TPMT_PUBLIC *dest); +TSS2_RC +Tss2_MU_TPMT_PUBLIC_DERIVE_Marshal( + TPMT_PUBLIC const *src, + uint8_t buffer[], + size_t buffer_size, + size_t *offset); + +TSS2_RC +Tss2_MU_TPMT_PUBLIC_DERIVE_Unmarshal( + uint8_t const buffer[], + size_t buffer_size, + size_t *offset, + TPMT_PUBLIC *dest); + TSS2_RC Tss2_MU_TPMT_PUBLIC_PARMS_Marshal( TPMT_PUBLIC_PARMS const *src, diff --git a/include/tss2/tss2_tpm2_types.h b/include/tss2/tss2_tpm2_types.h index 8113f96247..2484300098 100644 --- a/include/tss2/tss2_tpm2_types.h +++ b/include/tss2/tss2_tpm2_types.h @@ -1760,6 +1760,9 @@ union TPMU_PUBLIC_ID { TPMS_DERIVE derive; }; +/* Definition of TPMU_PUBLIC_ID_DERIVE Union */ +typedef union TPMU_PUBLIC_ID TPMU_PUBLIC_ID_DERIVE; + /* Definition of TPMS_KEYEDHASH_PARMS Structure */ typedef struct TPMS_KEYEDHASH_PARMS TPMS_KEYEDHASH_PARMS; struct TPMS_KEYEDHASH_PARMS { @@ -1819,6 +1822,9 @@ struct TPMT_PUBLIC { TPMU_PUBLIC_ID unique; /* the unique identifier of the structure. For an asymmetric key this would be the public key. */ }; +/* Definition of TPMT_PUBLIC_DERIVE Structure */ +typedef struct TPMT_PUBLIC TPMT_PUBLIC_DERIVE; + /* Definition of TPM2B_PUBLIC Structure */ typedef struct TPM2B_PUBLIC TPM2B_PUBLIC; struct TPM2B_PUBLIC { diff --git a/lib/tss2-mu.def b/lib/tss2-mu.def index b642f394b6..6a21a14c45 100644 --- a/lib/tss2-mu.def +++ b/lib/tss2-mu.def @@ -264,6 +264,8 @@ EXPORTS Tss2_MU_TPMT_SENSITIVE_Unmarshal Tss2_MU_TPMT_PUBLIC_Marshal Tss2_MU_TPMT_PUBLIC_Unmarshal + Tss2_MU_TPMT_PUBLIC_DERIVE_Marshal + Tss2_MU_TPMT_PUBLIC_DERIVE_Unmarshal Tss2_MU_TPMT_PUBLIC_PARMS_Marshal Tss2_MU_TPMT_PUBLIC_PARMS_Unmarshal Tss2_MU_TPMT_TK_CREATION_Marshal diff --git a/lib/tss2-mu.map b/lib/tss2-mu.map index 46611bb240..31d5ae9c47 100644 --- a/lib/tss2-mu.map +++ b/lib/tss2-mu.map @@ -264,6 +264,8 @@ Tss2_MU_TPMT_SENSITIVE_Unmarshal; Tss2_MU_TPMT_PUBLIC_Marshal; Tss2_MU_TPMT_PUBLIC_Unmarshal; + Tss2_MU_TPMT_PUBLIC_DERIVE_Marshal; + Tss2_MU_TPMT_PUBLIC_DERIVE_Unmarshal; Tss2_MU_TPMT_PUBLIC_PARMS_Marshal; Tss2_MU_TPMT_PUBLIC_PARMS_Unmarshal; Tss2_MU_TPMT_TK_CREATION_Marshal; diff --git a/src/tss2-mu/tpm2b-types.c b/src/tss2-mu/tpm2b-types.c index f62ab637f4..d488179712 100644 --- a/src/tss2-mu/tpm2b-types.c +++ b/src/tss2-mu/tpm2b-types.c @@ -349,6 +349,8 @@ TPM2B_MARSHAL (TPM2B_OPERAND); TPM2B_UNMARSHAL(TPM2B_OPERAND, buffer); TPM2B_MARSHAL (TPM2B_TEMPLATE); TPM2B_UNMARSHAL(TPM2B_TEMPLATE, buffer); +TPM2B_MARSHAL (TPM2B_LABEL); +TPM2B_UNMARSHAL(TPM2B_LABEL, buffer); TPM2B_MARSHAL_SUBTYPE(TPM2B_ECC_POINT, TPMS_ECC_POINT, point); TPM2B_UNMARSHAL_SUBTYPE(TPM2B_ECC_POINT, TPMS_ECC_POINT, point); TPM2B_MARSHAL_SUBTYPE(TPM2B_NV_PUBLIC, TPMS_NV_PUBLIC, nvPublic); diff --git a/src/tss2-mu/tpms-types.c b/src/tss2-mu/tpms-types.c index 8253560d0b..404900fa01 100644 --- a/src/tss2-mu/tpms-types.c +++ b/src/tss2-mu/tpms-types.c @@ -1119,6 +1119,14 @@ TPMS_UNMARSHAL_2(TPMS_ECC_POINT, x, Tss2_MU_TPM2B_ECC_PARAMETER_Unmarshal, y, Tss2_MU_TPM2B_ECC_PARAMETER_Unmarshal) +TPMS_MARSHAL_2(TPMS_DERIVE, + label, ADDR, Tss2_MU_TPM2B_LABEL_Marshal, + context, ADDR, Tss2_MU_TPM2B_LABEL_Marshal) + +TPMS_UNMARSHAL_2(TPMS_DERIVE, + label, Tss2_MU_TPM2B_LABEL_Unmarshal, + context, Tss2_MU_TPM2B_LABEL_Unmarshal) + TPMS_MARSHAL_2(TPMS_SIGNATURE_RSA, hash, VAL, Tss2_MU_UINT16_Marshal, sig, ADDR, Tss2_MU_TPM2B_PUBLIC_KEY_RSA_Marshal) diff --git a/src/tss2-mu/tpmt-types.c b/src/tss2-mu/tpmt-types.c index df899a6641..0cacef655d 100644 --- a/src/tss2-mu/tpmt-types.c +++ b/src/tss2-mu/tpmt-types.c @@ -588,6 +588,20 @@ TPMT_UNMARSHAL_6(TPMT_PUBLIC, type, Tss2_MU_UINT16_Unmarshal, parameters, type, Tss2_MU_TPMU_PUBLIC_PARMS_Unmarshal, unique, type, Tss2_MU_TPMU_PUBLIC_ID_Unmarshal) +TPMT_MARSHAL_6(TPMT_PUBLIC_DERIVE, type, VAL, Tss2_MU_UINT16_Marshal, + nameAlg, VAL, Tss2_MU_UINT16_Marshal, + objectAttributes, VAL, Tss2_MU_TPMA_OBJECT_Marshal, + authPolicy, ADDR, Tss2_MU_TPM2B_DIGEST_Marshal, + parameters, ADDR, type, Tss2_MU_TPMU_PUBLIC_PARMS_Marshal, + unique, ADDR, type, Tss2_MU_TPMU_PUBLIC_ID_DERIVE_Marshal) + +TPMT_UNMARSHAL_6(TPMT_PUBLIC_DERIVE, type, Tss2_MU_UINT16_Unmarshal, + nameAlg, Tss2_MU_UINT16_Unmarshal, + objectAttributes, Tss2_MU_TPMA_OBJECT_Unmarshal, + authPolicy, Tss2_MU_TPM2B_DIGEST_Unmarshal, + parameters, type, Tss2_MU_TPMU_PUBLIC_PARMS_Unmarshal, + unique, type, Tss2_MU_TPMU_PUBLIC_ID_DERIVE_Unmarshal) + TPMT_MARSHAL_2(TPMT_PUBLIC_PARMS, type, VAL, Tss2_MU_UINT16_Marshal, parameters, ADDR, type, Tss2_MU_TPMU_PUBLIC_PARMS_Marshal) diff --git a/src/tss2-mu/tpmu-types.c b/src/tss2-mu/tpmu-types.c index 8007ab52fb..397dd4f896 100644 --- a/src/tss2-mu/tpmu-types.c +++ b/src/tss2-mu/tpmu-types.c @@ -630,6 +630,17 @@ TPMU_UNMARSHAL2(TPMU_PUBLIC_ID, TPM2_ALG_RSA, rsa, Tss2_MU_TPM2B_PUBLIC_KEY_RSA_Unmarshal, TPM2_ALG_ECC, ecc, Tss2_MU_TPMS_ECC_POINT_Unmarshal) +TPMU_MARSHAL2(TPMU_PUBLIC_ID_DERIVE, + TPM2_ALG_KEYEDHASH, ADDR, derive, Tss2_MU_TPMS_DERIVE_Marshal, + TPM2_ALG_SYMCIPHER, ADDR, sym, Tss2_MU_TPM2B_DIGEST_Marshal, + TPM2_ALG_RSA, ADDR, rsa, Tss2_MU_TPM2B_PUBLIC_KEY_RSA_Marshal, + TPM2_ALG_ECC, ADDR, ecc, Tss2_MU_TPMS_ECC_POINT_Marshal) +TPMU_UNMARSHAL2(TPMU_PUBLIC_ID_DERIVE, + TPM2_ALG_KEYEDHASH, derive, Tss2_MU_TPMS_DERIVE_Unmarshal, + TPM2_ALG_SYMCIPHER, sym, Tss2_MU_TPM2B_DIGEST_Unmarshal, + TPM2_ALG_RSA, rsa, Tss2_MU_TPM2B_PUBLIC_KEY_RSA_Unmarshal, + TPM2_ALG_ECC, ecc, Tss2_MU_TPMS_ECC_POINT_Unmarshal) + TPMU_MARSHAL2(TPMU_PUBLIC_PARMS, TPM2_ALG_KEYEDHASH, ADDR, keyedHashDetail, Tss2_MU_TPMS_KEYEDHASH_PARMS_Marshal, TPM2_ALG_SYMCIPHER, ADDR, symDetail, Tss2_MU_TPMS_SYMCIPHER_PARMS_Marshal,