diff options
Diffstat (limited to 'src/hci/commands/digest_cmd.c')
| -rw-r--r-- | src/hci/commands/digest_cmd.c | 92 |
1 files changed, 53 insertions, 39 deletions
diff --git a/src/hci/commands/digest_cmd.c b/src/hci/commands/digest_cmd.c index 71308064f..4d7da0385 100644 --- a/src/hci/commands/digest_cmd.c +++ b/src/hci/commands/digest_cmd.c @@ -18,6 +18,7 @@ */ FILE_LICENCE ( GPL2_OR_LATER ); +FILE_SECBOOT ( PERMITTED ); #include <stdio.h> #include <string.h> @@ -26,10 +27,12 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include <ipxe/command.h> #include <ipxe/parseopt.h> #include <ipxe/image.h> +#include <ipxe/settings.h> #include <ipxe/crypto.h> #include <ipxe/md5.h> #include <ipxe/sha1.h> #include <usr/imgmgmt.h> +#include <hci/digest_cmd.h> /** @file * @@ -38,10 +41,16 @@ FILE_LICENCE ( GPL2_OR_LATER ); */ /** "digest" options */ -struct digest_options {}; +struct digest_options { + /** Setting */ + struct named_setting setting; +}; /** "digest" option list */ -static struct option_descriptor digest_opts[] = {}; +static struct option_descriptor digest_opts[] = { + OPTION_DESC ( "set", 's', required_argument, struct digest_options, + setting, parse_autovivified_setting ), +}; /** "digest" command descriptor */ static struct command_descriptor digest_cmd = @@ -56,54 +65,62 @@ static struct command_descriptor digest_cmd = * @v digest Digest algorithm * @ret rc Return status code */ -static int digest_exec ( int argc, char **argv, - struct digest_algorithm *digest ) { +int digest_exec ( int argc, char **argv, struct digest_algorithm *digest ) { struct digest_options opts; struct image *image; - uint8_t digest_ctx[digest->ctxsize]; - uint8_t digest_out[digest->digestsize]; - uint8_t buf[128]; - size_t offset; - size_t len; - size_t frag_len; + uint8_t ctx[digest->ctxsize]; + uint8_t out[digest->digestsize]; + unsigned int j; int i; - unsigned j; int rc; /* Parse options */ if ( ( rc = parse_options ( argc, argv, &digest_cmd, &opts ) ) != 0 ) return rc; + /* Use default setting type, if not specified */ + if ( ! opts.setting.setting.type ) + opts.setting.setting.type = &setting_type_hexraw; + + /* Calculate digests for each image */ for ( i = optind ; i < argc ; i++ ) { /* Acquire image */ if ( ( rc = imgacquire ( argv[i], 0, &image ) ) != 0 ) - continue; - offset = 0; - len = image->len; - - /* calculate digest */ - digest_init ( digest, digest_ctx ); - while ( len ) { - frag_len = len; - if ( frag_len > sizeof ( buf ) ) - frag_len = sizeof ( buf ); - copy_from_user ( buf, image->data, offset, frag_len ); - digest_update ( digest, digest_ctx, buf, frag_len ); - len -= frag_len; - offset += frag_len; + return rc; + + /* Calculate digest */ + digest_init ( digest, ctx ); + digest_update ( digest, ctx, image->data, image->len ); + digest_final ( digest, ctx, out ); + + /* Display or store digest as directed */ + if ( opts.setting.settings ) { + + /* Store digest */ + if ( ( rc = store_setting ( opts.setting.settings, + &opts.setting.setting, out, + sizeof ( out ) ) ) != 0 ) { + printf ( "Could not store \"%s\": %s\n", + opts.setting.setting.name, + strerror ( rc ) ); + return rc; + } + + } else { + + /* Print digest */ + for ( j = 0 ; j < sizeof ( out ) ; j++ ) + printf ( "%02x", out[j] ); + printf ( " %s\n", image->name ); } - digest_final ( digest, digest_ctx, digest_out ); - - for ( j = 0 ; j < sizeof ( digest_out ) ; j++ ) - printf ( "%02x", digest_out[j] ); - - printf ( " %s\n", image->name ); } return 0; } +/* Include "md5sum" and "sha1sum" commands unconditionally */ + static int md5sum_exec ( int argc, char **argv ) { return digest_exec ( argc, argv, &md5_algorithm ); } @@ -112,12 +129,9 @@ static int sha1sum_exec ( int argc, char **argv ) { return digest_exec ( argc, argv, &sha1_algorithm ); } -struct command md5sum_command __command = { - .name = "md5sum", - .exec = md5sum_exec, -}; +COMMAND ( md5sum, md5sum_exec ); +COMMAND ( sha1sum, sha1sum_exec ); -struct command sha1sum_command __command = { - .name = "sha1sum", - .exec = sha1sum_exec, -}; +/* Drag in commands for any other enabled algorithms */ +REQUIRING_SYMBOL ( digest_exec ); +REQUIRE_OBJECT ( config_digest_cmd ); |
