From patchwork Tue Nov 24 13:21:14 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Fenkart X-Patchwork-Id: 548067 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id BA16A1401E7 for ; Wed, 25 Nov 2015 00:32:06 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=FYlQiqVQ; dkim-atps=neutral Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id BA3224BD70; Tue, 24 Nov 2015 14:31:19 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Ek4DOLn2ZcAa; Tue, 24 Nov 2015 14:31:19 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 5138E4BD0C; Tue, 24 Nov 2015 14:30:50 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 010B04B976 for ; Tue, 24 Nov 2015 14:21:44 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id v7JN9kPMoveC for ; Tue, 24 Nov 2015 14:21:43 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-wm0-f44.google.com (mail-wm0-f44.google.com [74.125.82.44]) by theia.denx.de (Postfix) with ESMTPS id BEBAC4B9C4 for ; Tue, 24 Nov 2015 14:21:41 +0100 (CET) Received: by wmww144 with SMTP id w144so138313725wmw.1 for ; Tue, 24 Nov 2015 05:21:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=BgRe6oIy7PzGybDnaQdvF5Ys5hehpueSZPVx/eF+Q0s=; b=FYlQiqVQ/0RnqfYtveaiu9ITXomdBgxRKy0K/QXOT0khFGNg/R1vbTho6/vN4notan d9X7mW4FKd6a+Bmp8cfjppoEXL6qLWapaamzT7W5P5vkVcTb9DqPLlJ5+Qb57wupsgUz EtGRS/bqae5F/0XzuMEN91AhdRVTYjOsXUe2tdmxt4f74cJ9ar/kyL8nOkxUXWWFQMBh fjyxTxINiN1gfXDsEyTJ/+btDqXttJomY1Jp5FLxUuL9KxiyGpYbX+e4ZQK5DKZC4AKP 8SDpoed5/ASrQ5bMvbcK9tRWY4O3uzkaMrdVSf0N+/70AvfCNssBWOGlYtNqKhUjlrVx BXlw== X-Received: by 10.28.186.67 with SMTP id k64mr23766333wmf.56.1448371301444; Tue, 24 Nov 2015 05:21:41 -0800 (PST) Received: from localhost (ip-89-176-167-254.net.upcbroadband.cz. [89.176.167.254]) by smtp.gmail.com with ESMTPSA id m16sm18314509wmb.13.2015.11.24.05.21.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 24 Nov 2015 05:21:41 -0800 (PST) From: Andreas Fenkart X-Google-Original-From: Andreas Fenkart To: u-boot@lists.denx.de Date: Tue, 24 Nov 2015 14:21:14 +0100 Message-Id: <1448371275-900-5-git-send-email-andreas.fenkart@dev.digitalstrom.org> X-Mailer: git-send-email 2.6.2 In-Reply-To: <1448371275-900-1-git-send-email-andreas.fenkart@dev.digitalstrom.org> References: <1448371275-900-1-git-send-email-andreas.fenkart@dev.digitalstrom.org> X-Mailman-Approved-At: Tue, 24 Nov 2015 14:30:29 +0100 Subject: [U-Boot] [PATCH 4/5] tools: env: parse aes key / suppress flag into argument struct X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" disabled original parsing, but not yet removed since the argument indexing needs to be fixed Signed-off-by: Andreas Fenkart --- 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 - #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 +#include + /* 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;