Package init
This commit is contained in:
commit
78f36fe7ae
@ -0,0 +1,37 @@
|
|||||||
|
From 3acd773846a85d142e919e2f4eeeee1acea5ca3a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michal Schmidt <mschmidt@redhat.com>
|
||||||
|
Date: Mon, 20 Feb 2017 10:28:33 +0100
|
||||||
|
Subject: [PATCH 1/3] Fix build with OpenSSL 1.1 due to EVP_PKEY being an
|
||||||
|
opaque struct
|
||||||
|
|
||||||
|
With OpenSSL 1.1 the build fails with:
|
||||||
|
data_import.c:375:26: error: dereferencing pointer to incomplete type
|
||||||
|
'EVP_PKEY {aka struct evp_pkey_st}'
|
||||||
|
|
||||||
|
The manual page[1] says:
|
||||||
|
Previous versions of this document suggested using
|
||||||
|
EVP_PKEY_type(pkey->type) to determine the type of a key. Since EVP_PKEY
|
||||||
|
is now opaque this is no longer possible: the equivalent is
|
||||||
|
EVP_PKEY_base_id(pkey).
|
||||||
|
|
||||||
|
[1] https://www.openssl.org/docs/man1.1.0/crypto/EVP_PKEY_base_id.html
|
||||||
|
---
|
||||||
|
src/data_mgmt/data_import.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/data_mgmt/data_import.c b/src/data_mgmt/data_import.c
|
||||||
|
index f534717f02..d4d2052bc6 100644
|
||||||
|
--- a/src/data_mgmt/data_import.c
|
||||||
|
+++ b/src/data_mgmt/data_import.c
|
||||||
|
@@ -372,7 +372,7 @@ readX509Cert( const char *a_pszFile,
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if ( EVP_PKEY_type( pKey->type ) != EVP_PKEY_RSA ) {
|
||||||
|
+ if ( EVP_PKEY_base_id( pKey ) != EVP_PKEY_RSA ) {
|
||||||
|
logError( TOKEN_RSA_KEY_ERROR );
|
||||||
|
|
||||||
|
X509_free( pX509 );
|
||||||
|
--
|
||||||
|
2.9.3
|
||||||
|
|
||||||
192
0002-Fix-build-with-OpenSSL-1.1-due-to-RSA-being-an-opaqu.patch
Normal file
192
0002-Fix-build-with-OpenSSL-1.1-due-to-RSA-being-an-opaqu.patch
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
From 72fe7011fe981f90a04a62a3fb6ad33037390dff Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michal Schmidt <mschmidt@redhat.com>
|
||||||
|
Date: Mon, 20 Feb 2017 10:43:10 +0100
|
||||||
|
Subject: [PATCH 2/3] Fix build with OpenSSL 1.1 due to RSA being an opaque
|
||||||
|
struct
|
||||||
|
|
||||||
|
RSA is an opaque struct in OpenSSL 1.1. New getter functions must be
|
||||||
|
used to access the key components. The functions were not present in
|
||||||
|
OpenSSL 1.0, so add a compat header with the implementation of the
|
||||||
|
needed functions as suggested by the OpenSSL wiki [1] in order to allow
|
||||||
|
building tpm-tools with any version of OpenSSL.
|
||||||
|
|
||||||
|
[1] https://wiki.openssl.org/index.php/1.1_API_Changes
|
||||||
|
---
|
||||||
|
src/data_mgmt/Makefile.am | 3 ++-
|
||||||
|
src/data_mgmt/data_import.c | 52 ++++++++++++++++++++++---------------
|
||||||
|
src/data_mgmt/openssl_compat.h | 58 ++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 92 insertions(+), 21 deletions(-)
|
||||||
|
create mode 100644 src/data_mgmt/openssl_compat.h
|
||||||
|
|
||||||
|
diff --git a/src/data_mgmt/Makefile.am b/src/data_mgmt/Makefile.am
|
||||||
|
index de505e48ef..9457618ab9 100644
|
||||||
|
--- a/src/data_mgmt/Makefile.am
|
||||||
|
+++ b/src/data_mgmt/Makefile.am
|
||||||
|
@@ -32,7 +32,8 @@ noinst_HEADERS = data_common.h \
|
||||||
|
data_init.h \
|
||||||
|
data_object.h \
|
||||||
|
data_passwd.h \
|
||||||
|
- data_protect.h
|
||||||
|
+ data_protect.h \
|
||||||
|
+ openssl_compat.h
|
||||||
|
|
||||||
|
#
|
||||||
|
# Common build flags
|
||||||
|
diff --git a/src/data_mgmt/data_import.c b/src/data_mgmt/data_import.c
|
||||||
|
index d4d2052bc6..532543f7d3 100644
|
||||||
|
--- a/src/data_mgmt/data_import.c
|
||||||
|
+++ b/src/data_mgmt/data_import.c
|
||||||
|
@@ -39,6 +39,7 @@
|
||||||
|
#include <openssl/evp.h>
|
||||||
|
#include <openssl/err.h>
|
||||||
|
|
||||||
|
+#include "openssl_compat.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Global variables
|
||||||
|
@@ -691,8 +692,11 @@ createRsaPubKeyObject( RSA *a_pRsa,
|
||||||
|
|
||||||
|
int rc = -1;
|
||||||
|
|
||||||
|
- int nLen = BN_num_bytes( a_pRsa->n );
|
||||||
|
- int eLen = BN_num_bytes( a_pRsa->e );
|
||||||
|
+ const BIGNUM *rsa_n, *rsa_e;
|
||||||
|
+ RSA_get0_key( a_pRsa, &rsa_n, &rsa_e, NULL );
|
||||||
|
+
|
||||||
|
+ int nLen = BN_num_bytes( rsa_n );
|
||||||
|
+ int eLen = BN_num_bytes( rsa_e );
|
||||||
|
|
||||||
|
CK_RV rv;
|
||||||
|
|
||||||
|
@@ -732,8 +736,8 @@ createRsaPubKeyObject( RSA *a_pRsa,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get binary representations of the RSA key information
|
||||||
|
- BN_bn2bin( a_pRsa->n, n );
|
||||||
|
- BN_bn2bin( a_pRsa->e, e );
|
||||||
|
+ BN_bn2bin( rsa_n, n );
|
||||||
|
+ BN_bn2bin( rsa_e, e );
|
||||||
|
|
||||||
|
// Create the RSA public key object
|
||||||
|
rv = createObject( a_hSession, tAttr, ulAttrCount, a_hObject );
|
||||||
|
@@ -760,14 +764,22 @@ createRsaPrivKeyObject( RSA *a_pRsa,
|
||||||
|
|
||||||
|
int rc = -1;
|
||||||
|
|
||||||
|
- int nLen = BN_num_bytes( a_pRsa->n );
|
||||||
|
- int eLen = BN_num_bytes( a_pRsa->e );
|
||||||
|
- int dLen = BN_num_bytes( a_pRsa->d );
|
||||||
|
- int pLen = BN_num_bytes( a_pRsa->p );
|
||||||
|
- int qLen = BN_num_bytes( a_pRsa->q );
|
||||||
|
- int dmp1Len = BN_num_bytes( a_pRsa->dmp1 );
|
||||||
|
- int dmq1Len = BN_num_bytes( a_pRsa->dmq1 );
|
||||||
|
- int iqmpLen = BN_num_bytes( a_pRsa->iqmp );
|
||||||
|
+ const BIGNUM *rsa_n, *rsa_e, *rsa_d;
|
||||||
|
+ const BIGNUM *rsa_p, *rsa_q;
|
||||||
|
+ const BIGNUM *rsa_dmp1, *rsa_dmq1, *rsa_iqmp;
|
||||||
|
+
|
||||||
|
+ RSA_get0_key( a_pRsa, &rsa_n, &rsa_e, &rsa_d );
|
||||||
|
+ RSA_get0_factors( a_pRsa, &rsa_p, &rsa_q );
|
||||||
|
+ RSA_get0_crt_params( a_pRsa, &rsa_dmp1, &rsa_dmq1, &rsa_iqmp );
|
||||||
|
+
|
||||||
|
+ int nLen = BN_num_bytes( rsa_n );
|
||||||
|
+ int eLen = BN_num_bytes( rsa_e );
|
||||||
|
+ int dLen = BN_num_bytes( rsa_d );
|
||||||
|
+ int pLen = BN_num_bytes( rsa_p );
|
||||||
|
+ int qLen = BN_num_bytes( rsa_q );
|
||||||
|
+ int dmp1Len = BN_num_bytes( rsa_dmp1 );
|
||||||
|
+ int dmq1Len = BN_num_bytes( rsa_dmq1 );
|
||||||
|
+ int iqmpLen = BN_num_bytes( rsa_iqmp );
|
||||||
|
|
||||||
|
CK_RV rv;
|
||||||
|
|
||||||
|
@@ -821,14 +833,14 @@ createRsaPrivKeyObject( RSA *a_pRsa,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get binary representations of the RSA key information
|
||||||
|
- BN_bn2bin( a_pRsa->n, n );
|
||||||
|
- BN_bn2bin( a_pRsa->e, e );
|
||||||
|
- BN_bn2bin( a_pRsa->d, d );
|
||||||
|
- BN_bn2bin( a_pRsa->p, p );
|
||||||
|
- BN_bn2bin( a_pRsa->q, q );
|
||||||
|
- BN_bn2bin( a_pRsa->dmp1, dmp1 );
|
||||||
|
- BN_bn2bin( a_pRsa->dmq1, dmq1 );
|
||||||
|
- BN_bn2bin( a_pRsa->iqmp, iqmp );
|
||||||
|
+ BN_bn2bin( rsa_n, n );
|
||||||
|
+ BN_bn2bin( rsa_e, e );
|
||||||
|
+ BN_bn2bin( rsa_d, d );
|
||||||
|
+ BN_bn2bin( rsa_p, p );
|
||||||
|
+ BN_bn2bin( rsa_q, q );
|
||||||
|
+ BN_bn2bin( rsa_dmp1, dmp1 );
|
||||||
|
+ BN_bn2bin( rsa_dmq1, dmq1 );
|
||||||
|
+ BN_bn2bin( rsa_iqmp, iqmp );
|
||||||
|
|
||||||
|
// Create the RSA private key object
|
||||||
|
rv = createObject( a_hSession, tAttr, ulAttrCount, a_hObject );
|
||||||
|
diff --git a/src/data_mgmt/openssl_compat.h b/src/data_mgmt/openssl_compat.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..2a60fdf492
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/src/data_mgmt/openssl_compat.h
|
||||||
|
@@ -0,0 +1,58 @@
|
||||||
|
+/*
|
||||||
|
+ * Getter functions for OpenSSL < 1.1 compatibility. Based on code from:
|
||||||
|
+ * https://wiki.openssl.org/index.php/1.1_API_Changes#Adding_forward-compatible_code_to_older_versions
|
||||||
|
+ * and therefore:
|
||||||
|
+ * Copyright OpenSSL 2016
|
||||||
|
+ * Contents licensed under the terms of the OpenSSL license
|
||||||
|
+ * See http://www.openssl.org/source/license.html for details
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifndef __OPENSSL_COMPAT_H
|
||||||
|
+#define __OPENSSL_COMPAT_H
|
||||||
|
+
|
||||||
|
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
|
+
|
||||||
|
+#include <openssl/engine.h>
|
||||||
|
+
|
||||||
|
+static inline void
|
||||||
|
+RSA_get0_key( const RSA *r,
|
||||||
|
+ const BIGNUM **n,
|
||||||
|
+ const BIGNUM **e,
|
||||||
|
+ const BIGNUM **d ) {
|
||||||
|
+
|
||||||
|
+ if ( n )
|
||||||
|
+ *n = r->n;
|
||||||
|
+ if ( e )
|
||||||
|
+ *e = r->e;
|
||||||
|
+ if ( d )
|
||||||
|
+ *d = r->d;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline void
|
||||||
|
+RSA_get0_factors( const RSA *r,
|
||||||
|
+ const BIGNUM **p,
|
||||||
|
+ const BIGNUM **q ) {
|
||||||
|
+
|
||||||
|
+ if ( p )
|
||||||
|
+ *p = r->p;
|
||||||
|
+ if ( q )
|
||||||
|
+ *q = r->q;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline void
|
||||||
|
+RSA_get0_crt_params( const RSA *r,
|
||||||
|
+ const BIGNUM **dmp1,
|
||||||
|
+ const BIGNUM **dmq1,
|
||||||
|
+ const BIGNUM **iqmp ) {
|
||||||
|
+
|
||||||
|
+ if ( dmp1 )
|
||||||
|
+ *dmp1 = r->dmp1;
|
||||||
|
+ if ( dmq1 )
|
||||||
|
+ *dmq1 = r->dmq1;
|
||||||
|
+ if ( iqmp )
|
||||||
|
+ *iqmp = r->iqmp;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#endif /* OPENSSL_VERSION_NUMBER */
|
||||||
|
+
|
||||||
|
+#endif /* __OPENSSL_COMPAT_H */
|
||||||
|
--
|
||||||
|
2.9.3
|
||||||
|
|
||||||
89
0003-Allocate-OpenSSL-cipher-contexts-for-seal-unseal.patch
Normal file
89
0003-Allocate-OpenSSL-cipher-contexts-for-seal-unseal.patch
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
From c229bb590250bd9769cb5a63918ab0f6c9386be7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michal Schmidt <mschmidt@redhat.com>
|
||||||
|
Date: Mon, 20 Feb 2017 12:00:39 +0100
|
||||||
|
Subject: [PATCH 3/3] Allocate OpenSSL cipher contexts for seal/unseal
|
||||||
|
|
||||||
|
Cipher contexts need to be allocated before using EVP_EncryptInit or
|
||||||
|
EVP_DecryptInit. Using a NULL context is invalid.
|
||||||
|
|
||||||
|
Fixes: f50ab0949438 ("Support OpenSSL 1.1.0")
|
||||||
|
---
|
||||||
|
lib/tpm_unseal.c | 12 ++++++++++--
|
||||||
|
src/cmds/tpm_sealdata.c | 11 +++++++++--
|
||||||
|
2 files changed, 19 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/tpm_unseal.c b/lib/tpm_unseal.c
|
||||||
|
index fc4a84906a..005dab7f8f 100644
|
||||||
|
--- a/lib/tpm_unseal.c
|
||||||
|
+++ b/lib/tpm_unseal.c
|
||||||
|
@@ -86,7 +86,7 @@ int tpmUnsealFile( char* fname, unsigned char** tss_data, int* tss_size,
|
||||||
|
int srkSecretLen;
|
||||||
|
unsigned char* res_data = NULL;
|
||||||
|
int res_size = 0;
|
||||||
|
-
|
||||||
|
+ EVP_CIPHER_CTX *ctx = NULL;
|
||||||
|
BIO *bdata = NULL, *b64 = NULL, *bmem = NULL;
|
||||||
|
int bioRc;
|
||||||
|
|
||||||
|
@@ -408,7 +408,12 @@ int tpmUnsealFile( char* fname, unsigned char** tss_data, int* tss_size,
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Decode and decrypt the encrypted data */
|
||||||
|
- EVP_CIPHER_CTX *ctx = NULL;
|
||||||
|
+ ctx = EVP_CIPHER_CTX_new();
|
||||||
|
+ if ( ctx == NULL ) {
|
||||||
|
+ rc = TPMSEAL_STD_ERROR;
|
||||||
|
+ tpm_errno = ENOMEM;
|
||||||
|
+ goto tss_out;
|
||||||
|
+ }
|
||||||
|
EVP_DecryptInit(ctx, EVP_aes_256_cbc(), symKey, (unsigned char *)TPMSEAL_IV);
|
||||||
|
|
||||||
|
/* Create a base64 BIO to decode the encrypted data */
|
||||||
|
@@ -459,6 +464,9 @@ out:
|
||||||
|
} else
|
||||||
|
free(res_data);
|
||||||
|
|
||||||
|
+ if (ctx)
|
||||||
|
+ EVP_CIPHER_CTX_free(ctx);
|
||||||
|
+
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/cmds/tpm_sealdata.c b/src/cmds/tpm_sealdata.c
|
||||||
|
index a2157f34b1..e25244a0f4 100644
|
||||||
|
--- a/src/cmds/tpm_sealdata.c
|
||||||
|
+++ b/src/cmds/tpm_sealdata.c
|
||||||
|
@@ -118,7 +118,7 @@ int main(int argc, char **argv)
|
||||||
|
char *passwd = NULL;
|
||||||
|
int pswd_len;
|
||||||
|
BYTE wellKnown[TCPA_SHA1_160_HASH_LEN] = TSS_WELL_KNOWN_SECRET;
|
||||||
|
-
|
||||||
|
+ EVP_CIPHER_CTX *ctx = NULL;
|
||||||
|
BIO *bin = NULL, *bdata=NULL, *b64=NULL;
|
||||||
|
|
||||||
|
initIntlSys();
|
||||||
|
@@ -343,7 +343,11 @@ int main(int argc, char **argv)
|
||||||
|
BIO_puts(bdata, TPMSEAL_ENC_STRING);
|
||||||
|
bdata = BIO_push(b64, bdata);
|
||||||
|
|
||||||
|
- EVP_CIPHER_CTX *ctx = NULL;
|
||||||
|
+ ctx = EVP_CIPHER_CTX_new();
|
||||||
|
+ if (ctx == NULL) {
|
||||||
|
+ logError(_("Unable to allocate cipher context\n"));
|
||||||
|
+ goto out_close;
|
||||||
|
+ }
|
||||||
|
EVP_EncryptInit(ctx, EVP_aes_256_cbc(), randKey, (unsigned char *)TPMSEAL_IV);
|
||||||
|
|
||||||
|
while ((lineLen = BIO_read(bin, line, sizeof(line))) > 0) {
|
||||||
|
@@ -375,5 +379,8 @@ out:
|
||||||
|
BIO_free(bdata);
|
||||||
|
if (b64)
|
||||||
|
BIO_free(b64);
|
||||||
|
+ if (ctx)
|
||||||
|
+ EVP_CIPHER_CTX_free(ctx);
|
||||||
|
+
|
||||||
|
return iRc;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.9.3
|
||||||
|
|
||||||
BIN
tpm-tools-1.3.9.tar.gz
Normal file
BIN
tpm-tools-1.3.9.tar.gz
Normal file
Binary file not shown.
69
tpm-tools.spec
Normal file
69
tpm-tools.spec
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
Name: tpm-tools
|
||||||
|
Version: 1.3.9
|
||||||
|
Release: 6
|
||||||
|
Summary: A group of tools to manage the TPM hardware
|
||||||
|
License: CPL
|
||||||
|
URL: http://trousers.sourceforge.net
|
||||||
|
Source0: http://downloads.sourceforge.net/trousers/%{name}-%{version}.tar.gz
|
||||||
|
Patch0001: 0001-Fix-build-with-OpenSSL-1.1-due-to-EVP_PKEY-being-an-.patch
|
||||||
|
Patch0002: 0002-Fix-build-with-OpenSSL-1.1-due-to-RSA-being-an-opaqu.patch
|
||||||
|
Patch0003: 0003-Allocate-OpenSSL-cipher-contexts-for-seal-unseal.patch
|
||||||
|
BuildRequires: gcc trousers-devel openssl-devel opencryptoki-devel
|
||||||
|
Provides: %{name}-pkcs11 = %{version}-%{release}
|
||||||
|
Obsoletes: %{name}-pkcs11 < %{version}-%{release}
|
||||||
|
|
||||||
|
%description
|
||||||
|
Tpm-tools is used to manage and utilize the Trusted Computing Group's TPM hardware.
|
||||||
|
This package contains tools to allow the platform administrator the ability to
|
||||||
|
manage and diagnose the platform's TPM.TPM hardware can create, store and use
|
||||||
|
RSA keys securely (without ever being exposed in memory), verify a platform's
|
||||||
|
software state using cryptographic hashes and more.
|
||||||
|
|
||||||
|
%package devel
|
||||||
|
Summary: Development files for tpm-tools
|
||||||
|
Requires: %{name} = %{version}-%{release}
|
||||||
|
|
||||||
|
%description devel
|
||||||
|
The tpm-tools-devel package contains libraries and header files for developing applications.
|
||||||
|
|
||||||
|
%package help
|
||||||
|
Summary: Help document for the %{name} package
|
||||||
|
|
||||||
|
%description help
|
||||||
|
Help document for the %{name} package.
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -c %{name}-%{version} -p1
|
||||||
|
|
||||||
|
%build
|
||||||
|
%configure --disable-static --disable-rpath --disable-silent-rules
|
||||||
|
%make_build
|
||||||
|
|
||||||
|
%install
|
||||||
|
%make_install
|
||||||
|
|
||||||
|
%post -p /sbin/ldconfig
|
||||||
|
|
||||||
|
%postun -p /sbin/ldconfig
|
||||||
|
|
||||||
|
%files
|
||||||
|
%license LICENSE
|
||||||
|
%doc README
|
||||||
|
%{_bindir}/{tpm_*,tpmtoken_*}
|
||||||
|
%{_sbindir}/tpm_*
|
||||||
|
%{_libdir}/{libtpm_unseal.so.?.?.?,libtpm_unseal.so.?}
|
||||||
|
%exclude %{_libdir}/libtpm_unseal.la
|
||||||
|
|
||||||
|
%files devel
|
||||||
|
%{_libdir}/libtpm_unseal.so
|
||||||
|
%{_includedir}/tpm_tools/
|
||||||
|
|
||||||
|
%files help
|
||||||
|
%{_mandir}/man1/tpm_*
|
||||||
|
%{_mandir}/man1/tpmtoken_*
|
||||||
|
%{_mandir}/man3/tpmUnseal*
|
||||||
|
%{_mandir}/man8/tpm_*
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
* Sat Nov 23 2019 zhangchunyu <zhangchunyu11@huawei.com> - 1.3.9-6
|
||||||
|
- Package init
|
||||||
Loading…
x
Reference in New Issue
Block a user