| /******************************************************************************* |
| * Copyright 2017, Fraunhofer SIT sponsored by Infineon Technologies AG |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| * THE POSSIBILITY OF SUCH DAMAGE. |
| *******************************************************************************/ |
| #ifndef ESYS_IUTIL_H |
| #define ESYS_IUTIL_H |
| |
| #include <stdbool.h> |
| #include <inttypes.h> |
| #include <string.h> |
| |
| #include "tss2_esys.h" |
| |
| #include "esys_int.h" |
| #include "esys_crypto.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #define SAFE_FREE(S) if((S) != NULL) {free((void*) (S)); (S)=NULL;} |
| |
| #define TPM2_ERROR_FORMAT "%s%s (0x%08x)" |
| #define TPM2_ERROR_TEXT(r) "Error", "Code", r |
| |
| #define return_if_error(r,msg) \ |
| if (r != TSS2_RC_SUCCESS) { \ |
| LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \ |
| return r; \ |
| } |
| |
| #define return_state_if_error(r,s,msg) \ |
| if (r != TSS2_RC_SUCCESS) { \ |
| LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \ |
| esysContext->state = s; \ |
| return r; \ |
| } |
| |
| #define return_error(r,msg) \ |
| { \ |
| LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \ |
| return r; \ |
| } |
| |
| #define goto_state_if_error(r,s,msg,label) \ |
| if (r != TSS2_RC_SUCCESS) { \ |
| LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \ |
| esysContext->state = s; \ |
| goto label; \ |
| } |
| |
| #define goto_if_error(r,msg,label) \ |
| if (r != TSS2_RC_SUCCESS) { \ |
| LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \ |
| goto label; \ |
| } |
| |
| #define goto_error(r,v,msg,label) \ |
| { r = v; \ |
| LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \ |
| goto label; \ |
| } |
| |
| #define return_if_null(p,msg,ec) \ |
| if (p == NULL) { \ |
| LOG_ERROR("%s ", msg); \ |
| return ec; \ |
| } |
| |
| #define return_if_notnull(p,msg,ec) \ |
| if (p != NULL) { \ |
| LOG_ERROR("%s ", msg); \ |
| return ec; \ |
| } |
| |
| #define exit_if_error(r,msg) \ |
| if (r != TSS2_RC_SUCCESS) { \ |
| LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \ |
| exit(1); \ |
| } |
| |
| #define set_return_code(r_max, r, msg) \ |
| if (r != TSS2_RC_SUCCESS) { \ |
| LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \ |
| r_max = r; \ |
| } |
| |
| typedef struct { |
| TPM2_ALG_ID alg; |
| size_t size; |
| uint8_t digest[sizeof(TPMU_HA)]; |
| } HASH_TAB_ITEM; |
| |
| bool cmp_UINT16 (const UINT16 *in1, const UINT16 *in2); |
| bool cmp_BYTE (const BYTE *in1, const BYTE *in2); |
| bool cmp_BYTE_array(const BYTE *in1, size_t count1, const BYTE *in2, size_t count2); |
| bool cmp_TPM2B_DIGEST (const TPM2B_DIGEST *in1, const TPM2B_DIGEST *in2); |
| bool cmp_TPM2B_NAME (const TPM2B_NAME *in1, const TPM2B_NAME *in2); |
| bool cmp_TPM2B_AUTH (const TPM2B_AUTH *in1, const TPM2B_AUTH *in2); |
| |
| TSS2_RC init_session_tab( |
| ESYS_CONTEXT *esysContext, |
| ESYS_TR shandle1, ESYS_TR shandle2, ESYS_TR shandle3); |
| |
| void iesys_DeleteAllResourceObjects( |
| ESYS_CONTEXT *esys_context); |
| |
| TSS2_RC iesys_compute_encrypt_nonce( |
| ESYS_CONTEXT *esysContext, |
| int *encryptNonceIdx, |
| TPM2B_NONCE **encryptNonce); |
| |
| TSS2_RC iesys_compute_cp_hashtab( |
| ESYS_CONTEXT *esysContext, |
| const TPM2B_NAME *name1, |
| const TPM2B_NAME *name2, |
| const TPM2B_NAME *name3, |
| HASH_TAB_ITEM cp_hash_tab[3], |
| uint8_t *cpHashNum); |
| |
| TSS2_RC iesys_compute_rp_hashtab( |
| ESYS_CONTEXT *esysContext, |
| TSS2L_SYS_AUTH_RESPONSE *rspAuths, |
| const uint8_t *rpBuffer, |
| size_t rpBuffer_size, |
| HASH_TAB_ITEM rp_hash_tab[3], |
| uint8_t *rpHashNum); |
| |
| TSS2_RC esys_CreateResourceObject( |
| ESYS_CONTEXT *esys_context, |
| ESYS_TR esys_handle, |
| RSRC_NODE_T **node); |
| |
| TSS2_RC iesys_handle_to_tpm_handle( |
| ESYS_TR esys_handle, |
| TPM2_HANDLE *tpm_handle); |
| |
| TSS2_RC esys_GetResourceObject( |
| ESYS_CONTEXT *esys_context, |
| ESYS_TR rsrc_handle, |
| RSRC_NODE_T **node); |
| |
| TSS2_RC GetTpmHandle( |
| ESYS_CONTEXT *esys_context, |
| ESYS_TR esys_handle, |
| TPM2_RH *tpm_handle); |
| |
| TPM2_HT iesys_get_handle_type( |
| TPM2_HANDLE handle); |
| |
| bool esys_tpm_handle_with_context( |
| TPM2_HANDLE handle); |
| |
| bool esys_handle_with_context( |
| ESYS_CONTEXT *esys_context, |
| ESYS_TR esys_handle); |
| |
| bool esys_flush_context( |
| TPM2_HANDLE handle); |
| |
| TSS2_RC iesys_get_nv_name( |
| TPMS_NV_PUBLIC *nvPublic, |
| TPM2B_NAME *name); |
| |
| TSS2_RC iesys_get_object_name( |
| TPM2B_PUBLIC *publicArea2B, |
| TPM2B_NAME *name); |
| |
| TSS2_RC iesys_create_NV_resource( |
| TPMS_NV_PUBLIC *nvPublic, |
| IESYS_RESOURCE **nvResource); |
| |
| TSS2_RC iesys_finalize(ESYS_CONTEXT *context); |
| |
| bool iesys_compare_name( |
| TPM2B_PUBLIC *publicInfo, |
| TPM2B_NAME *name); |
| |
| TSS2_RC iesys_compute_encrypted_salt( |
| ESYS_CONTEXT *esysContext, |
| RSRC_NODE_T *tpmKeyNode, |
| TPM2B_ENCRYPTED_SECRET *encryptedSalt); |
| |
| TSS2_RC iesys_gen_caller_nonces( |
| ESYS_CONTEXT *esysContext); |
| |
| TSS2_RC iesys_encrypt_param( |
| ESYS_CONTEXT *esysContext, |
| TPM2B_NONCE **decryptNonce, |
| int *decryptNonceIdx); |
| |
| TSS2_RC iesys_decrypt_param( |
| ESYS_CONTEXT *esysContext, |
| const uint8_t *rpBuffer, |
| size_t rpBuffer_size); |
| |
| TSS2_RC iesys_check_rp_hmacs( |
| ESYS_CONTEXT *esysContext, |
| TSS2L_SYS_AUTH_RESPONSE *rspAuths, |
| HASH_TAB_ITEM rp_hash_tab[3]); |
| |
| void iesys_compute_bound_entity( |
| const TPM2B_NAME *name, |
| const TPM2B_AUTH *auth, |
| TPM2B_NAME *bound_entity); |
| |
| TSS2_RC iesys_check_sequence_async( |
| ESYS_CONTEXT *esysContext); |
| |
| TSS2_RC check_session_feasability( |
| ESYS_TR shandle1, |
| ESYS_TR shandle2, |
| ESYS_TR shandle3, |
| int mandatory); |
| |
| void iesys_compute_session_value( |
| RSRC_NODE_T *session, |
| const TPM2B_NAME *name, |
| const TPM2B_AUTH *auth_value); |
| |
| TSS2_RC iesys_compute_hmacs( |
| RSRC_NODE_T *session, |
| HASH_TAB_ITEM cp_hash_tab[3], |
| uint8_t cpHashNum, |
| TPM2B_NONCE *decryptNonce, |
| TPM2B_NONCE *encryptNonce, |
| TPMS_AUTH_COMMAND *auth); |
| |
| TSS2_RC iesys_gen_auths( |
| ESYS_CONTEXT *esysContext, |
| RSRC_NODE_T *h1, |
| RSRC_NODE_T *h2, |
| RSRC_NODE_T *h3, |
| TSS2L_SYS_AUTH_COMMAND *auths); |
| |
| TSS2_RC iesys_check_response( |
| ESYS_CONTEXT * esys_context); |
| |
| TSS2_RC iesys_nv_get_name( |
| TPM2B_NV_PUBLIC *publicInfo, |
| TPM2B_NAME *name); |
| |
| TSS2_RC iesys_get_name( |
| TPM2B_PUBLIC *publicInfo, |
| TPM2B_NAME *name); |
| |
| #ifdef __cplusplus |
| } /* extern "C" */ |
| #endif |
| |
| #endif /* ESYS_IUTIL_H */ |