TPM 2.0 trusted key rework
Subsystems (8)
James Bottomley
maintainerv12 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
James Bottomley
maintainerPATCH 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
@@ -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
@@ -684,3 +684,6 @@ config GENERIC_LIB_UCMPDI2 config PLDMFW bool default n + +config ASN1_ENCODER + tristate
lib/Makefile +1 -0
@@ -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
James Bottomley
maintainerPATCH v12 2/5 oid_registry: Add TCG defined OIDS for TPM keys
In reply to James BottomleyThe 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
@@ -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
James Bottomley
maintainerPATCH v12 3/5 security: keys: trusted: fix TPM2 authorizations
In reply to James BottomleyIn 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.
---
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
@@ -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
@@ -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
@@ -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
James Bottomley
maintainerPATCH v12 4/5 security: keys: trusted: use ASN.1 TPM2 key format for the blobs
In reply to James BottomleyModify 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
kernel test robot
build botRe: [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
kernel test robot
build botRe: [PATCH v12 4/5] security: keys: trusted: use ASN.1 TPM2 key format for the blobs
In reply to James BottomleyI 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]
James Bottomley
maintainerRe: [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-testingdhowells-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-projectf4e554180962aa6bc93678898b6933ea712bde50)
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
# installx86_64cross 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_64If you fix the issue, kindly add following tag as appropriate
Reported-by kernel test robot <[email protected]>
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
@@ -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)
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-testingdhowells-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-projectf4e554180962aa6bc93678898b6933ea712bde50)
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
# installx86_64cross 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_64If you fix the issue, kindly add following tag as appropriate
Reported-by kernel test robot <[email protected]>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
Kconfigwhich 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_ASN1must be defined for theasn1_compiler. Stop. make[3]: *** [/home/jejb/git/linux-build/scripts/Makefile.build:505:security/keys/trusted-keys] Error 2James
---
scripts/Makefile.build +0
-0
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
James Bottomley
maintainerRe: [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-testingdhowells-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-projectf4e554180962aa6bc93678898b6933ea712bde50)
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
# installx86_64cross 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_64If you fix the issue, kindly add following tag as appropriate
Reported-by kernel test robot <[email protected]>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
Kconfigwhich 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_ASN1must be defined for theasn1_compiler. Stop. make[3]: *** [/home/jejb/git/linux-build/scripts/Makefile.build:505:security/keys/trusted-keys] Error 2James
---
scripts/Makefile.build +0
-0@@ -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
Kconfigto gate whatever consumesCONFIG_ASN1onCONFIG_ASN1being 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
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-testingdhowells-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-projectf4e554180962aa6bc93678898b6933ea712bde50)
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
# installx86_64cross 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_64If you fix the issue, kindly add following tag as appropriate
Reported-by kernel test robot <[email protected]>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
Kconfigwhich 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_ASN1must be defined for theasn1_compiler. Stop. make[3]: *** [/home/jejb/git/linux-build/scripts/Makefile.build:505:security/keys/trusted-keys] Error 2James
---
scripts/Makefile.build +0
-0@@ -382,6 +382,11 @@ quiet_cmd_asn1_compiler = ASN.1 $(basename$@).[ch]
cmd_asn1_compiler = $(objtree)/scripts/asn1_compiler $< \ $(basename $@).c $(basename $@).hQuoted 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
Kconfigto gate whatever consumesCONFIG_ASN1onCONFIG_ASN1being 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_compileneed 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
kernel test robot
build botRe: [PATCH v12 4/5] security: keys: trusted: use ASN.1 TPM2 key format for the blobs
In reply to James BottomleyI 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
James Bottomley
maintainerPATCH v12 5/5 security: keys: trusted: Make sealed key properly interoperable
In reply to James BottomleyThe 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
@@ -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