/* 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; | |
} |