Package: tboot Version: 1.10.2+dfsg.0-1 Followup-For: Bug #1006588 User: ubuntu-de...@lists.ubuntu.com Usertags: origin-ubuntu jammy ubuntu-patch Control: tags -1 patch
Hi Timo, Upstream has fixed this bug. Attached is a debdiff of what I've uploaded to Ubuntu to fix the build failure, cherry-picking <http://hg.code.sf.net/p/tboot/code/rev/1d7d6d196bb1>. Cheers, -- Steve Langasek Give me a lever long enough and a Free OS Debian Developer to set it on, and I can move the world. Ubuntu Developer https://www.debian.org/ slanga...@ubuntu.com vor...@debian.org
diff -Nru tboot-1.10.2+dfsg.0/debian/patches/openssl3-compat.patch tboot-1.10.2+dfsg.0/debian/patches/openssl3-compat.patch --- tboot-1.10.2+dfsg.0/debian/patches/openssl3-compat.patch 1969-12-31 16:00:00.000000000 -0800 +++ tboot-1.10.2+dfsg.0/debian/patches/openssl3-compat.patch 2022-03-11 13:17:25.000000000 -0800 @@ -0,0 +1,1317 @@ + +# HG changeset patch +# User Pawel Randzio <pawel.rand...@intel.com> +# Date 1639146463 -3600 +# Node ID 1d7d6d196bb17546a74cd51f3fadf246f4054722 +# Parent 5bf5c12411d3a4a7e0a552203b40bfe59d5c7789 +Add OpenSSL 3.0.0 support in lcptools-v2 + +diff -r 5bf5c12411d3 -r 1d7d6d196bb1 lcptools-v2/lcputils.c +--- a/lcptools-v2/lcputils.c Wed Sep 15 16:53:34 2021 +0200 ++++ b/lcptools-v2/lcputils.c Fri Dec 10 15:27:43 2021 +0100 +@@ -50,6 +50,12 @@ + #include <openssl/ecdsa.h> + #include <openssl/ec.h> + #include <openssl/evp.h> ++#if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ #include <openssl/core.h> ++ #include <openssl/decoder.h> ++ #include <openssl/crypto.h> ++ #include <openssl/param_build.h> ++#endif + #include <safe_lib.h> + #include <snprintf_s.h> + #define PRINT printf +@@ -512,77 +518,164 @@ + int status; + EVP_PKEY_CTX *evp_context = NULL; + EVP_PKEY *evp_key = NULL; +- RSA *rsa_pubkey = NULL; + BIGNUM *modulus = NULL; + BIGNUM *exponent = NULL; + tb_hash_t *digest = NULL; + unsigned char exp_arr[] = {0x01, 0x00, 0x01}; ++ unsigned char *decrypted_sig = NULL; ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ size_t dcpt_sig_len; ++ #else ++ RSA *rsa_pubkey = NULL; ++ #endif + + LOG("[verify_rsa_signature]\n"); + if (data == NULL || pubkey == NULL || signature == NULL) { + ERROR("Error: list data, pubkey or signature buffer not defined.\n"); + return false; + } +- uint8_t decrypted_sig[pubkey->size]; +- +- //1. Create public key +- rsa_pubkey = RSA_new(); +- if ( rsa_pubkey == NULL ) { +- ERROR("Error: failed to allocate key\n"); +- status = 0; +- goto EXIT; +- } +- ++ + modulus = BN_bin2bn(pubkey->data, pubkey->size, NULL); + exponent = BN_bin2bn(exp_arr, 3, NULL); +- if (modulus == NULL) { +- goto OPENSSL_ERROR; +- } +- if (exponent == NULL) { ++ if ( modulus == NULL || exponent == NULL ) { ++ ERROR("Error: failed to convert modulus and/or exponent.\n"); + goto OPENSSL_ERROR; + } + +- #if OPENSSL_VERSION_NUMBER >= 0x10100000L +- RSA_set0_key(rsa_pubkey, modulus, exponent, NULL); ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ evp_context = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL); ++ if ( evp_context == NULL) { ++ ERROR("Error: failed to initialize CTX from name.\n"); ++ goto OPENSSL_ERROR; ++ } ++ ++ OSSL_PARAM_BLD *params_build = OSSL_PARAM_BLD_new(); ++ if ( params_build == NULL ) { ++ ERROR("Error: failed to set up parameter builder.\n"); ++ goto OPENSSL_ERROR; ++ } ++ if ( !OSSL_PARAM_BLD_push_BN(params_build, "n", modulus) ) { ++ ERROR("Error: failed to push modulus into param build.\n"); ++ goto OPENSSL_ERROR; ++ } ++ if ( !OSSL_PARAM_BLD_push_BN(params_build, "e", exponent) ) { ++ ERROR("Error: failed to push exponent into param build.\n"); ++ goto OPENSSL_ERROR; ++ } ++ if ( !OSSL_PARAM_BLD_push_BN(params_build, "d", NULL) ) { ++ ERROR("Error: failed to push NULL into param build.\n"); ++ goto OPENSSL_ERROR; ++ } ++ ++ OSSL_PARAM *params = OSSL_PARAM_BLD_to_param(params_build); ++ if ( params == NULL ) { ++ ERROR("Error: failed to construct parameters from builder.\n"); ++ goto OPENSSL_ERROR; ++ } ++ ++ if ( EVP_PKEY_fromdata_init(evp_context) <= 0 ) { ++ ERROR("Error: failed to initialize key creation.\n"); ++ goto OPENSSL_ERROR; ++ } ++ ++ if ( EVP_PKEY_fromdata(evp_context, &evp_key, EVP_PKEY_PUBLIC_KEY, params) <= 0 ) { ++ ERROR("Error: failed to create key.\n"); ++ goto OPENSSL_ERROR; ++ } ++ OSSL_PARAM_free(params); ++ OSSL_PARAM_BLD_free(params_build); ++ EVP_PKEY_CTX_free(evp_context); ++ evp_context = NULL; + #else +- rsa_pubkey->n = modulus; +- rsa_pubkey->e = exponent; +- rsa_pubkey->d = rsa_pubkey->p = rsa_pubkey->q = NULL; ++ rsa_pubkey = RSA_new(); ++ if ( rsa_pubkey == NULL ) { ++ ERROR("Error: failed to allocate key\n"); ++ status = 0; ++ goto EXIT; ++ } ++ ++ #if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ RSA_set0_key(rsa_pubkey, modulus, exponent, NULL); ++ #else ++ rsa_pubkey->n = modulus; ++ rsa_pubkey->e = exponent; ++ rsa_pubkey->d = rsa_pubkey->p = rsa_pubkey->q = NULL; ++ #endif + #endif + + if (MAJOR_VER(list_ver) != MAJOR_VER(LCP_TPM20_POLICY_LIST2_1_VERSION_300)) { +- //Decrypt signature - we will need to to find hashalg +- status = RSA_public_decrypt(pubkey->size, signature->data, decrypted_sig, +- rsa_pubkey, RSA_NO_PADDING); +- if (status <= 0) { +- ERROR("Error: failed to decrypt signature.\n"); ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ ++ evp_context = EVP_PKEY_CTX_new(evp_key, NULL); ++ if ( evp_context == NULL ) { ++ ERROR("Error: failed to instatiate CTX.\n"); ++ goto OPENSSL_ERROR; ++ } ++ if ( EVP_PKEY_encrypt_init(evp_context) <= 0 ) { ++ ERROR("Error: failed to initialize signature decryption.\n"); ++ goto OPENSSL_ERROR; ++ } ++ if ( EVP_PKEY_CTX_set_rsa_padding(evp_context, RSA_NO_PADDING) <= 0 ) { ++ ERROR("Error: failed to set RSA padding.\n"); ++ goto OPENSSL_ERROR; ++ } ++ if ( EVP_PKEY_encrypt(evp_context, NULL, &dcpt_sig_len, signature->data, pubkey->size) <= 0 ) { ++ ERROR("Error: failed to retrieve decrypted signature length.\n"); ++ goto OPENSSL_ERROR; ++ } ++ decrypted_sig = OPENSSL_malloc(dcpt_sig_len); ++ if ( decrypted_sig == NULL ) { ++ ERROR("Error: failed to allocate memory for decrypted signature.\n"); ++ status = 0; ++ goto EXIT; ++ } ++ if ( EVP_PKEY_encrypt(evp_context, decrypted_sig, &dcpt_sig_len, signature->data, pubkey->size) <= 0 ) { ++ ERROR("Error: failed to decrypt signature.\n"); ++ goto OPENSSL_ERROR; ++ } ++ if ( verbose ) { ++ LOG("Decrypted signature: \n"); ++ print_hex("", decrypted_sig, dcpt_sig_len); ++ } ++ EVP_PKEY_CTX_free(evp_context); ++ evp_context = NULL; ++ #else ++ decrypted_sig = OPENSSL_malloc(pubkey->size); ++ status = RSA_public_decrypt(pubkey->size, signature->data, decrypted_sig, rsa_pubkey, RSA_NO_PADDING); ++ if (status <= 0) { ++ ERROR("Error: failed to decrypt signature.\n"); ++ goto OPENSSL_ERROR; ++ } ++ if ( verbose ) { ++ LOG("Decrypted signature: \n"); ++ print_hex("", decrypted_sig, pubkey->size); ++ } ++ #endif ++ //In older lists we need to get hashAlg from signature data. ++ hashAlg = pkcs_get_hashalg((const unsigned char *) decrypted_sig); ++ OPENSSL_free((void *) decrypted_sig); ++ } ++ ++ #if OPENSSL_VERSION_NUMBER < 0x30000000L ++ evp_key = EVP_PKEY_new(); ++ if ( evp_key == NULL) { + goto OPENSSL_ERROR; + } +- if (verbose) { +- LOG("Decrypted signature: \n"); +- print_hex("", decrypted_sig, pubkey->size); ++ ++ status = EVP_PKEY_set1_RSA(evp_key, rsa_pubkey); ++ if (status <= 0) { ++ goto OPENSSL_ERROR; + } +- //In older lists we need to get hashAlg from signature data. +- hashAlg = pkcs_get_hashalg((const unsigned char *) decrypted_sig); +- } ++ #endif + +- evp_key = EVP_PKEY_new(); +- if ( evp_key == NULL) { ++ evp_context = EVP_PKEY_CTX_new(evp_key, NULL); ++ if ( evp_context == NULL ) { ++ ERROR("Error: failed to initialize CTX from pkey.\n"); + goto OPENSSL_ERROR; + } + +- status = EVP_PKEY_set1_RSA(evp_key, rsa_pubkey); +- if (status <= 0) { +- goto OPENSSL_ERROR; +- } +- +- evp_context = EVP_PKEY_CTX_new(evp_key, NULL); +- if ( evp_context == NULL) { +- goto OPENSSL_ERROR; +- } +- +- status = EVP_PKEY_verify_init(evp_context); +- if ( status <= 0) { ++ if ( EVP_PKEY_verify_init(evp_context) <= 0) { ++ ERROR("Error: failed to initialize verification."); + goto OPENSSL_ERROR; + } + +@@ -596,44 +689,38 @@ + goto EXIT; + } + if ( status <= 0) { ++ ERROR("Error: failed to set rsa padding.\n"); + goto OPENSSL_ERROR; + } + +- switch ( hashAlg) { +- case TPM_ALG_SHA1: +- if ( EVP_PKEY_CTX_set_signature_md(evp_context, EVP_sha1()) <= 0 ) { +- goto OPENSSL_ERROR; +- } +- break; +- case TPM_ALG_SHA256: +- if ( EVP_PKEY_CTX_set_signature_md(evp_context, EVP_sha256()) <= 0 ) { +- goto OPENSSL_ERROR; +- } +- break; +- case TPM_ALG_SHA384: +- if ( EVP_PKEY_CTX_set_signature_md(evp_context, EVP_sha384()) <= 0 ) { +- goto OPENSSL_ERROR; +- } +- break; +- default: ++ if ( hashAlg == TPM_ALG_SHA1 ) { ++ status = EVP_PKEY_CTX_set_signature_md(evp_context, EVP_sha1()); ++ } else if ( hashAlg == TPM_ALG_SHA256 ) { ++ status = EVP_PKEY_CTX_set_signature_md(evp_context, EVP_sha256()); ++ } else if ( hashAlg == TPM_ALG_SHA384 ) { ++ status = EVP_PKEY_CTX_set_signature_md(evp_context, EVP_sha384()); ++ } else { + ERROR("Error: Unknown hash alg.\n"); + status = 0; + goto EXIT; + } ++ if ( status <= 0 ) { ++ ERROR("Error: failed to set signature message digest.\n"); ++ goto OPENSSL_ERROR; ++ } ++ + digest = malloc(get_lcp_hash_size(hashAlg)); + if (digest == NULL) { + ERROR("Error: failed to allocate digest"); + status = 0; + goto EXIT; + } +- status = hash_buffer((const unsigned char *) data->data, data->size, digest, +- hashAlg); +- if (!status) { ++ if ( !hash_buffer((const unsigned char *) data->data, data->size, digest, hashAlg) ) { + ERROR("Error: failed to hash list contents.\n"); ++ status = 0; + goto EXIT; + } +- status = EVP_PKEY_verify(evp_context, signature->data, pubkey->size, +- (const unsigned char *) digest, get_lcp_hash_size(hashAlg)); ++ status = EVP_PKEY_verify(evp_context, signature->data, pubkey->size, (const unsigned char *) digest, get_lcp_hash_size(hashAlg)); + if (status < 0) { //Error occurred + goto OPENSSL_ERROR; + } +@@ -646,12 +733,14 @@ + ERR_free_strings(); + status = 0; + EXIT: ++ #if OPENSSL_VERSION_NUMBER < 0x30000000L ++ if (rsa_pubkey != NULL) ++ OPENSSL_free((void *) rsa_pubkey); ++ #endif + if (evp_context != NULL) + OPENSSL_free((void *) evp_context); + if (evp_key != NULL) + OPENSSL_free((void *) evp_key); +- if (rsa_pubkey != NULL) +- OPENSSL_free((void *) rsa_pubkey); + if (modulus != NULL) + OPENSSL_free((void *) modulus); + if (exponent != NULL) +@@ -686,102 +775,183 @@ + + Out: true/false on verification success or failure + */ +- //Stuff to make key with: ++ int result; + BIGNUM *x = NULL; + BIGNUM *y = NULL; +- EC_KEY *ec_key = NULL; +- EC_GROUP *ec_group = NULL; + EVP_PKEY *evp_key = NULL; +- const EVP_MD *mdtype; //Is freed when context is freed +- +- //Der encoded signature: ++ const EVP_MD *mdtype; + const unsigned char *der_encoded_sig = NULL; + int encoded_len; + int curveId = 0; +- +- //Contexts: +- EVP_MD_CTX *mctx = NULL; //Message Digest Context +- EVP_PKEY_CTX *pctx = NULL; //Key context +- +- //Other: +- int result; +- ++ EVP_MD_CTX *mctx = NULL; ++ EVP_PKEY_CTX *pctx = NULL; ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ const EC_GROUP *ec_group = NULL; ++ EC_POINT *ec_point = NULL; ++ unsigned char *point_buffer = NULL; ++ size_t pt_buf_len; ++ BN_CTX *bctx = NULL; ++ const char *curveName = NULL; ++ #else ++ EC_KEY *ec_key = NULL; ++ EC_GROUP *ec_group = NULL; ++ #endif ++ + LOG("[verify_ec_signature]\n"); +- if (data == NULL || pubkey_x == NULL || pubkey_y == NULL || +- sig_r == NULL || sig_s == NULL) { +- ERROR("Error: one or more buffers are not defined.\n"); +- return false; +- } +- ec_key = EC_KEY_new(); +- if (ec_key == NULL) { +- ERROR("Error: failed to generate EC_KEY.\n"); +- result = 0; +- goto EXIT; ++ if ( data == NULL || pubkey_x == NULL || pubkey_y == NULL || sig_r == NULL || sig_s == NULL ) { ++ ERROR("Error: one or more buffers are not defined.\n"); ++ return false; + } +- evp_key = EVP_PKEY_new(); +- if (evp_key == NULL) { +- ERROR("Error: failed to generate EC_KEY.\n"); +- result = 0; +- goto EXIT; +- } +- switch (hashalg) +- { +- case TPM_ALG_SM3_256: ++ ++ if ( hashalg == TPM_ALG_SM3_256 ) { + curveId = NID_sm2; + mdtype = EVP_sm3(); +- break; +- case TPM_ALG_SHA256: ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ curveName = SN_sm2; ++ #endif ++ } else if ( hashalg == TPM_ALG_SHA256 ) { + curveId = NID_secp256k1; + mdtype = EVP_sha256(); +- break; +- case TPM_ALG_SHA384: ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ curveName = SN_secp256k1; ++ #endif ++ } else if ( hashalg == TPM_ALG_SHA384 ) { + curveId = NID_secp384r1; + mdtype = EVP_sha384(); +- break; +- default: ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ curveName = SN_secp384r1; ++ #endif ++ } else { + ERROR("Error: unsupported hashalg.\n"); + result = 0; + goto EXIT; + } ++ + ec_group = EC_GROUP_new_by_curve_name(curveId); +- if (ec_group == NULL) { +- ERROR("Error: failed to generate new EC_GROUP.\n"); ++ if ( ec_group == NULL ) { ++ ERROR("Error: failed to create new EC group.\n"); + goto OPENSSL_ERROR; + } +- result = EC_KEY_set_group(ec_key, ec_group); +- if ( result <= 0) { +- ERROR("Failed to set EC Key group.\n"); +- goto OPENSSL_ERROR; +- } ++ + x = BN_bin2bn(pubkey_x->data, pubkey_x->size, NULL); + y = BN_bin2bn(pubkey_y->data, pubkey_y->size, NULL); + if ( x == NULL || y == NULL ) { +- ERROR("Failed to convert buffer to OpenSSL BN.\n"); ++ ERROR("Error: Failed to convert binary pubkey to BIGNUM x and/or y.\n"); + goto OPENSSL_ERROR; + } +- result = EC_KEY_set_public_key_affine_coordinates(ec_key, x, y); +- if ( result <= 0) { +- ERROR("Failed to set key coordinates.\n"); +- goto OPENSSL_ERROR; +- } +- result = EVP_PKEY_assign_EC_KEY(evp_key, ec_key); +- if (result <= 0) { +- ERROR("Error: failed to assign EC KEY to EVP structure.\n"); +- goto OPENSSL_ERROR; +- } ++ ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ ec_point = EC_POINT_new(ec_group); ++ if ( ec_point == NULL ) { ++ ERROR("Error: failed to create new EC point.\n"); ++ goto OPENSSL_ERROR; ++ } ++ ++ bctx = BN_CTX_new(); ++ if ( bctx == NULL ) { ++ ERROR("Error: Failed to create BIGNUM context.\n"); ++ goto OPENSSL_ERROR; ++ } ++ ++ if ( EC_POINT_set_affine_coordinates(ec_group, ec_point, x, y, bctx) <= 0 ) { ++ ERROR("Error: failed to set affine coordinates.\n"); ++ goto OPENSSL_ERROR; ++ } ++ ++ BN_CTX_free(bctx); ++ bctx = NULL; ++ bctx = BN_CTX_new(); ++ ++ pt_buf_len = EC_POINT_point2oct(ec_group, ec_point, POINT_CONVERSION_COMPRESSED, NULL, 0, bctx); ++ point_buffer = OPENSSL_malloc(pt_buf_len); ++ if ( point_buffer == NULL ) { ++ ERROR("Error: failed to allocate point buffer.\n"); ++ goto OPENSSL_ERROR; ++ } ++ ++ if ( EC_POINT_point2oct(ec_group, ec_point, POINT_CONVERSION_COMPRESSED, point_buffer, pt_buf_len, bctx) <= 0 ) { ++ ERROR("Error: failed to convert EC point into octal string.\n"); ++ goto OPENSSL_ERROR; ++ } ++ ++ EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL); ++ if ( ctx == NULL ) { ++ ERROR("Error: failed to initialize key creation CTX.\n"); ++ goto OPENSSL_ERROR; ++ } ++ ++ OSSL_PARAM_BLD *params_build = OSSL_PARAM_BLD_new(); ++ if ( params_build == NULL ) { ++ ERROR("Error: failed to set up parameter builder.\n"); ++ goto OPENSSL_ERROR; ++ } ++ if ( !OSSL_PARAM_BLD_push_utf8_string(params_build, "group", curveName, 0) ) { ++ ERROR("Error: failed to push group into param build.\n"); ++ goto OPENSSL_ERROR; ++ } ++ if ( !OSSL_PARAM_BLD_push_octet_string(params_build, "pub", point_buffer, pt_buf_len) ) { ++ ERROR("Error: failed to push pubkey into param build.\n"); ++ goto OPENSSL_ERROR; ++ } ++ OSSL_PARAM *params = OSSL_PARAM_BLD_to_param(params_build); ++ if ( params == NULL ) { ++ ERROR("Error: failed to construct params from build.\n"); ++ goto OPENSSL_ERROR; ++ } ++ ++ if ( EVP_PKEY_fromdata_init(ctx) <= 0 ) { ++ ERROR("ERROR: failed to initialize key creation from data.\n"); ++ goto OPENSSL_ERROR; ++ } ++ if ( EVP_PKEY_fromdata(ctx, &evp_key, EVP_PKEY_PUBLIC_KEY, params) <= 0) { ++ ERROR("Error: failed to create EC_KEY.\n"); ++ result = 0; ++ goto EXIT; ++ } ++ OSSL_PARAM_BLD_free(params_build); ++ OSSL_PARAM_free(params); ++ EVP_PKEY_CTX_free(ctx); ++ BN_CTX_free(bctx); ++ #else ++ ec_key = EC_KEY_new(); ++ if (ec_key == NULL) { ++ ERROR("Error: failed to generate EC_KEY.\n"); ++ result = 0; ++ goto EXIT; ++ } ++ evp_key = EVP_PKEY_new(); ++ if (evp_key == NULL) { ++ ERROR("Error: failed to generate EC_KEY.\n"); ++ result = 0; ++ goto EXIT; ++ } ++ if ( EC_KEY_set_group(ec_key, ec_group) <= 0) { ++ ERROR("Failed to set EC Key group.\n"); ++ goto OPENSSL_ERROR; ++ } ++ if ( EC_KEY_set_public_key_affine_coordinates(ec_key, x, y) <= 0) { ++ ERROR("Failed to set key coordinates.\n"); ++ goto OPENSSL_ERROR; ++ } ++ ++ if ( EVP_PKEY_assign_EC_KEY(evp_key, ec_key) <= 0) { ++ ERROR("Error: failed to assign EC KEY to EVP structure.\n"); ++ goto OPENSSL_ERROR; ++ } ++ if (sigalg == TPM_ALG_SM2) { ++ if ( EVP_PKEY_set_alias_type(evp_key, EVP_PKEY_SM2) <= 0 ) { ++ ERROR("Error: failed to set EVP KEY alias to SM2.\n"); ++ goto OPENSSL_ERROR; ++ } ++ } ++ #endif ++ + mctx = EVP_MD_CTX_new(); + if (mctx == NULL) { + ERROR("Error: failed to generate message digest context.\n"); + result = 0; + goto EXIT; + } +- if (sigalg == TPM_ALG_SM2) { +- result = EVP_PKEY_set_alias_type(evp_key, EVP_PKEY_SM2); +- if (result <= 0) { +- ERROR("Error: failed to set EVP KEY alias to SM2.\n"); +- goto OPENSSL_ERROR; +- } +- } + pctx = EVP_PKEY_CTX_new(evp_key, NULL); + if (pctx == NULL) { + ERROR("Error: failed to generate key context.\n"); +@@ -789,8 +959,7 @@ + goto EXIT; + } + if (sigalg == TPM_ALG_SM2) { +- result = EVP_PKEY_CTX_set1_id(pctx, SM2_ID, SM2_ID_LEN); +- if (result <= 0) { ++ if ( EVP_PKEY_CTX_set1_id(pctx, SM2_ID, SM2_ID_LEN) <= 0 ) { + ERROR("Error: failed to set sm2 id.\n"); + goto OPENSSL_ERROR; + } +@@ -802,26 +971,24 @@ + result = 0; + goto EXIT; + } +- result = EVP_DigestVerifyInit(mctx, NULL, mdtype, NULL, evp_key); +- if (result <= 0) { +- ERROR("Error: error while verifying.\n"); ++ if ( EVP_DigestVerifyInit(mctx, NULL, mdtype, NULL, evp_key) <= 0 ) { ++ ERROR("Error: error while verifying (init).\n"); + goto OPENSSL_ERROR; + } +- if (verbose) { ++ if ( verbose ) { + LOG("Data that was signed:\n"); + print_hex(" ", data->data, data->size); + } +- result = EVP_DigestVerifyUpdate(mctx, data->data, data->size); +- if (result <= 0) { +- ERROR("Error: error while verifying.\n"); ++ if ( EVP_DigestVerifyUpdate(mctx, data->data, data->size) <= 0) { ++ ERROR("Error: error while verifying (update).\n"); + goto OPENSSL_ERROR; + } + result = EVP_DigestVerifyFinal(mctx, der_encoded_sig, encoded_len); + if (result < 0) { +- ERROR("Error: error while verifying.\n"); ++ ERROR("Error: error while verifying (final)\tError code = %d.\n", result); + goto OPENSSL_ERROR; + } +- goto EXIT; ++ goto EXIT; + OPENSSL_ERROR: + ERR_load_crypto_strings(); + ERROR("OpenSSL error: %s\n",ERR_error_string(ERR_get_error(), NULL)); +@@ -829,8 +996,23 @@ + result = 0; + EXIT: + //cleanup: +- if (ec_key != NULL) { +- OPENSSL_free((void *) ec_key); ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ if (ec_point != NULL) { ++ OPENSSL_free((void *) ec_point); ++ } ++ if (point_buffer != NULL) { ++ OPENSSL_free((void *) point_buffer); ++ } ++ if (curveName != NULL) { ++ OPENSSL_free((void *) curveName); ++ } ++ #else ++ if (ec_key != NULL) { ++ OPENSSL_free((void *) ec_key); ++ } ++ #endif ++ if (ec_group != NULL) { ++ OPENSSL_free((void *) ec_group); + } + if (evp_key != NULL) { + OPENSSL_free((void *) evp_key); +@@ -841,11 +1023,8 @@ + if (y != NULL) { + OPENSSL_free((void *) y); + } +- if (ec_group != NULL) { +- OPENSSL_free((void *) ec_group); +- } + if (der_encoded_sig != NULL) { +- OPENSSL_free((void *)der_encoded_sig); ++ OPENSSL_free((void *) der_encoded_sig); + } + if (mctx != NULL) { + OPENSSL_free(mctx); +@@ -871,7 +1050,6 @@ + */ + int result; + size_t sig_length; +- EC_KEY *ec_key = NULL; + EVP_PKEY *evp_key = NULL; + EVP_MD_CTX *mctx = NULL; + EVP_PKEY_CTX *pctx = NULL; +@@ -880,6 +1058,9 @@ + const BIGNUM *sig_r = NULL; //Is freed when ECDSA_SIG is freed + const BIGNUM *sig_s = NULL; //Is freed when ECDSA_SIG is freed + const unsigned char *signature_block = NULL; ++ #if OPENSSL_VERSION_NUMBER < 0x30000000L ++ EC_KEY *ec_key = NULL; ++ #endif + + LOG("[ec_sign_data]\n"); + if (data == NULL || r == NULL || s == NULL) { +@@ -891,37 +1072,49 @@ + ERROR("Error: failed to allocate message digest context.\n"); + goto OPENSSL_ERROR; + } +- fp = fopen(privkey_file, "r"); ++ fp = fopen(privkey_file, "rb"); + if ( fp == NULL ) { + ERROR("Error: failed to open file %s: %s\n", privkey_file, strerror(errno)); + result = 0; + goto EXIT; + } +- ec_key = PEM_read_ECPrivateKey(fp, NULL, NULL, NULL); +- if (ec_key == NULL) { +- ERROR("Error: failed to allocate EC key.\n"); +- goto OPENSSL_ERROR; +- } ++ ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ OSSL_DECODER_CTX *dctx; ++ dctx = OSSL_DECODER_CTX_new_for_pkey(&evp_key, "PEM", NULL, "EC", OSSL_KEYMGMT_SELECT_PRIVATE_KEY, NULL, NULL); ++ if ( dctx == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ if ( !OSSL_DECODER_from_fp(dctx, fp) ) { ++ goto OPENSSL_ERROR; ++ } ++ OSSL_DECODER_CTX_free(dctx); ++ #else ++ ec_key = PEM_read_ECPrivateKey(fp, NULL, NULL, NULL); ++ if (ec_key == NULL) { ++ ERROR("Error: failed to allocate EC key.\n"); ++ goto OPENSSL_ERROR; ++ } ++ evp_key = EVP_PKEY_new(); ++ if (evp_key == NULL) { ++ ERROR("Error: failed to allocate EVP key.\n"); ++ goto OPENSSL_ERROR; ++ } ++ result = EVP_PKEY_assign_EC_KEY(evp_key, ec_key); ++ if (result <= 0) { ++ ERROR("Error: failed to assign EC key to EVP structure.\n"); ++ goto OPENSSL_ERROR; ++ } ++ if (sigalg == TPM_ALG_SM2) { ++ result = EVP_PKEY_set_alias_type(evp_key, EVP_PKEY_SM2); ++ if (result <= 0) { ++ ERROR("Error: failed to assign SM2 alias to EVP key.\n"); ++ goto OPENSSL_ERROR; ++ } ++ } ++ #endif + fclose(fp); + fp = NULL; +- evp_key = EVP_PKEY_new(); +- if (evp_key == NULL) { +- ERROR("Error: failed to allocate EVP key.\n"); +- goto OPENSSL_ERROR; +- } +- result = EVP_PKEY_assign_EC_KEY(evp_key, ec_key); +- if (result <= 0) { +- ERROR("Error: failed to assign EC key to EVP structure.\n"); +- goto OPENSSL_ERROR; +- } +- +- if (sigalg == TPM_ALG_SM2) { +- result = EVP_PKEY_set_alias_type(evp_key, EVP_PKEY_SM2); +- if (result <= 0) { +- ERROR("Error: failed to assign SM2 alias to EVP key.\n"); +- goto OPENSSL_ERROR; +- } +- } + + pctx = EVP_PKEY_CTX_new(evp_key, NULL); + if (pctx == NULL) { +@@ -999,9 +1192,11 @@ + ERR_free_strings(); + result = 0; + EXIT: +- if (ec_key != NULL) { +- OPENSSL_free((void *) ec_key); +- } ++ #if OPENSSL_VERSION_NUMBER < 0x30000000L ++ if (ec_key != NULL) { ++ OPENSSL_free((void *) ec_key); ++ } ++ #endif + if (evp_key != NULL) { + OPENSSL_free((void *) evp_key); + } +@@ -1185,8 +1380,9 @@ + uint8_t der_oid = 0x06; + size_t oid_size; + +- if (data == NULL) ++ if (data == NULL) { + return TPM_ALG_NULL; ++ } + + data += 2; //Skip 00 01 + //Skip 0xFFs padding and 00 after it +@@ -1195,8 +1391,9 @@ + } while (*data == 0xFF); + //Then move to der_oid + data += 5; +- if (*data != der_oid) ++ if (*data != der_oid) { + return TPM_ALG_NULL; ++ } + data += 1; + //Read oid size: + oid_size = *data; +diff -r 5bf5c12411d3 -r 1d7d6d196bb1 lcptools-v2/pollist2.c +--- a/lcptools-v2/pollist2.c Wed Sep 15 16:53:34 2021 +0200 ++++ b/lcptools-v2/pollist2.c Fri Dec 10 15:27:43 2021 +0100 +@@ -45,6 +45,10 @@ + #include <openssl/pem.h> + #include <openssl/err.h> + #include <openssl/bn.h> ++#if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ #include <openssl/decoder.h> ++ #include <openssl/core.h> ++#endif + #define PRINT printf + #include "../include/config.h" + #include "../include/hash.h" +@@ -93,8 +97,7 @@ + if ( MAJOR_VER(version) == 1 ){ + LOG("read_policy_list_file: version=0x0100\n"); + bool no_sigblock; +- if ( !verify_tpm12_policy_list(&(pollist->tpm12_policy_list), +- len, &no_sigblock, true) ) { ++ if ( !verify_tpm12_policy_list(&(pollist->tpm12_policy_list), len, &no_sigblock, true) ) { + free(pollist); + return NULL; + } +@@ -815,14 +818,31 @@ + lcp_signature_t2 *read_rsa_pubkey_file(const char *file) + { + LOG("read_rsa_pubkey_file\n"); +- FILE *fp = fopen(file, "r"); ++ FILE *fp = fopen(file, "rb"); + if ( fp == NULL ) { + ERROR("Error: failed to open .pem file %s: %s\n", file, + strerror(errno)); + return NULL; + } + +- RSA *pubkey = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL); ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ EVP_PKEY *pubkey = NULL; ++ OSSL_DECODER_CTX *dctx = OSSL_DECODER_CTX_new_for_pkey(&pubkey, "PEM", NULL, "RSA", OSSL_KEYMGMT_SELECT_PUBLIC_KEY, NULL, NULL); ++ if ( dctx == NULL ) { ++ ERROR("Error: no suitable potential decoders found\n"); ++ fclose(fp); ++ return NULL; ++ } ++ if ( !OSSL_DECODER_from_fp(dctx, fp) ) { ++ ERROR("Error: decoding failure\n"); ++ fclose(fp); ++ return NULL; ++ } ++ OSSL_DECODER_CTX_free(dctx); ++ #else ++ RSA *pubkey = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL); ++ #endif ++ + if ( pubkey == NULL ) { + ERR_load_crypto_strings(); + ERROR("Error: failed to read .pem file %s: %s\n", file, +@@ -832,10 +852,14 @@ + return NULL; + } + +- unsigned int keysize = RSA_size(pubkey); ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ unsigned int keysize = EVP_PKEY_get_size(pubkey); ++ #else ++ unsigned int keysize = RSA_size(pubkey); ++ #endif + if ( keysize == 0 ) { + ERROR("Error: public key size is 0\n"); +- RSA_free(pubkey); ++ OPENSSL_free((void *) pubkey); + fclose(fp); + return NULL; + } +@@ -843,17 +867,21 @@ + lcp_signature_t2 *sig = malloc(sizeof(lcp_rsa_signature_t) + 2*keysize); + if ( sig == NULL ) { + ERROR("Error: failed to allocate sig\n"); +- RSA_free(pubkey); ++ OPENSSL_free((void *) pubkey); + fclose(fp); + return NULL; + } +- const BIGNUM *modulus = NULL; ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ BIGNUM *modulus = NULL; ++ #else ++ const BIGNUM *modulus = NULL; ++ #endif + memset_s(sig, sizeof(lcp_rsa_signature_t) + 2*keysize, 0); + sig->rsa_signature.pubkey_size = keysize; + +- /* OpenSSL Version 1.1.0 and later don't allow direct access to RSA +- stuct */ +- #if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ EVP_PKEY_get_bn_param(pubkey, "n", &modulus); ++ #elif OPENSSL_VERSION_NUMBER >= 0x10100000L + RSA_get0_key(pubkey, &modulus, NULL, NULL); + #else + modulus = pubkey->n; +@@ -872,7 +900,7 @@ + } + + LOG("read rsa pubkey succeed!\n"); +- RSA_free(pubkey); ++ OPENSSL_free((void *) pubkey); + fclose(fp); + return sig; + } +@@ -881,52 +909,83 @@ + { + lcp_signature_t2 *sig = NULL; + FILE *fp = NULL; +- const EC_KEY *pubkey = NULL; +- const EC_POINT *pubpoint = NULL; +- const EC_GROUP *pubgroup = NULL; + BIGNUM *x = NULL; + BIGNUM *y = NULL; +- BN_CTX *ctx = NULL; + uint8_t *qx = NULL; + uint8_t *qy = NULL; +- + uint16_t keySize; + uint16_t keySizeBytes; + int result; ++ #if OPENSSL_VERSION_NUMBER < 0x30000000L ++ const EC_KEY *pubkey = NULL; ++ const EC_POINT *pubpoint = NULL; ++ const EC_GROUP *pubgroup = NULL; ++ BN_CTX *ctx = NULL; ++ #else ++ EVP_PKEY *pubkey; ++ #endif + + LOG("read ecdsa pubkey file for list signature.\n"); +- fp = fopen(pubkey_file, "r"); ++ fp = fopen(pubkey_file, "rb"); + if ( fp == NULL) { + ERROR("ERROR: cannot open file.\n"); + goto ERROR; + } +- pubkey = PEM_read_EC_PUBKEY(fp, NULL, NULL, NULL); +- if ( pubkey == NULL ) { +- goto OPENSSL_ERROR; +- } +- //Close the file +- fclose(fp); +- fp = NULL; ++ ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ OSSL_DECODER_CTX *dctx; ++ dctx = OSSL_DECODER_CTX_new_for_pkey(&pubkey, "PEM", NULL, "EC", OSSL_KEYMGMT_SELECT_PUBLIC_KEY, NULL, NULL); ++ if ( dctx == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ if ( !OSSL_DECODER_from_fp(dctx, fp) ) { ++ goto OPENSSL_ERROR; ++ } ++ OSSL_DECODER_CTX_free(dctx); ++ ++ if ( pubkey == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ ++ fclose(fp); ++ fp = NULL; + +- pubpoint = EC_KEY_get0_public_key(pubkey); +- if ( pubpoint == NULL ) { +- goto OPENSSL_ERROR; +- } +- pubgroup = EC_KEY_get0_group(pubkey); +- if ( pubgroup == NULL ) { +- goto OPENSSL_ERROR; +- } ++ EVP_PKEY_get_bn_param(pubkey, "qx", &x); ++ EVP_PKEY_get_bn_param(pubkey, "qy", &y); ++ if ( x == NULL || y == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ #else ++ pubkey = PEM_read_EC_PUBKEY(fp, NULL, NULL, NULL); ++ if ( pubkey == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ ++ fclose(fp); ++ fp = NULL; + +- x = BN_new(); +- y = BN_new(); +- ctx = BN_CTX_new(); +- if ( x == NULL|| y == NULL || ctx == NULL) { +- goto OPENSSL_ERROR; +- } +- result = EC_POINT_get_affine_coordinates_GFp(pubgroup, pubpoint, x, y, ctx); +- if (result <= 0) { +- goto OPENSSL_ERROR; +- } ++ pubpoint = EC_KEY_get0_public_key(pubkey); ++ if ( pubpoint == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ pubgroup = EC_KEY_get0_group(pubkey); ++ if ( pubgroup == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ ++ x = BN_new(); ++ y = BN_new(); ++ ctx = BN_CTX_new(); ++ if ( x == NULL|| y == NULL || ctx == NULL) { ++ goto OPENSSL_ERROR; ++ } ++ ++ result = EC_POINT_get_affine_coordinates_GFp(pubgroup, pubpoint, x, y, ctx); ++ if (result <= 0) { ++ goto OPENSSL_ERROR; ++ } ++ #endif ++ + keySize = BN_num_bytes(x)*8; + if (BN_num_bytes(x) != BN_num_bytes(y)) { + ERROR("ERROR: key coordinates are not the same length."); +@@ -951,12 +1010,6 @@ + goto ERROR; + } + +- if ( keySize/8 != BN_num_bytes(x) || keySize/8 != BN_num_bytes(y) ) { +- ERROR("ERROR: keySize 0x%X is not 0x%X or 0x%X.\n", keySizeBytes, +- MIN_ECC_KEY_SIZE, MAX_ECC_KEY_SIZE); +- goto ERROR; +- } +- + sig = calloc(1, sizeof(lcp_ecc_signature_t)+(4*keySizeBytes)); //qx, qy, r and s + if (sig == NULL) { + ERROR("Error: failed to allocate signature.\n"); +@@ -996,11 +1049,13 @@ + free(qx); + free(qy); + OPENSSL_free((void *) pubkey); +- OPENSSL_free((void *) pubpoint); +- OPENSSL_free((void *) pubgroup); +- OPENSSL_free((void *) ctx); + OPENSSL_free((void *) x); + OPENSSL_free((void *) y); ++ #if OPENSSL_VERSION_NUMBER < 0x30000000L ++ OPENSSL_free((void *) pubpoint); ++ OPENSSL_free((void *) pubgroup); ++ OPENSSL_free((void *) ctx); ++ #endif + return sig; + + //Errors: +@@ -1020,16 +1075,18 @@ + free(qy); + if (pubkey != NULL) + OPENSSL_free((void *) pubkey); +- if (pubpoint != NULL) +- OPENSSL_free((void *) pubpoint); +- if (pubgroup != NULL) +- OPENSSL_free((void *) pubgroup); +- if (ctx != NULL) +- OPENSSL_free((void *) ctx); + if (x != NULL) + OPENSSL_free((void *) x); + if (y != NULL) + OPENSSL_free((void *) y); ++ #if OPENSSL_VERSION_NUMBER < 0x30000000L ++ if (pubpoint != NULL) ++ OPENSSL_free((void *) pubpoint); ++ if (pubgroup != NULL) ++ OPENSSL_free((void *) pubgroup); ++ if (ctx != NULL) ++ OPENSSL_free((void *) ctx); ++ #endif + return NULL; + } + bool ec_sign_list2_data(lcp_policy_list_t2 *pollist, const char *privkey) +diff -r 5bf5c12411d3 -r 1d7d6d196bb1 lcptools-v2/pollist2_1.c +--- a/lcptools-v2/pollist2_1.c Wed Sep 15 16:53:34 2021 +0200 ++++ b/lcptools-v2/pollist2_1.c Fri Dec 10 15:27:43 2021 +0100 +@@ -48,6 +48,10 @@ + #include <openssl/ecdsa.h> + #include <openssl/ec.h> + #include <openssl/evp.h> ++#if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ #include <openssl/decoder.h> ++ #include <openssl/core.h> ++#endif + #include "../include/hash.h" + #include "../include/uuid.h" + #include "../include/lcp3.h" +@@ -1527,9 +1531,13 @@ + Out: Pointer to signature structure. + */ + { +- const BIGNUM *modulus = NULL; + FILE *fp = NULL; +- RSA *pubkey = NULL; ++ BIGNUM *modulus = NULL; ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ EVP_PKEY *pubkey = NULL; ++ #else ++ RSA *pubkey = NULL; ++ #endif + lcp_signature_2_1 *sig = NULL; + unsigned char *key = NULL; + +@@ -1537,14 +1545,26 @@ + int result = 0; + + LOG("read_rsa_pubkey_file_2_1\n"); +- fp = fopen(file, "r"); ++ fp = fopen(file, "rb"); + if ( fp == NULL ) { + ERROR("Error: failed to open .pem file %s: %s\n", file, + strerror(errno)); + return NULL; + } + +- pubkey = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL); ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ OSSL_DECODER_CTX *dctx; ++ dctx = OSSL_DECODER_CTX_new_for_pkey(&pubkey, "PEM", NULL, "RSA", OSSL_KEYMGMT_SELECT_PUBLIC_KEY, NULL, NULL); ++ if ( dctx == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ if ( !OSSL_DECODER_from_fp(dctx, fp) ) { ++ goto OPENSSL_ERROR; ++ } ++ OSSL_DECODER_CTX_free(dctx); ++ #else ++ pubkey = PEM_read_RSA_PUBKEY(fp, NULL, NULL, NULL); ++ #endif + if ( pubkey == NULL ) { + goto OPENSSL_ERROR; + } +@@ -1552,7 +1572,11 @@ + fclose(fp); + fp = NULL; + +- keysize = RSA_size(pubkey); ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ keysize = EVP_PKEY_get_size(pubkey); ++ #else ++ keysize = RSA_size(pubkey); ++ #endif + if ( keysize != 256 && keysize != 384 ) { + ERROR("Error: public key size %d is not supported\n", keysize); + goto ERROR; +@@ -1564,14 +1588,17 @@ + goto ERROR; + } + +- #if OPENSSL_VERSION_NUMBER >= 0x10100000L +- RSA_get0_key(pubkey, &modulus, NULL, NULL); +- if (modulus == NULL) { +- goto OPENSSL_ERROR; +- } ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ EVP_PKEY_get_bn_param(pubkey, "n", &modulus); ++ #elif OPENSSL_VERSION_NUMBER >= 0x10100000L ++ RSA_get0_key(pubkey, (const BIGNUM **) &modulus, NULL, NULL); + #else + modulus = pubkey->n; + #endif ++ if (modulus == NULL) { ++ goto OPENSSL_ERROR; ++ } ++ + //Allocate for the key + key = malloc(keysize); + if (key == NULL) { +@@ -1609,9 +1636,7 @@ + free(key); + return sig; + OPENSSL_ERROR: +- ERR_load_CRYPTO_strings(); + ERROR("OpenSSL error: %s\n", ERR_error_string(ERR_get_error(), NULL)); +- ERR_free_strings(); + goto ERROR; + ERROR: + if (fp != NULL) +@@ -1744,12 +1769,8 @@ + int result; + lcp_signature_2_1 *sig = NULL; + FILE *fp = NULL; +- const EC_KEY *pubkey = NULL; +- const EC_POINT *pubpoint = NULL; +- const EC_GROUP *pubgroup = NULL; + BIGNUM *x = NULL; + BIGNUM *y = NULL; +- BN_CTX *ctx = NULL; + uint16_t bytes_in_x; + uint16_t bytes_in_y; + uint16_t keySize; +@@ -1758,43 +1779,74 @@ + uint8_t qy[MAX_ECC_KEY_SIZE]; + uint8_t qx_le[MAX_ECC_KEY_SIZE]; + uint8_t qy_le[MAX_ECC_KEY_SIZE]; ++ #if OPENSSL_VERSION_NUMBER < 0x30000000L ++ const EC_KEY *pubkey = NULL; ++ const EC_POINT *pubpoint = NULL; ++ const EC_GROUP *pubgroup = NULL; ++ BN_CTX *ctx = NULL; ++ #else ++ EVP_PKEY *pubkey = NULL; ++ #endif + +- LOG("read ecdsa pubkey file for signature 2.1.\n"); +- fp = fopen(pubkey_file, "r"); ++ fp = fopen(pubkey_file, "rb"); + if ( fp == NULL) { + ERROR("ERROR: cannot open file.\n"); + goto ERROR; + } +- pubkey = PEM_read_EC_PUBKEY(fp, NULL, NULL, NULL); +- if ( pubkey == NULL ) { +- goto OPENSSL_ERROR; +- } ++ ++ #if OPENSSL_VERSION_NUMBER >= 0x30000000L ++ OSSL_DECODER_CTX *dctx; ++ dctx = OSSL_DECODER_CTX_new_for_pkey(&pubkey, "PEM", NULL, "EC", OSSL_KEYMGMT_SELECT_PUBLIC_KEY, NULL, NULL); ++ if ( dctx == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ if ( !OSSL_DECODER_from_fp(dctx, fp) ) { ++ goto OPENSSL_ERROR; ++ } ++ OSSL_DECODER_CTX_free(dctx); ++ ++ if ( pubkey == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ ++ EVP_PKEY_get_bn_param(pubkey, "qx", &x); ++ EVP_PKEY_get_bn_param(pubkey, "qy", &y); ++ if ( x == NULL|| y == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ #else ++ pubkey = PEM_read_EC_PUBKEY(fp, NULL, NULL, NULL); ++ if ( pubkey == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ ++ pubpoint = EC_KEY_get0_public_key(pubkey); ++ if ( pubpoint == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ pubgroup = EC_KEY_get0_group(pubkey); ++ if ( pubgroup == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ ++ x = BN_new(); ++ y = BN_new(); ++ if ( x == NULL|| y == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ ctx = BN_CTX_new(); ++ if ( ctx == NULL ) { ++ goto OPENSSL_ERROR; ++ } ++ result = EC_POINT_get_affine_coordinates_GFp(pubgroup, pubpoint, x, y, ctx); ++ if (result <= 0) { ++ goto OPENSSL_ERROR; ++ } ++ #endif + //Close the file + fclose(fp); + fp = NULL; + +- pubpoint = EC_KEY_get0_public_key(pubkey); +- if ( pubpoint == NULL ) { +- goto OPENSSL_ERROR; +- } +- pubgroup = EC_KEY_get0_group(pubkey); +- if ( pubgroup == NULL ) { +- goto OPENSSL_ERROR; +- } +- +- x = BN_new(); +- y = BN_new(); +- if ( x == NULL|| y == NULL ) { +- goto OPENSSL_ERROR; +- } +- ctx = BN_CTX_new(); +- if ( ctx == NULL ) { +- goto OPENSSL_ERROR; +- } +- result = EC_POINT_get_affine_coordinates_GFp(pubgroup, pubpoint, x, y, ctx); +- if (result <= 0) { +- goto OPENSSL_ERROR; +- } + bytes_in_x = BN_num_bytes(x); + bytes_in_y = BN_num_bytes(y); + +@@ -1865,11 +1917,13 @@ + } + //Free resources: + OPENSSL_free((void *) pubkey); +- OPENSSL_free((void *) pubpoint); +- OPENSSL_free((void *) pubgroup); +- OPENSSL_free((void *) ctx); + OPENSSL_free((void *) x); + OPENSSL_free((void *) y); ++ #if OPENSSL_VERSION_NUMBER < 0x30000000L ++ OPENSSL_free((void *) pubpoint); ++ OPENSSL_free((void *) pubgroup); ++ OPENSSL_free((void *) ctx); ++ #endif + return sig; + //ERROR handling: + OPENSSL_ERROR: +@@ -1884,16 +1938,18 @@ + free(sig); + if (pubkey != NULL) + OPENSSL_free((void *) pubkey); +- if (pubpoint != NULL) +- OPENSSL_free((void *) pubpoint); +- if (pubgroup != NULL) +- OPENSSL_free((void *) pubgroup); +- if (ctx != NULL) +- OPENSSL_free((void *) ctx); + if (x != NULL) + OPENSSL_free((void *) x); + if (y != NULL) + OPENSSL_free((void *) y); ++ #if OPENSSL_VERSION_NUMBER < 0x30000000L ++ if (pubpoint != NULL) ++ OPENSSL_free((void *) pubpoint); ++ if (pubgroup != NULL) ++ OPENSSL_free((void *) pubgroup); ++ if (ctx != NULL) ++ OPENSSL_free((void *) ctx); ++ #endif + return NULL; + } + + diff -Nru tboot-1.10.2+dfsg.0/debian/patches/series tboot-1.10.2+dfsg.0/debian/patches/series --- tboot-1.10.2+dfsg.0/debian/patches/series 1969-12-31 16:00:00.000000000 -0800 +++ tboot-1.10.2+dfsg.0/debian/patches/series 2022-03-11 13:09:02.000000000 -0800 @@ -0,0 +1 @@ +openssl3-compat.patch