代码拉取完成,页面将自动刷新
From 88d5468aaa577566eb5384d4e65f092adaf85afd Mon Sep 17 00:00:00 2001
From: fly2x <fly2x@hitls.org>
Date: Thu, 2 Nov 2023 08:17:38 +0800
Subject: [PATCH] tpm2 add SM3 and SM4 support
---
configure.ac | 14 +++
src/tpm2/AlgorithmTests.c | 1 +
src/tpm2/HashTestData.h | 6 +-
src/tpm2/Marshal.c | 11 +-
src/tpm2/Marshal_fp.h | 4 +
src/tpm2/NVMarshal.c | 156 ++++++++++++++++++++++--
src/tpm2/StateMarshal.c | 2 -
src/tpm2/SymmetricTest.h | 2 +-
src/tpm2/SymmetricTestData.h | 4 +-
src/tpm2/TpmProfile.h | 1 +
src/tpm2/Unmarshal_fp.h | 4 +
src/tpm2/Volatile.c | 2 -
src/tpm2/crypto/CryptSym.h | 4 +
src/tpm2/crypto/openssl/CryptCmac.c | 11 +-
src/tpm2/crypto/openssl/CryptSym.c | 18 +++
src/tpm2/crypto/openssl/Helpers.c | 101 ++++++++++++++-
src/tpm2/crypto/openssl/TpmToOsslHash.h | 25 ++--
src/tpm2/crypto/openssl/TpmToOsslSym.h | 33 ++---
src/tpm_tpm2_interface.c | 3 +
19 files changed, 351 insertions(+), 51 deletions(-)
diff --git a/configure.ac b/configure.ac
index d6a6c5e..f488467 100644
--- a/configure.ac
+++ b/configure.ac
@@ -106,6 +106,20 @@ AC_ARG_WITH([openssl],
]
)
+AC_ARG_WITH([openssl-SM],
+ AS_HELP_STRING([--with-openssl-SM], [libtpms supports SM3 and SM4, default not support]), [with_openssl_SM=yes], [with_openssl_SM=no]
+)
+
+AS_IF([test "x$with_openssl_SM" != "xno"], [
+ AC_DEFINE([ALG_SM3_256], [1], [1 denotes to support SM3, and 0 not support])
+ AC_DEFINE([ALG_SM4], [1], [1 denotes to support SM4, and 0 not support])
+])
+
+AS_IF([test "x$with_openssl_SM" = "xno"], [
+ AC_DEFINE([ALG_SM3_256], [0], [1 denotes to support SM3, and 0 not support])
+ AC_DEFINE([ALG_SM4], [0], [1 denotes to support SM4, and 0 not support])
+])
+
case "$cryptolib" in
freebl)
AM_CONDITIONAL(LIBTPMS_USE_FREEBL, true)
diff --git a/src/tpm2/AlgorithmTests.c b/src/tpm2/AlgorithmTests.c
index 08ee6b0..9cb2e29 100644
--- a/src/tpm2/AlgorithmTests.c
+++ b/src/tpm2/AlgorithmTests.c
@@ -846,6 +846,7 @@ TestAlgorithm(
// if SM4 is implemented, its test is like other block ciphers but there
// aren't any test vectors for it yet
// case TPM_ALG_SM4:
+ case TPM_ALG_SM4: /* libtpms added */
#endif
#if ALG_CAMELLIA
case TPM_ALG_CAMELLIA: // libtpms activated
diff --git a/src/tpm2/HashTestData.h b/src/tpm2/HashTestData.h
index ea0b0af..fe5d25d 100644
--- a/src/tpm2/HashTestData.h
+++ b/src/tpm2/HashTestData.h
@@ -130,7 +130,11 @@ TPM2B_SHA512 c_SHA512_digest = {{64, {
TPM2B_TYPE(EMPTY, 1);
#if ALG_SM3_256 == YES
-TPM2B_EMPTY c_SM3_256_digest = {{0, {0}}};
+TPM2B_TYPE(SM3_256, 32);
+TPM2B_SM3_256 c_SM3_256_digest = {{32, {
+ 0xbb,0x9e,0x23,0x79,0xfe,0xbb,0xf8,0xb0,0x1d,0x27,0x5f,0x30,0x71,0xbe,0xce,0x8a,
+ 0xb7,0x3f,0xee,0x6b,0xed,0xd7,0xee,0x45,0x4f,0x80,0xca,0x70,0x6c,0x09,0xb6,0x1a
+ }}};
#endif
#if ALG_SHA3_256 == YES
diff --git a/src/tpm2/Marshal.c b/src/tpm2/Marshal.c
index fe83b21..706acdc 100644
--- a/src/tpm2/Marshal.c
+++ b/src/tpm2/Marshal.c
@@ -1178,7 +1178,15 @@ TPMI_AES_KEY_BITS_Marshal(TPMI_AES_KEY_BITS *source, BYTE **buffer, INT32 *size)
written += TPM_KEY_BITS_Marshal(source, buffer, size);
return written;
}
-
+#if ALG_SM4 // libtpms add
+UINT16
+TPMI_SM4_KEY_BITS_Marshal(TPMI_SM4_KEY_BITS *source, BYTE **buffer, INT32 *size)
+{
+ UINT16 written = 0;
+ written += TPM_KEY_BITS_Marshal(source, buffer, size);
+ return written;
+}
+#endif
UINT16 // libtpms added begin
TPMI_TDES_KEY_BITS_Marshal(TPMI_TDES_KEY_BITS *source, BYTE **buffer, INT32 *size)
{
@@ -1186,7 +1194,6 @@ TPMI_TDES_KEY_BITS_Marshal(TPMI_TDES_KEY_BITS *source, BYTE **buffer, INT32 *siz
written += TPM_KEY_BITS_Marshal(source, buffer, size);
return written;
}
-
#if ALG_CAMELLIA
UINT16
TPMI_CAMELLIA_KEY_BITS_Marshal(TPMI_CAMELLIA_KEY_BITS *source, BYTE **buffer, INT32 *size)
diff --git a/src/tpm2/Marshal_fp.h b/src/tpm2/Marshal_fp.h
index d52f497..e7562ef 100644
--- a/src/tpm2/Marshal_fp.h
+++ b/src/tpm2/Marshal_fp.h
@@ -238,6 +238,10 @@ extern "C" {
TPM2B_ATTEST_Marshal(TPM2B_ATTEST *source, BYTE **buffer, INT32 *size);
UINT16
TPMI_AES_KEY_BITS_Marshal(TPMI_AES_KEY_BITS *source, BYTE **buffer, INT32 *size);
+#if ALG_SM4 // libtpms added
+ UINT16
+ TPMI_SM4_KEY_BITS_Marshal(TPMI_SM4_KEY_BITS *source, BYTE **buffer, INT32 *size);
+#endif
UINT16 // libtpms added
TPMI_TDES_KEY_BITS_Marshal(TPMI_TDES_KEY_BITS *source, BYTE **buffer, INT32 *size);
UINT16
diff --git a/src/tpm2/NVMarshal.c b/src/tpm2/NVMarshal.c
index c7cd1e0..e2f83de 100644
--- a/src/tpm2/NVMarshal.c
+++ b/src/tpm2/NVMarshal.c
@@ -774,8 +774,8 @@ PCR_SAVE_Marshal(PCR_SAVE *data, BYTE **buffer, INT32 *size)
written += Array_Marshal((BYTE *)&data->Sm3_256, array_size,
buffer, size);
#endif
-#if ALG_SHA3_256 || ALG_SHA3_384 || ALG_SHA3_512 || ALG_SM3_256
-#error SHA3 and SM3 are not supported
+#if ALG_SHA3_256 || ALG_SHA3_384 || ALG_SHA3_512
+#error SHA3 is not supported
#endif
/* end marker */
@@ -879,8 +879,8 @@ PCR_SAVE_Unmarshal(PCR_SAVE *data, BYTE **buffer, INT32 *size,
t = (BYTE *)&data->Sm3_256;
break;
#endif
-#if ALG_SHA3_256 || ALG_SHA3_384 || ALG_SHA3_512 || ALG_SM3_256
-#error SHA3 and SM3 are not supported
+#if ALG_SHA3_256 || ALG_SHA3_384 || ALG_SHA3_512
+#error SHA3 is not supported
#endif
case TPM_ALG_NULL:
/* end marker */
@@ -990,8 +990,8 @@ PCR_Marshal(PCR *data, BYTE **buffer, INT32 *size)
written += Array_Marshal((BYTE *)&data->Sm3_256Pcr, array_size,
buffer, size);
#endif
-#if ALG_SHA3_256 || ALG_SHA3_384 || ALG_SHA3_512 || ALG_SM3_256
-#error SHA3 and SM3 are not supported
+#if ALG_SHA3_256 || ALG_SHA3_384 || ALG_SHA3_512
+#error SHA3 is not supported
#endif
/* end marker */
@@ -1061,8 +1061,8 @@ PCR_Unmarshal(PCR *data, BYTE **buffer, INT32 *size,
t = (BYTE *)&data->Sm3_256Pcr;
break;
#endif
-#if ALG_SHA3_256 || ALG_SHA3_384 || ALG_SHA3_512 || ALG_SM3_256
-#error SHA3 and SM3 are not supported
+#if ALG_SHA3_256 || ALG_SHA3_384 || ALG_SHA3_512
+#error SHA3 is not supported
#endif
case TPM_ALG_NULL:
/* end marker */
@@ -2032,6 +2032,134 @@ skip_future_versions:
}
#endif
+#if ALG_SM3_256
+
+#define HASH_STATE_SM3_256_MAGIC 0x10854a09
+#define HASH_STATE_SM3_256_VERSION 2
+
+static UINT16
+tpmHashStateSM3_256_Marshal(tpmHashStateSM3_256_t *data, BYTE **buffer, INT32 *size,
+ UINT16 hashAlg)
+{
+ UINT16 written = 0;
+ UINT16 array_size;
+ SM3_CTX *sm3_ctx = NULL;
+ BLOCK_SKIP_INIT;
+
+ sm3_ctx = EVP_MD_CTX_md_data(*data);
+ written = NV_HEADER_Marshal(buffer, size,
+ HASH_STATE_SM3_256_VERSION,
+ HASH_STATE_SM3_256_MAGIC, 1);
+ written += UINT32_Marshal(&sm3_ctx->A, buffer, size);
+ written += UINT32_Marshal(&sm3_ctx->B, buffer, size);
+ written += UINT32_Marshal(&sm3_ctx->C, buffer, size);
+ written += UINT32_Marshal(&sm3_ctx->D, buffer, size);
+ written += UINT32_Marshal(&sm3_ctx->E, buffer, size);
+ written += UINT32_Marshal(&sm3_ctx->F, buffer, size);
+ written += UINT32_Marshal(&sm3_ctx->G, buffer, size);
+ written += UINT32_Marshal(&sm3_ctx->H, buffer, size);
+ written += UINT32_Marshal(&sm3_ctx->Nl, buffer, size);
+ written += UINT32_Marshal(&sm3_ctx->Nh, buffer, size);
+ /* data must be written as array */
+ array_size = sizeof(sm3_ctx->data);
+ written += UINT16_Marshal(&array_size, buffer, size);
+ written += Array_Marshal((BYTE *)&sm3_ctx->data[0], array_size, buffer, size);
+ written += UINT32_Marshal(&sm3_ctx->num, buffer, size);
+ written += BLOCK_SKIP_WRITE_PUSH(TRUE, buffer, size);
+ /* future versions append below this line */
+
+ BLOCK_SKIP_WRITE_POP(size);
+
+ BLOCK_SKIP_WRITE_CHECK;
+
+ return written;
+}
+
+static UINT16
+tpmHashStateSM3_256_Unmarshal(tpmHashStateSM3_256_t *data, BYTE **buffer, INT32 *size,
+ UINT16 hashAlg)
+{
+ UINT16 rc = TPM_RC_SUCCESS;
+ UINT16 array_size;
+ NV_HEADER hdr;
+ SM3_CTX *sm3_ctx = NULL;
+
+ (*data) = EVP_MD_CTX_new();
+ if ((*data) == NULL) {
+ rc = TPM_RC_FAILURE;
+ }
+ if (rc == TPM_RC_SUCCESS) {
+ EVP_DigestInit_ex(*data, EVP_sm3(), NULL);
+ sm3_ctx = EVP_MD_CTX_md_data(*data);
+ }
+
+ if (rc == TPM_RC_SUCCESS) {
+ rc = NV_HEADER_Unmarshal(&hdr, buffer, size,
+ HASH_STATE_SM3_256_VERSION,
+ HASH_STATE_SM3_256_MAGIC);
+ }
+
+ if (rc == TPM_RC_SUCCESS) {
+ rc = UINT32_Unmarshal(&sm3_ctx->A, buffer, size);
+ }
+ if (rc == TPM_RC_SUCCESS) {
+ rc = UINT32_Unmarshal(&sm3_ctx->B, buffer, size);
+ }
+ if (rc == TPM_RC_SUCCESS) {
+ rc = UINT32_Unmarshal(&sm3_ctx->C, buffer, size);
+ }
+ if (rc == TPM_RC_SUCCESS) {
+ rc = UINT32_Unmarshal(&sm3_ctx->D, buffer, size);
+ }
+ if (rc == TPM_RC_SUCCESS) {
+ rc = UINT32_Unmarshal(&sm3_ctx->E, buffer, size);
+ }
+ if (rc == TPM_RC_SUCCESS) {
+ rc = UINT32_Unmarshal(&sm3_ctx->F, buffer, size);
+ }
+ if (rc == TPM_RC_SUCCESS) {
+ rc = UINT32_Unmarshal(&sm3_ctx->G, buffer, size);
+ }
+ if (rc == TPM_RC_SUCCESS) {
+ rc = UINT32_Unmarshal(&sm3_ctx->H, buffer, size);
+ }
+ if (rc == TPM_RC_SUCCESS) {
+ rc = UINT32_Unmarshal(&sm3_ctx->Nl, buffer, size);
+ }
+ if (rc == TPM_RC_SUCCESS) {
+ rc = UINT32_Unmarshal(&sm3_ctx->Nh, buffer, size);
+ }
+ if (rc == TPM_RC_SUCCESS) {
+ rc = UINT16_Unmarshal(&array_size, buffer, size);
+ }
+ if (rc == TPM_RC_SUCCESS &&
+ array_size != sizeof(sm3_ctx->data)) {
+ TPMLIB_LogTPM2Error("HASH_STATE_SM3_256: Bad array size for data; "
+ "expected %zu, got %u\n",
+ sizeof(sm3_ctx->data), array_size);
+ rc = TPM_RC_BAD_PARAMETER;
+ }
+ if (rc == TPM_RC_SUCCESS) {
+ rc = Array_Unmarshal((BYTE *)&sm3_ctx->data[0], array_size,
+ buffer, size);
+ }
+ if (rc == TPM_RC_SUCCESS) {
+ rc = UINT32_Unmarshal(&sm3_ctx->num, buffer, size);
+ }
+
+ /* version 2 starts having indicator for next versions that we can skip;
+ this allows us to downgrade state */
+ if (rc == TPM_RC_SUCCESS && hdr.version >= 2) {
+ BLOCK_SKIP_READ(skip_future_versions, FALSE, buffer, size,
+ "HASH_STATE_SM3_256", "version 3 or later");
+ /* future versions nest-append here */
+ }
+skip_future_versions:
+
+ return rc;
+}
+#endif
+
#define ANY_HASH_STATE_MAGIC 0x349d494b
#define ANY_HASH_STATE_VERSION 2
@@ -2068,6 +2196,12 @@ ANY_HASH_STATE_Marshal(ANY_HASH_STATE *data, BYTE **buffer, INT32 *size,
written += tpmHashStateSHA512_Marshal(&data->Sha512, buffer, size,
ALG_SHA512_VALUE);
break;
+#endif
+#if ALG_SM3_256
+ case ALG_SM3_256_VALUE:
+ written += tpmHashStateSM3_256_Marshal(&data->Sm3_256, buffer, size,
+ ALG_SM3_256_VALUE);
+ break;
#endif
default:
break;
@@ -2118,6 +2252,12 @@ ANY_HASH_STATE_Unmarshal(ANY_HASH_STATE *data, BYTE **buffer, INT32 *size,
rc = tpmHashStateSHA512_Unmarshal(&data->Sha512, buffer, size,
ALG_SHA512_VALUE);
break;
+#endif
+#if ALG_SM3_256
+ case ALG_SM3_256_VALUE:
+ rc = tpmHashStateSM3_256_Unmarshal(&data->Sm3_256, buffer, size,
+ ALG_SM3_256_VALUE);
+ break;
#endif
}
diff --git a/src/tpm2/StateMarshal.c b/src/tpm2/StateMarshal.c
index fbb2662..3eabaf8 100644
--- a/src/tpm2/StateMarshal.c
+++ b/src/tpm2/StateMarshal.c
@@ -38,8 +38,6 @@
#include <stdlib.h>
-#include "config.h"
-
#include "StateMarshal.h"
#include "Volatile.h"
diff --git a/src/tpm2/SymmetricTest.h b/src/tpm2/SymmetricTest.h
index 058f50a..8083191 100644
--- a/src/tpm2/SymmetricTest.h
+++ b/src/tpm2/SymmetricTest.h
@@ -96,7 +96,7 @@ const SYMMETRIC_TEST_VECTOR c_symTestValues[NUM_SYMS + 1] = {
#if ALG_SM4 && SM4_128 // libtpms activated
{TPM_ALG_SM4, 128, key_SM4128, 16, sizeof(dataIn_SM4128), dataIn_SM4128,
{dataOut_SM4128_CTR, dataOut_SM4128_OFB, dataOut_SM4128_CBC,
- dataOut_SM4128_CFB, dataOut_AES128_ECB}},
+ dataOut_SM4128_CFB, dataOut_SM4128_ECB}},
#endif
// libtpms added begin
#if ALG_TDES && TDES_128
diff --git a/src/tpm2/SymmetricTestData.h b/src/tpm2/SymmetricTestData.h
index 77321fa..f8a8e7e 100644
--- a/src/tpm2/SymmetricTestData.h
+++ b/src/tpm2/SymmetricTestData.h
@@ -367,7 +367,7 @@ const BYTE dataOut_SM4128_ECB [] = {
0x2F, 0x1D, 0x30, 0x5A, 0x7F, 0xB1, 0x7D, 0xF9,
0x85, 0xF8, 0x1C, 0x84, 0x82, 0x19, 0x23, 0x04,
0x00, 0x2A, 0x8A, 0x4E, 0xFA, 0x86, 0x3C, 0xCA,
- 0xD0, 0x24, 0xAC, 0x03, 0x00, 0xBB, 0x40, 0xD2}
+ 0xD0, 0x24, 0xAC, 0x03, 0x00, 0xBB, 0x40, 0xD2};
const BYTE dataOut_SM4128_CBC [] = {
0x78, 0xEB, 0xB1, 0x1C, 0xC4, 0x0B, 0x0A, 0x48,
0x31, 0x2A, 0xAE, 0xB2, 0x04, 0x02, 0x44, 0xCB,
@@ -389,7 +389,7 @@ const BYTE dataOut_SM4128_OFB [] = {
echo "AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDDEEEEEEEEFFFFFFFFAAAAAAAABBBBBBBB" | xxd -p -r > plain.txt
openssl enc -sm4-ctr -in plain.txt -iv "F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF" -out out.txt -K "0123456789ABCDEFFEDCBA9876543210"
*/
-const BYTE dataOut_SM4_CTR [] = {
+const BYTE dataOut_SM4128_CTR [] = {
0xF4, 0x88, 0x4C, 0x6D, 0x39, 0x7E, 0x0B, 0x06,
0x3D, 0xAC, 0xD9, 0x46, 0x1A, 0xA4, 0xA5, 0x6A,
0x60, 0xDD, 0xA7, 0x5F, 0x86, 0xBC, 0xFE, 0xA4,
diff --git a/src/tpm2/TpmProfile.h b/src/tpm2/TpmProfile.h
index 49aaad1..5dd3be2 100644
--- a/src/tpm2/TpmProfile.h
+++ b/src/tpm2/TpmProfile.h
@@ -65,6 +65,7 @@
// A.2 TpmProfile.h
#ifndef _TPM_PROFILE_H_
#define _TPM_PROFILE_H_
+#include "config.h" /* libtpms added */
// Table 2:4 - Defines for Logic Values
#undef TRUE
#define TRUE 1
diff --git a/src/tpm2/Unmarshal_fp.h b/src/tpm2/Unmarshal_fp.h
index e541347..9ffdf5e 100644
--- a/src/tpm2/Unmarshal_fp.h
+++ b/src/tpm2/Unmarshal_fp.h
@@ -295,6 +295,10 @@ extern "C" {
#endif /* libtpms added */
LIB_EXPORT TPM_RC
TPMI_AES_KEY_BITS_Unmarshal(TPMI_AES_KEY_BITS *target, BYTE **buffer, INT32 *size);
+#if ALG_SM4 /* libtpms added */
+ LIB_EXPORT TPM_RC
+ TPMI_SM4_KEY_BITS_Unmarshal(TPMI_SM4_KEY_BITS *target, BYTE **buffer, INT32 *size);
+#endif
LIB_EXPORT TPM_RC
TPMI_CAMELLIA_KEY_BITS_Unmarshal(TPMI_CAMELLIA_KEY_BITS *target, BYTE **buffer, INT32 *size);
LIB_EXPORT TPM_RC /* libtpms added */
diff --git a/src/tpm2/Volatile.c b/src/tpm2/Volatile.c
index ff15c7f..6ff6330 100644
--- a/src/tpm2/Volatile.c
+++ b/src/tpm2/Volatile.c
@@ -45,8 +45,6 @@
#endif
#include <string.h>
-#include "config.h"
-
#include "assert.h"
#include "NVMarshal.h"
#include "Volatile.h"
diff --git a/src/tpm2/crypto/CryptSym.h b/src/tpm2/crypto/CryptSym.h
index 66cfb97..6e7e5d3 100644
--- a/src/tpm2/crypto/CryptSym.h
+++ b/src/tpm2/crypto/CryptSym.h
@@ -124,6 +124,8 @@ typedef union tpmCryptKeySchedule_t {
# define DECRYPT(keySchedule, in, out) \
decrypt(SWIZZLE(keySchedule, in, out))
+#define FINAL(keySchedule) final((void *)(keySchedule)) // libtpms added
+
/* Note that the macros rely on encrypt as local values in the functions that use these
macros. Those parameters are set by the macro that set the key schedule to be used for the
call. */
@@ -132,11 +134,13 @@ typedef union tpmCryptKeySchedule_t {
case TPM_ALG_##ALG: \
TpmCryptSetEncryptKey##ALG(key, keySizeInBits, &keySchedule.alg); \
encrypt = (TpmCryptSetSymKeyCall_t)TpmCryptEncrypt##ALG; \
+ final = (TpmCryptSymFinal_t)TpmCryptFinal##ALG; /* libtpms added */ \
break;
#define DECRYPT_CASE(ALG, alg) \
case TPM_ALG_##ALG: \
TpmCryptSetDecryptKey##ALG(key, keySizeInBits, &keySchedule.alg); \
decrypt = (TpmCryptSetSymKeyCall_t)TpmCryptDecrypt##ALG; \
+ final = (TpmCryptSymFinal_t)TpmCryptFinal##ALG; /* libtpms added */ \
break;
#endif
diff --git a/src/tpm2/crypto/openssl/CryptCmac.c b/src/tpm2/crypto/openssl/CryptCmac.c
index 0461e78..2cc98d2 100644
--- a/src/tpm2/crypto/openssl/CryptCmac.c
+++ b/src/tpm2/crypto/openssl/CryptCmac.c
@@ -120,6 +120,7 @@ CryptCmacData(
UINT16 keySizeInBits = cmacState->keySizeBits;
tpmCryptKeySchedule_t keySchedule;
TpmCryptSetSymKeyCall_t encrypt;
+ TpmCryptSymFinal_t final; /* libtpms added */
//
memset(&keySchedule, 0, sizeof(keySchedule)); /* libtpms added: coverity */
// Set up the encryption values based on the algorithm
@@ -142,6 +143,10 @@ CryptCmacData(
cmacState->iv.t.buffer[cmacState->bcount] ^= *buffer++;
}
}
+ /* libtpms added begin */
+ if (final)
+ FINAL(&keySchedule);
+ /* libtpms added end */
}
/* 10.2.6.3.3 CryptCmacEnd() */
@@ -162,6 +167,7 @@ CryptCmacEnd(
UINT16 keySizeInBits = cState->keySizeBits;
tpmCryptKeySchedule_t keySchedule;
TpmCryptSetSymKeyCall_t encrypt;
+ TpmCryptSymFinal_t final; /* libtpms added */
TPM2B_IV subkey = {{0, {0}}};
BOOL xorVal;
UINT16 i;
@@ -203,7 +209,10 @@ CryptCmacEnd(
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);
-
+ /* libtpms added begin */
+ if (final)
+ FINAL(&keySchedule);
+ /* libtpms added end */
return i;
}
diff --git a/src/tpm2/crypto/openssl/CryptSym.c b/src/tpm2/crypto/openssl/CryptSym.c
index c8a0497..3be1d3c 100644
--- a/src/tpm2/crypto/openssl/CryptSym.c
+++ b/src/tpm2/crypto/openssl/CryptSym.c
@@ -175,6 +175,7 @@ CryptSymmetricEncrypt(
tpmCryptKeySchedule_t keySchedule;
INT16 blockSize;
TpmCryptSetSymKeyCall_t encrypt;
+ TpmCryptSymFinal_t final; /* libtpms added */
BYTE *iv;
BYTE defaultIv[MAX_SYM_BLOCK_SIZE] = {0};
//
@@ -294,8 +295,16 @@ CryptSymmetricEncrypt(
break;
#endif
default:
+ /* libtpms added begin */
+ if (final)
+ FINAL(&keySchedule);
+ /* libtpms added end */
return TPM_RC_FAILURE;
}
+ /* libtpms added begin */
+ if (final)
+ FINAL(&keySchedule);
+ /* libtpms added end */
return TPM_RC_SUCCESS;
}
/* 10.2.20.5.1 CryptSymmetricDecrypt() */
@@ -326,6 +335,7 @@ CryptSymmetricDecrypt(
BYTE *iv;
TpmCryptSetSymKeyCall_t encrypt;
TpmCryptSetSymKeyCall_t decrypt;
+ TpmCryptSymFinal_t final; /* libtpms added */
BYTE defaultIv[MAX_SYM_BLOCK_SIZE] = {0};
memset(&keySchedule, 0, sizeof(keySchedule)); // libtpms added; coverity
@@ -466,8 +476,16 @@ CryptSymmetricDecrypt(
break;
#endif
default:
+ /* libtpms added begin */
+ if (final)
+ FINAL(&keySchedule);
+ /* libtpms added end */
return TPM_RC_FAILURE;
}
+ /* libtpms added begin */
+ if (final)
+ FINAL(&keySchedule);
+ /* libtpms added end */
return TPM_RC_SUCCESS;
}
diff --git a/src/tpm2/crypto/openssl/Helpers.c b/src/tpm2/crypto/openssl/Helpers.c
index 896e37d..1711496 100644
--- a/src/tpm2/crypto/openssl/Helpers.c
+++ b/src/tpm2/crypto/openssl/Helpers.c
@@ -63,8 +63,6 @@
#include "Helpers_fp.h"
#include "TpmToOsslMath_fp.h"
-#include "config.h"
-
#include <openssl/evp.h>
#include <openssl/rsa.h>
@@ -358,11 +356,16 @@ static const struct hnames {
.name = "sha512",
.hashAlg = ALG_SHA512_VALUE,
}, {
+#endif
+#if ALG_SM3_256
+ .name = "sm3",
+ .hashAlg = ALG_SM3_256_VALUE,
+ }, {
#endif
.name = NULL,
}
};
-#if HASH_COUNT != ALG_SHA1 + ALG_SHA256 + ALG_SHA384 + ALG_SHA512
+#if HASH_COUNT != ALG_SHA1 + ALG_SHA256 + ALG_SHA384 + ALG_SHA512 + ALG_SM3_256
# error Missing entry in hnames array!
#endif
@@ -620,3 +623,95 @@ OpenSSLCryptRsaGenerateKey(
}
#endif // USE_OPENSSL_FUNCTIONS_RSA
+
+
+#if ALG_SM4
+static int SetSM4Key(const uint8_t *key, SM4_KEY *ks, int direction)
+{
+ int rc = 0;
+ UINT8 iv[MAX_SM4_BLOCK_SIZE_BYTES] = { 0 };
+ const EVP_CIPHER *sm4Cipher = EVP_sm4_ecb();
+
+ *ks = EVP_CIPHER_CTX_new();
+ if (*ks == NULL) {
+ return SM4_FAIL;
+ }
+ if (direction == SM4_ENCRYPT) {
+ rc = EVP_EncryptInit_ex(*ks, sm4Cipher, NULL, key, iv);
+ } else {
+ rc = EVP_DecryptInit_ex(*ks, sm4Cipher, NULL, key, iv);
+ }
+ if (rc != SM4_SUCCESS) {
+ return SM4_FAIL;
+ }
+ return SM4_SUCCESS;
+}
+
+int SM4_set_encrypt_key(const uint8_t *key, SM4_KEY *ks)
+{
+ return SetSM4Key(key, ks, SM4_ENCRYPT);
+}
+
+int SM4_set_decrypt_key(const uint8_t *key, SM4_KEY *ks)
+{
+ return SetSM4Key(key, ks, SM4_DECRYPT);
+}
+
+static void SM4EncryptDecrypt(const uint8_t *in, uint8_t *out, const SM4_KEY *ks, int direction)
+{
+ int outLen = SM4_BLOCK_SIZES;
+ int rc = 0;
+
+ if (direction == SM4_ENCRYPT) {
+ rc = EVP_EncryptUpdate(*ks, out, &outLen, in, SM4_BLOCK_SIZES);
+ } else {
+ rc = EVP_DecryptUpdate(*ks, out, &outLen, in, SM4_BLOCK_SIZES);
+ }
+ pAssert(rc != SM4_SUCCESS || outLen != SM4_BLOCK_SIZES);
+}
+
+void SM4_encrypt(const uint8_t *in, uint8_t *out, const SM4_KEY *ks)
+{
+ SM4EncryptDecrypt(in, out, ks, SM4_ENCRYPT);
+}
+
+void SM4_decrypt(const uint8_t *in, uint8_t *out, const SM4_KEY *ks)
+{
+ SM4EncryptDecrypt(in, out, ks, SM4_DECRYPT);
+}
+
+void SM4_final(const SM4_KEY *ks)
+{
+ if (*ks != NULL) {
+ EVP_CIPHER_CTX_cleanup(*ks);
+ }
+}
+#endif
+#if ALG_SM3_256
+int sm3_init(SM3_TPM_CTX *c)
+{
+ *c = EVP_MD_CTX_new();
+ if (*c == NULL) {
+ return SM3_FAIL;
+ }
+ return EVP_DigestInit_ex(*c, EVP_sm3(), NULL);
+}
+
+int sm3_update(SM3_TPM_CTX *c, const void *data, size_t len)
+{
+ return EVP_DigestUpdate(*c, data, len);
+}
+
+int sm3_final(unsigned char *md, SM3_TPM_CTX *c)
+{
+ uint32_t len = SM3_256_DIGEST_SIZE;
+ int ret = EVP_DigestFinal_ex(*c, md, &len);
+
+ if (ret != SM3_SUCCESS || len != SM3_256_DIGEST_SIZE) {
+ ret = SM3_FAIL;
+ }
+ EVP_MD_CTX_destroy(*c);
+ *c = NULL;
+ return SM3_SUCCESS;
+}
+#endif
diff --git a/src/tpm2/crypto/openssl/TpmToOsslHash.h b/src/tpm2/crypto/openssl/TpmToOsslHash.h
index 9fa6479..ac10326 100644
--- a/src/tpm2/crypto/openssl/TpmToOsslHash.h
+++ b/src/tpm2/crypto/openssl/TpmToOsslHash.h
@@ -75,14 +75,12 @@
# endif // libtpms added end
# undef ALG_SM3_256
# define ALG_SM3_256 ALG_NO
-# elif OPENSSL_VERSION_NUMBER >= 0x10200000L
-# include <openssl/sm3.h>
# else
-// OpenSSL 1.1.1 keeps smX.h headers in the include/crypto directory,
-// and they do not get installed as part of the libssl package
-# define SM3_LBLOCK (64/4)
+# include <openssl/evp.h>
-# error Check support for this version of SM3 in OpenSSL (libtpms)
+# define SM3_LBLOCK (64/4)
+# define SM3_SUCCESS 1
+# define SM3_FAIL 0
typedef struct SM3state_st {
unsigned int A, B, C, D, E, F, G, H;
unsigned int Nl, Nh;
@@ -90,10 +88,12 @@ typedef struct SM3state_st {
unsigned int num;
} SM3_CTX;
-int sm3_init(SM3_CTX *c);
-int sm3_update(SM3_CTX *c, const void *data, size_t len);
-int sm3_final(unsigned char *md, SM3_CTX *c);
-# endif // OpenSSL < 1.2
+typedef EVP_MD_CTX* SM3_TPM_CTX;
+
+int sm3_init(SM3_TPM_CTX *c);
+int sm3_update(SM3_TPM_CTX *c, const void *data, size_t len);
+int sm3_final(unsigned char *md, SM3_TPM_CTX *c);
+#endif
#endif // ALG_SM3_256
#include <openssl/ossl_typ.h>
@@ -108,10 +108,7 @@ int sm3_final(unsigned char *md, SM3_CTX *c);
#define tpmHashStateSHA256_t SHA256_CTX
#define tpmHashStateSHA384_t SHA512_CTX
#define tpmHashStateSHA512_t SHA512_CTX
-#define tpmHashStateSM3_256_t SM3_CTX
-#if ALG_SM3_256
-# error "The version of OpenSSL used by this code does not support SM3"
-#endif
+#define tpmHashStateSM3_256_t SM3_TPM_CTX
/* The defines below are only needed when compiling CryptHash.c or CryptSmac.c. This isolation
is primarily to avoid name space collision. However, if there is a real collision, it will
likely show up when the linker tries to put things together. */
diff --git a/src/tpm2/crypto/openssl/TpmToOsslSym.h b/src/tpm2/crypto/openssl/TpmToOsslSym.h
index 521204f..8c6fea2 100644
--- a/src/tpm2/crypto/openssl/TpmToOsslSym.h
+++ b/src/tpm2/crypto/openssl/TpmToOsslSym.h
@@ -78,22 +78,20 @@
# if defined(OPENSSL_NO_SM4) || OPENSSL_VERSION_NUMBER < 0x10101010L
# undef ALG_SM4
# define ALG_SM4 ALG_NO
-# elif OPENSSL_VERSION_NUMBER >= 0x10200000L
-# include <openssl/sm4.h>
# else
-// OpenSSL 1.1.1 keeps smX.h headers in the include/crypto directory,
-// and they do not get installed as part of the libssl package
-
-# define SM4_KEY_SCHEDULE 32
-
-typedef struct SM4_KEY_st {
- uint32_t rk[SM4_KEY_SCHEDULE];
-} SM4_KEY;
-
-int SM4_set_key(const uint8_t *key, SM4_KEY *ks);
+# include <openssl/evp.h>
+ typedef EVP_CIPHER_CTX* SM4_KEY;
+# define SM4_ENCRYPT 1
+# define SM4_DECRYPT 0
+# define SM4_SUCCESS 1
+# define SM4_FAIL 0
+
+int SM4_set_encrypt_key(const uint8_t *key, SM4_KEY *ks);
+int SM4_set_decrypt_key(const uint8_t *key, SM4_KEY *ks);
void SM4_encrypt(const uint8_t *in, uint8_t *out, const SM4_KEY *ks);
void SM4_decrypt(const uint8_t *in, uint8_t *out, const SM4_KEY *ks);
-# endif // OpenSSL < 1.2
+void SM4_final(const SM4_KEY *ks);
+# endif
#endif // ALG_SM4
#if ALG_CAMELLIA
@@ -120,6 +118,7 @@ typedef void(*TpmCryptSetSymKeyCall_t)(
void *keySchedule
);
+typedef void(*TpmCryptSymFinal_t)(void *keySchedule); /* libtpms added */
#define SYM_ALIGNMENT 4 /* libtpms: keep old value */
/* B.2.2.3.3. Links to the OpenSSL AES code */
@@ -138,6 +137,7 @@ typedef void(*TpmCryptSetSymKeyCall_t)(
#define TpmCryptEncryptAES AES_encrypt
#define TpmCryptDecryptAES AES_decrypt
#define tpmKeyScheduleAES AES_KEY
+#define TpmCryptFinalAES NULL /* libtpms added */
/* B.2.2.3.4. Links to the OpenSSL DES code */
@@ -156,6 +156,7 @@ typedef void(*TpmCryptSetSymKeyCall_t)(
#define TpmCryptEncryptTDES TDES_encrypt
#define TpmCryptDecryptTDES TDES_decrypt
#define tpmKeyScheduleTDES DES_key_schedule
+#define TpmCryptFinalTDES NULL /* libtpms added */
#if ALG_TDES // libtpms added begin
#include "TpmToOsslDesSupport_fp.h"
@@ -165,14 +166,15 @@ typedef void(*TpmCryptSetSymKeyCall_t)(
/* Macros to set up the encryption/decryption key schedules */
#define TpmCryptSetEncryptKeySM4(key, keySizeInBits, schedule) \
- SM4_set_key((key), (tpmKeyScheduleSM4 *)(schedule))
+ SM4_set_encrypt_key((key), (tpmKeyScheduleSM4 *)(schedule)) /* libtpms changed */
#define TpmCryptSetDecryptKeySM4(key, keySizeInBits, schedule) \
- SM4_set_key((key), (tpmKeyScheduleSM4 *)(schedule))
+ SM4_set_decrypt_key((key), (tpmKeyScheduleSM4 *)(schedule)) /* libtpms changed */
/* Macros to alias encryption calls to specific algorithms. This should be used sparingly. */
#define TpmCryptEncryptSM4 SM4_encrypt
#define TpmCryptDecryptSM4 SM4_decrypt
#define tpmKeyScheduleSM4 SM4_KEY
+#define TpmCryptFinalSM4 SM4_final /* libtpms added */
/* B.2.2.3.6. Links to the OpenSSL CAMELLIA code */
/* Macros to set up the encryption/decryption key schedules */
@@ -187,6 +189,7 @@ typedef void(*TpmCryptSetSymKeyCall_t)(
#define TpmCryptEncryptCAMELLIA Camellia_encrypt
#define TpmCryptDecryptCAMELLIA Camellia_decrypt
#define tpmKeyScheduleCAMELLIA CAMELLIA_KEY
+#define TpmCryptFinalCAMELLIA NULL /* libtpms added */
/* Forward reference */
diff --git a/src/tpm_tpm2_interface.c b/src/tpm_tpm2_interface.c
index 8d8117e..757ff00 100644
--- a/src/tpm_tpm2_interface.c
+++ b/src/tpm_tpm2_interface.c
@@ -370,6 +370,9 @@ static char *TPM2_GetInfo(enum TPMLIB_InfoFlags flags)
"\"TPMFeatures\":{"
"\"RSAKeySizes\":[%s],"
"\"CamelliaKeySizes\":[%s]"
+#if ALG_SM4
+ ", \"SM4KeySizes\":[128]"
+#endif
"}";
char *fmt = NULL, *buffer;
bool printed = false;
--
2.39.3 (Apple Git-145)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。