diff options
author | Peter Korsgaard <jacmet@sunsite.dk> | 2011-05-18 09:18:20 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2011-05-19 20:36:22 +0200 |
commit | 373de3c1c49221ab684d397960a278231325d367 (patch) | |
tree | 8d396d84028d8aae7cbf8cff189eaa0baa9cfe17 /commands/digest.c | |
parent | c2bd07f6a971793a6f40f99963ad761064a26df5 (diff) | |
download | barebox-373de3c1c49221ab684d397960a278231325d367.tar.gz barebox-373de3c1c49221ab684d397960a278231325d367.tar.xz |
commands: add md5/sha1/sha256sum commands using the digest api
The interface emulates the Linux commands, except that you can
specify a sub area - E.G.:
barebox:/ md5sum /dev/fd0 2M+1M /env/config /env/bin/boot 10+2
61c4c0180b044191d28f27545f43562f /dev/fd0 0x00200000 ... 0x00300000
908b84bcbadd2f263583a65ff31d1cad /env/config 0x00000000 ... 0x000003a7
f23bd15825cc5006cf5f9fd486d82d2d /env/bin/boot 0x0000000a ... 0x0000000c
Adds around 1400 bytes (+ size of digest code) with everything enabled.
Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'commands/digest.c')
-rw-r--r-- | commands/digest.c | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/commands/digest.c b/commands/digest.c new file mode 100644 index 0000000000..2a699e625c --- /dev/null +++ b/commands/digest.c @@ -0,0 +1,183 @@ +/* + * digest.c - Calculate a md5/sha1/sha256 checksum of a memory area + * + * Copyright (c) 2011 Peter Korsgaard <jacmet@sunsite.dk> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <common.h> +#include <command.h> +#include <fs.h> +#include <fcntl.h> +#include <errno.h> +#include <xfuncs.h> +#include <malloc.h> +#include <digest.h> + +static int file_digest(struct digest *d, char *filename, + ulong start, ulong size) +{ + ulong len = 0; + int fd, now, i, ret = 0; + unsigned char *buf; + + d->init(d); + + fd = open(filename, O_RDONLY); + if (fd < 0) { + perror(filename); + return fd; + } + + if (start > 0) { + ret = lseek(fd, start, SEEK_SET); + if (ret == -1) { + perror("lseek"); + goto out; + } + } + + buf = xmalloc(4096); + + while (size) { + now = min((ulong)4096, size); + now = read(fd, buf, now); + if (now < 0) { + ret = now; + perror("read"); + goto out_free; + } + if (!now) + break; + + if (ctrlc()) { + ret = -EINTR; + goto out_free; + } + + d->update(d, buf, now); + size -= now; + len += now; + } + + d->final(d, buf); + + for (i = 0; i < d->length; i++) + printf("%02x", buf[i]); + + printf(" %s\t0x%08lx ... 0x%08lx\n", filename, start, start + len); + +out_free: + free(buf); +out: + close(fd); + + return ret; +} + +static int do_digest(char *algorithm, int argc, char *argv[]) +{ + struct digest *d; + int ret = 0; + + d = digest_get_by_name(algorithm); + BUG_ON(!d); + + if (argc < 2) + return COMMAND_ERROR_USAGE; + + argv++; + while (*argv) { + char *filename = "/dev/mem"; + ulong start = 0, size = ~0; + + /* arguments are either file, file+area or area */ + if (parse_area_spec(*argv, &start, &size)) { + filename = *argv; + if (argv[1] && !parse_area_spec(argv[1], &start, &size)) + argv++; + } + + if (file_digest(d, filename, start, size) < 0) + ret = 1; + + argv++; + } + + return ret; +} + +#ifdef CONFIG_CMD_MD5SUM + +static int do_md5(struct command *cmdtp, int argc, char *argv[]) +{ + return do_digest("md5", argc, argv); +} + +BAREBOX_CMD_HELP_START(md5sum) +BAREBOX_CMD_HELP_USAGE("md5sum [[FILE] [AREA]]...\n") +BAREBOX_CMD_HELP_SHORT("Calculate a md5 checksum of a memory area.\n") +BAREBOX_CMD_HELP_END + +BAREBOX_CMD_START(md5sum) + .cmd = do_md5, + .usage = "md5 checksum calculation", + BAREBOX_CMD_HELP(cmd_md5sum_help) +BAREBOX_CMD_END + +#endif /* CMD_CMD_MD5SUM */ + +#ifdef CONFIG_CMD_SHA1SUM + +static int do_sha1(struct command *cmdtp, int argc, char *argv[]) +{ + return do_digest("sha1", argc, argv); +} + +BAREBOX_CMD_HELP_START(sha1sum) +BAREBOX_CMD_HELP_USAGE("sha1sum [[FILE] [AREA]]...\n") +BAREBOX_CMD_HELP_SHORT("Calculate a sha1 checksum of a memory area.\n") +BAREBOX_CMD_HELP_END + +BAREBOX_CMD_START(sha1sum) + .cmd = do_sha1, + .usage = "sha1 checksum calculation", + BAREBOX_CMD_HELP(cmd_sha1sum_help) +BAREBOX_CMD_END + +#endif /* CMD_CMD_SHA1SUM */ + +#ifdef CONFIG_CMD_SHA256SUM + +static int do_sha256(struct command *cmdtp, int argc, char *argv[]) +{ + return do_digest("sha256", argc, argv); +} + +BAREBOX_CMD_HELP_START(sha256sum) +BAREBOX_CMD_HELP_USAGE("sha256sum [[FILE] [AREA]]...\n") +BAREBOX_CMD_HELP_SHORT("Calculate a sha256 checksum of a memory area.\n") +BAREBOX_CMD_HELP_END + +BAREBOX_CMD_START(sha256sum) + .cmd = do_sha256, + .usage = "sha256 checksum calculation", + BAREBOX_CMD_HELP(cmd_sha256sum_help) +BAREBOX_CMD_END + +#endif /* CMD_CMD_SHA256SUM */ |