You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

175 lines
8.6 KiB

/* 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.
*/
//** Introduction
// This header defines the interface between the hashing code and the LIbTomCrypt
// hash functions.
#ifndef HASH_LIB_DEFINED
#define HASH_LIB_DEFINED
#define HASH_LIB_LTC
// Avoid pulling in the MPA math if not doing asymmetric with LTC
#if !(defined MATH_LIB_LTC)
# define LTC_NO_ASYMMETRIC
#endif
#define HASH_ALIGNMENT RADIX_BYTES
#include "LtcSettings.h"
//***************************************************************
//******** Linking to the TomCrypt HASH code ********************
//***************************************************************
// These defines need to be known in all parts of the TPM so that the structure
// sizes can be properly computed when needed.
#define tpmHashStateSHA1_t struct sha1_state
#define tpmHashStateSHA256_t struct sha256_state
#define tpmHashStateSHA512_t struct sha512_state
#define tpmHashStateSHA384_t struct sha512_state
// The following defines are only needed by CryptHash.c
#ifdef _CRYPT_HASH_C_
// Define the interface between CryptHash.c to the functions provided by the
// library. For each method, define the calling parameters of the method and then
// define how the method is invoked in CryptHash.c.
//
// All hashes are required to have the same calling sequence. If they don't, create
// a simple adaptation function that converts from the "standard" form of the call
// to the form used by the specific hash (and then send a nasty letter to the
// person who wrote the hash function for the library).
//
// The macro that calls the method also defines how the
// parameters get swizzled between the default form (in CryptHash.c)and the
// library form.
//
// Initialize the hash context
#define HASH_START_METHOD_DEF \
void (HASH_START_METHOD)(PANY_HASH_STATE state)
#define HASH_START(hashState) \
((hashState)->def->method.start)(&(hashState)->state)
// Add data to the hash
#define HASH_DATA_METHOD_DEF \
void (HASH_DATA_METHOD)(PANY_HASH_STATE state, \
const BYTE *buffer, \
size_t size)
#define HASH_DATA(hashState, dInSize, dIn) \
((hashState)->def->method.data)(&(hashState)->state, dIn, dInSize)
// Finalize the hash and get the digest
#define HASH_END_METHOD_DEF \
void (HASH_END_METHOD)(PANY_HASH_STATE \
state, \
BYTE *buffer)
#define HASH_END(hashState, buffer) \
((hashState)->def->method.end)(&(hashState)->state, buffer)
// Copy the hash context
// Note: For import, export, and copy, memcpy() is used since there is no
// reformatting necessary between the internal and external forms
#define HASH_STATE_COPY_METHOD_DEF \
void (HASH_STATE_COPY_METHOD)(PANY_HASH_STATE to, \
PCANY_HASH_STATE from, \
size_t size)
#define HASH_STATE_COPY(hashStateOut, hashStateIn) \
((hashStateIn)->def->method.copy) \
(&(hashStateOut)->state, \
&(hashStateIn)->state, \
(hashStateIn)->def->contextSize)
// Copy (with reformatting when necessary) an internal hash structure to an
// external blob
#define HASH_STATE_EXPORT_METHOD_DEF \
void (HASH_STATE_EXPORT_METHOD)(BYTE *to, \
PANY_HASH_STATE from, \
size_t size)
#define HASH_STATE_EXPORT(to, hashStateFrom) \
((hashStateFrom)->def->method.copyOut) \
(&(((BYTE *)(to))[offsetof(HASH_STATE, state)]), \
&(hashStateFrom)->state, \
(hashStateFrom)->def->contextSize)
// Copy from an external blob to an internal formate (with reformatting when
// necessary
#define HASH_STATE_IMPORT_METHOD_DEF \
void (HASH_STATE_IMPORT_METHOD)(PANY_HASH_STATE to, \
const BYTE *from, \
size_t size)
#define HASH_STATE_IMPORT(hashStateTo, from) \
((hashStateTo)->def->method.copyIn) \
(&(hashStateTo)->state, \
&(((const BYTE *)(from))[offsetof(HASH_STATE, state)]),\
(hashStateTo)->def->contextSize)
// Internal External
// Designation Designation
#define tpmHashStart_SHA1 sha1_init
#define tpmHashData_SHA1 sha1_process
#define tpmHashEnd_SHA1 sha1_done
#define tpmHashStateCopy_SHA1 memcpy
#define tpmHashStateExport_SHA1 memcpy
#define tpmHashStateImport_SHA1 memcpy
#define tpmHashStart_SHA256 sha256_init
#define tpmHashData_SHA256 sha256_process
#define tpmHashEnd_SHA256 sha256_done
#define tpmHashStateCopy_SHA256 memcpy
#define tpmHashStateExport_SHA256 memcpy
#define tpmHashStateImport_SHA256 memcpy
#define tpmHashStart_SHA384 sha384_init
#define tpmHashData_SHA384 sha384_process
#define tpmHashEnd_SHA384 sha384_done
#define tpmHashStateCopy_SHA384 memcpy
#define tpmHashStateExport_SHA384 memcpy
#define tpmHashStateImport_SHA384 memcpy
#define tpmHashStart_SHA512 sha512_init
#define tpmHashData_SHA512 sha512_process
#define tpmHashEnd_SHA512 sha512_done
#define tpmHashStateCopy_SHA512 memcpy
#define tpmHashStateExport_SHA512 memcpy
#define tpmHashStateImport_SHA512 memcpy
#endif // _CRYPT_HASH_C_
// No special processing to initialize the LTC hash library
#define LibHashInit()
// No special processing at the end of the simulation (i.e., no statistics to print)
#define HashLibSimulationEnd()
#endif // HASH_LIB_DEFINED