1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */ 2*758e9fbaSOystein Eftevaag /*********************************************************************** 3*758e9fbaSOystein Eftevaag * Copyright (c) 2017-2018, Intel Corporation 4*758e9fbaSOystein Eftevaag * 5*758e9fbaSOystein Eftevaag * All rights reserved. 6*758e9fbaSOystein Eftevaag ***********************************************************************/ 7*758e9fbaSOystein Eftevaag #ifndef _SESSION_UTIL_H_ 8*758e9fbaSOystein Eftevaag #define _SESSION_UTIL_H_ 9*758e9fbaSOystein Eftevaag 10*758e9fbaSOystein Eftevaag #include <stdbool.h> 11*758e9fbaSOystein Eftevaag #include <uthash.h> 12*758e9fbaSOystein Eftevaag #include "tss2_tpm2_types.h" 13*758e9fbaSOystein Eftevaag #include "tss2_sys.h" 14*758e9fbaSOystein Eftevaag #include "util/tpm2b.h" 15*758e9fbaSOystein Eftevaag 16*758e9fbaSOystein Eftevaag typedef struct { 17*758e9fbaSOystein Eftevaag TPMI_DH_OBJECT tpmKey; 18*758e9fbaSOystein Eftevaag TPMI_DH_ENTITY bind; 19*758e9fbaSOystein Eftevaag TPM2B_ENCRYPTED_SECRET encryptedSalt; 20*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER salt; 21*758e9fbaSOystein Eftevaag TPM2_SE sessionType; 22*758e9fbaSOystein Eftevaag TPMT_SYM_DEF symmetric; 23*758e9fbaSOystein Eftevaag TPMI_ALG_HASH authHash; 24*758e9fbaSOystein Eftevaag TPMI_SH_AUTH_SESSION sessionHandle; 25*758e9fbaSOystein Eftevaag TPM2B_NONCE nonceTPM; 26*758e9fbaSOystein Eftevaag TPM2B_DIGEST sessionKey; 27*758e9fbaSOystein Eftevaag TPM2B_DIGEST authValueBind; 28*758e9fbaSOystein Eftevaag TPM2B_NONCE nonceNewer; 29*758e9fbaSOystein Eftevaag TPM2B_NONCE nonceOlder; 30*758e9fbaSOystein Eftevaag TPM2B_NONCE nonceTpmDecrypt; 31*758e9fbaSOystein Eftevaag TPM2B_NONCE nonceTpmEncrypt; 32*758e9fbaSOystein Eftevaag TPM2B_NAME name; 33*758e9fbaSOystein Eftevaag void *hmacPtr; 34*758e9fbaSOystein Eftevaag UT_hash_handle hh; 35*758e9fbaSOystein Eftevaag } SESSION; 36*758e9fbaSOystein Eftevaag 37*758e9fbaSOystein Eftevaag typedef struct{ 38*758e9fbaSOystein Eftevaag TPM2_HANDLE entityHandle; 39*758e9fbaSOystein Eftevaag TPM2B_AUTH entityAuth; 40*758e9fbaSOystein Eftevaag UT_hash_handle hh; 41*758e9fbaSOystein Eftevaag } ENTITY; 42*758e9fbaSOystein Eftevaag 43*758e9fbaSOystein Eftevaag /* 44*758e9fbaSOystein Eftevaag * Helper function used to calculate cpHash and rpHash 45*758e9fbaSOystein Eftevaag * if command is true cpHash is calculated, 46*758e9fbaSOystein Eftevaag * otherwise rpHash rpHash is calculated. 47*758e9fbaSOystein Eftevaag */ 48*758e9fbaSOystein Eftevaag TSS2_RC 49*758e9fbaSOystein Eftevaag tpm_calc_phash( 50*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sysContext, 51*758e9fbaSOystein Eftevaag TPM2_HANDLE handle1, 52*758e9fbaSOystein Eftevaag TPM2_HANDLE handle2, 53*758e9fbaSOystein Eftevaag TPM2_HANDLE handle3, 54*758e9fbaSOystein Eftevaag TPMI_ALG_HASH auth_hash, 55*758e9fbaSOystein Eftevaag bool command, 56*758e9fbaSOystein Eftevaag TPM2B_DIGEST *result); 57*758e9fbaSOystein Eftevaag 58*758e9fbaSOystein Eftevaag UINT32 59*758e9fbaSOystein Eftevaag tpm_handle_to_name( 60*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tcti_context, 61*758e9fbaSOystein Eftevaag TPM2_HANDLE handle, 62*758e9fbaSOystein Eftevaag TPM2B_NAME *name); 63*758e9fbaSOystein Eftevaag 64*758e9fbaSOystein Eftevaag void 65*758e9fbaSOystein Eftevaag roll_nonces( 66*758e9fbaSOystein Eftevaag SESSION *session, 67*758e9fbaSOystein Eftevaag TPM2B_NONCE *new_nonce); 68*758e9fbaSOystein Eftevaag 69*758e9fbaSOystein Eftevaag TSS2_RC 70*758e9fbaSOystein Eftevaag KDFa(TPMI_ALG_HASH hash, 71*758e9fbaSOystein Eftevaag TPM2B *key, 72*758e9fbaSOystein Eftevaag const char *label, 73*758e9fbaSOystein Eftevaag TPM2B *contextU, 74*758e9fbaSOystein Eftevaag TPM2B *contextV, 75*758e9fbaSOystein Eftevaag UINT16 bits, 76*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *resultKey ); 77*758e9fbaSOystein Eftevaag 78*758e9fbaSOystein Eftevaag SESSION * 79*758e9fbaSOystein Eftevaag get_session(TPMI_SH_AUTH_SESSION hndl); 80*758e9fbaSOystein Eftevaag 81*758e9fbaSOystein Eftevaag TSS2_RC create_auth_session( 82*758e9fbaSOystein Eftevaag SESSION **psession, 83*758e9fbaSOystein Eftevaag TPMI_DH_OBJECT tpmKey, 84*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *salt, 85*758e9fbaSOystein Eftevaag TPMI_DH_ENTITY bind, 86*758e9fbaSOystein Eftevaag TPM2B_AUTH *bindAuth, 87*758e9fbaSOystein Eftevaag TPM2B_NONCE *nonceCaller, 88*758e9fbaSOystein Eftevaag TPM2B_ENCRYPTED_SECRET *encryptedSalt, 89*758e9fbaSOystein Eftevaag TPM2_SE sessionType, 90*758e9fbaSOystein Eftevaag TPMT_SYM_DEF *symmetric, 91*758e9fbaSOystein Eftevaag TPMI_ALG_HASH algId, 92*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tctiContext); 93*758e9fbaSOystein Eftevaag 94*758e9fbaSOystein Eftevaag TSS2_RC 95*758e9fbaSOystein Eftevaag compute_command_hmac( 96*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sysContext, 97*758e9fbaSOystein Eftevaag TPM2_HANDLE handle1, 98*758e9fbaSOystein Eftevaag TPM2_HANDLE handle2, 99*758e9fbaSOystein Eftevaag TPM2_HANDLE handle3, 100*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND *pSessionsDataIn); 101*758e9fbaSOystein Eftevaag 102*758e9fbaSOystein Eftevaag TSS2_RC 103*758e9fbaSOystein Eftevaag check_response_hmac( 104*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sysContext, 105*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_COMMAND *pSessionsDataIn, 106*758e9fbaSOystein Eftevaag TPM2_HANDLE handle1, 107*758e9fbaSOystein Eftevaag TPM2_HANDLE handle2, 108*758e9fbaSOystein Eftevaag TPM2_HANDLE handle3, 109*758e9fbaSOystein Eftevaag TSS2L_SYS_AUTH_RESPONSE *pSessionsDataOut); 110*758e9fbaSOystein Eftevaag 111*758e9fbaSOystein Eftevaag void 112*758e9fbaSOystein Eftevaag end_auth_session(SESSION *session); 113*758e9fbaSOystein Eftevaag 114*758e9fbaSOystein Eftevaag int 115*758e9fbaSOystein Eftevaag AddEntity(TPM2_HANDLE handle, TPM2B_AUTH *auth); 116*758e9fbaSOystein Eftevaag 117*758e9fbaSOystein Eftevaag void 118*758e9fbaSOystein Eftevaag DeleteEntity(TPM2_HANDLE handle); 119*758e9fbaSOystein Eftevaag 120*758e9fbaSOystein Eftevaag int 121*758e9fbaSOystein Eftevaag GetEntityAuth(TPM2_HANDLE handle, TPM2B_AUTH *auth); 122*758e9fbaSOystein Eftevaag 123*758e9fbaSOystein Eftevaag ENTITY * 124*758e9fbaSOystein Eftevaag GetEntity(TPM2_HANDLE handle); 125*758e9fbaSOystein Eftevaag 126*758e9fbaSOystein Eftevaag TSS2_RC 127*758e9fbaSOystein Eftevaag encrypt_command_param( 128*758e9fbaSOystein Eftevaag SESSION *session, 129*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *encryptedData, 130*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *clearData, 131*758e9fbaSOystein Eftevaag TPM2B_AUTH *authValue); 132*758e9fbaSOystein Eftevaag 133*758e9fbaSOystein Eftevaag TSS2_RC 134*758e9fbaSOystein Eftevaag decrypt_response_param( 135*758e9fbaSOystein Eftevaag SESSION *session, 136*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *clearData, 137*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *encryptedData, 138*758e9fbaSOystein Eftevaag TPM2B_AUTH *authValue); 139*758e9fbaSOystein Eftevaag 140*758e9fbaSOystein Eftevaag #endif 141