[U-Boot] [PATCH v2 4/7] tools: env: parse aes key / suppress flag into argument struct

Andreas Fenkart afenkart at gmail.com
Thu Nov 26 11:52:31 CET 2015


disabled original parsing, but not yet removed since the
argument indexing needs to be fixed

Signed-off-by: Andreas Fenkart <andreas.fenkart at dev.digitalstrom.org>
---
 tools/env/fw_env.c      | 64 ++++++++++---------------------------------------
 tools/env/fw_env.h      | 13 ++++++++++
 tools/env/fw_env_main.c | 31 ++++++++++++++++++++----
 3 files changed, 51 insertions(+), 57 deletions(-)

diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
index 5b76b74..2cfff02 100644
--- a/tools/env/fw_env.c
+++ b/tools/env/fw_env.c
@@ -33,8 +33,6 @@
 
 #include "fw_env.h"
 
-#include <aes.h>
-
 #define DIV_ROUND_UP(n, d)	(((n) + (d) - 1) / (d))
 
 #define WHITESPACE(c) ((c == '\t') || (c == ' '))
@@ -104,9 +102,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;
@@ -124,7 +119,6 @@ static int parse_config (void);
 
 #if defined(CONFIG_FILE)
 static int get_config (char *);
-static char *config_file = CONFIG_FILE;
 #endif
 static inline ulong getenvsize (void)
 {
@@ -133,7 +127,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;
@@ -207,7 +201,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;
@@ -242,32 +236,16 @@ 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;
 
 #ifdef CONFIG_FILE
 	if (argc >= 2 && strcmp(argv[1], "-c") == 0) {
-		if (argc < 3) {
-			fprintf(stderr,
-				"## Error: '-c' option requires the config file to use\n");
-			return -1;
-		}
-		config_file = argv[2];
 		argv += 2;
 		argc -= 2;
 	}
 #endif
 
 	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;
 	}
@@ -291,7 +269,6 @@ int fw_printenv (int argc, char *argv[])
 	}
 
 	if (strcmp (argv[1], "-n") == 0) {
-		n_flag = 1;
 		++argv;
 		--argc;
 		if (argc != 2) {
@@ -299,8 +276,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   */
@@ -318,7 +293,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);
 				}
@@ -338,7 +313,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,
@@ -494,7 +469,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;
@@ -502,12 +477,6 @@ int fw_setenv(int argc, char *argv[])
 
 #ifdef CONFIG_FILE
 	if (argc >= 2 && strcmp(argv[1], "-c") == 0) {
-		if (argc < 3) {
-			fprintf(stderr,
-				"## Error: '-c' option requires the config file to use\n");
-			return -1;
-		}
-		config_file = argv[2];
 		argv += 2;
 		argc -= 2;
 	}
@@ -519,15 +488,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;
 	}
@@ -1025,7 +985,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);
@@ -1253,7 +1213,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;
@@ -1310,7 +1270,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;
@@ -1394,9 +1354,9 @@ static int parse_config ()
 
 #if defined(CONFIG_FILE)
 	/* Fills in DEVNAME(), ENVSIZE(), DEVESIZE(). Or don't. */
-	if (get_config (config_file)) {
-		fprintf (stderr,
-			"Cannot parse config file '%s': %s\n", config_file, strerror (errno));
+	if (get_config(common_args.config_file)) {
+		fprintf(stderr, "Cannot parse config file '%s': %m\n",
+			common_args.config_file);
 		return -1;
 	}
 #else
diff --git a/tools/env/fw_env.h b/tools/env/fw_env.h
index 1a02c46..696eace 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 */
 #include <linux/kconfig.h>
 
@@ -54,7 +57,15 @@
 	"bootm"
 #endif
 
+struct common_args {
+	char *config_file;
+	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;
 
@@ -63,6 +74,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 0c9f918..b68f1bf 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;
 
@@ -84,17 +85,27 @@ int parse_printenv_args(int argc, char *argv[])
 {
 	int c;
 
+#ifdef CONFIG_FILE
+	common_args.config_file = CONFIG_FILE;
+#endif
+
 	while ((c = getopt_long (argc, argv, "a:c:ns:h",
 		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;
+#ifdef CONFIG_FILE
 		case 'c':
-			/* handled later */
+			common_args.config_file = optarg;
 			break;
+#endif
 		case 'n':
-			/* handled in fw_printenv */
+			printenv_args.name_suppress = 1;
 			break;
 		case 'h':
 			usage();
@@ -113,15 +124,25 @@ int parse_setenv_args(int argc, char *argv[])
 {
 	int c;
 
+#ifdef CONFIG_FILE
+	common_args.config_file = CONFIG_FILE;
+#endif
+
 	while ((c = getopt_long (argc, argv, "a:c:ns:h",
 		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;
+#ifdef CONFIG_FILE
 		case 'c':
-			/* handled later */
+			common_args.config_file = optarg;
 			break;
+#endif
 		case 's':
 			setenv_args.script_file = optarg;
 			break;
-- 
2.6.2



More information about the U-Boot mailing list