Skip to content
Snippets Groups Projects
Commit 5ab177be authored by Joe Hershberger's avatar Joe Hershberger Committed by Tom Rini
Browse files

Implement verify option for md5sum command


Loosely based on CONFIG_CRC32_VERIFY.

The sum to verify against can be in memory, in a variable, or the last
parameter to the function directly.

Signed-off-by: default avatarJoe Hershberger <joe.hershberger@ni.com>
parent 3c210e29
No related branches found
No related tags found
No related merge requests found
/*
* (C) Copyright 2011
* Joe Hershberger, National Instruments, joe.hershberger@ni.com
*
* (C) Copyright 2000
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
*
......@@ -25,6 +28,96 @@
#include <command.h>
#include <u-boot/md5.h>
#ifdef CONFIG_MD5SUM_VERIFY
static int parse_verify_sum(char *verify_str, u8 *vsum)
{
if (*verify_str == '*') {
u8 *ptr;
ptr = (u8 *)simple_strtoul(verify_str + 1, NULL, 16);
memcpy(vsum, ptr, 16);
} else {
unsigned int i;
char *vsum_str;
if (strlen(verify_str) == 32)
vsum_str = verify_str;
else {
vsum_str = getenv(verify_str);
if (vsum_str == NULL || strlen(vsum_str) != 32)
return 1;
}
for (i = 0; i < 16; i++) {
char *nullp = vsum_str + (i + 1) * 2;
char end = *nullp;
*nullp = '\0';
*(u8 *)(vsum + i) =
simple_strtoul(vsum_str + (i * 2), NULL, 16);
*nullp = end;
}
}
return 0;
}
int do_md5sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
ulong addr, len;
unsigned int i;
u8 output[16];
u8 vsum[16];
int verify = 0;
int ac;
char * const *av;
if (argc < 3)
return CMD_RET_USAGE;
av = argv + 1;
ac = argc - 1;
if (strcmp(*av, "-v") == 0) {
verify = 1;
av++;
ac--;
if (ac < 3)
return CMD_RET_USAGE;
}
addr = simple_strtoul(*av++, NULL, 16);
len = simple_strtoul(*av++, NULL, 16);
md5_wd((unsigned char *) addr, len, output, CHUNKSZ_MD5);
if (!verify) {
printf("md5 for %08lx ... %08lx ==> ", addr, addr + len - 1);
for (i = 0; i < 16; i++)
printf("%02x", output[i]);
printf("\n");
} else {
char *verify_str = *av++;
if (parse_verify_sum(verify_str, vsum)) {
printf("ERROR: %s does not contain a valid md5 sum\n",
verify_str);
return 1;
}
if (memcmp(output, vsum, 16) != 0) {
printf("md5 for %08lx ... %08lx ==> ", addr,
addr + len - 1);
for (i = 0; i < 16; i++)
printf("%02x", output[i]);
printf(" != ");
for (i = 0; i < 16; i++)
printf("%02x", vsum[i]);
printf(" ** ERROR **\n");
return 1;
}
}
return 0;
}
#else
static int do_md5sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
unsigned long addr, len;
......@@ -45,9 +138,21 @@ static int do_md5sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
return 0;
}
#endif
#ifdef CONFIG_MD5SUM_VERIFY
U_BOOT_CMD(
md5sum, 5, 1, do_md5sum,
"compute MD5 message digest",
"address count\n"
" - compute MD5 message digest\n"
"md5sum -v address count [*]sum\n"
" - verify md5sum of memory area"
);
#else
U_BOOT_CMD(
md5sum, 3, 1, do_md5sum,
"compute MD5 message digest",
"address count"
);
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment