]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - common/hash.c
fdt: fix incorrect placement of partition information for atmel_nand
[karo-tx-uboot.git] / common / hash.c
index 7627b84b451421a599f378511eccd71639e450fe..d154d029e9c32466979bdc93116b70778402bb78 100644 (file)
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
+#ifndef USE_HOSTCC
 #include <common.h>
 #include <command.h>
 #include <malloc.h>
 #include <hw_sha.h>
-#include <hash.h>
-#include <sha1.h>
-#include <sha256.h>
 #include <asm/io.h>
 #include <asm/errno.h>
+#else
+#include "mkimage.h"
+#include <time.h>
+#include <image.h>
+#endif /* !USE_HOSTCC*/
+
+#include <hash.h>
+#include <u-boot/crc.h>
+#include <u-boot/sha1.h>
+#include <u-boot/sha256.h>
+#include <u-boot/md5.h>
 
-#ifdef CONFIG_CMD_SHA1SUM
+#ifdef CONFIG_SHA1
 static int hash_init_sha1(struct hash_algo *algo, void **ctxp)
 {
        sha1_context *ctx = malloc(sizeof(sha1_context));
@@ -125,12 +134,7 @@ static struct hash_algo hash_algo[] = {
                CHUNKSZ_SHA256,
        },
 #endif
-       /*
-        * This is CONFIG_CMD_SHA1SUM instead of CONFIG_SHA1 since otherwise
-        * it bloats the code for boards which use SHA1 but not the 'hash'
-        * or 'sha1sum' commands.
-        */
-#ifdef CONFIG_CMD_SHA1SUM
+#ifdef CONFIG_SHA1
        {
                "sha1",
                SHA1_SUM_LEN,
@@ -140,7 +144,6 @@ static struct hash_algo hash_algo[] = {
                hash_update_sha1,
                hash_finish_sha1,
        },
-#define MULTI_HASH
 #endif
 #ifdef CONFIG_SHA256
        {
@@ -152,7 +155,6 @@ static struct hash_algo hash_algo[] = {
                hash_update_sha256,
                hash_finish_sha256,
        },
-#define MULTI_HASH
 #endif
        {
                "crc32",
@@ -165,6 +167,10 @@ static struct hash_algo hash_algo[] = {
        },
 };
 
+#if defined(CONFIG_SHA256) || defined(CONFIG_CMD_SHA1SUM)
+#define MULTI_HASH
+#endif
+
 #if defined(CONFIG_HASH_VERIFY) || defined(CONFIG_CMD_HASH)
 #define MULTI_HASH
 #endif
@@ -176,6 +182,40 @@ static struct hash_algo hash_algo[] = {
 #define multi_hash()   0
 #endif
 
+int hash_lookup_algo(const char *algo_name, struct hash_algo **algop)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(hash_algo); i++) {
+               if (!strcmp(algo_name, hash_algo[i].name)) {
+                       *algop = &hash_algo[i];
+                       return 0;
+               }
+       }
+
+       debug("Unknown hash algorithm '%s'\n", algo_name);
+       return -EPROTONOSUPPORT;
+}
+
+int hash_progressive_lookup_algo(const char *algo_name,
+                                struct hash_algo **algop)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(hash_algo); i++) {
+               if (!strcmp(algo_name, hash_algo[i].name)) {
+                       if (hash_algo[i].hash_init) {
+                               *algop = &hash_algo[i];
+                               return 0;
+                       }
+               }
+       }
+
+       debug("Unknown hash algorithm '%s'\n", algo_name);
+       return -EPROTONOSUPPORT;
+}
+
+#ifndef USE_HOSTCC
 /**
  * store_result: Store the resulting sum to an address or variable
  *
@@ -187,7 +227,7 @@ static struct hash_algo hash_algo[] = {
  * @allow_env_vars:    non-zero to permit storing the result to an
  *                     variable environment
  */
-static void store_result(struct hash_algo *algo, const u8 *sum,
+static void store_result(struct hash_algo *algo, const uint8_t *sum,
                         const char *dest, int allow_env_vars)
 {
        unsigned int i;
@@ -214,7 +254,7 @@ static void store_result(struct hash_algo *algo, const u8 *sum,
                        sprintf(str_ptr, "%02x", sum[i]);
                        str_ptr += 2;
                }
-               str_ptr = '\0';
+               *str_ptr = '\0';
                setenv(dest, str_output);
        } else {
                ulong addr;
@@ -243,8 +283,8 @@ static void store_result(struct hash_algo *algo, const u8 *sum,
  *                     address, and the * prefix is not expected.
  * @return 0 if ok, non-zero on error
  */
-static int parse_verify_sum(struct hash_algo *algo, char *verify_str, u8 *vsum,
-                           int allow_env_vars)
+static int parse_verify_sum(struct hash_algo *algo, char *verify_str,
+                           uint8_t *vsum, int allow_env_vars)
 {
        int env_var = 0;
 
@@ -256,7 +296,7 @@ static int parse_verify_sum(struct hash_algo *algo, char *verify_str, u8 *vsum,
                        env_var = 1;
        }
 
-       if (env_var) {
+       if (!env_var) {
                ulong addr;
                void *buf;
 
@@ -296,23 +336,7 @@ static int parse_verify_sum(struct hash_algo *algo, char *verify_str, u8 *vsum,
        return 0;
 }
 
-int hash_lookup_algo(const char *algo_name, struct hash_algo **algop)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(hash_algo); i++) {
-               if (!strcmp(algo_name, hash_algo[i].name)) {
-                       *algop = &hash_algo[i];
-                       return 0;
-               }
-       }
-
-       debug("Unknown hash algorithm '%s'\n", algo_name);
-       return -EPROTONOSUPPORT;
-}
-
-static void show_hash(struct hash_algo *algo, ulong addr, ulong len,
-                     u8 *output)
+void hash_show(struct hash_algo *algo, ulong addr, ulong len, uint8_t *output)
 {
        int i;
 
@@ -348,7 +372,7 @@ int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
 {
        ulong addr, len;
 
-       if (argc < 2)
+       if ((argc < 2) || ((flags & HASH_FLAG_VERIFY) && (argc < 3)))
                return CMD_RET_USAGE;
 
        addr = simple_strtoul(*argv++, NULL, 16);
@@ -356,8 +380,8 @@ int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
 
        if (multi_hash()) {
                struct hash_algo *algo;
-               u8 output[HASH_MAX_DIGEST_SIZE];
-               u8 vsum[HASH_MAX_DIGEST_SIZE];
+               uint8_t output[HASH_MAX_DIGEST_SIZE];
+               uint8_t vsum[HASH_MAX_DIGEST_SIZE];
                void *buf;
 
                if (hash_lookup_algo(algo_name, &algo)) {
@@ -381,8 +405,6 @@ int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
 #else
                if (0) {
 #endif
-                       if (!argc)
-                               return CMD_RET_USAGE;
                        if (parse_verify_sum(algo, *argv, vsum,
                                        flags & HASH_FLAG_ENV)) {
                                printf("ERROR: %s does not contain a valid "
@@ -392,7 +414,7 @@ int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
                        if (memcmp(output, vsum, algo->digest_size) != 0) {
                                int i;
 
-                               show_hash(algo, addr, len, output);
+                               hash_show(algo, addr, len, output);
                                printf(" != ");
                                for (i = 0; i < algo->digest_size; i++)
                                        printf("%02x", vsum[i]);
@@ -400,7 +422,7 @@ int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
                                return 1;
                        }
                } else {
-                       show_hash(algo, addr, len, output);
+                       hash_show(algo, addr, len, output);
                        printf("\n");
 
                        if (argc) {
@@ -427,3 +449,4 @@ int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
 
        return 0;
 }
+#endif