rsa: fix alignment issue when getting public exponent
authorHeiko Stuebner <heiko.stuebner@theobroma-systems.com>
Sun, 3 May 2020 11:26:34 +0000 (13:26 +0200)
committerTom Rini <trini@konsulko.com>
Thu, 7 May 2020 13:01:42 +0000 (09:01 -0400)
To fill the exponent field of the rsa_public_key struct, rsa_mod_exp_sw
did a cast to uint64_t of the key_prop->public_exponent field.
But that alignment is not guaranteed in all cases.

This came to light when in my spl-fit-signature the key-name exceeded
a certain length and with it the verification then started failing.
(naming it "integrity" worked fine, "integrity-uboot" failed)

key_prop.public_exponent itself is actually a void-pointer, fdt_getprop()
also just returns such a void-pointer and inside the devicetree the 64bit
exponent is represented as 2 32bit numbers, so assuming a 64bit alignment
can lead to false reads.

So just use the already existing rsa_convert_big_endian() to do the actual
conversion from the dt's big-endian to the needed uint64 value.

Fixes: fc2f4246b4b3 ("rsa: Split the rsa-verify to separate the modular exponentiation")
Signed-off-by: Heiko Stuebner <heiko.stuebner@theobroma-systems.com>
Reviewed-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
lib/rsa/rsa-mod-exp.c

index 420ab2eba05ff1afbb5322bb390cebfd830c972e..62b2557cc288eb3ab11abebfdf0db3c67f8421bd 100644 (file)
@@ -262,8 +262,8 @@ int rsa_mod_exp_sw(const uint8_t *sig, uint32_t sig_len,
        if (!prop->public_exponent)
                key.exponent = RSA_DEFAULT_PUBEXP;
        else
-               key.exponent =
-                       fdt64_to_cpu(*((uint64_t *)(prop->public_exponent)));
+               rsa_convert_big_endian((uint32_t *)&key.exponent,
+                                      prop->public_exponent, 2);
 
        if (!key.len || !prop->modulus || !prop->rr) {
                debug("%s: Missing RSA key info", __func__);