1// Copyright 2015 The Chromium OS Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// THIS CODE IS GENERATED - DO NOT MODIFY! 6 7#include "MemoryLib_fp.h" 8#include "Create_fp.h" 9 10UINT16 Create_Out_Marshal(Create_Out* source, 11 TPMI_ST_COMMAND_TAG tag, 12 BYTE** buffer, 13 INT32* size) { 14 UINT16 total_size = 0; 15 UINT32 parameter_size = 0; 16 BYTE* parameter_size_location; 17 INT32 parameter_size_size = sizeof(UINT32); 18 UINT32 num_response_handles = 0; 19 // Add parameter_size=0 to indicate size of the parameter area. Will be 20 // replaced later by computed parameter_size. 21 if (tag == TPM_ST_SESSIONS) { 22 parameter_size_location = *buffer; 23 // Don't add to total_size, but increment *buffer and decrement *size. 24 UINT32_Marshal(¶meter_size, buffer, size); 25 } 26 // Marshal response parameters. 27 total_size += TPM2B_PRIVATE_Marshal(&source->outPrivate, buffer, size); 28 total_size += TPM2B_PUBLIC_Marshal(&source->outPublic, buffer, size); 29 total_size += 30 TPM2B_CREATION_DATA_Marshal(&source->creationData, buffer, size); 31 total_size += TPM2B_DIGEST_Marshal(&source->creationHash, buffer, size); 32 total_size += TPMT_TK_CREATION_Marshal(&source->creationTicket, buffer, size); 33 // Compute actual parameter_size. Don't add result to total_size. 34 if (tag == TPM_ST_SESSIONS) { 35 parameter_size = total_size - num_response_handles * sizeof(TPM_HANDLE); 36 UINT32_Marshal(¶meter_size, ¶meter_size_location, 37 ¶meter_size_size); 38 } 39 return total_size; 40} 41 42TPM_RC Create_In_Unmarshal(Create_In* target, 43 TPM_HANDLE request_handles[], 44 BYTE** buffer, 45 INT32* size) { 46 TPM_RC result = TPM_RC_SUCCESS; 47 // Get request handles from request_handles array. 48 target->parentHandle = request_handles[0]; 49 // Unmarshal request parameters. 50 result = TPM2B_SENSITIVE_CREATE_Unmarshal(&target->inSensitive, buffer, size); 51 if (result != TPM_RC_SUCCESS) { 52 return result; 53 } 54 result = TPM2B_PUBLIC_Unmarshal(&target->inPublic, buffer, size); 55 if (result != TPM_RC_SUCCESS) { 56 return result; 57 } 58 result = TPM2B_DATA_Unmarshal(&target->outsideInfo, buffer, size); 59 if (result != TPM_RC_SUCCESS) { 60 return result; 61 } 62 result = TPML_PCR_SELECTION_Unmarshal(&target->creationPCR, buffer, size); 63 if (result != TPM_RC_SUCCESS) { 64 return result; 65 } 66 if ((result == TPM_RC_SUCCESS) && *size) { 67 result = TPM_RC_SIZE; 68 } 69 return result; 70} 71 72TPM_RC Exec_Create(TPMI_ST_COMMAND_TAG tag, 73 BYTE** request_parameter_buffer, 74 INT32* request_parameter_buffer_size, 75 TPM_HANDLE request_handles[], 76 UINT32* response_handle_buffer_size, 77 UINT32* response_parameter_buffer_size) { 78 TPM_RC result = TPM_RC_SUCCESS; 79 Create_In in; 80 Create_Out out; 81#ifdef TPM_CC_Create 82 BYTE* response_buffer; 83 INT32 response_buffer_size; 84 UINT16 bytes_marshalled; 85 UINT16 num_response_handles = 0; 86#endif 87 *response_handle_buffer_size = 0; 88 *response_parameter_buffer_size = 0; 89 // Unmarshal request parameters to input structure. 90 result = Create_In_Unmarshal(&in, request_handles, request_parameter_buffer, 91 request_parameter_buffer_size); 92 if (result != TPM_RC_SUCCESS) { 93 return result; 94 } 95 // Execute command. 96 result = TPM2_Create(&in, &out); 97 if (result != TPM_RC_SUCCESS) { 98 return result; 99 } 100// Marshal output structure to global response buffer. 101#ifdef TPM_CC_Create 102 response_buffer = MemoryGetResponseBuffer(TPM_CC_Create) + 10; 103 response_buffer_size = MAX_RESPONSE_SIZE - 10; 104 bytes_marshalled = 105 Create_Out_Marshal(&out, tag, &response_buffer, &response_buffer_size); 106 *response_handle_buffer_size = num_response_handles * sizeof(TPM_HANDLE); 107 *response_parameter_buffer_size = 108 bytes_marshalled - *response_handle_buffer_size; 109 return TPM_RC_SUCCESS; 110#endif 111 return TPM_RC_COMMAND_CODE; 112} 113