Skip to contentSkip to conversation

TPM 2.0 trusted key rework

PATCH Superseded James Bottomley 4 participants 13 messages Sep 20, 2020 – Sep 22, 2020

Subsystems (8)

v12 of 15 Superseded Latest is v15 →

lore
Share & tools
lore

James Bottomley

author maintainer
#0 lore raw

v12 cover TPM 2.0 trusted key rework

Update to fix blobauth parsing problem.

General cover letter minus policy bit:

This patch updates the trusted key code to export keys in the ASN.1 format used by current TPM key tools (openssl_tpm2_engine and openconnect). The current code will try to load keys containing policy, but being unable to formulate the policy commands necessary to load them, the unseal will always fail unless the policy is executed in user space and a pre-formed policy session passed in.

The key format is designed to be compatible with our two openssl engine implementations as well as with the format used by openconnect. I've added seal/unseal to my engine so I can use it for interoperability testing and I'll later use this for sealed symmetric keys via engine:

https://git.kernel.org/pub/scm/linux/kernel/git/jejb/openssl_tpm2_engine.git/

James

---

James Bottomley (5):
lib: add ASN.1 encoder
oid_registry: Add TCG defined OIDS for TPM keys
security: keys: trusted: fix TPM2 authorizations
security: keys: trusted: use ASN.1 TPM2 key format for the blobs
security: keys: trusted: Make sealed key properly interoperable

 .../security/keys/trusted-encrypted.rst       |  58 +++
 include/keys/trusted-type.h                   |   2 +
 include/linux/asn1_encoder.h                  |  32 ++
 include/linux/oid_registry.h                  |   5 +
 include/linux/tpm.h                           |   2 +
 lib/Kconfig                                   |   3 +
 lib/Makefile                                  |   1 +
 lib/asn1_encoder.c                            | 454 ++++++++++++++++++
 security/keys/Kconfig                         |   1 +
 security/keys/trusted-keys/Makefile           |   2 +-
 security/keys/trusted-keys/tpm2key.asn1       |  11 +
 security/keys/trusted-keys/trusted_tpm1.c     |  34 +-
 security/keys/trusted-keys/trusted_tpm2.c     | 266 +++++++++-
 13 files changed, 840 insertions(+), 31 deletions(-)
 create mode 100644 include/linux/asn1_encoder.h
 create mode 100644 lib/asn1_encoder.c
 create mode 100644 security/keys/trusted-keys/tpm2key.asn1
Signature · 1 line
2.26.2
author maintainer
#1 lore raw

PATCH v12 1/5 lib: add ASN.1 encoder

We have a need in the TPM2 trusted keys to return the ASN.1 form of the TPM key blob so it can be operated on by tools outside of the kernel. The specific tools are the openssl_tpm2_engine, openconnect and the Intel tpm2-tss-engine. To do that, we have to be able to read and write the same binary key format the tools use. The current ASN.1 decoder does fine for reading, but we need pieces of an ASN.1 encoder to write the key blob in binary compatible form.

For backwards compatibility, the trusted key reader code will still accept the two TPM2B quantities that it uses today, but the writer will only output the ASN.1 form.

The current implementation only encodes the ASN.1 bits we actually need.

---

v2: updated API to use indefinite length, and made symbol exports gpl
v3: add data length error handling
v4: use end_data instead of data_len pointer
v5: mention tools and space out code
v7: reverse christmas tree variable definitions and better spacing
v9: update comments, remove indefinite length, make encoder config dependent

---
 include/linux/asn1_encoder.h |  32 +++
 lib/Kconfig                  |   3 +
 lib/Makefile                 |   1 +
 lib/asn1_encoder.c           | 454 +++++++++++++++++++++++++++++++++++
 4 files changed, 490 insertions(+)
 create mode 100644 include/linux/asn1_encoder.h
 create mode 100644 lib/asn1_encoder.c
include/linux/asn1_encoder.h new file +32 -0
new file mode 100644
index 000000000000..08cd0c2ad34f
@@ -0,0 +1,32 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef _LINUX_ASN1_ENCODER_H
+#define _LINUX_ASN1_ENCODER_H
+
+#include <linux/types.h>
+#include <linux/asn1.h>
+#include <linux/asn1_ber_bytecode.h>
+#include <linux/bug.h>
+
+#define asn1_oid_len(oid) (sizeof(oid)/sizeof(u32))
+unsigned char *
+asn1_encode_integer(unsigned char *data, const unsigned char *end_data,
+		    s64 integer);
+unsigned char *
+asn1_encode_oid(unsigned char *data, const unsigned char *end_data,
+		u32 oid[], int oid_len);
+unsigned char *
+asn1_encode_tag(unsigned char *data, const unsigned char *end_data,
+		u32 tag, const unsigned char *string, int len);
+unsigned char *
+asn1_encode_octet_string(unsigned char *data,
+			 const unsigned char *end_data,
+			 const unsigned char *string, u32 len);
+unsigned char *
+asn1_encode_sequence(unsigned char *data, const unsigned char *end_data,
+		     const unsigned char *seq, int len);
+unsigned char *
+asn1_encode_boolean(unsigned char *data, const unsigned char *end_data,
+		    bool val);
+
+#endif
lib/Kconfig +3 -0
index b4b98a03ff98..6ac79fe3fe52 100644
@@ -684,3 +684,6 @@ config GENERIC_LIB_UCMPDI2
 config PLDMFW
 	bool
 	default n
+
+config ASN1_ENCODER
+       tristate
lib/Makefile +1 -0
index a4a4c6864f51..3df3998a83d6 100644
@@ -278,6 +278,7 @@ obj-$(CONFIG_INTERVAL_TREE_TEST) += interval_tree_test.o
 obj-$(CONFIG_PERCPU_TEST) += percpu_test.o
 
 obj-$(CONFIG_ASN1) += asn1_decoder.o
+obj-$(CONFIG_ASN1_ENCODER) += asn1_encoder.o
 
 obj-$(CONFIG_FONT_SUPPORT) += fonts/
 
lib/asn1_encoder.c new file +454 -0

454 lines not on this page · raw message

Signature · 1 line
2.26.2
author maintainer
#2 lore raw

PATCH v12 2/5 oid_registry: Add TCG defined OIDS for TPM keys

In reply to James Bottomley

The TCG has defined an OID prefix "2.23.133.10.1" for the various TPM key uses. We've defined three of the available numbers:

2.23.133.10.1.3 TPM Loadable key. This is an asymmetric key (Usually
RSA2048 or Elliptic Curve) which can be imported by a TPM2_Load() operation.

2.23.133.10.1.4 TPM Importable Key. This is an asymmetric key (Usually
RSA2048 or Elliptic Curve) which can be imported by a TPM2_Import() operation.

Both loadable and importable keys are specific to a given TPM, the difference is that a loadable key is wrapped with the symmetric secret, so must have been created by the TPM itself. An importable key is wrapped with a DH shared secret, and may be created without access to the TPM provided you know the public part of the parent key.

2.23.133.10.1.5 TPM Sealed Data. This is a set of data (up to 128
bytes) which is sealed by the TPM. It usually represents a symmetric key and must be unsealed before use.

The ASN.1 binary key form starts of with this OID as the first element of a sequence, giving the binary form a unique recognizable identity marker regardless of encoding.

---

v3: correct OID_TPMImportableKey name
v7: add ack
v9: add review

---
 include/linux/oid_registry.h | 5 +++++
 1 file changed, 5 insertions(+)
include/linux/oid_registry.h +5 -0
index 657d6bf2c064..f6e2276e5f30 100644
@@ -107,6 +107,11 @@ enum OID {
 	OID_gostTC26Sign512B,		/* 1.2.643.7.1.2.1.2.2 */
 	OID_gostTC26Sign512C,		/* 1.2.643.7.1.2.1.2.3 */
 
+	/* TCG defined OIDS for TPM based keys */
+	OID_TPMLoadableKey,		/* 2.23.133.10.1.3 */
+	OID_TPMImportableKey,		/* 2.23.133.10.1.4 */
+	OID_TPMSealedData,		/* 2.23.133.10.1.5 */
+
 	OID__NR
 };
 
Signature · 1 line
2.26.2
author maintainer
#3 lore raw

PATCH v12 3/5 security: keys: trusted: fix TPM2 authorizations

In reply to James Bottomley

In TPM 1.2 an authorization was a 20 byte number. The spec actually recommended you to hash variable length passwords and use the sha1 hash as the authorization. Because the spec doesn't require this hashing, the current authorization for trusted keys is a 40 digit hex number. For TPM 2.0 the spec allows the passing in of variable length passwords and passphrases directly, so we should allow that in trusted keys for ease of use. Update the 'blobauth' parameter to take this into account, so we can now use plain text passwords for the keys.

so before

keyctl add trusted kmk "new 32 blobauthõ72d396fae9206628714fb2ce00f72e94f2258fkeyhandle�000001" @u

after we will accept both the old hex sha1 form as well as a new directly supplied password:

keyctl add trusted kmk "new 32 blobauth=hello keyhandle�000001" @u

Since a sha1 hex code must be exactly 40 bytes long and a direct password must be 20 or less, we use the length as the discriminator for which form is input.

Note this is both and enhancement and a potential bug fix. The TPM 2.0 spec requires us to strip leading zeros, meaning empyty authorization is a zero length HMAC whereas we're currently passing in 20 bytes of zeros. A lot of TPMs simply accept this as OK, but the Microsoft TPM emulator rejects it with TPM_RC_BAD_AUTH, so this patch makes the Microsoft TPM emulator work with trusted keys.

Fixes 0fe5480303a1 ("keys, trusted: seal/unseal with TPM 2.0 chips")

---

v6: change comment, eliminate else clauses and add fixes tag
v7: fixes before signoff
v12: fix mismerge from v6 to make processing continue after blobauth

Merge with auth fix

---
 include/keys/trusted-type.h               |  1 +
 security/keys/trusted-keys/trusted_tpm1.c | 32 ++++++++++++++++++-----
 security/keys/trusted-keys/trusted_tpm2.c | 10 ++++---
 3 files changed, 33 insertions(+), 10 deletions(-)
include/keys/trusted-type.h +1 -0
index a94c03a61d8f..b2ed3481c6a0 100644
@@ -30,6 +30,7 @@ struct trusted_key_options {
 	uint16_t keytype;
 	uint32_t keyhandle;
 	unsigned char keyauth[TPM_DIGEST_SIZE];
+	uint32_t blobauth_len;
 	unsigned char blobauth[TPM_DIGEST_SIZE];
 	uint32_t pcrinfo_len;
 	unsigned char pcrinfo[MAX_PCRINFO_SIZE];
security/keys/trusted-keys/trusted_tpm1.c +26 -6
index b9fe02e5f84f..eaa2e7ca136e 100644
@@ -781,13 +781,33 @@ static int getoptions(char *c, struct trusted_key_payload *pay,
 				return -EINVAL;
 			break;
 		case Opt_blobauth:
-			if (strlen(args[0].from) != 2 * SHA1_DIGEST_SIZE)
-				return -EINVAL;
-			res = hex2bin(opt->blobauth, args[0].from,
-				      SHA1_DIGEST_SIZE);
-			if (res < 0)
-				return -EINVAL;
+			/*
+			 * TPM 1.2 authorizations are sha1 hashes passed in as
+			 * hex strings.  TPM 2.0 authorizations are simple
+			 * passwords (although it can take a hash as well)
+			 */
+			opt->blobauth_len = strlen(args[0].from);
+
+			if (opt->blobauth_len = 2 * TPM_DIGEST_SIZE) {
+				res = hex2bin(opt->blobauth, args[0].from,
+					      TPM_DIGEST_SIZE);
+				if (res < 0)
+					return -EINVAL;
+
+				opt->blobauth_len = TPM_DIGEST_SIZE;
+				break;
+			}
+
+			if (tpm2 && opt->blobauth_len <= sizeof(opt->blobauth)) {
+				memcpy(opt->blobauth, args[0].from,
+				       opt->blobauth_len);
+				break;
+			}
+
+			return -EINVAL;
+
 			break;
+
 		case Opt_migratable:
 			if (*args[0].from = '0')
 				pay->migratable = 0;
security/keys/trusted-keys/trusted_tpm2.c +6 -4
index 08ec7f48f01d..b4a5058107c2 100644
@@ -91,10 +91,12 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
 			     TPM_DIGEST_SIZE);
 
 	/* sensitive */
-	tpm_buf_append_u16(&buf, 4 + TPM_DIGEST_SIZE + payload->key_len + 1);
+	tpm_buf_append_u16(&buf, 4 + options->blobauth_len + payload->key_len + 1);
+
+	tpm_buf_append_u16(&buf, options->blobauth_len);
+	if (options->blobauth_len)
+		tpm_buf_append(&buf, options->blobauth, options->blobauth_len);
 
-	tpm_buf_append_u16(&buf, TPM_DIGEST_SIZE);
-	tpm_buf_append(&buf, options->blobauth, TPM_DIGEST_SIZE);
 	tpm_buf_append_u16(&buf, payload->key_len + 1);
 	tpm_buf_append(&buf, payload->key, payload->key_len);
 	tpm_buf_append_u8(&buf, payload->migratable);
@@ -258,7 +260,7 @@ static int tpm2_unseal_cmd(struct tpm_chip *chip,
 			     NULL /* nonce */, 0,
 			     TPM2_SA_CONTINUE_SESSION,
 			     options->blobauth /* hmac */,
-			     TPM_DIGEST_SIZE);
+			     options->blobauth_len);
 
 	rc = tpm_send(chip, buf.data, tpm_buf_length(&buf));
 	if (rc > 0)
Signature · 1 line
2.26.2
author maintainer
#4 lore raw

PATCH v12 4/5 security: keys: trusted: use ASN.1 TPM2 key format for the blobs

In reply to James Bottomley

Modify the TPM2 key format blob output to export and import in the ASN.1 form for TPM2 sealed object keys. For compatibility with prior trusted keys, the importer will also accept two TPM2B quantities representing the public and private parts of the key. However, the export via keyctl pipe will only output the ASN.1 format.

The benefit of the ASN.1 format is that it's a standard and thus the exported key can be used by userspace tools (openssl_tpm2_engine, openconnect and tpm2-tss-engine). The format includes policy specifications, thus it gets us out of having to construct policy handles in userspace and the format includes the parent meaning you don't have to keep passing it in each time.

This patch only implements basic handling for the ASN.1 format, so keys with passwords but no policy.

---
v2: Updated encode API, added length checks
v5: correct export format after doing interoperability checks
v7: use prefix tpm2_key_ instead of tpmkey_ for functions
v8: resplit commit
v9: select ASN1_ENCODER
v11: add ASN.1 format description

---
 .../security/keys/trusted-encrypted.rst       |  58 +++++
 include/keys/trusted-type.h                   |   1 +
 security/keys/Kconfig                         |   1 +
 security/keys/trusted-keys/Makefile           |   2 +-
 security/keys/trusted-keys/tpm2key.asn1       |  11 +
 security/keys/trusted-keys/trusted_tpm1.c     |   2 +-
 security/keys/trusted-keys/trusted_tpm2.c     | 207 +++++++++++++++++-
 7 files changed, 274 insertions(+), 8 deletions(-)
 create mode 100644 security/keys/trusted-keys/tpm2key.asn1
Documentation/security/keys/trusted-encrypted.rst +58 -0
index 9483a7425ad5..eb639bb24fcc 100644
@@ -208,3 +208,61 @@ about the usage can be found in the file
 Another new format 'enc32' has been defined in order to support encrypted keys
 with payload size of 32 bytes. This will initially be used for nvdimm security
 but may expand to other usages that require 32 bytes payload.
+
+
+TPM 2.0 ASN.1 Key Format
+------------------------
+
+The TPM 2.0 ASN.1 key format is designed to be easily recognisable,
+even in binary form (fixing a problem we had with the TPM 1.2 ASN.1
+format) and to be extensible for additions like importable keys and
+policy::
+
+    TPMKey ::= SEQUENCE {
+        type		OBJECT IDENTIFIER
+        emptyAuth	[0] EXPLICIT BOOLEAN OPTIONAL
+        parent		INTEGER
+        pubkey		OCTET STRING
+        privkey		OCTET STRING
+    }
+
+type is what distinguishes the key even in binary form since the OID
+is provided by the TCG to be unique and thus forms a recognizable
+binary pattern at offset 3 in the key.  The OIDs currently made
+available are::
+
+    2.23.133.10.1.3 TPM Loadable key.  This is an asymmetric key (Usually
+                    RSA2048 or Elliptic Curve) which can be imported by a
+                    TPM2_Load() operation.
+
+    2.23.133.10.1.4 TPM Importable Key.  This is an asymmetric key (Usually
+                    RSA2048 or Elliptic Curve) which can be imported by a
+                    TPM2_Import() operation.
+
+    2.23.133.10.1.5 TPM Sealed Data.  This is a set of data (up to 128
+                    bytes) which is sealed by the TPM.  It usually
+                    represents a symmetric key and must be unsealed before
+                    use.
+
+The trusted key code only uses the TPM Sealed Data OID.
+
+emptyAuth is true if the key has well known authorization "".  If it
+is false or not present, the key requires an explicit authorization
+phrase.  This is used by most user space consumers to decide whether
+to prompt for a password.
+
+parent represents the parent key handle, either in the 0x81 MSO space,
+like 0x81000001 for the RSA primary storage key.  Userspace programmes
+also support specifying the primary handle in the 0x40 MSO space.  If
+this happens the Elliptic Curve variant of the primary key using the
+TCG defined template will be generated on the fly into a volatile
+object and used as the parent.  The current kernel code only supports
+the 0x81 MSO form.
+
+pubkey is the binary representation of TPM2B_PRIVATE excluding the
+initial TPM2B header, which can be reconstructed from the ASN.1 octet
+string length.
+
+privkey is the binary representation of TPM2B_PUBLIC excluding the
+initial TPM2B header which can be reconstructed from the ASN.1 octed
+string length.
include/keys/trusted-type.h +1 -0
index b2ed3481c6a0..b2d87ad21714 100644
@@ -22,6 +22,7 @@ struct trusted_key_payload {
 	unsigned int key_len;
 	unsigned int blob_len;
 	unsigned char migratable;
+	unsigned char old_format;
 	unsigned char key[MAX_KEY_SIZE + 1];
 	unsigned char blob[MAX_BLOB_SIZE];
 };
security/keys/Kconfig +1 -0
index 83bc23409164..8fbfedf6d1cc 100644
@@ -75,6 +75,7 @@ config TRUSTED_KEYS
 	select CRYPTO_HMAC
 	select CRYPTO_SHA1
 	select CRYPTO_HASH_INFO
+	select ASN1_ENCODER
 	help
 	  This option provides support for creating, sealing, and unsealing
 	  keys in the kernel. Trusted keys are random number symmetric keys,
security/keys/trusted-keys/Makefile +1 -1
index 7b73cebbb378..e0198641eff2 100644
@@ -5,4 +5,4 @@
 
 obj-$(CONFIG_TRUSTED_KEYS) += trusted.o
 trusted-y += trusted_tpm1.o
-trusted-y += trusted_tpm2.o
+trusted-y += trusted_tpm2.o tpm2key.asn1.o
security/keys/trusted-keys/tpm2key.asn1 new file +11 -0
new file mode 100644
index 000000000000..3f6a9d01d1e5
@@ -0,0 +1,11 @@
+---
+--- ASN.1 for for TPM 2.0 keys
+---
+
+TPMKey ::= SEQUENCE {
+	type		OBJECT IDENTIFIER ({tpm2_key_type}),
+	emptyAuth	[0] EXPLICIT BOOLEAN OPTIONAL,
+	parent		INTEGER ({tpm2_key_parent}),
+	pubkey		OCTET STRING ({tpm2_key_pub}),
+	privkey		OCTET STRING ({tpm2_key_priv})
+	}
security/keys/trusted-keys/trusted_tpm1.c +1 -1
index eaa2e7ca136e..f235637865b9 100644
@@ -1011,7 +1011,7 @@ static int trusted_instantiate(struct key *key,
 		goto out;
 	}
 
-	if (!options->keyhandle) {
+	if (!options->keyhandle && !tpm2) {
 		ret = -EINVAL;
 		goto out;
 	}
security/keys/trusted-keys/trusted_tpm2.c +200 -6

264 lines not on this page · raw message

Signature · 1 line
2.26.2
#5 lore raw

Re: [PATCH v12 4/5] security: keys: trusted: use ASN.1 TPM2 key format for the blobs

I love your patch! Yet something to improve:

Hi James,

I love your patch! Yet something to improve:

[auto build test ERROR on integrity/next-integrity]
[also build test ERROR on linus/master v5.9-rc5 next-20200918] [cannot apply to security/next-testing dhowells-fs/fscache-next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/James-Bottomley/TPM-2-0-trusted-key-rework/20200921-003922
base:   https://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git next-integrity
config: nios2-randconfig-r011-20200920 (attached as .config)
compiler: nios2-linux-gcc (GCC) 9.3.0

reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=nios2

If you fix the issue, kindly add following tag as appropriate

All errors (new ones prefixed by >>):

>> security/keys/trusted-keys/trusted_tpm2.c:19:10: fatal error: tpm2key.asn1.h: No such file or directory
      19 | #include "tpm2key.asn1.h"
         |          ^~~~~~~~~~~~~~~~

compilation terminated.

# https://github.com/0day-ci/linux/commit/9efe9767c322f5597da46bb83fd31d504f51037e
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review James-Bottomley/TPM-2-0-trusted-key-rework/20200921-003922 git checkout 9efe9767c322f5597da46bb83fd31d504f51037e
vim +19 security/keys/trusted-keys/trusted_tpm2.c

    18	
  > 19	#include "tpm2key.asn1.h"
    20	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

#6 lore raw

Re: [PATCH v12 4/5] security: keys: trusted: use ASN.1 TPM2 key format for the blobs

In reply to James Bottomley
I love your patch! Yet something to improve:

Hi James,

I love your patch! Yet something to improve:

[auto build test ERROR on integrity/next-integrity]
[also build test ERROR on linus/master v5.9-rc5 next-20200918] [cannot apply to security/next-testing dhowells-fs/fscache-next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/James-Bottomley/TPM-2-0-trusted-key-rework/20200921-003922
base:   https://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git next-integrity
config: x86_64-randconfig-a003-20200921 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project f4e554180962aa6bc93678898b6933ea712bde50)

reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build
# apt-get install binutils-x86-64-linux-gnu
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64

If you fix the issue, kindly add following tag as appropriate

All errors (new ones prefixed by >>):

>> make[4]: *** No rule to make target 'security/keys/trusted-keys/tpm2key.asn1.o', needed by 'security/keys/trusted-keys/built-in.a'.

make[4]: *** [scripts/Makefile.build:283: security/keys/trusted-keys/trusted_tpm2.o] Error 1 make[4]: Target '__build' not remade because of errors.

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]

author maintainer
#7 lore raw

Re: [PATCH v12 4/5] security: keys: trusted: use ASN.1 TPM2 key format for the blobs

Quoted 33 lines · kernel test robot

Hi James,

I love your patch! Yet something to improve:

[auto build test ERROR on integrity/next-integrity] [also build test ERROR on linus/master v5.9-rc5 next-20200918] [cannot apply to security/next-testing dhowells-fs/fscache-next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch]

url:
https://github.com/0day-ci/linux/commits/James-Bottomley/TPM-2-0-trusted-key-rework/20200921-003922
base:
https://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git
next-integrity
config: x86_64-randconfig-a003-20200921 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project
f4e554180962aa6bc93678898b6933ea712bde50)
reproduce (this is a W=1 build):
wget
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross
-O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build # apt-get install binutils-x86-64-linux-gnu
# save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross
ARCH=x86_64

If you fix the issue, kindly add following tag as appropriate

Quoted 8 lines

All errors (new ones prefixed by >>):

Quoted 3 lines
Quoted 3 lines

make[4]: *** No rule to make target 'security/keys/trusted- keys/tpm2key.asn1.o', needed by 'security/keys/trusted- keys/built-in.a'.

make[4]: *** [scripts/Makefile.build:283: security/keys/trusted-
keys/trusted_tpm2.o] Error 1
make[4]: Target '__build' not remade because of errors.

So can I still add that tracking this down involved installing an entirely unnecessary ARM build environment, which was a huge effort I didn't need to do if you'd just provided the build log which fingered the ASN.1 compiler problem if you know what to look for.

The reason for the problem is because ASN1 isn't selected in the Kconfig which causes the ASN.1 compiler not to be built. The way our current build rules are structured causes the make rule for this simply to be skipped, which means you have to know to look for the absence of ASN.1 in the build log. I propose adding this to the build rules, which produces the much more explicit:

/home/jejb/git/linux-build/scripts/Makefile.build:387: *** CONFIG_ASN1 must be defined for the asn1_compiler. Stop. make[3]: *** [/home/jejb/git/linux-build/scripts/Makefile.build:505: security/keys/trusted-keys] Error 2

James

---

scripts/Makefile.build +5 -0
index a467b9323442..bca7003beac8 100644
@@ -382,6 +382,11 @@ quiet_cmd_asn1_compiler = ASN.1   $(basename $@).[ch]
       cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \
 				$(basename $@).c $(basename $@).h
 
+ifndef CONFIG_ASN1
+$(objtree)/scripts/asn1_compiler:
+	$(error CONFIG_ASN1 must be defined for the asn1_compiler)
+endif
+
 $(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
 	$(call cmd,asn1_compiler)
 
#8 lore raw

Re: [PATCH v12 4/5] security: keys: trusted: use ASN.1 TPM2 key format for the blobs

Quoted 45 lines · James Bottomley
Quoted 33 lines · kernel test robot

Hi James,

I love your patch! Yet something to improve:

[auto build test ERROR on integrity/next-integrity] [also build test ERROR on linus/master v5.9-rc5 next-20200918] [cannot apply to security/next-testing dhowells-fs/fscache-next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch]

url:
https://github.com/0day-ci/linux/commits/James-Bottomley/TPM-2-0-trusted-key-rework/20200921-003922
base:
https://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git
next-integrity
config: x86_64-randconfig-a003-20200921 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project
f4e554180962aa6bc93678898b6933ea712bde50)
reproduce (this is a W=1 build):
wget
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross
-O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build # apt-get install binutils-x86-64-linux-gnu
# save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross
ARCH=x86_64

If you fix the issue, kindly add following tag as appropriate

Quoted 8 lines

All errors (new ones prefixed by >>):

Quoted 3 lines
Quoted 3 lines

make[4]: *** No rule to make target 'security/keys/trusted- keys/tpm2key.asn1.o', needed by 'security/keys/trusted- keys/built-in.a'.

make[4]: *** [scripts/Makefile.build:283: security/keys/trusted-
keys/trusted_tpm2.o] Error 1
make[4]: Target '__build' not remade because of errors.

Quoted 4 lines

So can I still add that tracking this down involved installing an entirely unnecessary ARM build environment, which was a huge effort I didn't need to do if you'd just provided the build log which fingered the ASN.1 compiler problem if you know what to look for.

Having a link to the build log artifact is a valid criticism.

Quoted 20 lines

The reason for the problem is because ASN1 isn't selected in the Kconfig which causes the ASN.1 compiler not to be built. The way our current build rules are structured causes the make rule for this simply to be skipped, which means you have to know to look for the absence of ASN.1 in the build log. I propose adding this to the build rules, which produces the much more explicit:

/home/jejb/git/linux-build/scripts/Makefile.build:387: *** CONFIG_ASN1 must be defined for the asn1_compiler. Stop. make[3]: *** [/home/jejb/git/linux-build/scripts/Makefile.build:505: security/keys/trusted-keys] Error 2

James

---

scripts/Makefile.build +0 -0
index a467b9323442..bca7003beac8 100644

scripts/Makefile.build quiet_cmd_asn1_compiler = ASN.1 $(basename $@).[ch] · line 391

Quoted 10 lines
scripts/Makefile.build +5 -0
@@ -382,6 +382,11 @@ quiet_cmd_asn1_compiler = ASN.1   $(basename $@).[ch]
       cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \
                                $(basename $@).c $(basename $@).h
 
+ifndef CONFIG_ASN1
+$(objtree)/scripts/asn1_compiler:
+       $(error CONFIG_ASN1 must be defined for the asn1_compiler)
+endif
+
 $(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
        $(call cmd,asn1_compiler)

Is there a better way via Kconfig to gate whatever consumes CONFIG_ASN1 on CONFIG_ASN1 being set, rather than erroring for randconfig builds? I don't see how the diff would solve the case of CI systems doing randconfig builds.

Signature · 2 lines
Thanks,
~Nick Desaulniers
author maintainer
#9 lore raw

Re: [PATCH v12 4/5] security: keys: trusted: use ASN.1 TPM2 key format for the blobs

Quoted 48 lines · Nick Desaulniers
Quoted 46 lines · James Bottomley
Quoted 44 lines · kernel test robot

Hi James,

I love your patch! Yet something to improve:

[auto build test ERROR on integrity/next-integrity] [also build test ERROR on linus/master v5.9-rc5 next-20200918] [cannot apply to security/next-testing dhowells-fs/fscache-next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch]

url:
https://github.com/0day-ci/linux/commits/James-Bottomley/TPM-2-0-trusted-key-rework/20200921-003922
base:
https://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git
next-integrity
config: x86_64-randconfig-a003-20200921 (attached as .config)
compiler: clang version 12.0.0 (
https://github.com/llvm/llvm-project
f4e554180962aa6bc93678898b6933ea712bde50)
reproduce (this is a W=1 build):
wget
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross
-O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build # apt-get install binutils-x86-64-linux-gnu # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang
make.cross
ARCH=x86_64

If you fix the issue, kindly add following tag as appropriate

All errors (new ones prefixed by >>):

Quoted 3 lines
Quoted 3 lines

make[4]: *** No rule to make target 'security/keys/trusted- keys/tpm2key.asn1.o', needed by 'security/keys/trusted- keys/built-in.a'.

make[4]: *** [scripts/Makefile.build:283:
security/keys/trusted-
keys/trusted_tpm2.o] Error 1
make[4]: Target '__build' not remade because of errors.

Quoted 6 lines
Quoted 4 lines

So can I still add that tracking this down involved installing an entirely unnecessary ARM build environment, which was a huge effort I didn't need to do if you'd just provided the build log which fingered the ASN.1 compiler problem if you know what to look for.

Having a link to the build log artifact is a valid criticism.

Heh, I'm just annoyed because when I finally got the ARM environment installed and the problem replicated, I realised it could be reproduced with an x86 build ... just one that would never be useful in practice.

Quoted 26 lines
Quoted 26 lines

The reason for the problem is because ASN1 isn't selected in the Kconfig which causes the ASN.1 compiler not to be built. The way our current build rules are structured causes the make rule for this simply to be skipped, which means you have to know to look for the absence of ASN.1 in the build log. I propose adding this to the build rules, which produces the much more explicit:

/home/jejb/git/linux-build/scripts/Makefile.build:387: *** CONFIG_ASN1 must be defined for the asn1_compiler. Stop. make[3]: *** [/home/jejb/git/linux- build/scripts/Makefile.build:505: security/keys/trusted-keys] Error 2

James

---

scripts/Makefile.build +0 -0
index a467b9323442..bca7003beac8 100644
@@ -382,6 +382,11 @@ quiet_cmd_asn1_compiler = ASN.1   $(basename

$@).[ch]

       cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \
                                $(basename $@).c $(basename $@).h
Quoted 13 lines
Quoted 8 lines
scripts/Makefile.build +5 -0
+ifndef CONFIG_ASN1
+$(objtree)/scripts/asn1_compiler:
+       $(error CONFIG_ASN1 must be defined for the asn1_compiler)
+endif
+
 $(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1

$(objtree)/scripts/asn1_compiler

        $(call cmd,asn1_compiler)

Is there a better way via Kconfig to gate whatever consumes CONFIG_ASN1 on CONFIG_ASN1 being set, rather than erroring for randconfig builds? I don't see how the diff would solve the case of CI systems doing randconfig builds.

Well, no there's an actual bug: all consumers of asn1_compile need a select ASN1. This was missing from the v12 patch and is now included in the v13 one. This Makefile.build patch here was just to make the problem explicit in the 0day logs if it ever occurs again.

The reason it only showed up on arm32 is that pretty much only an embedded kernel is cut down enough to create a randconfig that doesn't pull in CRYPTO_RSA, which also selects ASN1 and hides the problem.

James

#10 lore raw

Re: [PATCH v12 4/5] security: keys: trusted: use ASN.1 TPM2 key format for the blobs

Quoted 54 lines · James Bottomley
Quoted 53 lines · Nick Desaulniers
Quoted 50 lines · James Bottomley
Quoted 37 lines · kernel test robot

Hi James,

I love your patch! Yet something to improve:

[auto build test ERROR on integrity/next-integrity] [also build test ERROR on linus/master v5.9-rc5 next-20200918] [cannot apply to security/next-testing dhowells-fs/fscache-next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch]

url:
https://github.com/0day-ci/linux/commits/James-Bottomley/TPM-2-0-trusted-key-rework/20200921-003922
base:
https://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git
next-integrity
config: x86_64-randconfig-a003-20200921 (attached as .config)
compiler: clang version 12.0.0 (
https://github.com/llvm/llvm-project
f4e554180962aa6bc93678898b6933ea712bde50)
reproduce (this is a W=1 build):
wget
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross
-O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build # apt-get install binutils-x86-64-linux-gnu # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang
make.cross
ARCH=x86_64

If you fix the issue, kindly add following tag as appropriate

All errors (new ones prefixed by >>):

Quoted 7 lines
Quoted 3 lines
Quoted 3 lines

make[4]: *** No rule to make target 'security/keys/trusted- keys/tpm2key.asn1.o', needed by 'security/keys/trusted- keys/built-in.a'.

make[4]: *** [scripts/Makefile.build:283:
security/keys/trusted-
keys/trusted_tpm2.o] Error 1
make[4]: Target '__build' not remade because of errors.

So can I still add that tracking this down involved installing an entirely unnecessary ARM build environment, which was a huge effort I didn't need to do if you'd just provided the build log which fingered the ASN.1 compiler problem if you know what to look for.

Quoted 5 lines
Quoted 1 line

Having a link to the build log artifact is a valid criticism.

Heh, I'm just annoyed because when I finally got the ARM environment installed and the problem replicated, I realised it could be reproduced with an x86 build ... just one that would never be useful in practice.

Hi James, sorry for the inconvenience, we will consider to add build log in near future.

Quoted 53 lines
Quoted 27 lines
Quoted 27 lines

The reason for the problem is because ASN1 isn't selected in the Kconfig which causes the ASN.1 compiler not to be built. The way our current build rules are structured causes the make rule for this simply to be skipped, which means you have to know to look for the absence of ASN.1 in the build log. I propose adding this to the build rules, which produces the much more explicit:

/home/jejb/git/linux-build/scripts/Makefile.build:387: *** CONFIG_ASN1 must be defined for the asn1_compiler. Stop. make[3]: *** [/home/jejb/git/linux- build/scripts/Makefile.build:505: security/keys/trusted-keys] Error 2

James

---

scripts/Makefile.build +0 -0
index a467b9323442..bca7003beac8 100644
@@ -382,6 +382,11 @@ quiet_cmd_asn1_compiler = ASN.1   $(basename

$@).[ch]

       cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \
                                $(basename $@).c $(basename $@).h
Quoted 13 lines
Quoted 8 lines
scripts/Makefile.build +5 -0
+ifndef CONFIG_ASN1
+$(objtree)/scripts/asn1_compiler:
+       $(error CONFIG_ASN1 must be defined for the asn1_compiler)
+endif
+
 $(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1

$(objtree)/scripts/asn1_compiler

        $(call cmd,asn1_compiler)

Is there a better way via Kconfig to gate whatever consumes CONFIG_ASN1 on CONFIG_ASN1 being set, rather than erroring for randconfig builds? I don't see how the diff would solve the case of CI systems doing randconfig builds.

Well, no there's an actual bug: all consumers of asn1_compile need a select ASN1. This was missing from the v12 patch and is now included in the v13 one. This Makefile.build patch here was just to make the problem explicit in the 0day logs if it ever occurs again.

The reason it only showed up on arm32 is that pretty much only an embedded kernel is cut down enough to create a randconfig that doesn't pull in CRYPTO_RSA, which also selects ASN1 and hides the problem.

James

#11 lore raw

Re: [PATCH v12 4/5] security: keys: trusted: use ASN.1 TPM2 key format for the blobs

In reply to James Bottomley
I love your patch! Yet something to improve:

Hi James,

I love your patch! Yet something to improve:

[auto build test ERROR on integrity/next-integrity]
[also build test ERROR on linus/master]
[cannot apply to security/next-testing dhowells-fs/fscache-next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/James-Bottomley/TPM-2-0-trusted-key-rework/20200921-003922
base:   https://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git next-integrity
config: nds32-randconfig-c004-20200920 (attached as .config)
compiler: nds32le-linux-gcc (GCC) 9.3.0

reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=nds32

If you fix the issue, kindly add following tag as appropriate

All errors (new ones prefixed by >>):

nds32le-linux-ld: security/keys/trusted-keys/trusted_tpm2.o: in function `tpm2_key_type':

>> trusted_tpm2.c:(.text+0x1aa): undefined reference to `look_up_OID'
>> nds32le-linux-ld: trusted_tpm2.c:(.text+0x1ae): undefined reference to `look_up_OID'
>> nds32le-linux-ld: trusted_tpm2.c:(.text+0x1cc): undefined reference to `sprint_oid'

nds32le-linux-ld: trusted_tpm2.c:(.text+0x1d0): undefined reference to `sprint_oid'

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

author maintainer
#12 lore raw

PATCH v12 5/5 security: keys: trusted: Make sealed key properly interoperable

In reply to James Bottomley

The current implementation appends a migratable flag to the end of a key, meaning the format isn't exactly interoperable because the using party needs to know to strip this extra byte. However, all other consumers of TPM sealed blobs expect the unseal to return exactly the key. Since TPM2 keys have a key property flag that corresponds to migratable, use that flag instead and make the actual key the only sealed quantity. This is secure because the key properties are bound to a hash in the private part, so if they're altered the key won't load.

Backwards compatibility is implemented by detecting whether we're loading a new format key or not and correctly setting migratable from the last byte of old format keys.

---

v2: added length checks to untrusted payload
v8: recover patch

---
 include/linux/tpm.h                       |  2 +
 security/keys/trusted-keys/trusted_tpm2.c | 53 ++++++++++++++++-------
 2 files changed, 40 insertions(+), 15 deletions(-)
include/linux/tpm.h +2 -0
index ae2482510f8c..35224860fd0c 100644
@@ -305,6 +305,8 @@ struct tpm_buf {
 };
 
 enum tpm2_object_attributes {
+	TPM2_OA_FIXED_TPM		= BIT(1),
+	TPM2_OA_FIXED_PARENT		= BIT(4),
 	TPM2_OA_USER_WITH_AUTH		= BIT(6),
 };
 
security/keys/trusted-keys/trusted_tpm2.c +38 -15

105 lines not on this page · raw message

Signature · 1 line
2.26.2