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 TEST_INTEGRATION_SAPI_UTIL_H 8*758e9fbaSOystein Eftevaag #define TEST_INTEGRATION_SAPI_UTIL_H 9*758e9fbaSOystein Eftevaag 10*758e9fbaSOystein Eftevaag #include "tss2_tpm2_types.h" 11*758e9fbaSOystein Eftevaag #include "tss2_sys.h" 12*758e9fbaSOystein Eftevaag #include "util/tpm2b.h" 13*758e9fbaSOystein Eftevaag 14*758e9fbaSOystein Eftevaag /* 15*758e9fbaSOystein Eftevaag * This macro is like the GNU TEMP_FAILURE_RETRY macro for the 16*758e9fbaSOystein Eftevaag * TPM2_RC_RETRY response code. 17*758e9fbaSOystein Eftevaag */ 18*758e9fbaSOystein Eftevaag #define TSS2_RETRY_EXP(expression) \ 19*758e9fbaSOystein Eftevaag ({ \ 20*758e9fbaSOystein Eftevaag TSS2_RC __result = 0; \ 21*758e9fbaSOystein Eftevaag do { \ 22*758e9fbaSOystein Eftevaag __result = (expression); \ 23*758e9fbaSOystein Eftevaag } while ((__result & 0x0000ffff) == TPM2_RC_RETRY); \ 24*758e9fbaSOystein Eftevaag __result; \ 25*758e9fbaSOystein Eftevaag }) 26*758e9fbaSOystein Eftevaag /* 27*758e9fbaSOystein Eftevaag * tpm2b default initializers, these set the size to the max for the default 28*758e9fbaSOystein Eftevaag * structure and zero's the data area. 29*758e9fbaSOystein Eftevaag */ 30*758e9fbaSOystein Eftevaag #define TPM2B_SIZE(type) (sizeof (type) - 2) 31*758e9fbaSOystein Eftevaag #define TPM2B_NAMED_INIT(type, field) \ 32*758e9fbaSOystein Eftevaag { \ 33*758e9fbaSOystein Eftevaag .size = TPM2B_SIZE (type), \ 34*758e9fbaSOystein Eftevaag .field = { 0 } \ 35*758e9fbaSOystein Eftevaag } 36*758e9fbaSOystein Eftevaag #define TPM2B_DIGEST_INIT TPM2B_NAMED_INIT (TPM2B_DIGEST, buffer) 37*758e9fbaSOystein Eftevaag #define TPM2B_NAME_INIT TPM2B_NAMED_INIT (TPM2B_NAME, name) 38*758e9fbaSOystein Eftevaag #define TPM2B_PRIVATE_INIT TPM2B_NAMED_INIT (TPM2B_PRIVATE, buffer) 39*758e9fbaSOystein Eftevaag 40*758e9fbaSOystein Eftevaag #define TPM2B_MAX_BUFFER_INIT { .size = TPM2_MAX_DIGEST_BUFFER } 41*758e9fbaSOystein Eftevaag #define TPM2B_IV_INIT { .size = TPM2_MAX_SYM_BLOCK_SIZE } 42*758e9fbaSOystein Eftevaag 43*758e9fbaSOystein Eftevaag #define BUFFER_SIZE(type, field) (sizeof((((type *)NULL)->t.field))) 44*758e9fbaSOystein Eftevaag #define TPM2B_TYPE_INIT(type, field) { .size = BUFFER_SIZE(type, field), } 45*758e9fbaSOystein Eftevaag /* 46*758e9fbaSOystein Eftevaag * Use te provide SAPI context to create & load a primary key. The key will 47*758e9fbaSOystein Eftevaag * be a 2048 bit (restricted decryption) RSA key. The associated symmetric 48*758e9fbaSOystein Eftevaag * key is a 128 bit AES (CFB mode) key. 49*758e9fbaSOystein Eftevaag */ 50*758e9fbaSOystein Eftevaag TSS2_RC 51*758e9fbaSOystein Eftevaag create_primary_rsa_2048_aes_128_cfb ( 52*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sapi_context, 53*758e9fbaSOystein Eftevaag TPM2_HANDLE *handle); 54*758e9fbaSOystein Eftevaag /* 55*758e9fbaSOystein Eftevaag * This function creates a 128 bit symmetric AES key in cbc mode. This key will 56*758e9fbaSOystein Eftevaag * be created as the child of the parameter 'handle_parent'. The handle for the 57*758e9fbaSOystein Eftevaag * newly created AND loaded key is returned in the parameter 'handle'. 58*758e9fbaSOystein Eftevaag */ 59*758e9fbaSOystein Eftevaag TSS2_RC 60*758e9fbaSOystein Eftevaag create_aes_128_cfb ( 61*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sapi_context, 62*758e9fbaSOystein Eftevaag TPM2_HANDLE handle_parent, 63*758e9fbaSOystein Eftevaag TPM2_HANDLE *handle); 64*758e9fbaSOystein Eftevaag 65*758e9fbaSOystein Eftevaag /* 66*758e9fbaSOystein Eftevaag * This function creates a RSA key of KEYEDHASH type. 67*758e9fbaSOystein Eftevaag */ 68*758e9fbaSOystein Eftevaag TSS2_RC 69*758e9fbaSOystein Eftevaag create_keyedhash_key ( 70*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sapi_context, 71*758e9fbaSOystein Eftevaag TPM2_HANDLE handle_parent, 72*758e9fbaSOystein Eftevaag TPM2_HANDLE *handle); 73*758e9fbaSOystein Eftevaag 74*758e9fbaSOystein Eftevaag /* 75*758e9fbaSOystein Eftevaag * This function will decrypt or encrypt the 'data_in' buffer and return the 76*758e9fbaSOystein Eftevaag * results in the 'data_out' parameter. Decrypt or encrypt is selected using 77*758e9fbaSOystein Eftevaag * the 'decrypt' TPMI_YES_NO parameter. The key used for the operation is 78*758e9fbaSOystein Eftevaag * provided in the 'handle' parameter. 79*758e9fbaSOystein Eftevaag * Under the covers this function uses an IV of all zeros and so it can not 80*758e9fbaSOystein Eftevaag * be used for streaming. It can only be used to encrypt or decrypt a single 81*758e9fbaSOystein Eftevaag * buffer. This function uses tpm to perform encryption. 82*758e9fbaSOystein Eftevaag */ 83*758e9fbaSOystein Eftevaag TSS2_RC 84*758e9fbaSOystein Eftevaag tpm_encrypt_decrypt_cfb ( 85*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sapi_context, 86*758e9fbaSOystein Eftevaag TPMI_DH_OBJECT handle, 87*758e9fbaSOystein Eftevaag TPMI_YES_NO decrypt, 88*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_in, 89*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_out); 90*758e9fbaSOystein Eftevaag /* 91*758e9fbaSOystein Eftevaag * This is a convenience wrapper around the encrypt_decrypt_cfb function. 92*758e9fbaSOystein Eftevaag * This function uses tpm to perform encryption. 93*758e9fbaSOystein Eftevaag */ 94*758e9fbaSOystein Eftevaag TSS2_RC 95*758e9fbaSOystein Eftevaag tpm_encrypt_cfb ( 96*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sapi_context, 97*758e9fbaSOystein Eftevaag TPMI_DH_OBJECT handle, 98*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_in, 99*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_out); 100*758e9fbaSOystein Eftevaag /* 101*758e9fbaSOystein Eftevaag * This is a convenience wrapper around the encrypt_decrypt_cfb function. 102*758e9fbaSOystein Eftevaag * This function uses tpm to perform encryption. 103*758e9fbaSOystein Eftevaag */ 104*758e9fbaSOystein Eftevaag TSS2_RC 105*758e9fbaSOystein Eftevaag tpm_decrypt_cfb ( 106*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sapi_context, 107*758e9fbaSOystein Eftevaag TPMI_DH_OBJECT handle, 108*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_in, 109*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_out); 110*758e9fbaSOystein Eftevaag /* 111*758e9fbaSOystein Eftevaag * This function is identical to the encrypt_decrypt_cfb function but under 112*758e9fbaSOystein Eftevaag * the covers it uses the EncryptDecrypt2 function instead of EncryptDecrypt. 113*758e9fbaSOystein Eftevaag * This function uses tpm to perform encryption. 114*758e9fbaSOystein Eftevaag */ 115*758e9fbaSOystein Eftevaag TSS2_RC 116*758e9fbaSOystein Eftevaag tpm_encrypt_decrypt_2_cfb ( 117*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sapi_context, 118*758e9fbaSOystein Eftevaag TPMI_DH_OBJECT handle, 119*758e9fbaSOystein Eftevaag TPMI_YES_NO decrypt, 120*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_in, 121*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_out); 122*758e9fbaSOystein Eftevaag /* 123*758e9fbaSOystein Eftevaag * This is a convenience wrapper around the encrypt_decrypt_2_cfb function. 124*758e9fbaSOystein Eftevaag * This function uses tpm to perform encryption. 125*758e9fbaSOystein Eftevaag */ 126*758e9fbaSOystein Eftevaag TSS2_RC 127*758e9fbaSOystein Eftevaag tpm_encrypt_2_cfb ( 128*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sapi_context, 129*758e9fbaSOystein Eftevaag TPMI_DH_OBJECT handle, 130*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_in, 131*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_out); 132*758e9fbaSOystein Eftevaag /* 133*758e9fbaSOystein Eftevaag * This is a convenience wrapper around the encrypt_decrypt_2_cfb function. 134*758e9fbaSOystein Eftevaag * This function uses tpm to perform encryption. 135*758e9fbaSOystein Eftevaag */ 136*758e9fbaSOystein Eftevaag TSS2_RC 137*758e9fbaSOystein Eftevaag tpm_decrypt_2_cfb ( 138*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sapi_context, 139*758e9fbaSOystein Eftevaag TPMI_DH_OBJECT handle, 140*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_in, 141*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_out); 142*758e9fbaSOystein Eftevaag /* 143*758e9fbaSOystein Eftevaag * This helper function uses software to perform decryption. 144*758e9fbaSOystein Eftevaag */ 145*758e9fbaSOystein Eftevaag TSS2_RC 146*758e9fbaSOystein Eftevaag decrypt_cfb ( 147*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_out, 148*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_in, 149*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *key, 150*758e9fbaSOystein Eftevaag TPM2B_IV *iv); 151*758e9fbaSOystein Eftevaag /* 152*758e9fbaSOystein Eftevaag * This helper function uses software to perform encryption. 153*758e9fbaSOystein Eftevaag */ 154*758e9fbaSOystein Eftevaag TSS2_RC 155*758e9fbaSOystein Eftevaag encrypt_cfb ( 156*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_out, 157*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *data_in, 158*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *key, 159*758e9fbaSOystein Eftevaag TPM2B_IV *iv); 160*758e9fbaSOystein Eftevaag 161*758e9fbaSOystein Eftevaag /* 162*758e9fbaSOystein Eftevaag * This is a helper function for digest calculation. 163*758e9fbaSOystein Eftevaag * alg can be TPM2_ALG_SHA1, TPM2_ALG_SHA256, TPM2_ALG_SHA384, 164*758e9fbaSOystein Eftevaag * and TPM2_ALG_SHA512 165*758e9fbaSOystein Eftevaag */ 166*758e9fbaSOystein Eftevaag TSS2_RC 167*758e9fbaSOystein Eftevaag hash ( 168*758e9fbaSOystein Eftevaag TPM2_ALG_ID alg, 169*758e9fbaSOystein Eftevaag const void *data, 170*758e9fbaSOystein Eftevaag int size, 171*758e9fbaSOystein Eftevaag TPM2B_DIGEST *out); 172*758e9fbaSOystein Eftevaag 173*758e9fbaSOystein Eftevaag /* 174*758e9fbaSOystein Eftevaag * This is a helper function for calculating HMAC. 175*758e9fbaSOystein Eftevaag * alg can be TPM2_ALG_SHA1, TPM2_ALG_SHA256, TPM2_ALG_SHA384, 176*758e9fbaSOystein Eftevaag * and TPM2_ALG_SHA512 177*758e9fbaSOystein Eftevaag */ 178*758e9fbaSOystein Eftevaag TSS2_RC 179*758e9fbaSOystein Eftevaag hmac( 180*758e9fbaSOystein Eftevaag TPM2_ALG_ID alg, 181*758e9fbaSOystein Eftevaag const void *key, 182*758e9fbaSOystein Eftevaag int key_len, 183*758e9fbaSOystein Eftevaag TPM2B_DIGEST **buffer_list, 184*758e9fbaSOystein Eftevaag TPM2B_DIGEST *out); 185*758e9fbaSOystein Eftevaag 186*758e9fbaSOystein Eftevaag /* 187*758e9fbaSOystein Eftevaag * Returns digest size for a give hash alg 188*758e9fbaSOystein Eftevaag */ 189*758e9fbaSOystein Eftevaag UINT16 190*758e9fbaSOystein Eftevaag GetDigestSize(TPM2_ALG_ID hash); 191*758e9fbaSOystein Eftevaag 192*758e9fbaSOystein Eftevaag TSS2_RC 193*758e9fbaSOystein Eftevaag CompareSizedByteBuffer( 194*758e9fbaSOystein Eftevaag TPM2B *buffer1, 195*758e9fbaSOystein Eftevaag TPM2B *buffer2); 196*758e9fbaSOystein Eftevaag 197*758e9fbaSOystein Eftevaag TSS2_RC 198*758e9fbaSOystein Eftevaag ConcatSizedByteBuffer( 199*758e9fbaSOystein Eftevaag TPM2B_MAX_BUFFER *result, 200*758e9fbaSOystein Eftevaag TPM2B *buf); 201*758e9fbaSOystein Eftevaag 202*758e9fbaSOystein Eftevaag void 203*758e9fbaSOystein Eftevaag CatSizedByteBuffer( 204*758e9fbaSOystein Eftevaag TPM2B *dest, 205*758e9fbaSOystein Eftevaag TPM2B *src); 206*758e9fbaSOystein Eftevaag 207*758e9fbaSOystein Eftevaag UINT16 208*758e9fbaSOystein Eftevaag CopySizedByteBuffer( 209*758e9fbaSOystein Eftevaag TPM2B *dest, 210*758e9fbaSOystein Eftevaag const TPM2B *src); 211*758e9fbaSOystein Eftevaag 212*758e9fbaSOystein Eftevaag TSS2_RC 213*758e9fbaSOystein Eftevaag DefineNvIndex ( 214*758e9fbaSOystein Eftevaag TSS2_SYS_CONTEXT *sys_ctx, 215*758e9fbaSOystein Eftevaag TPMI_RH_PROVISION authHandle, 216*758e9fbaSOystein Eftevaag TPM2B_AUTH *auth, 217*758e9fbaSOystein Eftevaag const TPM2B_DIGEST *authPolicy, 218*758e9fbaSOystein Eftevaag TPMI_RH_NV_INDEX nvIndex, 219*758e9fbaSOystein Eftevaag TPMI_ALG_HASH nameAlg, 220*758e9fbaSOystein Eftevaag TPMA_NV attributes, 221*758e9fbaSOystein Eftevaag UINT16 size); 222*758e9fbaSOystein Eftevaag 223*758e9fbaSOystein Eftevaag #endif /* TEST_INTEGRATION_SAPI_UTIL_H */ 224