aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Bottomley <James.Bottomley@HansenPartnership.com>2023-03-22 22:46:45 -0400
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2023-03-22 22:59:44 -0400
commit3e7e24c66f8a4de0ce2e11ac892af18033750dee (patch)
tree98a102c956e5c743bdb73a0c29b4eac8e0744867
parent261becb65db0cbbefc1bcd32fa610e03e1cde628 (diff)
downloadopenssl_tpm2_engine-3e7e24c66f8a4de0ce2e11ac892af18033750dee.tar.gz
intel-tss: update for openssl-3
The missing routines in the intel-tss over the IBM one need to be updated to use openssl-3 primitives. Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
-rw-r--r--src/include/intel-tss.h70
1 files changed, 63 insertions, 7 deletions
diff --git a/src/include/intel-tss.h b/src/include/intel-tss.h
index d5913a4..da4c682 100644
--- a/src/include/intel-tss.h
+++ b/src/include/intel-tss.h
@@ -11,6 +11,8 @@
#include <tss2/tss2_tcti.h>
#include <tss2/tss2_tctildr.h>
+#include <string.h>
+
#include <openssl/aes.h>
#include <openssl/hmac.h>
#include <openssl/sha.h>
@@ -209,7 +211,7 @@ TSS_CONVERT_UNMARSHAL(TPMT_SIGNATURE, X)
static const struct {
TPM_ALG_ID alg;
- const char *name;
+ char *name;
int size;
} TSS_Hashes[] = {
{ TPM_ALG_SHA1, "sha1", SHA_DIGEST_LENGTH },
@@ -301,6 +303,16 @@ TSS_GetDigestSize(TPM_ALG_ID alg) {
return -1;
}
+static inline char *
+TSS_GetDigestName(TPM_ALG_ID alg) {
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(TSS_Hashes); i++)
+ if (TSS_Hashes[i].alg == alg)
+ return TSS_Hashes[i].name;
+ return NULL;
+}
+
static inline int
TSS_Hash_GetMd(const EVP_MD **md, TPM_ALG_ID alg) {
int i;
@@ -381,8 +393,16 @@ TSS_HMAC_Generate(TPMT_HA *digest, const TPM2B_KEY *hmacKey, ...)
const EVP_MD *md; /* message digest method */
#if OPENSSL_VERSION_NUMBER < 0x10100000
HMAC_CTX ctx;
-#else
+#elsif OPENSSL_VERSION < 0x30000000
HMAC_CTX *ctx;
+#else
+ EVP_MAC *mac = EVP_MAC_fetch(NULL, "HMAC", NULL);
+ EVP_MAC_CTX *ctx;
+ OSSL_PARAM params[] = {
+ OSSL_PARAM_construct_utf8_string("digest", TSS_GetDigestName(digest->hashAlg), 0),
+ OSSL_PARAM_construct_end()
+ };
+ fprintf(stderr, "HMAC\n");
#endif
int length;
uint8_t *buffer;
@@ -392,8 +412,10 @@ TSS_HMAC_Generate(TPMT_HA *digest, const TPM2B_KEY *hmacKey, ...)
#if OPENSSL_VERSION_NUMBER < 0x10100000
HMAC_CTX_init(&ctx);
-#else
+#elsif OPENSSL_VERSION < 0x30000000
ctx = HMAC_CTX_new();
+#else
+ ctx = EVP_MAC_CTX_new(mac);
#endif
rc = TSS_Hash_GetMd(&md, digest->hashAlg);
if (rc)
@@ -404,11 +426,13 @@ TSS_HMAC_Generate(TPMT_HA *digest, const TPM2B_KEY *hmacKey, ...)
hmacKey->buffer, hmacKey->size, /* HMAC key */
md, /* message digest method */
NULL);
-#else
+#elsif OPENSSL_VERSION < 0x30000000
rc = HMAC_Init_ex(ctx,
hmacKey->buffer, hmacKey->size, /* HMAC key */
md, /* message digest method */
NULL);
+#else
+ rc = EVP_MAC_init(ctx, hmacKey->buffer, hmacKey->size, params);
#endif
if (rc == 0) {
@@ -428,8 +452,10 @@ TSS_HMAC_Generate(TPMT_HA *digest, const TPM2B_KEY *hmacKey, ...)
}
#if OPENSSL_VERSION_NUMBER < 0x10100000
rc = HMAC_Update(&ctx, buffer, length);
-#else
+#elsif OPENSSL_VERSION < 0x30000000
rc = HMAC_Update(ctx, buffer, length);
+#else
+ rc = EVP_MAC_update(ctx, buffer, length);
#endif
if (rc == 0) {
fprintf(stderr, "TSS_HMAC_Generate: HMAC_Update failed\n");
@@ -440,8 +466,10 @@ TSS_HMAC_Generate(TPMT_HA *digest, const TPM2B_KEY *hmacKey, ...)
#if OPENSSL_VERSION_NUMBER < 0x10100000
rc = HMAC_Final(&ctx, (uint8_t *)&digest->digest, NULL);
-#else
+#elsif OPENSSL_VERSION < 0x30000000
rc = HMAC_Final(ctx, (uint8_t *)&digest->digest, NULL);
+#else
+ rc = EVP_MAC_final(ctx, (uint8_t *)&digest->digest, NULL, TSS_GetDigestSize(digest->hashAlg));
#endif
if (rc == 0)
rc = TPM_RC_FAILURE;
@@ -451,8 +479,11 @@ TSS_HMAC_Generate(TPMT_HA *digest, const TPM2B_KEY *hmacKey, ...)
out_free:
#if OPENSSL_VERSION_NUMBER < 0x10100000
HMAC_CTX_cleanup(&ctx);
-#else
+#elsif OPENSSL_VERSION < 0x30000000
HMAC_CTX_free(ctx);
+#else
+ EVP_MAC_CTX_free(ctx);
+ EVP_MAC_free(mac);
#endif
out:
va_end(ap);
@@ -477,6 +508,7 @@ static inline TPM_RC
TSS_AES_EncryptCFB(uint8_t *dOut, uint32_t keySizeInBits, uint8_t *key,
uint8_t *iv,uint32_t dInSize, uint8_t *dIn)
{
+#if OPENSSL_VERSION_NUMBER < 0x30000000
TPM_RC rc = 0;
int blockSize;
AES_KEY aeskey;
@@ -500,6 +532,30 @@ TSS_AES_EncryptCFB(uint8_t *dOut, uint32_t keySizeInBits, uint8_t *key,
}
return TPM_RC_SUCCESS;
+#else
+ int rc;
+ int outsize, tmpsize;
+ EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
+
+ rc = EVP_EncryptInit_ex(ctx, EVP_aes_128_cfb(), NULL, key, iv);
+ if (!rc) {
+ fprintf(stderr, "EncryptInit failed\n");
+ return TPM_RC_FAILURE;
+ }
+ rc = EVP_EncryptUpdate(ctx, dOut, &outsize, dIn, dInSize);
+ if (!rc) {
+ fprintf(stderr, "EncryptUpdate failed\n");
+ return TPM_RC_FAILURE;
+ }
+ rc = EVP_EncryptFinal(ctx, dOut + outsize, &tmpsize);
+ if (!rc) {
+ fprintf(stderr, "EncryptFinal failed\n");
+ return TPM_RC_FAILURE;
+ }
+ EVP_CIPHER_CTX_free(ctx);
+
+ return TPM_RC_SUCCESS;
+#endif
}
static inline TPM_RC