|
@@ -10,12 +10,13 @@
|
|
#include <asm/byteorder.h>
|
|
#include <asm/byteorder.h>
|
|
#include <asm/errno.h>
|
|
#include <asm/errno.h>
|
|
#include <asm/unaligned.h>
|
|
#include <asm/unaligned.h>
|
|
|
|
+#include <hash.h>
|
|
#else
|
|
#else
|
|
#include "fdt_host.h"
|
|
#include "fdt_host.h"
|
|
-#endif
|
|
|
|
-#include <u-boot/rsa.h>
|
|
|
|
#include <u-boot/sha1.h>
|
|
#include <u-boot/sha1.h>
|
|
#include <u-boot/sha256.h>
|
|
#include <u-boot/sha256.h>
|
|
|
|
+#endif
|
|
|
|
+#include <u-boot/rsa.h>
|
|
|
|
|
|
/* PKCS 1.5 paddings as described in the RSA PKCS#1 v2.1 standard. */
|
|
/* PKCS 1.5 paddings as described in the RSA PKCS#1 v2.1 standard. */
|
|
|
|
|
|
@@ -136,28 +137,37 @@ const uint8_t padding_sha256_rsa4096[RSA4096_BYTES - SHA256_SUM_LEN] = {
|
|
0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20
|
|
0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20
|
|
};
|
|
};
|
|
|
|
|
|
-void sha1_calculate(const struct image_region region[], int region_count,
|
|
|
|
- uint8_t *checksum)
|
|
|
|
|
|
+int hash_calculate(const char *name,
|
|
|
|
+ const struct image_region region[],
|
|
|
|
+ int region_count, uint8_t *checksum)
|
|
{
|
|
{
|
|
- sha1_context ctx;
|
|
|
|
|
|
+ struct hash_algo *algo;
|
|
|
|
+ int ret = 0;
|
|
|
|
+ void *ctx;
|
|
uint32_t i;
|
|
uint32_t i;
|
|
i = 0;
|
|
i = 0;
|
|
|
|
|
|
- sha1_starts(&ctx);
|
|
|
|
- for (i = 0; i < region_count; i++)
|
|
|
|
- sha1_update(&ctx, region[i].data, region[i].size);
|
|
|
|
- sha1_finish(&ctx, checksum);
|
|
|
|
-}
|
|
|
|
|
|
+ ret = hash_progressive_lookup_algo(name, &algo);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
|
|
-void sha256_calculate(const struct image_region region[], int region_count,
|
|
|
|
- uint8_t *checksum)
|
|
|
|
-{
|
|
|
|
- sha256_context ctx;
|
|
|
|
- uint32_t i;
|
|
|
|
- i = 0;
|
|
|
|
|
|
+ ret = algo->hash_init(algo, &ctx);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < region_count - 1; i++) {
|
|
|
|
+ ret = algo->hash_update(algo, ctx, region[i].data,
|
|
|
|
+ region[i].size, 0);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ret = algo->hash_update(algo, ctx, region[i].data, region[i].size, 1);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+ ret = algo->hash_finish(algo, ctx, checksum, algo->digest_size);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
|
|
- sha256_starts(&ctx);
|
|
|
|
- for (i = 0; i < region_count; i++)
|
|
|
|
- sha256_update(&ctx, region[i].data, region[i].size);
|
|
|
|
- sha256_finish(&ctx, checksum);
|
|
|
|
|
|
+ return 0;
|
|
}
|
|
}
|