From: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
To: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: linux-integrity@vger.kernel.org, Mimi Zohar <zohar@linux.ibm.com>,
David Woodhouse <dwmw2@infradead.org>,
keyrings@vger.kernel.org
Subject: Re: [PATCH v6 1/6] lib: add ASN.1 encoder
Date: Tue, 03 Mar 2020 19:22:08 +0000 [thread overview]
Message-ID: <20200303192208.GA5775@linux.intel.com> (raw)
In-Reply-To: <20200302122759.5204-2-James.Bottomley@HansenPartnership.com>
On Mon, Mar 02, 2020 at 07:27:54AM -0500, James Bottomley wrote:
> 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.
>
> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
>
> ---
>
> 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
> ---
> include/linux/asn1_encoder.h | 32 ++++
> lib/Makefile | 2 +-
> lib/asn1_encoder.c | 431 +++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 464 insertions(+), 1 deletion(-)
> create mode 100644 include/linux/asn1_encoder.h
> create mode 100644 lib/asn1_encoder.c
>
> diff --git a/include/linux/asn1_encoder.h b/include/linux/asn1_encoder.h
> new file mode 100644
> index 000000000000..08cd0c2ad34f
> --- /dev/null
> +++ b/include/linux/asn1_encoder.h
> @@ -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
> diff --git a/lib/Makefile b/lib/Makefile
> index 611872c06926..1a9169ef2bed 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -237,7 +237,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) += asn1_decoder.o asn1_encoder.o
>
> obj-$(CONFIG_FONT_SUPPORT) += fonts/
>
> diff --git a/lib/asn1_encoder.c b/lib/asn1_encoder.c
> new file mode 100644
> index 000000000000..c7493667656e
> --- /dev/null
> +++ b/lib/asn1_encoder.c
> @@ -0,0 +1,431 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Simple encoder primitives for ASN.1 BER/DER/CER
> + *
> + * Copyright (C) 2019 James.Bottomley@HansenPartnership.com
> + */
> +
> +#include <linux/asn1_encoder.h>
> +#include <linux/bug.h>
> +#include <linux/string.h>
> +#include <linux/module.h>
> +
> +/**
> + * asn1_encode_integer() - encode positive integer to ASN.1
> + * @data: pointer to the pointer to the data
> + * @end_data: end of data pointer, points one beyond last usable byte in @data
> + * @integer: integer to be encoded
> + *
> + * This is a simplified encoder: it only currently does
> + * positive integers, but it should be simple enough to add the
> + * negative case if a use comes along.
> + */
> +unsigned char *
> +asn1_encode_integer(unsigned char *data, const unsigned char *end_data,
> + s64 integer)
> +{
> + unsigned char *d = &data[2];
So what magic does index 2 contain?
> + int i;
> + bool found = false;
> + int data_len = end_data - data;
I'd reorder these:
int data_len = end_data - data;
unsigned char *d = &data[2];
bool found = false;
int i;
Reordering makes easier to comprehend the declarations.
> +
> + if (WARN(integer < 0,
> + "BUG: integer encode only supports positive integers"))
> + return ERR_PTR(-EINVAL);
> +
> + if (IS_ERR(data))
> + return data;
> +
> + /* need at least 3 bytes for tag, length and integer encoding */
> + if (data_len < 3)
> + return ERR_PTR(-EINVAL);
> +
> + /* remaining length where at d (the start of the integer encoding) */
> + data_len -= 2;
> +
> + data[0] = _tag(UNIV, PRIM, INT);
> + if (integer = 0) {
> + *d++ = 0;
> + goto out;
> + }
> +
> + for (i = sizeof(integer); i > 0 ; i--) {
> + int byte = integer >> (8*(i-1));
Spacing (according to the kernel coding style) is wrong here.
/Jarkko
WARNING: multiple messages have this Message-ID (diff)
From: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
To: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: linux-integrity@vger.kernel.org, Mimi Zohar <zohar@linux.ibm.com>,
David Woodhouse <dwmw2@infradead.org>,
keyrings@vger.kernel.org
Subject: Re: [PATCH v6 1/6] lib: add ASN.1 encoder
Date: Tue, 3 Mar 2020 21:22:08 +0200 [thread overview]
Message-ID: <20200303192208.GA5775@linux.intel.com> (raw)
In-Reply-To: <20200302122759.5204-2-James.Bottomley@HansenPartnership.com>
On Mon, Mar 02, 2020 at 07:27:54AM -0500, James Bottomley wrote:
> 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.
>
> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
>
> ---
>
> 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
> ---
> include/linux/asn1_encoder.h | 32 ++++
> lib/Makefile | 2 +-
> lib/asn1_encoder.c | 431 +++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 464 insertions(+), 1 deletion(-)
> create mode 100644 include/linux/asn1_encoder.h
> create mode 100644 lib/asn1_encoder.c
>
> diff --git a/include/linux/asn1_encoder.h b/include/linux/asn1_encoder.h
> new file mode 100644
> index 000000000000..08cd0c2ad34f
> --- /dev/null
> +++ b/include/linux/asn1_encoder.h
> @@ -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
> diff --git a/lib/Makefile b/lib/Makefile
> index 611872c06926..1a9169ef2bed 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -237,7 +237,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) += asn1_decoder.o asn1_encoder.o
>
> obj-$(CONFIG_FONT_SUPPORT) += fonts/
>
> diff --git a/lib/asn1_encoder.c b/lib/asn1_encoder.c
> new file mode 100644
> index 000000000000..c7493667656e
> --- /dev/null
> +++ b/lib/asn1_encoder.c
> @@ -0,0 +1,431 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Simple encoder primitives for ASN.1 BER/DER/CER
> + *
> + * Copyright (C) 2019 James.Bottomley@HansenPartnership.com
> + */
> +
> +#include <linux/asn1_encoder.h>
> +#include <linux/bug.h>
> +#include <linux/string.h>
> +#include <linux/module.h>
> +
> +/**
> + * asn1_encode_integer() - encode positive integer to ASN.1
> + * @data: pointer to the pointer to the data
> + * @end_data: end of data pointer, points one beyond last usable byte in @data
> + * @integer: integer to be encoded
> + *
> + * This is a simplified encoder: it only currently does
> + * positive integers, but it should be simple enough to add the
> + * negative case if a use comes along.
> + */
> +unsigned char *
> +asn1_encode_integer(unsigned char *data, const unsigned char *end_data,
> + s64 integer)
> +{
> + unsigned char *d = &data[2];
So what magic does index 2 contain?
> + int i;
> + bool found = false;
> + int data_len = end_data - data;
I'd reorder these:
int data_len = end_data - data;
unsigned char *d = &data[2];
bool found = false;
int i;
Reordering makes easier to comprehend the declarations.
> +
> + if (WARN(integer < 0,
> + "BUG: integer encode only supports positive integers"))
> + return ERR_PTR(-EINVAL);
> +
> + if (IS_ERR(data))
> + return data;
> +
> + /* need at least 3 bytes for tag, length and integer encoding */
> + if (data_len < 3)
> + return ERR_PTR(-EINVAL);
> +
> + /* remaining length where at d (the start of the integer encoding) */
> + data_len -= 2;
> +
> + data[0] = _tag(UNIV, PRIM, INT);
> + if (integer == 0) {
> + *d++ = 0;
> + goto out;
> + }
> +
> + for (i = sizeof(integer); i > 0 ; i--) {
> + int byte = integer >> (8*(i-1));
Spacing (according to the kernel coding style) is wrong here.
/Jarkko
next prev parent reply other threads:[~2020-03-03 19:22 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-02 12:27 [PATCH v6 0/6] TPM 2.0 trusted keys with attached policy James Bottomley
2020-03-02 12:27 ` James Bottomley
2020-03-02 12:27 ` [PATCH v6 1/6] lib: add ASN.1 encoder James Bottomley
2020-03-02 12:27 ` James Bottomley
2020-03-03 19:22 ` Jarkko Sakkinen [this message]
2020-03-03 19:22 ` Jarkko Sakkinen
2020-03-03 20:49 ` James Bottomley
2020-03-03 20:49 ` James Bottomley
2020-03-03 21:31 ` Jarkko Sakkinen
2020-03-03 21:31 ` Jarkko Sakkinen
2020-03-02 12:27 ` [PATCH v6 2/6] oid_registry: Add TCG defined OIDS for TPM keys James Bottomley
2020-03-02 12:27 ` James Bottomley
2020-03-03 19:24 ` Jarkko Sakkinen
2020-03-03 19:24 ` Jarkko Sakkinen
2020-03-02 12:27 ` [PATCH v6 3/6] security: keys: trusted: fix TPM2 authorizations James Bottomley
2020-03-02 12:27 ` James Bottomley
2020-03-03 19:33 ` Jarkko Sakkinen
2020-03-03 19:33 ` Jarkko Sakkinen
2020-03-03 20:39 ` James Bottomley
2020-03-03 20:39 ` James Bottomley
2020-03-03 21:32 ` Jarkko Sakkinen
2020-03-03 21:32 ` Jarkko Sakkinen
2020-03-02 12:27 ` [PATCH v6 4/6] security: keys: trusted: use ASN.1 TPM2 key format for the blobs James Bottomley
2020-03-02 12:27 ` James Bottomley
2020-03-03 20:06 ` Jarkko Sakkinen
2020-03-03 20:06 ` Jarkko Sakkinen
2020-03-03 20:42 ` James Bottomley
2020-03-03 20:42 ` James Bottomley
2020-03-03 21:20 ` Jarkko Sakkinen
2020-03-03 21:20 ` Jarkko Sakkinen
2020-03-02 12:27 ` [PATCH v6 5/6] security: keys: trusted: add ability to specify arbitrary policy James Bottomley
2020-03-02 12:27 ` James Bottomley
2020-03-02 12:27 ` [PATCH v6 6/6] security: keys: trusted: implement counter/timer policy James Bottomley
2020-03-02 12:27 ` James Bottomley
2020-03-03 20:08 ` Jarkko Sakkinen
2020-03-03 20:08 ` Jarkko Sakkinen
2020-03-03 20:40 ` James Bottomley
2020-03-03 20:40 ` James Bottomley
2020-03-03 21:20 ` Jarkko Sakkinen
2020-03-03 21:20 ` Jarkko Sakkinen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200303192208.GA5775@linux.intel.com \
--to=jarkko.sakkinen@linux.intel.com \
--cc=James.Bottomley@HansenPartnership.com \
--cc=dwmw2@infradead.org \
--cc=keyrings@vger.kernel.org \
--cc=linux-integrity@vger.kernel.org \
--cc=zohar@linux.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.