Skip to content

Commit fe68bd5

Browse files
FAPI: Add ECC encryption/decryption to Fapi_Encrypt/Decrypt
The cipher produced by Fapi_Encrypt contains the marshaled data for the c1, c2, and c3 parameter described in the TPM Spec 1.83. TPM2B_ECC_POINT c1; TPM2B_MAX_BUFFER c2; TPM2B_DIGEST c3; Signed-off-by: Juergen Repp <juergen_repp@web.de>
1 parent 95957eb commit fe68bd5

13 files changed

Lines changed: 305 additions & 6 deletions

Makefile-test.am

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ test_helper_tpm_cmd_tcti_dummy_LDFLAGS = $(TESTS_LDFLAGS)
5151
test_helper_tpm_cmd_tcti_dummy_LDADD = $(TESTS_LDADD)
5252
endif #UNIT
5353

54-
### Rules to enumerate binary test files for FAPI from b64 files.
54+
### Rules to enerate binary test files for FAPI from b64 files.
5555

5656
if FAPI
5757
FAPI_TEST_BINS = \
@@ -356,6 +356,7 @@ FAPI_TESTS_INTEGRATION = \
356356
test/integration/fapi-data-crypt-persistent.fint \
357357
test/integration/fapi-data-crypt-rsa.fint \
358358
test/integration/fapi-data-crypt-rsa-persistent.fint \
359+
test/integration/fapi-ecc-encrypt-decrypt.fint \
359360
test/integration/fapi-duplicate.fint \
360361
test/integration/fapi-export-policy.fint \
361362
test/integration/fapi-ext-public-key.fint \
@@ -2514,6 +2515,13 @@ test_integration_fapi_data_crypt_rsa_persistent_fint_SOURCES = \
25142515
test/integration/fapi-data-crypt.int.c \
25152516
test/integration/main-fapi.c test/integration/test-fapi.h
25162517

2518+
test_integration_fapi_ecc_encrypt_decrypt_fint_CFLAGS = $(JSONC_CFLAGS) $(TESTS_CFLAGS)
2519+
test_integration_fapi_ecc_encrypt_decrypt_fint_LDADD = $(TESTS_LDADD)
2520+
test_integration_fapi_ecc_encrypt_decrypt_fint_LDFLAGS = $(TESTS_LDFLAGS)
2521+
test_integration_fapi_ecc_encrypt_decrypt_fint_SOURCES = \
2522+
test/integration/fapi-ecc-encrypt-decrypt.int.c \
2523+
test/integration/main-fapi.c test/integration/test-fapi.h
2524+
25172525
test_integration_fapi_duplicate_fint_CFLAGS = $(JSONC_CFLAGS) $(TESTS_CFLAGS)
25182526
test_integration_fapi_duplicate_fint_LDADD = $(TESTS_LDADD)
25192527
test_integration_fapi_duplicate_fint_LDFLAGS = $(TESTS_LDFLAGS)

dist/fapi-profiles/P_ECCP256SHA256.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
"hashAlg":"sha256"
1212
}
1313
},
14+
"ecc_crypt_scheme": {
15+
"scheme": "kdf2",
16+
"details": { "hashAlg": "sha256"}
17+
},
1418
"sym_mode":"cfb",
1519
"sym_parameters": {
1620
"algorithm":"aes",

dist/fapi-profiles/P_ECCP384SHA384.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
"hashAlg":"sha384"
1212
}
1313
},
14+
"ecc_crypt_scheme": {
15+
"scheme": "kdf2",
16+
"details": { "hashAlg": "sha384"}
17+
},
1418
"sym_mode":"cfb",
1519
"sym_parameters": {
1620
"algorithm":"aes",

src/tss2-fapi/api/Fapi_Decrypt.c

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,39 @@
2121
#include "tss2_common.h" // for TSS2_RC, BYTE, TSS2_RC_SUCCESS, TSS2_BA...
2222
#include "tss2_esys.h" // for Esys_SetTimeout, ESYS_TR_NONE, Esys_Flu...
2323
#include "tss2_fapi.h" // for FAPI_CONTEXT, Fapi_Decrypt, Fapi_Decryp...
24+
#include "tss2_mu.h" // for unmarshaling of encrypted ecc data.
2425
#include "tss2_tcti.h" // for TSS2_TCTI_TIMEOUT_BLOCK
2526
#include "tss2_tpm2_types.h" // for TPM2B_PUBLIC_KEY_RSA, TPM2B_PUBLIC, TPM...
2627

2728
#define LOGMODULE fapi
2829
#include "util/log.h" // for SAFE_FREE, LOG_TRACE, goto_if_error
2930

31+
static TPM2_RC
32+
unmarshal_ecc_crypt_result(const uint8_t *crypt_buf,
33+
size_t size_crypt_buf,
34+
TPM2B_ECC_POINT *c1,
35+
TPM2B_MAX_BUFFER *c2,
36+
TPM2B_DIGEST *c3) {
37+
TSS2_RC rc;
38+
size_t pos = 0;
39+
size_t offset = 0;
40+
41+
rc = Tss2_MU_TPM2B_ECC_POINT_Unmarshal(&crypt_buf[pos], size_crypt_buf, &offset, c1);
42+
return_if_error(rc, "Unmarshal Point.");
43+
44+
pos += offset;
45+
offset = 0;
46+
rc = Tss2_MU_TPM2B_MAX_BUFFER_Unmarshal(&crypt_buf[pos], size_crypt_buf, &offset, c2);
47+
return_if_error(rc, "Unmarshal Max Buffer.");
48+
49+
pos += offset;
50+
offset = 0;
51+
rc = Tss2_MU_TPM2B_DIGEST_Unmarshal(&crypt_buf[pos], size_crypt_buf, &offset, c3);
52+
return_if_error(rc, "Unmarshal Digest.");
53+
54+
return rc;
55+
}
56+
3057
/** One-Call function for Fapi_Decrypt
3158
*
3259
* Decrypts data that was previously encrypted with Fapi_Encrypt.
@@ -242,6 +269,7 @@ Fapi_Decrypt_Finish(FAPI_CONTEXT *context, uint8_t **plainText, size_t *plainTex
242269

243270
TSS2_RC r;
244271
TPM2B_PUBLIC_KEY_RSA *tpmPlainText = NULL;
272+
TPM2B_MAX_BUFFER *ecc_plain_text;
245273

246274
/* Check for NULL parameters */
247275
check_not_null(context);
@@ -297,6 +325,12 @@ Fapi_Decrypt_Finish(FAPI_CONTEXT *context, uint8_t **plainText, size_t *plainTex
297325
r = ifapi_authorize_object(context, command->key_object, &command->auth_session);
298326
return_try_again(r);
299327
goto_if_error(r, "Authorize key.", error_cleanup);
328+
329+
if (command->key_object->misc.key.public.publicArea.type == TPM2_ALG_ECC) {
330+
context->state = DATA_DECRYPT_PREPARE_ECC_ENCRYPTION;
331+
return TSS2_FAPI_RC_TRY_AGAIN;
332+
}
333+
300334
TPM2B_DATA null_data = { .size = 0, .buffer = {} };
301335

302336
/* Copy cipher data to tpm object */
@@ -319,15 +353,17 @@ Fapi_Decrypt_Finish(FAPI_CONTEXT *context, uint8_t **plainText, size_t *plainTex
319353
goto_if_error_reset_state(r, "RSA decryption.", error_cleanup);
320354

321355
/* Duplicate the decrypted plaintext for returning to the user. */
322-
if (plainTextSize)
323-
command->plainTextSize = tpmPlainText->size;
324356
if (plainText) {
357+
command->plainTextSize = tpmPlainText->size;
325358
command->plainText = malloc(tpmPlainText->size);
326359
goto_if_null(command->plainText, "Out of memory", TSS2_FAPI_RC_MEMORY, error_cleanup);
327360

328361
memcpy(command->plainText, &tpmPlainText->buffer[0], tpmPlainText->size);
329362
SAFE_FREE(tpmPlainText);
330363
}
364+
fallthrough;
365+
366+
statecase(context->state, DATA_DECRYPT_PREPARE_FLUSH);
331367

332368
/* Flush the used key. */
333369
if (!command->key_object->misc.key.persistent_handle) {
@@ -358,6 +394,37 @@ Fapi_Decrypt_Finish(FAPI_CONTEXT *context, uint8_t **plainText, size_t *plainTex
358394
*plainTextSize = command->plainTextSize;
359395
break;
360396

397+
statecase(context->state, DATA_DECRYPT_PREPARE_ECC_ENCRYPTION)
398+
/* Decrypt the actual data. */
399+
TPM2B_ECC_POINT c1;
400+
TPM2B_MAX_BUFFER c2;
401+
TPM2B_DIGEST c3;
402+
403+
r = unmarshal_ecc_crypt_result(command->in_data, command->numBytes, &c1, &c2, &c3);
404+
goto_if_error(r, "Unmarshal ECC cipher", error_cleanup);
405+
406+
r = Esys_ECC_Decrypt_Async(context->esys, context->cmd.Data_EncryptDecrypt.key_handle,
407+
command->auth_session,
408+
ENC_SESSION_IF_POLICY(command->auth_session), ESYS_TR_NONE, &c1,
409+
&c2, &c3, &command->profile->ecc_crypt_scheme);
410+
goto_if_error(r, "Error esys rsa decrypt", error_cleanup);
411+
fallthrough;
412+
413+
statecase(context->state, DATA_DECRYPT_WAIT_FOR_ECC_DECRYPTION);
414+
r = Esys_ECC_Decrypt_Finish(context->esys, &ecc_plain_text);
415+
return_try_again(r);
416+
goto_if_error_reset_state(r, "ECC decryption.", error_cleanup);
417+
if (ecc_plain_text) {
418+
command->plainTextSize = ecc_plain_text->size;
419+
command->plainText = malloc(ecc_plain_text->size);
420+
goto_if_null(command->plainText, "Out of memory", TSS2_FAPI_RC_MEMORY, error_cleanup);
421+
422+
memcpy(command->plainText, &ecc_plain_text->buffer[0], ecc_plain_text->size);
423+
SAFE_FREE(ecc_plain_text);
424+
}
425+
context->state = DATA_DECRYPT_PREPARE_FLUSH;
426+
return TSS2_FAPI_RC_TRY_AGAIN;
427+
361428
statecasedefault(context->state);
362429
}
363430

src/tss2-fapi/api/Fapi_Encrypt.c

Lines changed: 81 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "tss2_common.h" // for TSS2_RC, BYTE, TSS2_FAPI_RC_MEMORY, TSS...
2222
#include "tss2_esys.h" // for Esys_SetTimeout, ESYS_TR_NONE, Esys_Flu...
2323
#include "tss2_fapi.h" // for FAPI_CONTEXT, Fapi_Encrypt, Fapi_Encryp...
24+
#include "tss2_mu.h" // for mashaling the result of ECC encryption.
2425
#include "tss2_tcti.h" // for TSS2_TCTI_TIMEOUT_BLOCK
2526
#include "tss2_tpm2_types.h" // for TPM2B_PUBLIC_KEY_RSA, TPM2B_PUBLIC, TPM...
2627

@@ -30,6 +31,45 @@
3031

3132
#define IV_SIZE 16
3233

34+
static TPM2_RC
35+
marshal_ecc_crypt_result(TPM2B_ECC_POINT *c1,
36+
TPM2B_MAX_BUFFER *c2,
37+
TPM2B_DIGEST *c3,
38+
uint8_t **crypt_buf,
39+
size_t *crypt_buf_size) {
40+
TSS2_RC rc;
41+
size_t pos = 0;
42+
size_t offset = 0;
43+
size_t size_crypt_buf = c1->size + c2->size + c3->size + 3 * (sizeof(UINT16));
44+
45+
*crypt_buf = calloc(1, size_crypt_buf);
46+
47+
return_if_null(*crypt_buf, "Out of Memory", TSS2_FAPI_RC_MEMORY);
48+
49+
rc = Tss2_MU_TPM2B_ECC_POINT_Marshal(c1, &(*crypt_buf)[pos], size_crypt_buf, &offset);
50+
goto_if_error(rc, "Error Marshal Point", error);
51+
52+
pos += offset;
53+
offset = 0;
54+
55+
rc = Tss2_MU_TPM2B_MAX_BUFFER_Marshal(c2, &(*crypt_buf)[pos], size_crypt_buf, &offset);
56+
goto_if_error(rc, "Marshal Max Digest", error);
57+
58+
pos += offset;
59+
offset = 0;
60+
61+
rc = Tss2_MU_TPM2B_DIGEST_Marshal(c3, &(*crypt_buf)[pos], size_crypt_buf, &offset);
62+
goto_if_error(rc, "Marshal Digest", error);
63+
64+
*crypt_buf_size = pos + offset;
65+
66+
return rc;
67+
68+
error:
69+
SAFE_FREE(*crypt_buf);
70+
return rc;
71+
}
72+
3373
/** One-Call function for Fapi_Encrypt
3474
*
3575
* Encrypt the provided data for the target key using the TPM encryption
@@ -334,8 +374,23 @@ Fapi_Encrypt_Finish(FAPI_CONTEXT *context, uint8_t **cipherText, size_t *cipherT
334374

335375
context->state = DATA_ENCRYPT_WAIT_FOR_RSA_ENCRYPTION;
336376
} else if (public->publicArea.type == TPM2_ALG_ECC) {
337-
goto_error(r, TSS2_FAPI_RC_NOT_IMPLEMENTED, "ECC Encryption not yet supported",
338-
error_cleanup);
377+
TPM2B_MAX_BUFFER *ecc_message = (TPM2B_MAX_BUFFER *)&context->aux_data;
378+
ecc_message->size = context->cmd.Data_EncryptDecrypt.in_dataSize;
379+
memcpy(&ecc_message->buffer[0], context->cmd.Data_EncryptDecrypt.in_data,
380+
context->cmd.Data_EncryptDecrypt.in_dataSize);
381+
382+
r = Esys_TRSess_SetAttributes(context->esys, context->session1,
383+
TPMA_SESSION_CONTINUESESSION | TPMA_SESSION_DECRYPT,
384+
0xff);
385+
goto_if_error_reset_state(r, "Set session attributes.", error_cleanup);
386+
387+
r = Esys_ECC_Encrypt_Async(context->esys, context->cmd.Data_EncryptDecrypt.key_handle,
388+
context->session1, ESYS_TR_NONE, ESYS_TR_NONE, ecc_message,
389+
&command->profile->ecc_crypt_scheme);
390+
goto_if_error(r, "Error esys ecc encrypt", error_cleanup);
391+
392+
context->state = DATA_ENCRYPT_WAIT_FOR_ECC_ENCRYPTION;
393+
return TSS2_FAPI_RC_TRY_AGAIN;
339394
} else {
340395
goto_error(r, TSS2_FAPI_RC_NOT_IMPLEMENTED, "Unsupported algorithm (%" PRIu16 ")",
341396
error_cleanup, public->publicArea.type);
@@ -361,6 +416,9 @@ Fapi_Encrypt_Finish(FAPI_CONTEXT *context, uint8_t **cipherText, size_t *cipherT
361416

362417
memcpy(command->cipherText, &tpmCipherText->buffer[0], tpmCipherText->size);
363418
SAFE_FREE(tpmCipherText);
419+
fallthrough;
420+
421+
statecase(context->state, DATA_ENCRYPT_PREPARE_FLUSH)
364422

365423
/* Flush the key from the TPM. */
366424
if (strncmp(command->keyPath, "/ext", 4) == 0
@@ -410,6 +468,27 @@ Fapi_Encrypt_Finish(FAPI_CONTEXT *context, uint8_t **cipherText, size_t *cipherT
410468
*cipherTextSize = command->cipherTextSize;
411469
break;
412470

471+
statecase(context->state, DATA_ENCRYPT_WAIT_FOR_ECC_ENCRYPTION);
472+
TPM2B_ECC_POINT *c1 = NULL;
473+
TPM2B_MAX_BUFFER *c2 = NULL;
474+
TPM2B_DIGEST *c3 = NULL;
475+
476+
r = Esys_ECC_Encrypt_Finish(context->esys, &c1, &c2, &c3);
477+
return_try_again(r);
478+
if (r == 0x00000084) {
479+
LOG_ERROR("The data to be encrypted might be too large.");
480+
}
481+
goto_if_error_reset_state(r, "ECC encryption.", error_cleanup);
482+
483+
r = marshal_ecc_crypt_result(c1, c2, c3, &command->cipherText, &command->cipherTextSize);
484+
goto_if_error_reset_state(r, "Marshaling c1 c2 c3..", error_cleanup);
485+
486+
SAFE_FREE(c1);
487+
SAFE_FREE(c2);
488+
SAFE_FREE(c3);
489+
context->state = DATA_ENCRYPT_PREPARE_FLUSH;
490+
return TSS2_FAPI_RC_TRY_AGAIN;
491+
413492
statecasedefault(context->state);
414493
}
415494

src/tss2-fapi/fapi_int.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,17 +1076,22 @@ enum FAPI_STATE {
10761076
DATA_ENCRYPT_WAIT_FOR_SESSION,
10771077
DATA_ENCRYPT_WAIT_FOR_KEY,
10781078
DATA_ENCRYPT_WAIT_FOR_EXT_KEY,
1079+
DATA_ENCRYPT_PREPARE_FLUSH,
10791080
DATA_ENCRYPT_WAIT_FOR_FLUSH,
10801081
DATA_ENCRYPT_WAIT_FOR_RSA_ENCRYPTION,
1082+
DATA_ENCRYPT_WAIT_FOR_ECC_ENCRYPTION,
10811083
DATA_ENCRYPT_CLEAN,
10821084

10831085
DATA_DECRYPT_WAIT_FOR_PROFILE,
10841086
DATA_DECRYPT_WAIT_FOR_SESSION,
10851087
DATA_DECRYPT_WAIT_FOR_KEY,
1088+
DATA_DECRYPT_PREPARE_FLUSH,
10861089
DATA_DECRYPT_WAIT_FOR_FLUSH,
10871090
DATA_DECRYPT_WAIT_FOR_RSA_DECRYPTION,
10881091
DATA_DECRYPT_AUTHORIZE_KEY,
10891092
DATA_DECRYPT_CLEANUP,
1093+
DATA_DECRYPT_PREPARE_ECC_ENCRYPTION,
1094+
DATA_DECRYPT_WAIT_FOR_ECC_DECRYPTION,
10901095

10911096
PCR_EXTEND_WAIT_FOR_SESSION,
10921097
PCR_EXTEND_WAIT_FOR_GET_CAP,

src/tss2-fapi/ifapi_profiles.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,14 @@ ifapi_profile_json_deserialize(json_object *jso, IFAPI_PROFILE *out) {
417417
r = ifapi_json_TPMI_ALG_HASH_deserialize(jso2, &out->nameAlg);
418418
return_if_error(r, "Bad value for field \"nameAlg\".");
419419

420+
if (!ifapi_get_sub_object(jso, "ecc_crypt_scheme", &jso2)) {
421+
out->ecc_crypt_scheme.scheme = TPM2_ALG_KDF2;
422+
out->ecc_crypt_scheme.details.kdf2.hashAlg = out->nameAlg;
423+
} else {
424+
r = ifapi_json_TPMT_KDF_SCHEME_deserialize(jso2, &out->ecc_crypt_scheme);
425+
return_if_error(r, "Bad value for field \"ecc_crypt_scheme\".");
426+
}
427+
420428
if (out->type == TPM2_ALG_RSA) {
421429
if (!ifapi_get_sub_object(jso, "exponent", &jso2)) {
422430
LOG_ERROR("Field \"exponent\" not found.");

src/tss2-fapi/ifapi_profiles.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ typedef struct IFAPI_PROFILE {
2525
TPMT_SIG_SCHEME ecc_signing_scheme; /**< Signing scheme for the ECC key. */
2626
TPMT_SIG_SCHEME rsa_signing_scheme; /**< Signing scheme for the RSA key. */
2727
TPMT_RSA_DECRYPT rsa_decrypt_scheme; /**< Decrypt scheme for the RSA key. */
28+
TPMT_KDF_SCHEME ecc_crypt_scheme; /**< Scheme for the ECC encryption. */
2829
TPMI_ALG_CIPHER_MODE sym_mode; /**< Mode for symmectric encryption. */
2930
TPMT_SYM_DEF_OBJECT sym_parameters; /**< Parameters for symmectric encryption. */
3031
UINT16 sym_block_size; /**< Block size for symmectric encryption. */

src/tss2-fapi/tpm_json_deserialize.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1523,7 +1523,7 @@ ifapi_json_TPMI_ALG_CIPHER_MODE_deserialize(json_object *jso, TPMI_ALG_CIPHER_MO
15231523
*/
15241524
TSS2_RC
15251525
ifapi_json_TPMI_ALG_KDF_deserialize(json_object *jso, TPMI_ALG_KDF *out) {
1526-
SUBTYPE_FILTER(TPMI_ALG_KDF, TPM2_ALG_ID, TPM2_ALG_MGF1, TPM2_ALG_KDF1_SP800_56A,
1526+
SUBTYPE_FILTER(TPMI_ALG_KDF, TPM2_ALG_ID, TPM2_ALG_KDF2, TPM2_ALG_MGF1, TPM2_ALG_KDF1_SP800_56A,
15271527
TPM2_ALG_KDF1_SP800_108, TPM2_ALG_NULL);
15281528
}
15291529

@@ -3022,6 +3022,22 @@ ifapi_json_TPMS_KEY_SCHEME_ECDH_deserialize(json_object *jso, TPMS_KEY_SCHEME_EC
30223022

30233023
/*** Table 154 - Definition of Types for KDF Schemes ***/
30243024

3025+
/** Deserialize a TPMS_SCHEME_MGF1 json object.
3026+
*
3027+
* @param[in] jso the json object to be deserialized.
3028+
* @param[out] out the deserialzed binary object.
3029+
* @retval TSS2_RC_SUCCESS if the function call was a success.
3030+
* @retval TSS2_FAPI_RC_BAD_VALUE if the json object can't be deserialized.
3031+
* @retval TSS2_FAPI_RC_BAD_REFERENCE a invalid null pointer is passed.
3032+
*/
3033+
TSS2_RC
3034+
ifapi_json_TPMS_SCHEME_KDF2_deserialize(json_object *jso, TPMS_SCHEME_KDF2 *out) {
3035+
LOG_TRACE("call");
3036+
return ifapi_json_TPMS_SCHEME_HASH_deserialize(jso, out);
3037+
}
3038+
3039+
/*** Table 154 - Definition of Types for KDF Schemes ***/
3040+
30253041
/** Deserialize a TPMS_SCHEME_MGF1 json object.
30263042
*
30273043
* @param[in] jso the json object to be deserialized.
@@ -3087,6 +3103,9 @@ ifapi_json_TPMU_KDF_SCHEME_deserialize(UINT32 selector, json_object *jso, TPMU_K
30873103
case TPM2_ALG_KDF1_SP800_108:
30883104
return ifapi_json_TPMS_SCHEME_KDF1_SP800_108_deserialize(jso, &out->kdf1_sp800_108);
30893105

3106+
case TPM2_ALG_KDF2:
3107+
return ifapi_json_TPMS_SCHEME_KDF1_SP800_108_deserialize(jso, &out->kdf1_sp800_108);
3108+
30903109
case TPM2_ALG_NULL: {
30913110
return TSS2_RC_SUCCESS;
30923111
}

src/tss2-fapi/tpm_json_deserialize.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,9 @@ ifapi_json_TPMI_ECC_CURVE_deserialize(json_object *jso, TPMI_ECC_CURVE *out);
319319
TSS2_RC
320320
ifapi_json_TPMT_ECC_SCHEME_deserialize(json_object *jso, TPMT_ECC_SCHEME *out);
321321

322+
TSS2_RC
323+
ifapi_json_TPMS_SCHEME_KDF2_deserialize(json_object *jso, TPMS_SCHEME_KDF2 *out);
324+
322325
TSS2_RC
323326
ifapi_json_TPMS_SIGNATURE_RSA_deserialize(json_object *jso, TPMS_SIGNATURE_RSA *out);
324327

0 commit comments

Comments
 (0)