Merge https://gitlab.denx.de/u-boot/custodians/u-boot-riscv
[oweals/u-boot.git] / cmd / avb.c
index 5bc158252b30e67b2af3e564fa7fbb7f3177e595..88172a9ee67502bca36afd3bf355818909d47eac 100644 (file)
--- a/cmd/avb.c
+++ b/cmd/avb.c
 #define AVB_BOOTARGS   "avb_bootargs"
 static struct AvbOps *avb_ops;
 
-static const char * const requested_partitions[] = {"boot",
-                                            "system",
-                                            "vendor",
-                                            NULL};
-
-int do_avb_init(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+int do_avb_init(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 {
        unsigned long mmc_dev;
 
@@ -41,7 +36,8 @@ int do_avb_init(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        return CMD_RET_FAILURE;
 }
 
-int do_avb_read_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+int do_avb_read_part(struct cmd_tbl *cmdtp, int flag, int argc,
+                    char *const argv[])
 {
        const char *part;
        s64 offset;
@@ -73,7 +69,7 @@ int do_avb_read_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        return CMD_RET_FAILURE;
 }
 
-int do_avb_read_part_hex(cmd_tbl_t *cmdtp, int flag, int argc,
+int do_avb_read_part_hex(struct cmd_tbl *cmdtp, int flag, int argc,
                         char *const argv[])
 {
        const char *part;
@@ -119,7 +115,8 @@ int do_avb_read_part_hex(cmd_tbl_t *cmdtp, int flag, int argc,
        return CMD_RET_FAILURE;
 }
 
-int do_avb_write_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+int do_avb_write_part(struct cmd_tbl *cmdtp, int flag, int argc,
+                     char *const argv[])
 {
        const char *part;
        s64 offset;
@@ -150,7 +147,8 @@ int do_avb_write_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        return CMD_RET_FAILURE;
 }
 
-int do_avb_read_rb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+int do_avb_read_rb(struct cmd_tbl *cmdtp, int flag, int argc,
+                  char *const argv[])
 {
        size_t index;
        u64 rb_idx;
@@ -176,7 +174,8 @@ int do_avb_read_rb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        return CMD_RET_FAILURE;
 }
 
-int do_avb_write_rb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+int do_avb_write_rb(struct cmd_tbl *cmdtp, int flag, int argc,
+                   char *const argv[])
 {
        size_t index;
        u64 rb_idx;
@@ -201,8 +200,8 @@ int do_avb_write_rb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        return CMD_RET_FAILURE;
 }
 
-int do_avb_get_uuid(cmd_tbl_t *cmdtp, int flag,
-                   int argc, char * const argv[])
+int do_avb_get_uuid(struct cmd_tbl *cmdtp, int flag,
+                   int argc, char *const argv[])
 {
        const char *part;
        char buffer[UUID_STR_LEN + 1];
@@ -229,13 +228,15 @@ int do_avb_get_uuid(cmd_tbl_t *cmdtp, int flag,
        return CMD_RET_FAILURE;
 }
 
-int do_avb_verify_part(cmd_tbl_t *cmdtp, int flag,
+int do_avb_verify_part(struct cmd_tbl *cmdtp, int flag,
                       int argc, char *const argv[])
 {
+       const char * const requested_partitions[] = {"boot", NULL};
        AvbSlotVerifyResult slot_result;
        AvbSlotVerifyData *out_data;
        char *cmdline;
        char *extra_args;
+       char *slot_suffix = "";
 
        bool unlocked = false;
        int res = CMD_RET_FAILURE;
@@ -245,9 +246,12 @@ int do_avb_verify_part(cmd_tbl_t *cmdtp, int flag,
                return CMD_RET_FAILURE;
        }
 
-       if (argc != 1)
+       if (argc < 1 || argc > 2)
                return CMD_RET_USAGE;
 
+       if (argc == 2)
+               slot_suffix = argv[1];
+
        printf("## Android Verified Boot 2.0 version %s\n",
               avb_version_string());
 
@@ -260,7 +264,7 @@ int do_avb_verify_part(cmd_tbl_t *cmdtp, int flag,
        slot_result =
                avb_slot_verify(avb_ops,
                                requested_partitions,
-                               "",
+                               slot_suffix,
                                unlocked,
                                AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE,
                                &out_data);
@@ -312,11 +316,14 @@ int do_avb_verify_part(cmd_tbl_t *cmdtp, int flag,
                printf("Unknown error occurred\n");
        }
 
+       if (out_data)
+               avb_slot_verify_data_free(out_data);
+
        return res;
 }
 
-int do_avb_is_unlocked(cmd_tbl_t *cmdtp, int flag,
-                      int argc, char * const argv[])
+int do_avb_is_unlocked(struct cmd_tbl *cmdtp, int flag,
+                      int argc, char *const argv[])
 {
        bool unlock;
 
@@ -341,8 +348,8 @@ int do_avb_is_unlocked(cmd_tbl_t *cmdtp, int flag,
        return CMD_RET_FAILURE;
 }
 
-int do_avb_read_pvalue(cmd_tbl_t *cmdtp, int flag, int argc,
-                      char * const argv[])
+int do_avb_read_pvalue(struct cmd_tbl *cmdtp, int flag, int argc,
+                      char *const argv[])
 {
        const char *name;
        size_t bytes;
@@ -382,8 +389,8 @@ int do_avb_read_pvalue(cmd_tbl_t *cmdtp, int flag, int argc,
        return CMD_RET_FAILURE;
 }
 
-int do_avb_write_pvalue(cmd_tbl_t *cmdtp, int flag, int argc,
-                       char * const argv[])
+int do_avb_write_pvalue(struct cmd_tbl *cmdtp, int flag, int argc,
+                       char *const argv[])
 {
        const char *name;
        const char *value;
@@ -411,7 +418,7 @@ int do_avb_write_pvalue(cmd_tbl_t *cmdtp, int flag, int argc,
        return CMD_RET_FAILURE;
 }
 
-static cmd_tbl_t cmd_avb[] = {
+static struct cmd_tbl cmd_avb[] = {
        U_BOOT_CMD_MKENT(init, 2, 0, do_avb_init, "", ""),
        U_BOOT_CMD_MKENT(read_rb, 2, 0, do_avb_read_rb, "", ""),
        U_BOOT_CMD_MKENT(write_rb, 3, 0, do_avb_write_rb, "", ""),
@@ -420,16 +427,16 @@ static cmd_tbl_t cmd_avb[] = {
        U_BOOT_CMD_MKENT(read_part, 5, 0, do_avb_read_part, "", ""),
        U_BOOT_CMD_MKENT(read_part_hex, 4, 0, do_avb_read_part_hex, "", ""),
        U_BOOT_CMD_MKENT(write_part, 5, 0, do_avb_write_part, "", ""),
-       U_BOOT_CMD_MKENT(verify, 1, 0, do_avb_verify_part, "", ""),
+       U_BOOT_CMD_MKENT(verify, 2, 0, do_avb_verify_part, "", ""),
 #ifdef CONFIG_OPTEE_TA_AVB
        U_BOOT_CMD_MKENT(read_pvalue, 3, 0, do_avb_read_pvalue, "", ""),
        U_BOOT_CMD_MKENT(write_pvalue, 3, 0, do_avb_write_pvalue, "", ""),
 #endif
 };
 
-static int do_avb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+static int do_avb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 {
-       cmd_tbl_t *cp;
+       struct cmd_tbl *cp;
 
        cp = find_cmd_tbl(argv[1], cmd_avb, ARRAY_SIZE(cmd_avb));
 
@@ -463,6 +470,7 @@ U_BOOT_CMD(
        "avb read_pvalue <name> <bytes> - read a persistent value <name>\n"
        "avb write_pvalue <name> <value> - write a persistent value <name>\n"
 #endif
-       "avb verify - run verification process using hash data\n"
+       "avb verify [slot_suffix] - run verification process using hash data\n"
        "    from vbmeta structure\n"
+       "    [slot_suffix] - _a, _b, etc (if vbmeta partition is slotted)\n"
        );