
disabled original parsing, but not yet removed since the argument indexing needs to be fixed
Signed-off-by: Andreas Fenkart andreas.fenkart@dev.digitalstrom.org --- tools/env/fw_env.c | 45 +++++++++------------------------------------ tools/env/fw_env.h | 12 ++++++++++++ tools/env/fw_env_main.c | 15 ++++++++++++--- 3 files changed, 33 insertions(+), 39 deletions(-)
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index f1dea8b..32bb3aa 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -31,8 +31,6 @@
#include "fw_env.h"
-#include <aes.h> - #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
#define WHITESPACE(c) ((c == '\t') || (c == ' ')) @@ -102,9 +100,6 @@ static struct environment environment = { .flag_scheme = FLAG_NONE, };
-/* Is AES encryption used? */ -static int aes_flag; -static uint8_t aes_key[AES_KEY_LENGTH] = { 0 }; static int env_aes_cbc_crypt(char *data, const int enc);
static int HaveRedundEnv = 0; @@ -130,7 +125,7 @@ static inline ulong getenvsize (void) if (HaveRedundEnv) rc -= sizeof (char);
- if (aes_flag) + if (common_args.aes_flag) rc &= ~(AES_KEY_LENGTH - 1);
return rc; @@ -204,7 +199,7 @@ char *fw_getdefenv(char *name) return NULL; }
-static int parse_aes_key(char *key, uint8_t *bin_key) +int parse_aes_key(char *key, uint8_t *bin_key) { char tmp[5] = { '0', 'x', 0, 0, 0 }; unsigned long ul; @@ -239,19 +234,9 @@ static int parse_aes_key(char *key, uint8_t *bin_key) int fw_printenv (int argc, char *argv[]) { char *env, *nxt; - int i, n_flag; - int rc = 0; + int i, rc = 0;
if (argc >= 2 && strcmp(argv[1], "-a") == 0) { - if (argc < 3) { - fprintf(stderr, - "## Error: '-a' option requires AES key\n"); - return -1; - } - rc = parse_aes_key(argv[2], aes_key); - if (rc) - return rc; - aes_flag = 1; argv += 2; argc -= 2; } @@ -275,7 +260,6 @@ int fw_printenv (int argc, char *argv[]) }
if (strcmp (argv[1], "-n") == 0) { - n_flag = 1; ++argv; --argc; if (argc != 2) { @@ -283,8 +267,6 @@ int fw_printenv (int argc, char *argv[]) "`-n' option requires exactly one argument\n"); return -1; } - } else { - n_flag = 0; }
for (i = 1; i < argc; ++i) { /* print single env variables */ @@ -302,7 +284,7 @@ int fw_printenv (int argc, char *argv[]) } val = envmatch (name, env); if (val) { - if (!n_flag) { + if (!printenv_args.name_suppress) { fputs (name, stdout); putc ('=', stdout); } @@ -322,7 +304,7 @@ int fw_printenv (int argc, char *argv[]) int fw_env_close(void) { int ret; - if (aes_flag) { + if (common_args.aes_flag) { ret = env_aes_cbc_crypt(environment.data, 1); if (ret) { fprintf(stderr, @@ -478,7 +460,7 @@ int fw_env_write(char *name, char *value) */ int fw_setenv(int argc, char *argv[]) { - int i, rc; + int i; size_t len; char *name, **valv; char *value = NULL; @@ -490,15 +472,6 @@ int fw_setenv(int argc, char *argv[]) }
if (strcmp(argv[1], "-a") == 0) { - if (argc < 3) { - fprintf(stderr, - "## Error: '-a' option requires AES key\n"); - return -1; - } - rc = parse_aes_key(argv[2], aes_key); - if (rc) - return rc; - aes_flag = 1; argv += 2; argc -= 2; } @@ -996,7 +969,7 @@ static int env_aes_cbc_crypt(char *payload, const int enc) uint32_t aes_blocks;
/* First we expand the key. */ - aes_expand_key(aes_key, key_exp); + aes_expand_key(common_args.aes_key, key_exp);
/* Calculate the number of AES blocks to encrypt. */ aes_blocks = DIV_ROUND_UP(len, AES_KEY_LENGTH); @@ -1224,7 +1197,7 @@ int fw_env_open(void)
crc0 = crc32 (0, (uint8_t *) environment.data, ENV_SIZE);
- if (aes_flag) { + if (common_args.aes_flag) { ret = env_aes_cbc_crypt(environment.data, 0); if (ret) return ret; @@ -1281,7 +1254,7 @@ int fw_env_open(void)
crc1 = crc32 (0, (uint8_t *) redundant->data, ENV_SIZE);
- if (aes_flag) { + if (common_args.aes_flag) { ret = env_aes_cbc_crypt(redundant->data, 0); if (ret) return ret; diff --git a/tools/env/fw_env.h b/tools/env/fw_env.h index 4ac7de4..abb0f3b 100644 --- a/tools/env/fw_env.h +++ b/tools/env/fw_env.h @@ -5,6 +5,9 @@ * SPDX-License-Identifier: GPL-2.0+ */
+#include <aes.h> +#include <stdint.h> + /* Pull in the current config to define the default environment */ #ifndef __ASSEMBLY__ #define __ASSEMBLY__ /* get only #defines from config.h */ @@ -52,7 +55,14 @@ "bootm" #endif
+struct common_args { + uint8_t aes_key[AES_KEY_LENGTH]; + int aes_flag; /* Is AES encryption used? */ +}; +extern struct common_args common_args; + struct printenv_args { + int name_suppress; }; extern struct printenv_args printenv_args;
@@ -61,6 +71,8 @@ struct setenv_args { }; extern struct setenv_args setenv_args;
+int parse_aes_key(char *key, uint8_t *bin_key); + extern int fw_printenv(int argc, char *argv[]); extern char *fw_getenv (char *name); extern int fw_setenv (int argc, char *argv[]); diff --git a/tools/env/fw_env_main.c b/tools/env/fw_env_main.c index f45c94a..c828fd0 100644 --- a/tools/env/fw_env_main.c +++ b/tools/env/fw_env_main.c @@ -45,6 +45,7 @@ static struct option long_options[] = { {NULL, 0, NULL, 0} };
+struct common_args common_args; struct printenv_args printenv_args; struct setenv_args setenv_args;
@@ -83,10 +84,14 @@ int parse_printenv_args(int argc, char *argv[]) long_options, NULL)) != EOF) { switch (c) { case 'a': - /* AES key, handled later */ + if (parse_aes_key(optarg, common_args.aes_key)) { + fprintf(stderr, "AES key parse error\n"); + return EXIT_FAILURE; + } + common_args.aes_flag = 1; break; case 'n': - /* handled in fw_printenv */ + printenv_args.name_suppress = 1; break; case 'h': usage(); @@ -108,7 +113,11 @@ int parse_setenv_args(int argc, char *argv[]) long_options, NULL)) != EOF) { switch (c) { case 'a': - /* AES key, handled later */ + if (parse_aes_key(optarg, common_args.aes_key)) { + fprintf(stderr, "AES key parse error\n"); + return EXIT_FAILURE; + } + common_args.aes_flag = 1; break; case 's': setenv_args.script_file = optarg;