summaryrefslogtreecommitdiffstats
path: root/src/hci/commands/digest_cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/hci/commands/digest_cmd.c')
-rw-r--r--src/hci/commands/digest_cmd.c92
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 );