diff options
author | Yves Arrouye <drcrash@google.com> | 2019-03-10 23:13:29 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-10-19 05:20:50 +0000 |
commit | be1088a543af82266129df9b718f5c17c1f45c9e (patch) | |
tree | 8a59c340542b5c84d73c8cf7121a036e025a7785 | |
parent | 7d82d2ad737608d474cf597e52757bccadd392d6 (diff) | |
download | chrome-ec-be1088a543af82266129df9b718f5c17c1f45c9e.tar.gz |
Make the argument to --sn_bits a 96-bits hex string
This makes the argument simpler to understand and produce.
BUG=chromium:940327
TEST=manual on a device
Change-Id: I9226116f52011dab1967196e1c236dd36b11e4c4
Signed-off-by: Yves Arrouye <drcrash@google.com>
Reviewed-on: https://chromium-review.googlesource.com/1514215
Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
Tested-by: Yves Arrouye <drcrash@chromium.org>
Reviewed-by: Andrey Pronin <apronin@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2459704
Reviewed-by: Stimim Chen <stimim@chromium.org>
Commit-Queue: Stimim Chen <stimim@chromium.org>
Tested-by: Stimim Chen <stimim@chromium.org>
-rw-r--r-- | extra/usb_updater/gsctool.c | 63 |
1 files changed, 41 insertions, 22 deletions
diff --git a/extra/usb_updater/gsctool.c b/extra/usb_updater/gsctool.c index 949eabb390..d3d98added 100644 --- a/extra/usb_updater/gsctool.c +++ b/extra/usb_updater/gsctool.c @@ -205,6 +205,11 @@ struct upgrade_pkt { #define MAX_BOARD_ID_LENGTH 9 /* + * Length, in bytes, of the SN Bits serial number bits. + */ +#define SN_BITS_SIZE (96 >> 3) + +/* * Max. length of FW version in the format of <epoch>.<major>.<minor> * (3 uint32_t string representation + 2 separators + NULL terminator). */ @@ -544,9 +549,9 @@ static void usage(int errs) " Get or set Info1 board ID fields\n" " ID could be 32 bit hex or 4 " "character string.\n" - " -S,--sn_bits SN_1:SN_2:SN_3\n" + " -S,--sn_bits SN_BITS\n" " Set Info1 SN bits fields.\n" - " SN_n should be 32 bit hex.\n" + " SN_BITS should be 96 bit hex.\n" " -R,--sn_rma_inc RMA_INC\n" " Increment SN RMA count by RMA_INC.\n" " RMA_INC should be 0-7.\n" @@ -1482,22 +1487,41 @@ static int parse_bid(const char *opt, return 1; } -static int parse_sn_bits(const char *opt, uint32_t *sn_bits) -{ - const char *s; - char *e; - int i = 0; +/* + * Reads a two-character hexadecimal byte from a string. If the string is + * ill-formed, returns 0. Otherwise, |byte| contains the byte value and the + * return value is non-zero. + */ +static int read_hex_byte(const char* s, uint8_t* byte) { + uint8_t b = 0; + for (const char* end = s + 2; s < end; ++s) { + if (*s >= '0' && *s <= '9') + b = b * 16 + *s - '0'; + else if (*s >= 'A' && *s <= 'F') + b = b * 16 + 10 + *s - 'A'; + else if (*s >= 'a' && *s <= 'f') + b = b * 16 + 10 + *s - 'a'; + else + return 0; + } + *byte = b; + return 1; +} - s = opt; - sn_bits[i] = (uint32_t)strtoul(s, &e, 0); +static int parse_sn_bits(const char *opt, uint8_t *sn_bits) +{ + size_t len = strlen(opt); - while (s != e && *e == ':' && i < 2) { - s = e + 1; - i++; - sn_bits[i] = (uint32_t)strtoul(s, &e, 0); + if (!strncmp(opt, "0x", 2)) { + opt += 2; + len -= 2; } + if (len != SN_BITS_SIZE * 2) return 0; - return *e == '\0' && i == 2; + for (int i = 0; i < SN_BITS_SIZE; ++i, opt +=2) + if (!read_hex_byte(opt, sn_bits++)) return 0; + + return 1; } static int parse_sn_inc_rma(const char *opt, uint8_t *arg) @@ -1902,19 +1926,14 @@ void process_bid(struct transfer_descriptor *td, } static void process_sn_bits(struct transfer_descriptor *td, - uint32_t *sn_bits) + uint8_t *sn_bits) { int rv; - int i = 0; - uint32_t command_body[3]; uint8_t response_code; size_t response_size = sizeof(response_code); - for (i = 0; i < 3; i++) - command_body[i] = htobe32(sn_bits[i]); - rv = send_vendor_command(td, VENDOR_CC_SN_SET_HASH, - command_body, sizeof(command_body), + sn_bits, SN_BITS_SIZE, &response_code, &response_size); if (rv) { @@ -2162,7 +2181,7 @@ int main(int argc, char *argv[]) char *factory_mode_arg; char *tpm_mode_arg = NULL; int sn_bits = 0; - uint32_t sn_bits_arg[3]; + uint8_t sn_bits_arg[SN_BITS_SIZE]; int sn_inc_rma = 0; uint8_t sn_inc_rma_arg; |