]> git.proxmox.com Git - libtpms.git/commitdiff
rev148: Add files for Cmac and Smac
authorStefan Berger <stefanb@linux.vnet.ibm.com>
Wed, 11 Jul 2018 13:15:37 +0000 (09:15 -0400)
committerStefan Berger <stefanb@us.ibm.com>
Thu, 3 Jan 2019 18:15:44 +0000 (13:15 -0500)
Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
src/Makefile.am
src/tpm2/crypto/CryptCmac_fp.h [new file with mode: 0644]
src/tpm2/crypto/CryptSmac_fp.h [new file with mode: 0644]
src/tpm2/crypto/openssl/CryptCmac.c [new file with mode: 0644]
src/tpm2/crypto/openssl/CryptSmac.c [new file with mode: 0644]

index 1119e4760635d708d3bf68f8d3a20ed02d78c7f5..dbe945dea5ae0ef9d18e1b826f8f2aeba03d33cb 100644 (file)
@@ -270,6 +270,7 @@ libtpms_tpm2_la_SOURCES = \
 
 noinst_HEADERS += \
        compiler.h \
+       tpm2/crypto/CryptCmac_fp.h \
        tpm2/crypto/CryptDes_fp.h \
        tpm2/crypto/CryptEcc.h \
        tpm2/crypto/CryptEccKeyExchange_fp.h \
@@ -285,6 +286,7 @@ noinst_HEADERS += \
        tpm2/crypto/CryptRsa_fp.h \
        tpm2/crypto/CryptRsa.h \
        tpm2/crypto/CryptSelfTest_fp.h \
+       tpm2/crypto/CryptSmac_fp.h \
        tpm2/crypto/CryptSym.h \
        tpm2/crypto/CryptSym_fp.h \
        tpm2/crypto/CryptTest.h \
@@ -489,6 +491,7 @@ noinst_HEADERS += \
 if LIBTPMS_USE_OPENSSL
 
 libtpms_tpm2_la_SOURCES += \
+       tpm2/crypto/openssl/CryptCmac.c \
        tpm2/crypto/openssl/CryptDes.c \
        tpm2/crypto/openssl/CryptEccKeyExchange.c \
        tpm2/crypto/openssl/CryptEccMain.c \
@@ -499,6 +502,7 @@ libtpms_tpm2_la_SOURCES += \
        tpm2/crypto/openssl/CryptPrimeSieve.c \
        tpm2/crypto/openssl/CryptRand.c \
        tpm2/crypto/openssl/CryptRsa.c \
+       tpm2/crypto/openssl/CryptSmac.c \
        tpm2/crypto/openssl/CryptSym.c \
        tpm2/crypto/openssl/TpmToOsslDesSupport.c \
        tpm2/crypto/openssl/TpmToOsslMath.c \
diff --git a/src/tpm2/crypto/CryptCmac_fp.h b/src/tpm2/crypto/CryptCmac_fp.h
new file mode 100644 (file)
index 0000000..a15c02d
--- /dev/null
@@ -0,0 +1,86 @@
+/********************************************************************************/
+/*     Message Authentication Codes Based on a Symmetric Block Cipher          */
+/*             Implementation of cryptographic functions for hashing.          */
+/*                          Written by Ken Goldman                             */
+/*                    IBM Thomas J. Watson Research Center                     */
+/*            $Id: CryptCmac_fp.h 1259 2018-07-10 19:11:09Z kgoldman $         */
+/*                                                                             */
+/*  Licenses and Notices                                                       */
+/*                                                                             */
+/*  1. Copyright Licenses:                                                     */
+/*                                                                             */
+/*  - Trusted Computing Group (TCG) grants to the user of the source code in   */
+/*    this specification (the "Source Code") a worldwide, irrevocable,                 */
+/*    nonexclusive, royalty free, copyright license to reproduce, create       */
+/*    derivative works, distribute, display and perform the Source Code and    */
+/*    derivative works thereof, and to grant others the rights granted herein. */
+/*                                                                             */
+/*  - The TCG grants to the user of the other parts of the specification       */
+/*    (other than the Source Code) the rights to reproduce, distribute,        */
+/*    display, and perform the specification solely for the purpose of                 */
+/*    developing products based on such documents.                             */
+/*                                                                             */
+/*  2. Source Code Distribution Conditions:                                    */
+/*                                                                             */
+/*  - Redistributions of Source Code must retain the above copyright licenses,         */
+/*    this list of conditions and the following disclaimers.                   */
+/*                                                                             */
+/*  - Redistributions in binary form must reproduce the above copyright        */
+/*    licenses, this list of conditions        and the following disclaimers in the    */
+/*    documentation and/or other materials provided with the distribution.     */
+/*                                                                             */
+/*  3. Disclaimers:                                                            */
+/*                                                                             */
+/*  - THE COPYRIGHT LICENSES SET FORTH ABOVE DO NOT REPRESENT ANY FORM OF      */
+/*  LICENSE OR WAIVER, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, WITH      */
+/*  RESPECT TO PATENT RIGHTS HELD BY TCG MEMBERS (OR OTHER THIRD PARTIES)      */
+/*  THAT MAY BE NECESSARY TO IMPLEMENT THIS SPECIFICATION OR OTHERWISE.                */
+/*  Contact TCG Administration (admin@trustedcomputinggroup.org) for           */
+/*  information on specification licensing rights available through TCG        */
+/*  membership agreements.                                                     */
+/*                                                                             */
+/*  - THIS SPECIFICATION IS PROVIDED "AS IS" WITH NO EXPRESS OR IMPLIED        */
+/*    WARRANTIES WHATSOEVER, INCLUDING ANY WARRANTY OF MERCHANTABILITY OR      */
+/*    FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, COMPLETENESS, OR             */
+/*    NONINFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS, OR ANY WARRANTY                 */
+/*    OTHERWISE ARISING OUT OF ANY PROPOSAL, SPECIFICATION OR SAMPLE.          */
+/*                                                                             */
+/*  - Without limitation, TCG and its members and licensors disclaim all       */
+/*    liability, including liability for infringement of any proprietary       */
+/*    rights, relating to use of information in this specification and to the  */
+/*    implementation of this specification, and TCG disclaims all liability for        */
+/*    cost of procurement of substitute goods or services, lost profits, loss  */
+/*    of use, loss of data or any incidental, consequential, direct, indirect,         */
+/*    or special damages, whether under contract, tort, warranty or otherwise,         */
+/*    arising in any way out of use or reliance upon this specification or any         */
+/*    information herein.                                                      */
+/*                                                                             */
+/*  (c) Copyright IBM Corp. and others, 2018                                   */
+/*                                                                             */
+/********************************************************************************/
+
+#ifndef CRYPTCMAC_FP_H
+#define CRYPTCMAC_FP_H
+#include "Tpm.h"
+
+UINT16
+CryptCmacStart(
+              SMAC_STATE          *state,
+              TPMU_PUBLIC_PARMS   *keyParms,
+              TPM_ALG_ID           macAlg,
+              TPM2B               *key
+              );
+void
+CryptCmacData(
+             SMAC_STATES         *state,
+             UINT32               size,
+             const BYTE          *buffer
+             );
+UINT16
+CryptCmacEnd(
+            SMAC_STATES             *state,
+            UINT32                   outSize,
+            BYTE                    *outBuffer
+            );
+
+#endif
diff --git a/src/tpm2/crypto/CryptSmac_fp.h b/src/tpm2/crypto/CryptSmac_fp.h
new file mode 100644 (file)
index 0000000..c255b54
--- /dev/null
@@ -0,0 +1,98 @@
+/********************************************************************************/
+/*             Message Authentication Codes Based on a Symmetric Block Cipher  */
+/*             Implementation of cryptographic functions for hashing.          */
+/*                          Written by Ken Goldman                             */
+/*                    IBM Thomas J. Watson Research Center                     */
+/*            $Id: CryptSmac_fp.h 1259 2018-07-10 19:11:09Z kgoldman $         */
+/*                                                                             */
+/*  Licenses and Notices                                                       */
+/*                                                                             */
+/*  1. Copyright Licenses:                                                     */
+/*                                                                             */
+/*  - Trusted Computing Group (TCG) grants to the user of the source code in   */
+/*    this specification (the "Source Code") a worldwide, irrevocable,                 */
+/*    nonexclusive, royalty free, copyright license to reproduce, create       */
+/*    derivative works, distribute, display and perform the Source Code and    */
+/*    derivative works thereof, and to grant others the rights granted herein. */
+/*                                                                             */
+/*  - The TCG grants to the user of the other parts of the specification       */
+/*    (other than the Source Code) the rights to reproduce, distribute,        */
+/*    display, and perform the specification solely for the purpose of                 */
+/*    developing products based on such documents.                             */
+/*                                                                             */
+/*  2. Source Code Distribution Conditions:                                    */
+/*                                                                             */
+/*  - Redistributions of Source Code must retain the above copyright licenses,         */
+/*    this list of conditions and the following disclaimers.                   */
+/*                                                                             */
+/*  - Redistributions in binary form must reproduce the above copyright        */
+/*    licenses, this list of conditions        and the following disclaimers in the    */
+/*    documentation and/or other materials provided with the distribution.     */
+/*                                                                             */
+/*  3. Disclaimers:                                                            */
+/*                                                                             */
+/*  - THE COPYRIGHT LICENSES SET FORTH ABOVE DO NOT REPRESENT ANY FORM OF      */
+/*  LICENSE OR WAIVER, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, WITH      */
+/*  RESPECT TO PATENT RIGHTS HELD BY TCG MEMBERS (OR OTHER THIRD PARTIES)      */
+/*  THAT MAY BE NECESSARY TO IMPLEMENT THIS SPECIFICATION OR OTHERWISE.                */
+/*  Contact TCG Administration (admin@trustedcomputinggroup.org) for           */
+/*  information on specification licensing rights available through TCG        */
+/*  membership agreements.                                                     */
+/*                                                                             */
+/*  - THIS SPECIFICATION IS PROVIDED "AS IS" WITH NO EXPRESS OR IMPLIED        */
+/*    WARRANTIES WHATSOEVER, INCLUDING ANY WARRANTY OF MERCHANTABILITY OR      */
+/*    FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, COMPLETENESS, OR             */
+/*    NONINFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS, OR ANY WARRANTY                 */
+/*    OTHERWISE ARISING OUT OF ANY PROPOSAL, SPECIFICATION OR SAMPLE.          */
+/*                                                                             */
+/*  - Without limitation, TCG and its members and licensors disclaim all       */
+/*    liability, including liability for infringement of any proprietary       */
+/*    rights, relating to use of information in this specification and to the  */
+/*    implementation of this specification, and TCG disclaims all liability for        */
+/*    cost of procurement of substitute goods or services, lost profits, loss  */
+/*    of use, loss of data or any incidental, consequential, direct, indirect,         */
+/*    or special damages, whether under contract, tort, warranty or otherwise,         */
+/*    arising in any way out of use or reliance upon this specification or any         */
+/*    information herein.                                                      */
+/*                                                                             */
+/*  (c) Copyright IBM Corp. and others, 2018                                   */
+/*                                                                             */
+/********************************************************************************/
+
+#ifndef CRYPTSMAC_FP_H
+#define CRYPTSMAC_FP_H
+#include "Tpm.h"
+
+UINT16
+CryptSmacStart(
+              HASH_STATE              *state,
+              TPMU_PUBLIC_PARMS       *keyParameters,
+              TPM_ALG_ID               macAlg, 
+              TPM2B                   *key
+              );
+UINT16
+CryptMacStart(
+             HMAC_STATE              *state,
+             TPMU_PUBLIC_PARMS       *keyParameters,
+             TPM_ALG_ID               macAlg, 
+             TPM2B                   *key
+             );
+UINT16
+CryptMacEnd(
+           HMAC_STATE          *state,
+           UINT32               size,
+           BYTE                *buffer
+           );
+UINT16
+CryptMacEnd(
+           HMAC_STATE          *state,
+           UINT32               size,
+           BYTE                *buffer
+           );
+UINT16
+CryptMacEnd2B (
+              HMAC_STATE          *state,
+              TPM2B               *data
+              );
+
+#endif
diff --git a/src/tpm2/crypto/openssl/CryptCmac.c b/src/tpm2/crypto/openssl/CryptCmac.c
new file mode 100644 (file)
index 0000000..abc8cbc
--- /dev/null
@@ -0,0 +1,190 @@
+/********************************************************************************/
+/*                                                                             */
+/*     Message Authentication Codes Based on a Symmetric Block Cipher          */
+/*                          Written by Ken Goldman                             */
+/*                    IBM Thomas J. Watson Research Center                     */
+/*            $Id: CryptCmac.c 1259 2018-07-10 19:11:09Z kgoldman $            */
+/*                                                                             */
+/*  Licenses and Notices                                                       */
+/*                                                                             */
+/*  1. Copyright Licenses:                                                     */
+/*                                                                             */
+/*  - Trusted Computing Group (TCG) grants to the user of the source code in   */
+/*    this specification (the "Source Code") a worldwide, irrevocable,                 */
+/*    nonexclusive, royalty free, copyright license to reproduce, create       */
+/*    derivative works, distribute, display and perform the Source Code and    */
+/*    derivative works thereof, and to grant others the rights granted herein. */
+/*                                                                             */
+/*  - The TCG grants to the user of the other parts of the specification       */
+/*    (other than the Source Code) the rights to reproduce, distribute,        */
+/*    display, and perform the specification solely for the purpose of                 */
+/*    developing products based on such documents.                             */
+/*                                                                             */
+/*  2. Source Code Distribution Conditions:                                    */
+/*                                                                             */
+/*  - Redistributions of Source Code must retain the above copyright licenses,         */
+/*    this list of conditions and the following disclaimers.                   */
+/*                                                                             */
+/*  - Redistributions in binary form must reproduce the above copyright        */
+/*    licenses, this list of conditions        and the following disclaimers in the    */
+/*    documentation and/or other materials provided with the distribution.     */
+/*                                                                             */
+/*  3. Disclaimers:                                                            */
+/*                                                                             */
+/*  - THE COPYRIGHT LICENSES SET FORTH ABOVE DO NOT REPRESENT ANY FORM OF      */
+/*  LICENSE OR WAIVER, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, WITH      */
+/*  RESPECT TO PATENT RIGHTS HELD BY TCG MEMBERS (OR OTHER THIRD PARTIES)      */
+/*  THAT MAY BE NECESSARY TO IMPLEMENT THIS SPECIFICATION OR OTHERWISE.                */
+/*  Contact TCG Administration (admin@trustedcomputinggroup.org) for           */
+/*  information on specification licensing rights available through TCG        */
+/*  membership agreements.                                                     */
+/*                                                                             */
+/*  - THIS SPECIFICATION IS PROVIDED "AS IS" WITH NO EXPRESS OR IMPLIED        */
+/*    WARRANTIES WHATSOEVER, INCLUDING ANY WARRANTY OF MERCHANTABILITY OR      */
+/*    FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, COMPLETENESS, OR             */
+/*    NONINFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS, OR ANY WARRANTY                 */
+/*    OTHERWISE ARISING OUT OF ANY PROPOSAL, SPECIFICATION OR SAMPLE.          */
+/*                                                                             */
+/*  - Without limitation, TCG and its members and licensors disclaim all       */
+/*    liability, including liability for infringement of any proprietary       */
+/*    rights, relating to use of information in this specification and to the  */
+/*    implementation of this specification, and TCG disclaims all liability for        */
+/*    cost of procurement of substitute goods or services, lost profits, loss  */
+/*    of use, loss of data or any incidental, consequential, direct, indirect,         */
+/*    or special damages, whether under contract, tort, warranty or otherwise,         */
+/*    arising in any way out of use or reliance upon this specification or any         */
+/*    information herein.                                                      */
+/*                                                                             */
+/*  (c) Copyright IBM Corp. and others, 2018                                   */
+/*                                                                             */
+/********************************************************************************/
+
+/* 10.2.6      CryptCmac.c */
+/* 10.2.6.1    Introduction */
+/* This file contains the implementation of the message authentication codes based on a symmetric
+   block cipher. These functions only use the single block encryption functions of the selected
+   symmetric cryptographic library. */
+/* 10.2.6.2    Includes, Defines, and Typedefs */
+#define _CRYPT_HASH_C_
+#include "Tpm.h"
+#include "CryptSym.h"
+#ifdef TPM_ALG_CMAC
+    /* 10.2.6.3        Functions */
+    /* 10.2.6.3.1      CryptCmacStart() */
+    /* This is the function to start the CMAC sequence operation. It initializes the dispatch
+       functions for the data and end operations for CMAC and initializes the parameters that are
+       used for the processing of data, including the key, key size and block cipher algorithm. */
+UINT16
+CryptCmacStart(
+              SMAC_STATE          *state,
+              TPMU_PUBLIC_PARMS   *keyParms,
+              TPM_ALG_ID           macAlg,
+              TPM2B               *key
+              )
+{
+    tpmCmacState_t      *cState = &state->state.cmac;
+    TPMT_SYM_DEF_OBJECT *def = &keyParms->symDetail.sym;
+    //
+    if(macAlg != TPM_ALG_CMAC)
+       return 0;
+    // set up the encryption algorithm and parameters
+    cState->symAlg = def->algorithm;
+    cState->keySizeBits = def->keyBits.sym;
+    cState->iv.t.size = CryptGetSymmetricBlockSize(def->algorithm,
+                                                  def->keyBits.sym);
+    MemoryCopy2B(&cState->symKey.b, key, sizeof(cState->symKey.t.buffer));
+    // Set up the dispatch methods for the CMAC
+    state->smacMethods.data = CryptCmacData;
+    state->smacMethods.end = CryptCmacEnd;
+    return cState->iv.t.size;
+}
+
+/* 10.2.6.3.2  CryptCmacData() */
+/* This function is used to add data to the CMAC sequence computation. The function will XOR new
+   data into the IV. If the buffer is full, and there is additional input data, the data is
+   encrypted into the IV buffer, the new data is then XOR into the IV. When the data runs out, the
+   function returns without encrypting even if the buffer is full. The last data block of a sequence
+   will not be encrypted until the call to CryptCmacEnd(). This is to allow the proper subkey to be
+   computed and applied before the last block is encrypted. */
+void
+CryptCmacData(
+             SMAC_STATES         *state,
+             UINT32               size,
+             const BYTE          *buffer
+             )
+{
+    tpmCmacState_t          *cmacState = &state->cmac;
+    TPM_ALG_ID               algorithm = cmacState->symAlg;
+    BYTE                    *key = cmacState->symKey.t.buffer;
+    UINT16                   keySizeInBits = cmacState->keySizeBits;
+    tpmCryptKeySchedule_t    keySchedule;
+    TpmCryptSetSymKeyCall_t  encrypt;
+    //
+    SELECT(ENCRYPT);
+    while(size > 0)
+       {
+           if(cmacState->bcount == cmacState->iv.t.size)
+               {
+                   ENCRYPT(&keySchedule, cmacState->iv.t.buffer, cmacState->iv.t.buffer);
+                   cmacState->bcount = 0;
+               }
+           for(;(size > 0) && (cmacState->bcount < cmacState->iv.t.size);
+               size--, cmacState->bcount++)
+               {
+                   cmacState->iv.t.buffer[cmacState->bcount] ^= *buffer++;
+               }
+       }
+}
+/* 10.2.6.3.3  CryptCmacEnd() */
+/* This is the completion function for the CMAC. It does padding, if needed, and selects the subkey
+   to be applied before the last block is encrypted. */
+UINT16
+CryptCmacEnd(
+            SMAC_STATES             *state,
+            UINT32                   outSize,
+            BYTE                    *outBuffer
+            )
+{
+    tpmCmacState_t          *cState = &state->cmac;
+    // Need to set algorithm, key, and keySizeInBits in the local context so that
+    // the SELECT and ENCRYPT macros will work here
+    TPM_ALG_ID               algorithm = cState->symAlg;
+    BYTE                    *key = cState->symKey.t.buffer;
+    UINT16                   keySizeInBits = cState->keySizeBits;
+    tpmCryptKeySchedule_t    keySchedule;
+    TpmCryptSetSymKeyCall_t  encrypt;
+    TPM2B_IV                 subkey = {{0, {0}}};
+    BOOL                     xorVal;
+    UINT16                   i;
+    subkey.t.size = cState->iv.t.size;
+    // Encrypt a block of zero
+    SELECT(ENCRYPT);
+    ENCRYPT(&keySchedule, subkey.t.buffer, subkey.t.buffer);
+    // shift left by 1 and XOR with 0x0...87 if the MSb was 0
+    xorVal = ((subkey.t.buffer[0] & 0x80) == 0) ? 0 : 0x87;
+    ShiftLeft(&subkey.b);
+    subkey.t.buffer[subkey.t.size - 1] ^= xorVal;
+    // this is a sanity check to make sure that the algorithm is working properly.
+    // remove this check when debug is done
+    pAssert(cState->bcount <= cState->iv.t.size);
+    // If the buffer is full then no need to compute subkey 2.
+    if(cState->bcount < cState->iv.t.size)
+       {
+           //Pad the data
+           cState->iv.t.buffer[cState->bcount++] ^= 0x80;
+           // The rest of the data is a pad of zero which would simply be XORed
+           // with the iv value so nothing to do...
+           // Now compute K2
+           xorVal = ((subkey.t.buffer[0] & 0x80) == 0) ? 0 : 0x87;
+           ShiftLeft(&subkey.b);
+           subkey.t.buffer[subkey.t.size - 1] ^= xorVal;
+       }
+    // XOR the subkey into the IV
+    for(i = 0; i < subkey.t.size; i++)
+       cState->iv.t.buffer[i] ^= subkey.t.buffer[i];
+    ENCRYPT(&keySchedule, cState->iv.t.buffer, cState->iv.t.buffer);
+    i = (UINT16)MIN(cState->iv.t.size, outSize);
+    MemoryCopy(outBuffer, cState->iv.t.buffer, i);
+    return i;
+}
+#endif
diff --git a/src/tpm2/crypto/openssl/CryptSmac.c b/src/tpm2/crypto/openssl/CryptSmac.c
new file mode 100644 (file)
index 0000000..4932f0e
--- /dev/null
@@ -0,0 +1,154 @@
+/********************************************************************************/
+/*                                                                             */
+/*             Message Authentication Codes Based on a Symmetric Block Cipher  */
+/*                          Written by Ken Goldman                             */
+/*                    IBM Thomas J. Watson Research Center                     */
+/*            $Id: CryptSmac.c 1259 2018-07-10 19:11:09Z kgoldman $            */
+/*                                                                             */
+/*  Licenses and Notices                                                       */
+/*                                                                             */
+/*  1. Copyright Licenses:                                                     */
+/*                                                                             */
+/*  - Trusted Computing Group (TCG) grants to the user of the source code in   */
+/*    this specification (the "Source Code") a worldwide, irrevocable,                 */
+/*    nonexclusive, royalty free, copyright license to reproduce, create       */
+/*    derivative works, distribute, display and perform the Source Code and    */
+/*    derivative works thereof, and to grant others the rights granted herein. */
+/*                                                                             */
+/*  - The TCG grants to the user of the other parts of the specification       */
+/*    (other than the Source Code) the rights to reproduce, distribute,        */
+/*    display, and perform the specification solely for the purpose of                 */
+/*    developing products based on such documents.                             */
+/*                                                                             */
+/*  2. Source Code Distribution Conditions:                                    */
+/*                                                                             */
+/*  - Redistributions of Source Code must retain the above copyright licenses,         */
+/*    this list of conditions and the following disclaimers.                   */
+/*                                                                             */
+/*  - Redistributions in binary form must reproduce the above copyright        */
+/*    licenses, this list of conditions        and the following disclaimers in the    */
+/*    documentation and/or other materials provided with the distribution.     */
+/*                                                                             */
+/*  3. Disclaimers:                                                            */
+/*                                                                             */
+/*  - THE COPYRIGHT LICENSES SET FORTH ABOVE DO NOT REPRESENT ANY FORM OF      */
+/*  LICENSE OR WAIVER, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, WITH      */
+/*  RESPECT TO PATENT RIGHTS HELD BY TCG MEMBERS (OR OTHER THIRD PARTIES)      */
+/*  THAT MAY BE NECESSARY TO IMPLEMENT THIS SPECIFICATION OR OTHERWISE.                */
+/*  Contact TCG Administration (admin@trustedcomputinggroup.org) for           */
+/*  information on specification licensing rights available through TCG        */
+/*  membership agreements.                                                     */
+/*                                                                             */
+/*  - THIS SPECIFICATION IS PROVIDED "AS IS" WITH NO EXPRESS OR IMPLIED        */
+/*    WARRANTIES WHATSOEVER, INCLUDING ANY WARRANTY OF MERCHANTABILITY OR      */
+/*    FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, COMPLETENESS, OR             */
+/*    NONINFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS, OR ANY WARRANTY                 */
+/*    OTHERWISE ARISING OUT OF ANY PROPOSAL, SPECIFICATION OR SAMPLE.          */
+/*                                                                             */
+/*  - Without limitation, TCG and its members and licensors disclaim all       */
+/*    liability, including liability for infringement of any proprietary       */
+/*    rights, relating to use of information in this specification and to the  */
+/*    implementation of this specification, and TCG disclaims all liability for        */
+/*    cost of procurement of substitute goods or services, lost profits, loss  */
+/*    of use, loss of data or any incidental, consequential, direct, indirect,         */
+/*    or special damages, whether under contract, tort, warranty or otherwise,         */
+/*    arising in any way out of use or reliance upon this specification or any         */
+/*    information herein.                                                      */
+/*                                                                             */
+/*  (c) Copyright IBM Corp. and others, 2018                                   */
+/*                                                                             */
+/********************************************************************************/
+
+/* 10.2.20     CryptSmac.c */
+/* 10.2.20.1   Introduction */
+/* This file contains the implementation of the message authentication codes based on a symmetric
+   block cipher. These functions only use the single block encryption functions of the selected
+   symmetric cryptographic library. */
+/* 10.2.20.2   Includes, Defines, and Typedefs */
+#define _CRYPT_HASH_C_
+#include "Tpm.h"
+#ifdef SMAC_IMPLEMENTED
+    /* 10.2.20.2.1     CryptSmacStart() */
+    /* Function to start an SMAC. */
+UINT16
+CryptSmacStart(
+              HASH_STATE              *state,
+              TPMU_PUBLIC_PARMS       *keyParameters,
+              TPM_ALG_ID               macAlg,          // IN: the type of MAC
+              TPM2B                   *key
+              )
+{
+    UINT16                  retVal = 0;
+    //
+    // Make sure that the key size is correct. This should have been checked
+    // at key load, but...
+    if(BITS_TO_BYTES(keyParameters->symDetail.sym.keyBits.sym) == key->size)
+       {
+           switch(macAlg)
+               {
+#ifdef TPM_ALG_CMAC
+                 case TPM_ALG_CMAC:
+                   retVal = CryptCmacStart(&state->state.smac, keyParameters,
+                                           macAlg, key);
+                   break;
+#endif
+                 default:
+                   break;
+               }
+       }
+    state->type = (retVal != 0) ? HASH_STATE_SMAC : HASH_STATE_EMPTY;
+    return retVal;
+}
+/* 10.2.20.2.2 CryptMacStart() */
+/* Function to start either an HMAC or an SMAC. Cannot reuse the CryptHmacStart() function because
+   of the difference in number of parameters. */
+UINT16
+CryptMacStart(
+             HMAC_STATE              *state,
+             TPMU_PUBLIC_PARMS       *keyParameters,
+             TPM_ALG_ID               macAlg,          // IN: the type of MAC
+             TPM2B                   *key
+             )
+{
+    MemorySet(state, 0, sizeof(HMAC_STATE));
+    if(CryptHashIsValidAlg(macAlg, FALSE))
+       {
+           return CryptHmacStart(state, macAlg, key->size, key->buffer);
+       }
+    else if(CryptSmacIsValidAlg(macAlg, FALSE))
+       {
+           return CryptSmacStart(&state->hashState, keyParameters, macAlg, key);
+       }
+    else
+       return 0;
+}
+/* 10.2.20.2.3 CryptMacEnd() */
+/* Dispatch to the MAC end function using a size and buffer pointer. */
+UINT16
+CryptMacEnd(
+           HMAC_STATE          *state,
+           UINT32               size,
+           BYTE                *buffer
+           )
+{
+    UINT16              retVal = 0;
+    if(state->hashState.type == HASH_STATE_SMAC)
+       retVal = (state->hashState.state.smac.smacMethods.end)(
+                                                              &state->hashState.state.smac.state, size, buffer);
+    else if(state->hashState.type == HASH_STATE_HMAC)
+       retVal = CryptHmacEnd(state, size, buffer);
+    state->hashState.type = HASH_STATE_EMPTY;
+    return retVal;
+}
+/* 10.2.20.2.4 CryptMacEnd2B() */
+/* Dispatch to the MAC end function using a 2B. */
+UINT16
+CryptMacEnd2B (
+              HMAC_STATE          *state,
+              TPM2B               *data
+              )
+{
+    return CryptMacEnd(state, data->size, data->buffer);
+}
+#endif // SMAC_IMPLEMENTED
+