TEE_Result get_random_key_method1() { TEE_Result res; TEE_OperationHandle operation = TEE_HANDLE_NULL; uint32_t algorithm = TEE_ALG_HMAC_MD5; uint32_t mode = TEE_MODE_MAC; uint32_t maxKeySize = 512; res = TEE_AllocateOperation(&operation, algorithm, mode, maxKeySize); if(res != TEE_SUCCESS) { TEE_Printf("[err] TEE_AllocateOperation\n"); goto _ret_; } uint32_t maxKeyObjectSize = maxKeySize; //TEE_Attribute params; //uint32_t paramCount = 0; res = TEE_GenerateKey(operation->key1, maxKeyObjectSize, NULL, 0); if(res != TEE_SUCCESS) { TEE_Printf("[err] TEE_GenerateKey\n"); return 0; } _ret_: if (operation) { TEE_FreeOperation(operation); } return res; }
TEE_Result set_spec_key_method(const void *key, size_t kelen) { TEE_Result res; TEE_OperationHandle operation; uint32_t algorithm = TEE_ALG_HMAC_MD5; uint32_t mode = TEE_MODE_MAC; uint32_t maxKeySize = 512; uint32_t attributeID = TEE_ATTR_SECRET_VALUE; res = TEE_AllocateOperation(&operation, algorithm, mode, maxKeySize); if(res != TEE_SUCCESS) { TEE_Printf("[err] TEE_AllocateOperation\n"); goto _ret_; } res = set_key_value(operation->key1, key, kelen, attributeID); if(res != TEE_SUCCESS) { TEE_Printf("[err] set_key_value\n"); goto _ret_; } _ret_: if (operation) { TEE_FreeOperation(operation); } return res; }
TEE_Result crypt_cipher_aes_cbc(const void *message, size_t message_len, const void *key, size_t key_len, void *cipher, size_t *cipher_len, const void *IV, size_t IVLen, uint32_t mode) { TEE_Result res = TEE_ERROR_GENERIC; TEE_OperationHandle operation = TEE_HANDLE_NULL; uint32_t algorithm = TEE_ALG_AES_CBC_NOPAD; uint32_t maxKeySize = 256; /* valid sizes 128, 192, 256 */ res = TEE_AllocateOperation(&operation, algorithm, mode, maxKeySize); if(res != TEE_SUCCESS) { TEE_Printf("[err] TEE_AllocateOperation\n"); goto _ret_; } if(!key || 0 >= key_len) { res = TEE_ERROR_BAD_PARAMETERS; goto _ret_; } // set crypt key TEE_Attribute attr_list[1]; uint32_t attributeID = TEE_ATTR_SECRET_VALUE; TEE_MemFill(&attr_list[0], sizeof(attr_list[0]), 0); TEE_InitRefAttribute(&attr_list[0], attributeID /* TEE_ATTR_SECRET_VALUE */, (void *)key, key_len ); res = TEE_PopulateTransientObject(operation->key1, &attr_list[0], sizeof(attr_list)/sizeof(attr_list[0])); if(res != TEE_SUCCESS) { TEE_Printf("[err] TEE_PopulateTransientObject\n"); goto _ret_; } // do crypt res = crypt_cipher_interface(operation, (const void *)message, message_len, cipher, cipher_len, IV, IVLen); if(res != TEE_SUCCESS) { TEE_Printf("[err] crypt_cipher_interface\n"); goto _ret_; } _ret_: if (operation) { TEE_FreeOperation(operation); } if(res != TEE_SUCCESS) { TEE_Panic(res); } return res; }
TEE_Result ta_entry_allocate_operation(uint32_t param_type, TEE_Param params[4]) { TEE_Result res; TEE_OperationHandle op; ASSERT_PARAM_TYPE(TEE_PARAM_TYPES (TEE_PARAM_TYPE_VALUE_INOUT, TEE_PARAM_TYPE_VALUE_INPUT, TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE)); res = TEE_AllocateOperation(&op, params[0].value.b, params[1].value.a, params[1].value.b); params[0].value.a = (uint32_t) op; return res; }
static TEE_Result invoke_generate_hash(uint32_t param_types, TEE_Param params[4]) { TEE_Result res = TEE_ERROR_BAD_PARAMETERS; void *message = NULL; size_t message_len; void *digest = NULL; size_t digest_len; TEE_OperationHandle operation; uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT, TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE); DMSG("has been called"); if (param_types != exp_param_types) return TEE_ERROR_BAD_PARAMETERS; message = params[0].memref.buffer; message_len = params[0].memref.size; digest = params[1].memref.buffer; digest_len = params[1].memref.size; res = TEE_AllocateOperation(&operation, TEE_ALG_SHA1, TEE_MODE_DIGEST, 0); if (res != TEE_SUCCESS) { DMSG("TEE_AllocateOperation failed! res: 0x%x", res); goto out; } res = TEE_DigestDoFinal(operation, message, message_len, digest, &digest_len); if (res != TEE_SUCCESS) { DMSG("TEE_DigestDoFinal failed! res: 0x%x", res); } out: if (operation) TEE_FreeOperation(operation); return res; }
TEE_Result get_random_key_method2() { TEE_Result res; TEE_OperationHandle operation = TEE_HANDLE_NULL; uint32_t algorithm = TEE_ALG_HMAC_MD5; uint32_t mode = TEE_MODE_MAC; uint32_t maxKeySize = 512; res = TEE_AllocateOperation(&operation, algorithm, mode, maxKeySize); if(res != TEE_SUCCESS) { TEE_Printf("[err] TEE_AllocateOperation\n"); goto _ret_; } TEE_ObjectHandle hKeyObject = TEE_HANDLE_NULL; TEE_ObjectType keyObjectType = TEE_TYPE_HMAC_MD5; uint32_t maxKeyObjectSize = maxKeySize; res = TEE_NewRandomKeyObject(keyObjectType, maxKeyObjectSize, &hKeyObject); if(res != TEE_SUCCESS) { TEE_Printf("[err] TEE_AllocateTransientObject\n"); return 0; } res = TEE_SetOperationKey(operation, hKeyObject); if(res != TEE_SUCCESS) { TEE_Printf("[err] TEE_SetOperationKey\n"); goto _ret_; } _ret_: if (operation) { TEE_FreeOperation(operation); } if(hKeyObject) { TEE_FreeTransientObject(hKeyObject); } return res; }