[U-Boot] [U-Boot v2] [PATCH] rsa: add a more flexible way to support different hash algorithms (e.g. sha256)

As proposed by Heiko I made some small changes and verified the patch with the checkpatch-script.
From 169f40e72fceb222bb15dd59c1337f42371e97a5 Mon Sep 17 00:00:00 2001
From: Andreas Oetken andreas.oetken@siemens.com Date: Wed, 27 Nov 2013 13:09:19 +0100 Subject: [PATCH] Added rsa-sha256 support.
Signed-off-by: Andreas Oetken andreas.oetken@siemens.com --- common/image-sig.c | 33 +++++++++++++ include/image.h | 20 +++++++- include/rsa-checksum.h | 25 ++++++++++ include/rsa.h | 17 +++++++ lib/rsa/Makefile | 2 +- lib/rsa/rsa-checksum.c | 108 +++++++++++++++++++++++++++++++++++++++++++ lib/rsa/rsa-sign.c | 10 ++-- lib/rsa/rsa-verify.c | 80 +++++++++----------------------- test/vboot/sign-configs.its | 2 +- test/vboot/sign-images.its | 2 +- 10 files changed, 233 insertions(+), 66 deletions(-) create mode 100644 include/rsa-checksum.h create mode 100644 lib/rsa/rsa-checksum.c
diff --git a/common/image-sig.c b/common/image-sig.c index 973b06d..5ce6b80 100644 --- a/common/image-sig.c +++ b/common/image-sig.c @@ -14,15 +14,48 @@ DECLARE_GLOBAL_DATA_PTR; #endif /* !USE_HOSTCC*/ #include <image.h> #include <rsa.h> +#include <rsa-checksum.h> #define IMAGE_MAX_HASHED_NODES 100 + +struct image_hash_algo image_hash_algos[] = { + { + "sha1", + SHA1_SUM_LEN, +#if IMAGE_ENABLE_SIGN + EVP_sha1, +#else + sha1_calculate, + padding_sha1_rsa2048, +#endif + }, + { + "sha256", + SHA256_SUM_LEN, +#if IMAGE_ENABLE_SIGN + EVP_sha256, +#else + sha256_calculate, + padding_sha256_rsa2048, +#endif + } +}; + struct image_sig_algo image_sig_algos[] = { { "sha1,rsa2048", rsa_sign, rsa_add_verify_data, rsa_verify, + &image_hash_algos[0], + }, + { + "sha256,rsa2048", + rsa_sign, + rsa_add_verify_data, + rsa_verify, + &image_hash_algos[1], } }; diff --git a/include/image.h b/include/image.h index ee6eb8d..1f7ca61 100644 --- a/include/image.h +++ b/include/image.h @@ -822,7 +822,8 @@ int calculate_hash(const void *data, int data_len, const char *algo, # ifdef USE_HOSTCC # define IMAGE_ENABLE_SIGN 1 # define IMAGE_ENABLE_VERIFY 0 -#else +# include <openssl/evp.h> +# else # define IMAGE_ENABLE_SIGN 0 # define IMAGE_ENABLE_VERIFY 1 # endif @@ -861,6 +862,20 @@ struct image_region { int size; }; +struct image_hash_algo { + const char *name; + const int checksum_len; +#if IMAGE_ENABLE_SIGN + EVP_MD *(*calculate)(void); +#else +#if IMAGE_ENABLE_VERIFY + void (*calculate)(const struct image_region region[], + int region_count, uint8_t *checksum); + const uint8_t *rsa_padding; +#endif +#endif +}; + struct image_sig_algo { const char *name; /* Name of algorithm */ @@ -911,6 +926,9 @@ struct image_sig_algo { int (*verify)(struct image_sign_info *info, const struct image_region region[], int region_count, uint8_t *sig, uint sig_len); + + /* pointer to hash algorithm */ + struct image_hash_algo *hash_algo; }; /** diff --git a/include/rsa-checksum.h b/include/rsa-checksum.h new file mode 100644 index 0000000..d2c6474 --- /dev/null +++ b/include/rsa-checksum.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2013, Andreas Oetken. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef _RSA_CHECKSUM_H +#define _RSA_CHECKSUM_H + +#include <errno.h> +#include <image.h> +#include <sha1.h> +#include <sha256.h> + +#if IMAGE_ENABLE_VERIFY +extern const uint8_t padding_sha256_rsa2048[]; +extern const uint8_t padding_sha1_rsa2048[]; + +void sha256_calculate(const struct image_region region[], + int region_count, uint8_t *checksum); +void sha1_calculate(const struct image_region region[], + int region_count, uint8_t *checksum); +#endif + +#endif diff --git a/include/rsa.h b/include/rsa.h index add4c78..12ae443 100644 --- a/include/rsa.h +++ b/include/rsa.h @@ -15,6 +15,23 @@ #include <errno.h> #include <image.h> +#define RSA2048_BYTES (2048 / 8) + +/** + * struct rsa_public_key - holder for a public key + * + * An RSA public key consists of a modulus (typically called N), the inverse + * and R^2, where R is 2^(# key bits). + */ + +struct rsa_public_key { + uint len; /* Length of modulus[] in number of uint32_t */ + uint32_t n0inv; /* -1 / modulus[0] mod 2^32 */ + uint32_t *modulus; /* modulus as little endian array */ + uint32_t *rr; /* R^2 as little endian array */ +}; + + #if IMAGE_ENABLE_SIGN /** * sign() - calculate and return signature for given input data diff --git a/lib/rsa/Makefile b/lib/rsa/Makefile index 164ab39..a5a96cb6 100644 --- a/lib/rsa/Makefile +++ b/lib/rsa/Makefile @@ -7,4 +7,4 @@ # SPDX-License-Identifier: GPL-2.0+ # -obj-$(CONFIG_FIT_SIGNATURE) += rsa-verify.o +obj-$(CONFIG_FIT_SIGNATURE) += rsa-verify.o rsa-checksum.o diff --git a/lib/rsa/rsa-checksum.c b/lib/rsa/rsa-checksum.c new file mode 100644 index 0000000..e75abb8 --- /dev/null +++ b/lib/rsa/rsa-checksum.c @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2013, Andreas Oetken. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <fdtdec.h> +#include <rsa.h> +#include <sha1.h> +#include <sha256.h> +#include <asm/byteorder.h> +#include <asm/errno.h> +#include <asm/unaligned.h> + + +/* PKCS 1.5 paddings as described in the RSA PKCS#1 v2.1 standard. */ + + +const uint8_t padding_sha256_rsa2048[RSA2048_BYTES - SHA256_SUM_LEN] = { + 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x31, 0x30, + 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, + 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20 +}; + +const uint8_t padding_sha1_rsa2048[RSA2048_BYTES - SHA1_SUM_LEN] = { + 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x21, 0x30, + 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, + 0x05, 0x00, 0x04, 0x14 +}; + + +void sha1_calculate(const struct image_region region[], + int region_count, uint8_t *checksum) +{ + sha1_context ctx; + uint32_t i; + + sha1_starts(&ctx); + for (i = 0; i < region_count; i++) + sha1_update(&ctx, region[i].data, region[i].size); + sha1_finish(&ctx, checksum); +} + +void sha256_calculate(const struct image_region region[], + int region_count, uint8_t *checksum) +{ + sha256_context ctx; + uint32_t i; + + sha256_starts(&ctx); + for (i = 0; i < region_count; i++) + sha256_update(&ctx, region[i].data, region[i].size); + sha256_finish(&ctx, checksum); +} + diff --git a/lib/rsa/rsa-sign.c b/lib/rsa/rsa-sign.c index 549130e..e3b8790 100644 --- a/lib/rsa/rsa-sign.c +++ b/lib/rsa/rsa-sign.c @@ -159,8 +159,9 @@ static void rsa_remove(void) EVP_cleanup(); } -static int rsa_sign_with_key(RSA *rsa, const struct image_region region[], - int region_count, uint8_t **sigp, uint *sig_size) +static int rsa_sign_with_key(RSA *rsa, struct image_hash_algo *hash_algo, + const struct image_region region[], + int region_count, uint8_t **sigp, uint *sig_size) { EVP_PKEY *key; EVP_MD_CTX *context; @@ -192,7 +193,7 @@ static int rsa_sign_with_key(RSA *rsa, const struct image_region region[], goto err_create; } EVP_MD_CTX_init(context); - if (!EVP_SignInit(context, EVP_sha1())) { + if (!EVP_SignInit(context, hash_algo->calculate())) { ret = rsa_err("Signer setup failed"); goto err_sign; } @@ -242,7 +243,8 @@ int rsa_sign(struct image_sign_info *info, ret = rsa_get_priv_key(info->keydir, info->keyname, &rsa); if (ret) goto err_priv; - ret = rsa_sign_with_key(rsa, region, region_count, sigp, sig_len); + ret = rsa_sign_with_key(rsa, info->algo->hash_algo, + region, region_count, sigp, sig_len); if (ret) goto err_sign; diff --git a/lib/rsa/rsa-verify.c b/lib/rsa/rsa-verify.c index 02cc4e3..9a42641 100644 --- a/lib/rsa/rsa-verify.c +++ b/lib/rsa/rsa-verify.c @@ -7,28 +7,14 @@ #include <common.h> #include <fdtdec.h> #include <rsa.h> -#include <sha1.h> #include <asm/byteorder.h> #include <asm/errno.h> #include <asm/unaligned.h> -/** - * struct rsa_public_key - holder for a public key - * - * An RSA public key consists of a modulus (typically called N), the inverse - * and R^2, where R is 2^(# key bits). - */ -struct rsa_public_key { - uint len; /* Length of modulus[] in number of uint32_t */ - uint32_t n0inv; /* -1 / modulus[0] mod 2^32 */ - uint32_t *modulus; /* modulus as little endian array */ - uint32_t *rr; /* R^2 as little endian array */ -}; +#define MAXIMUM_CHECKSUM_LEN 512 #define UINT64_MULT32(v, multby) (((uint64_t)(v)) * ((uint32_t)(multby))) -#define RSA2048_BYTES (2048 / 8) - /* This is the minimum/maximum key size we support, in bits */ #define RSA_MIN_KEY_BITS 2048 #define RSA_MAX_KEY_BITS 2048 @@ -36,38 +22,6 @@ struct rsa_public_key { /* This is the maximum signature length that we support, in bits */ #define RSA_MAX_SIG_BITS 2048 -static const uint8_t padding_sha1_rsa2048[RSA2048_BYTES - SHA1_SUM_LEN] = { - 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x21, 0x30, - 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, - 0x05, 0x00, 0x04, 0x14 -}; /** * subtract_modulus() - subtract modulus from the given value @@ -209,7 +163,8 @@ static int pow_mod(const struct rsa_public_key *key, uint32_t *inout) } static int rsa_verify_key(const struct rsa_public_key *key, const uint8_t *sig, - const uint32_t sig_len, const uint8_t *hash) + const uint32_t sig_len, const uint8_t *hash, + struct image_hash_algo *hash_algo) { const uint8_t *padding; int pad_len; @@ -223,6 +178,8 @@ static int rsa_verify_key(const struct rsa_public_key *key, const uint8_t *sig, return -EINVAL; } + debug("Hash-algorithm: %s", hash_algo->name); + /* Sanity check for stack size */ if (sig_len > RSA_MAX_SIG_BITS / 8) { debug("Signature length %u exceeds maximum %d\n", sig_len, @@ -239,8 +196,8 @@ static int rsa_verify_key(const struct rsa_public_key *key, const uint8_t *sig, return ret; /* Determine padding to use depending on the signature type. */ - padding = padding_sha1_rsa2048; - pad_len = RSA2048_BYTES - SHA1_SUM_LEN; + padding = hash_algo->rsa_padding; + pad_len = RSA2048_BYTES - hash_algo->checksum_len; /* Check pkcs1.5 padding bytes. */ if (memcmp(buf, padding, pad_len)) { @@ -309,7 +266,7 @@ static int rsa_verify_with_keynode(struct image_sign_info *info, } debug("key length %d\n", key.len); - ret = rsa_verify_key(&key, sig, sig_len, hash); + ret = rsa_verify_key(&key, sig, sig_len, hash, info->algo->hash_algo); if (ret) { printf("%s: RSA failed to verify: %d\n", __func__, ret); return ret; @@ -323,12 +280,21 @@ int rsa_verify(struct image_sign_info *info, uint8_t *sig, uint sig_len) { const void *blob = info->fdt_blob; - uint8_t hash[SHA1_SUM_LEN]; + /* Reserve memory for a maximum checksum-length of 512 bytes */ + uint8_t hash[MAXIMUM_CHECKSUM_LEN]; int ndepth, noffset; int sig_node, node; char name[100]; - sha1_context ctx; - int ret, i; + int ret; + + /* Verify that checksum-length is lower than MAXIMUM_CHECKSUM_LEN */ + if (info->algo->hash_algo->checksum_len > MAXIMUM_CHECKSUM_LEN) { + debug("%s: invlaid checksum-length %s, a maximum \ + of %d is currently set.\n", + __func__, info->algo->hash_algo->name, + MAXIMUM_CHECKSUM_LEN); + return -EINVAL; + } sig_node = fdt_subnode_offset(blob, 0, FIT_SIG_NODENAME); if (sig_node < 0) { @@ -336,10 +302,8 @@ int rsa_verify(struct image_sign_info *info, return -ENOENT; } - sha1_starts(&ctx); - for (i = 0; i < region_count; i++) - sha1_update(&ctx, region[i].data, region[i].size); - sha1_finish(&ctx, hash); + /* Calculate checksum with checksum-algorithm */ + info->algo->hash_algo->calculate(region, region_count, hash); /* See if we must use a particular key */ if (info->required_keynode != -1) { diff --git a/test/vboot/sign-configs.its b/test/vboot/sign-configs.its index db2ed79..5b315f3 100644 --- a/test/vboot/sign-configs.its +++ b/test/vboot/sign-configs.its @@ -36,7 +36,7 @@ kernel = "kernel@1"; fdt = "fdt@1"; signature@1 { - algo = "sha1,rsa2048"; + algo = "sha256,rsa2048"; key-name-hint = "dev"; sign-images = "fdt", "kernel"; }; diff --git a/test/vboot/sign-images.its b/test/vboot/sign-images.its index f69326a..e2b0446 100644 --- a/test/vboot/sign-images.its +++ b/test/vboot/sign-images.its @@ -27,7 +27,7 @@ compression = "none"; fdt-version = <1>; signature@1 { - algo = "sha1,rsa2048"; + algo = "sha256,rsa2048"; key-name-hint = "dev"; }; }; -- 1.7.10.4

Hello Andreas,
Am 27.11.2013 13:10, schrieb andreas@oetken.name:
As proposed by Heiko I made some small changes and verified the patch with the checkpatch-script.
From 169f40e72fceb222bb15dd59c1337f42371e97a5 Mon Sep 17 00:00:00 2001
From: Andreas Oetkenandreas.oetken@siemens.com Date: Wed, 27 Nov 2013 13:09:19 +0100 Subject: [PATCH] Added rsa-sha256 support.
Could you fix your commit message?
Please write in the commit message why and what you have changed in your patch. After "---" you can write for example the changelog of your patch, see a detailed help for sending patches, here:
http://www.denx.de/wiki/U-Boot/Patches
Signed-off-by: Andreas Oetkenandreas.oetken@siemens.com
common/image-sig.c | 33 +++++++++++++ include/image.h | 20 +++++++- include/rsa-checksum.h | 25 ++++++++++ include/rsa.h | 17 +++++++ lib/rsa/Makefile | 2 +- lib/rsa/rsa-checksum.c | 108 +++++++++++++++++++++++++++++++++++++++++++ lib/rsa/rsa-sign.c | 10 ++-- lib/rsa/rsa-verify.c | 80 +++++++++----------------------- test/vboot/sign-configs.its | 2 +- test/vboot/sign-images.its | 2 +- 10 files changed, 233 insertions(+), 66 deletions(-) create mode 100644 include/rsa-checksum.h create mode 100644 lib/rsa/rsa-checksum.c
Hmm.. I tried to apply your patch, but I get:
pollux:u-boot hs [20131202] $ git am mbox Wende an: rsa: add a more flexible way to support different hash algorithms (e.g. sha256) fatal: fehlerhafter Patch bei Zeile 24 Anwendung des Patches fehlgeschlagen bei 0001 rsa: add a more flexible way to support different hash algorithms (e.g. sha256) Die Kopie des fehlgeschlagenen Patches befindet sich in: /home/hs/ids/u-boot/.git/rebase-apply/patch Wenn Sie das Problem gelöst haben, führen Sie "git am --resolved" aus. Falls Sie diesen Patch auslassen möchten, führen Sie stattdessen "git am --skip" aus. Um den ursprünglichen Zweig wiederherzustellen und die Anwendung der Patches abzubrechen, führen Sie "git am --abort" aus. pollux:u-boot hs [20131202] $ git am --abort pollux:u-boot hs [20131202] $ vi mbox pollux:u-boot hs [20131202] $ patch -p1 < mbox patching file common/image-sig.c patch: **** malformed patch at line 49: #endif /* !USE_HOSTCC*/
pollux:u-boot hs [20131202] $
Can you have a look at this issue?
Beside of that, just some nitpicking comment:
[...]
diff --git a/include/rsa.h b/include/rsa.h index add4c78..12ae443 100644 --- a/include/rsa.h +++ b/include/rsa.h @@ -15,6 +15,23 @@ #include<errno.h> #include<image.h>
+#define RSA2048_BYTES (2048 / 8)
+/**
- struct rsa_public_key - holder for a public key
- An RSA public key consists of a modulus (typically called N), the inverse
- and R^2, where R is 2^(# key bits).
- */
+struct rsa_public_key {
uint len; /* Length of modulus[] in number of uint32_t */
uint32_t n0inv; /* -1 / modulus[0] mod 2^32 */
uint32_t *modulus; /* modulus as little endian array */
uint32_t *rr; /* R^2 as little endian array */
+};
only one empty line please.
#if IMAGE_ENABLE_SIGN /**
- sign() - calculate and return signature for given input data
[...]
diff --git a/lib/rsa/rsa-checksum.c b/lib/rsa/rsa-checksum.c new file mode 100644 index 0000000..e75abb8 --- /dev/null +++ b/lib/rsa/rsa-checksum.c @@ -0,0 +1,108 @@ +/*
- Copyright (c) 2013, Andreas Oetken.
- SPDX-License-Identifier: GPL-2.0+
- */
+#include<common.h> +#include<fdtdec.h> +#include<rsa.h> +#include<sha1.h> +#include<sha256.h> +#include<asm/byteorder.h> +#include<asm/errno.h> +#include<asm/unaligned.h>
only one empty line please.
+/* PKCS 1.5 paddings as described in the RSA PKCS#1 v2.1 standard. */
here too.. please fix globally.
[...]
bye, Heiko

Hi,
On 1 December 2013 23:10, Heiko Schocher hs@denx.de wrote:
Hello Andreas,
Am 27.11.2013 13:10, schrieb andreas@oetken.name:
As proposed by Heiko I made some small changes and verified the patch with the checkpatch-script.
You can also use patman to generate, check and send your patch if you like.
I couldn't apply it due to the problems Heiko mentioned, but it looks promising. One I think I wonder if whether you could use the existing infrastructure in common/hash.c to select the hash algorithm?
Regards, Simon
From 169f40e72fceb222bb15dd59c1337f42371e97a5 Mon Sep 17 00:00:00 2001
From: Andreas Oetkenandreas.oetken@siemens.com Date: Wed, 27 Nov 2013 13:09:19 +0100 Subject: [PATCH] Added rsa-sha256 support.
Could you fix your commit message?
Please write in the commit message why and what you have changed in your patch. After "---" you can write for example the changelog of your patch, see a detailed help for sending patches, here:
http://www.denx.de/wiki/U-Boot/Patches
Signed-off-by: Andreas Oetkenandreas.oetken@siemens.com
common/image-sig.c | 33 +++++++++++++ include/image.h | 20 +++++++- include/rsa-checksum.h | 25 ++++++++++ include/rsa.h | 17 +++++++ lib/rsa/Makefile | 2 +- lib/rsa/rsa-checksum.c | 108 +++++++++++++++++++++++++++++++++++++++++++ lib/rsa/rsa-sign.c | 10 ++-- lib/rsa/rsa-verify.c | 80 +++++++++----------------------- test/vboot/sign-configs.its | 2 +- test/vboot/sign-images.its | 2 +- 10 files changed, 233 insertions(+), 66 deletions(-) create mode 100644 include/rsa-checksum.h create mode 100644 lib/rsa/rsa-checksum.c
Hmm.. I tried to apply your patch, but I get:
pollux:u-boot hs [20131202] $ git am mbox Wende an: rsa: add a more flexible way to support different hash algorithms (e.g. sha256) fatal: fehlerhafter Patch bei Zeile 24 Anwendung des Patches fehlgeschlagen bei 0001 rsa: add a more flexible way to support different hash algorithms (e.g. sha256) Die Kopie des fehlgeschlagenen Patches befindet sich in: /home/hs/ids/u-boot/.git/rebase-apply/patch Wenn Sie das Problem gelöst haben, führen Sie "git am --resolved" aus. Falls Sie diesen Patch auslassen möchten, führen Sie stattdessen "git am --skip" aus. Um den ursprünglichen Zweig wiederherzustellen und die Anwendung der Patches abzubrechen, führen Sie "git am --abort" aus. pollux:u-boot hs [20131202] $ git am --abort pollux:u-boot hs [20131202] $ vi mbox pollux:u-boot hs [20131202] $ patch -p1 < mbox patching file common/image-sig.c patch: **** malformed patch at line 49: #endif /* !USE_HOSTCC*/
pollux:u-boot hs [20131202] $
Can you have a look at this issue?
Beside of that, just some nitpicking comment:
[...]
diff --git a/include/rsa.h b/include/rsa.h index add4c78..12ae443 100644 --- a/include/rsa.h +++ b/include/rsa.h @@ -15,6 +15,23 @@ #include<errno.h> #include<image.h>
+#define RSA2048_BYTES (2048 / 8)
+/**
- struct rsa_public_key - holder for a public key
- An RSA public key consists of a modulus (typically called N), the
inverse
- and R^2, where R is 2^(# key bits).
- */
+struct rsa_public_key {
uint len; /* Length of modulus[] in number of
uint32_t */
uint32_t n0inv; /* -1 / modulus[0] mod 2^32 */
uint32_t *modulus; /* modulus as little endian array */
uint32_t *rr; /* R^2 as little endian array */
+};
only one empty line please.
#if IMAGE_ENABLE_SIGN /**
- sign() - calculate and return signature for given input data
[...]
diff --git a/lib/rsa/rsa-checksum.c b/lib/rsa/rsa-checksum.c new file mode 100644 index 0000000..e75abb8 --- /dev/null +++ b/lib/rsa/rsa-checksum.c @@ -0,0 +1,108 @@ +/*
- Copyright (c) 2013, Andreas Oetken.
- SPDX-License-Identifier: GPL-2.0+
- */
+#include<common.h> +#include<fdtdec.h> +#include<rsa.h> +#include<sha1.h> +#include<sha256.h> +#include<asm/byteorder.h> +#include<asm/errno.h> +#include<asm/unaligned.h>
only one empty line please.
+/* PKCS 1.5 paddings as described in the RSA PKCS#1 v2.1 standard. */
here too.. please fix globally.
[...]
bye, Heiko -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
participants (3)
-
andreas@oetken.name
-
Heiko Schocher
-
Simon Glass