diff --git a/targets/stm32l442/merge_hex.py b/targets/stm32l442/merge_hex.py index 0473d8a..a0d2470 100644 --- a/targets/stm32l442/merge_hex.py +++ b/targets/stm32l442/merge_hex.py @@ -4,21 +4,38 @@ from intelhex import IntelHex import sys +from binascii import unhexlify if len(sys.argv) < 3: - print('usage: %s [...] ') + print('usage: %s [...] [-s ] ') sys.exit(1) def flash_addr(num): return 0x08000000 + num * 2048 +args = sys.argv[:] + +# generic / hacker attestation key +secret_attestation_key = "cd67aa310d091ed16e7e9892aa070e1994fcd714ae7c408fb946b72e5fe75d30" + +# user supplied, optional +for i,x in enumerate(args): + if x == '-s': + secret_attestation_key = args[i+1] + break + +if secret_attestation_key is not None: + args = args[:i] + args[i+2:] + +# TODO put definitions somewhere else PAGES = 128 APPLICATION_END_PAGE = PAGES - 19 AUTH_WORD_ADDR = (flash_addr(APPLICATION_END_PAGE)-8) +ATTEST_ADDR = (flash_addr(PAGES - 15)) -first = IntelHex(sys.argv[1]) -for i in range(2, len(sys.argv)-1): - first.merge(IntelHex( sys.argv[i] ), overlap = 'replace') +first = IntelHex(args[1]) +for i in range(2, len(args)-1): + first.merge(IntelHex( args[i] ), overlap = 'replace') first[AUTH_WORD_ADDR] = 0 first[AUTH_WORD_ADDR+1] = 0 @@ -30,4 +47,11 @@ first[AUTH_WORD_ADDR+5] = 0xff first[AUTH_WORD_ADDR+6] = 0xff first[AUTH_WORD_ADDR+7] = 0xff -first.tofile(sys.argv[len(sys.argv)-1], format='hex') +if secret_attestation_key is not None: + key = unhexlify(secret_attestation_key) + print('using key ',key) + for i,x in enumerate(key): + print(hex(ATTEST_ADDR + i)) + first[ATTEST_ADDR + i] = x + +first.tofile(args[len(args)-1], format='hex') diff --git a/targets/stm32l442/src/crypto.c b/targets/stm32l442/src/crypto.c index 9bab3d4..06ce94b 100644 --- a/targets/stm32l442/src/crypto.c +++ b/targets/stm32l442/src/crypto.c @@ -20,6 +20,7 @@ #include "device.h" #include APP_CONFIG #include "log.h" +#include "memory_layout.h" typedef enum @@ -164,7 +165,9 @@ void crypto_ecc256_init() void crypto_ecc256_load_attestation_key() { - _signing_key = attestation_key; + static uint8_t _key [32]; + memmove(_key, (uint8_t*)ATTESTATION_KEY_ADDR, 32); + _signing_key = _key; _key_len = 32; } diff --git a/targets/stm32l442/src/memory_layout.h b/targets/stm32l442/src/memory_layout.h index 63a7543..cf84af6 100644 --- a/targets/stm32l442/src/memory_layout.h +++ b/targets/stm32l442/src/memory_layout.h @@ -17,7 +17,7 @@ // Storage of FIDO2 resident keys #define RK_NUM_PAGES 10 #define RK_START_PAGE (PAGES - 14) -#define RK_END_PAGE (PAGES - 14 + RK_NUM_PAGES) +#define RK_END_PAGE (PAGES - 14 + RK_NUM_PAGES) // not included // Start of application code #ifndef APPLICATION_START_PAGE @@ -25,6 +25,10 @@ #endif #define APPLICATION_START_ADDR (0x08000000 + ((APPLICATION_START_PAGE)*PAGE_SIZE)) +// where attestation key is located +#define ATTESTATION_KEY_PAGE (PAGES - 15) +#define ATTESTATION_KEY_ADDR (0x08000000 + ATTESTATION_KEY_PAGE*PAGE_SIZE) + // End of application code. Leave some extra room for future data storage. // NOT included in application #define APPLICATION_END_PAGE ((PAGES - 19))