1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-01 00:32:04 +02:00

Add support for SHA384 and SHA512

The current recommendation for best security practice from the US government
is to use SHA384 for TOP SECRET [1].

This patch adds support for SHA384 and SHA512 in the hash command, and also
allows FIT images to be hashed with these algorithms, and signed with
sha384,rsaXXXX and sha512,rsaXXXX

The SHA implementation is adapted from the linux kernel implementation.

[1] Commercial National Security Algorithm Suite
http://www.iad.gov/iad/programs/iad-initiatives/cnsa-suite.cfm

Signed-off-by: Reuben Dowle <reuben.dowle@4rf.com>
This commit is contained in:
Reuben Dowle
2020-04-16 17:36:52 +12:00
committed by Tom Rini
parent f191f3a102
commit d16b38f427
13 changed files with 632 additions and 16 deletions

View File

@@ -31,6 +31,7 @@
#include <u-boot/crc.h>
#include <u-boot/sha1.h>
#include <u-boot/sha256.h>
#include <u-boot/sha512.h>
#include <u-boot/md5.h>
#if !defined(USE_HOSTCC) && defined(CONFIG_NEEDS_MANUAL_RELOC)
@@ -95,6 +96,65 @@ static int hash_finish_sha256(struct hash_algo *algo, void *ctx, void
}
#endif
#if defined(CONFIG_SHA384)
static int hash_init_sha384(struct hash_algo *algo, void **ctxp)
{
sha512_context *ctx = malloc(sizeof(sha512_context));
sha384_starts(ctx);
*ctxp = ctx;
return 0;
}
static int hash_update_sha384(struct hash_algo *algo, void *ctx,
const void *buf, unsigned int size, int is_last)
{
sha384_update((sha512_context *)ctx, buf, size);
return 0;
}
static int hash_finish_sha384(struct hash_algo *algo, void *ctx, void
*dest_buf, int size)
{
if (size < algo->digest_size)
return -1;
sha384_finish((sha512_context *)ctx, dest_buf);
free(ctx);
return 0;
}
#endif
#if defined(CONFIG_SHA512)
static int hash_init_sha512(struct hash_algo *algo, void **ctxp)
{
sha512_context *ctx = malloc(sizeof(sha512_context));
sha512_starts(ctx);
*ctxp = ctx;
return 0;
}
static int hash_update_sha512(struct hash_algo *algo, void *ctx,
const void *buf, unsigned int size, int is_last)
{
sha512_update((sha512_context *)ctx, buf, size);
return 0;
}
static int hash_finish_sha512(struct hash_algo *algo, void *ctx, void
*dest_buf, int size)
{
if (size < algo->digest_size)
return -1;
printf("hello world\n");
sha512_finish((sha512_context *)ctx, dest_buf);
free(ctx);
return 0;
}
#endif
static int hash_init_crc16_ccitt(struct hash_algo *algo, void **ctxp)
{
uint16_t *ctx = malloc(sizeof(uint16_t));
@@ -195,6 +255,28 @@ static struct hash_algo hash_algo[] = {
.hash_finish = hash_finish_sha256,
#endif
},
#endif
#ifdef CONFIG_SHA384
{
.name = "sha384",
.digest_size = SHA384_SUM_LEN,
.chunk_size = CHUNKSZ_SHA384,
.hash_func_ws = sha384_csum_wd,
.hash_init = hash_init_sha384,
.hash_update = hash_update_sha384,
.hash_finish = hash_finish_sha384,
},
#endif
#ifdef CONFIG_SHA512
{
.name = "sha512",
.digest_size = SHA512_SUM_LEN,
.chunk_size = CHUNKSZ_SHA512,
.hash_func_ws = sha512_csum_wd,
.hash_init = hash_init_sha512,
.hash_update = hash_update_sha512,
.hash_finish = hash_finish_sha512,
},
#endif
{
.name = "crc16-ccitt",
@@ -218,7 +300,8 @@ static struct hash_algo hash_algo[] = {
/* Try to minimize code size for boards that don't want much hashing */
#if defined(CONFIG_SHA256) || defined(CONFIG_CMD_SHA1SUM) || \
defined(CONFIG_CRC32_VERIFY) || defined(CONFIG_CMD_HASH)
defined(CONFIG_CRC32_VERIFY) || defined(CONFIG_CMD_HASH) || \
defined(CONFIG_SHA384) || defined(CONFIG_SHA512)
#define multi_hash() 1
#else
#define multi_hash() 0