]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - common/hash.c
mx6: hab: add function to authenticate any data blob via HAB
[karo-tx-uboot.git] / common / hash.c
index c4d8c3a041e979d1139eb597fcbd8edd7f6c7674..a1b048204d36e8065749db2bdc652b10ab16b5d3 100644 (file)
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
+#ifndef USE_HOSTCC
 #include <common.h>
 #include <command.h>
 #include <malloc.h>
+#include <mapmem.h>
 #include <hw_sha.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 <asm/io.h>
-#include <asm/errno.h>
+#include <u-boot/md5.h>
 
 #ifdef CONFIG_SHA1
 static int hash_init_sha1(struct hash_algo *algo, void **ctxp)
@@ -118,11 +128,21 @@ static struct hash_algo hash_algo[] = {
                SHA1_SUM_LEN,
                hw_sha1,
                CHUNKSZ_SHA1,
+#ifdef CONFIG_SHA_PROG_HW_ACCEL
+               hw_sha_init,
+               hw_sha_update,
+               hw_sha_finish,
+#endif
        }, {
                "sha256",
                SHA256_SUM_LEN,
                hw_sha256,
                CHUNKSZ_SHA256,
+#ifdef CONFIG_SHA_PROG_HW_ACCEL
+               hw_sha_init,
+               hw_sha_update,
+               hw_sha_finish,
+#endif
        },
 #endif
 #ifdef CONFIG_SHA1
@@ -173,6 +193,60 @@ 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
+int hash_parse_string(const char *algo_name, const char *str, uint8_t *result)
+{
+       struct hash_algo *algo;
+       int ret;
+       int i;
+
+       ret = hash_lookup_algo(algo_name, &algo);
+       if (ret)
+               return ret;
+
+       for (i = 0; i < algo->digest_size; i++) {
+               char chr[3];
+
+               strncpy(chr, &str[i * 2], 2);
+               result[i] = simple_strtoul(chr, NULL, 16);
+       }
+
+       return 0;
+}
+
 /**
  * store_result: Store the resulting sum to an address or variable
  *
@@ -261,7 +335,6 @@ static int parse_verify_sum(struct hash_algo *algo, char *verify_str,
                buf = map_sysmem(addr, algo->digest_size);
                memcpy(vsum, buf, algo->digest_size);
        } else {
-               unsigned int i;
                char *vsum_str;
                int digits = algo->digest_size * 2;
 
@@ -281,51 +354,11 @@ static int parse_verify_sum(struct hash_algo *algo, char *verify_str,
                        }
                }
 
-               for (i = 0; i < algo->digest_size; i++) {
-                       char *nullp = vsum_str + (i + 1) * 2;
-                       char end = *nullp;
-
-                       *nullp = '\0';
-                       vsum[i] = simple_strtoul(vsum_str + (i * 2), NULL, 16);
-                       *nullp = end;
-               }
+               hash_parse_string(algo->name, vsum_str, 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;
-}
-
-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;
-}
-
 void hash_show(struct hash_algo *algo, ulong addr, ulong len, uint8_t *output)
 {
        int i;
@@ -439,3 +472,4 @@ int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
 
        return 0;
 }
+#endif