Revert "video: mxsfb: Configure the clock after eLCDIF reset"
[oweals/u-boot.git] / tools / kwbimage.c
index 5830549d261095412f134a4d584656378bf38ddf..b8f8d38212f5c00ee79bf89dd63ef585b27eacb2 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Image manipulator for Marvell SoCs
  *  supports Kirkwood, Dove, Armada 370, Armada XP, and Armada 38x
@@ -5,8 +6,6 @@
  * (C) Copyright 2013 Thomas Petazzoni
  * <thomas.petazzoni@free-electrons.com>
  *
- * SPDX-License-Identifier:    GPL-2.0+
- *
  * Not implemented: support for the register headers in v1 images
  */
 
@@ -24,7 +23,8 @@
 #include <openssl/err.h>
 #include <openssl/evp.h>
 
-#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
+#if OPENSSL_VERSION_NUMBER < 0x10100000L || \
+    (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070000fL)
 static void RSA_get0_key(const RSA *r,
                  const BIGNUM **n, const BIGNUM **e, const BIGNUM **d)
 {
@@ -36,7 +36,7 @@ static void RSA_get0_key(const RSA *r,
        *d = r->d;
 }
 
-#else
+#elif !defined(LIBRESSL_VERSION_NUMBER)
 void EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
 {
        EVP_MD_CTX_reset(ctx);
@@ -290,6 +290,33 @@ static uint8_t image_checksum8(void *start, uint32_t len)
        return csum;
 }
 
+size_t kwbimage_header_size(unsigned char *ptr)
+{
+       if (image_version((void *)ptr) == 0)
+               return sizeof(struct main_hdr_v0);
+       else
+               return KWBHEADER_V1_SIZE((struct main_hdr_v1 *)ptr);
+}
+
+/*
+ * Verify checksum over a complete header that includes the checksum field.
+ * Return 1 when OK, otherwise 0.
+ */
+static int main_hdr_checksum_ok(void *hdr)
+{
+       /* Offsets of checksum in v0 and v1 headers are the same */
+       struct main_hdr_v0 *main_hdr = (struct main_hdr_v0 *)hdr;
+       uint8_t checksum;
+
+       checksum = image_checksum8(hdr, kwbimage_header_size(hdr));
+       /* Calculated checksum includes the header checksum field. Compensate
+        * for that.
+        */
+       checksum -= main_hdr->checksum;
+
+       return checksum == main_hdr->checksum;
+}
+
 static uint32_t image_checksum32(void *start, uint32_t len)
 {
        uint32_t csum = 0;
@@ -674,7 +701,7 @@ int kwb_verify(RSA *key, void *data, int datasz, struct sig_v1 *sig,
                goto err_ctx;
        }
 
-       if (!EVP_VerifyFinal(ctx, sig->sig, sizeof(sig->sig), evp_key)) {
+       if (EVP_VerifyFinal(ctx, sig->sig, sizeof(sig->sig), evp_key) != 1) {
                ret = openssl_err("Could not verify signature");
                goto err_ctx;
        }
@@ -1246,6 +1273,13 @@ static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
        e = image_find_option(IMAGE_CFG_DEBUG);
        if (e)
                main_hdr->flags = e->debug ? 0x1 : 0;
+       e = image_find_option(IMAGE_CFG_BINARY);
+       if (e) {
+               char *s = strrchr(e->binary.file, '/');
+
+               if (strcmp(s, "/binary.0") == 0)
+                       main_hdr->destaddr = cpu_to_le32(params->addr);
+       }
 
 #if defined(CONFIG_KWB_SECURE)
        if (image_get_csk_index() >= 0) {
@@ -1587,14 +1621,13 @@ static int kwbimage_check_image_types(uint8_t type)
 static int kwbimage_verify_header(unsigned char *ptr, int image_size,
                                  struct image_tool_params *params)
 {
-       struct main_hdr_v0 *main_hdr;
        uint8_t checksum;
+       size_t header_size = kwbimage_header_size(ptr);
+
+       if (header_size > image_size)
+               return -FDT_ERR_BADSTRUCTURE;
 
-       main_hdr = (struct main_hdr_v0 *)ptr;
-       checksum = image_checksum8(ptr,
-                                  sizeof(struct main_hdr_v0)
-                                  - sizeof(uint8_t));
-       if (checksum != main_hdr->checksum)
+       if (!main_hdr_checksum_ok(ptr))
                return -FDT_ERR_BADSTRUCTURE;
 
        /* Only version 0 extended header has checksum */