/* Microsoft Reference Implementation for TPM 2.0 * * The copyright in this software is being made available under the BSD License, * included below. This software may be subject to other third party and * contributor rights, including patent rights, and no such rights are granted * under this license. * * Copyright (c) Microsoft Corporation * * All rights reserved. * * BSD License * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * * 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. */ //** Description // This file contains the common code for building a response header, including // setting the size of the structure. 'command' may be NULL if result is // not TPM_RC_SUCCESS. //** Includes and Defines #include "Tpm.h" //** BuildResponseHeader() // Adds the response header to the response. It will update command->parameterSize // to indicate the total size of the response. void BuildResponseHeader( COMMAND *command, // IN: main control structure BYTE *buffer, // OUT: the output buffer TPM_RC result // IN: the response code ) { TPM_ST tag; UINT32 size; if(result != TPM_RC_SUCCESS) { tag = TPM_ST_NO_SESSIONS; size = 10; } else { tag = command->tag; // Compute the overall size of the response size = STD_RESPONSE_HEADER + command->handleNum * sizeof(TPM_HANDLE); size += command->parameterSize; size += (command->tag == TPM_ST_SESSIONS) ? command->authSize + sizeof(UINT32) : 0; } TPM_ST_Marshal(&tag, &buffer, NULL); UINT32_Marshal(&size, &buffer, NULL); TPM_RC_Marshal(&result, &buffer, NULL); if(result == TPM_RC_SUCCESS) { if(command->handleNum > 0) TPM_HANDLE_Marshal(&command->handles[0], &buffer, NULL); if(tag == TPM_ST_SESSIONS) UINT32_Marshal((UINT32 *)&command->parameterSize, &buffer, NULL); } command->parameterSize = size; }