diff options
author | Andrew Duda <aduda@meraki.com> | 2016-11-08 18:53:40 +0000 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2016-11-21 14:07:30 -0500 |
commit | da29f2991d75fc8aa3289407a0e686a4a22f8c9e (patch) | |
tree | 3c972878a859196e72be31fe6da6d0ae5047d38b /include | |
parent | 5300a4f9336291fb713fcfaf9ea6e51b71824800 (diff) | |
download | u-boot-imx-da29f2991d75fc8aa3289407a0e686a4a22f8c9e.zip u-boot-imx-da29f2991d75fc8aa3289407a0e686a4a22f8c9e.tar.gz u-boot-imx-da29f2991d75fc8aa3289407a0e686a4a22f8c9e.tar.bz2 |
rsa: Verify RSA padding programatically
Padding verification was done against static SHA/RSA pair arrays which
take up a lot of static memory, are mostly 0xff, and cannot be reused
for additional SHA/RSA pairings. The padding can be easily computed
according to PKCS#1v2.1 as:
EM = 0x00 || 0x01 || PS || 0x00 || T
where PS is (emLen - tLen - 3) octets of 0xff and T is DER encoding
of the hash.
Store DER prefix in checksum_algo and create rsa_verify_padding
function to handle verification of a message for any SHA/RSA pairing.
Signed-off-by: Andrew Duda <aduda@meraki.com>
Signed-off-by: aduda <aduda@meraki.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/image.h | 3 | ||||
-rw-r--r-- | include/u-boot/rsa-checksum.h | 4 | ||||
-rw-r--r-- | include/u-boot/sha1.h | 3 | ||||
-rw-r--r-- | include/u-boot/sha256.h | 3 |
4 files changed, 8 insertions, 5 deletions
diff --git a/include/image.h b/include/image.h index bfe10a0..de73a07 100644 --- a/include/image.h +++ b/include/image.h @@ -1070,6 +1070,8 @@ struct image_region { struct checksum_algo { const char *name; const int checksum_len; + const int der_len; + const uint8_t *der_prefix; const int key_len; #if IMAGE_ENABLE_SIGN const EVP_MD *(*calculate_sign)(void); @@ -1077,7 +1079,6 @@ struct checksum_algo { int (*calculate)(const char *name, const struct image_region region[], int region_count, uint8_t *checksum); - const uint8_t *rsa_padding; }; struct image_sig_algo { diff --git a/include/u-boot/rsa-checksum.h b/include/u-boot/rsa-checksum.h index 3c69d85..c240720 100644 --- a/include/u-boot/rsa-checksum.h +++ b/include/u-boot/rsa-checksum.h @@ -12,10 +12,6 @@ #include <u-boot/sha1.h> #include <u-boot/sha256.h> -extern const uint8_t padding_sha256_rsa4096[]; -extern const uint8_t padding_sha256_rsa2048[]; -extern const uint8_t padding_sha1_rsa2048[]; - /** * hash_calculate() - Calculate hash over the data * diff --git a/include/u-boot/sha1.h b/include/u-boot/sha1.h index b0d9ce9..2634a29 100644 --- a/include/u-boot/sha1.h +++ b/include/u-boot/sha1.h @@ -21,6 +21,9 @@ extern "C" { #define SHA1_SUM_POS -0x20 #define SHA1_SUM_LEN 20 +#define SHA1_DER_LEN 15 + +extern const uint8_t sha1_der_prefix[]; /** * \brief SHA-1 context structure diff --git a/include/u-boot/sha256.h b/include/u-boot/sha256.h index beadab3..9aa1251 100644 --- a/include/u-boot/sha256.h +++ b/include/u-boot/sha256.h @@ -2,6 +2,9 @@ #define _SHA256_H #define SHA256_SUM_LEN 32 +#define SHA256_DER_LEN 19 + +extern const uint8_t sha256_der_prefix[]; /* Reset watchdog each time we process this many bytes */ #define CHUNKSZ_SHA256 (64 * 1024) |