From eb39e0f2c48bf830601cf67a8a9ea97dd91acaf7 Mon Sep 17 00:00:00 2001 From: Conor Patrick Date: Mon, 3 Dec 2018 00:01:41 -0500 Subject: [PATCH] reboot and pass tests --- fido2/extensions/extensions.c | 2 +- targets/stm32l442/bootloader/bootloader.h | 2 +- targets/stm32l442/bootloader/main.c | 1 + targets/stm32l442/src/device.c | 7 +-- web/js/wallet.js | 57 ++++++++--------------- 5 files changed, 26 insertions(+), 43 deletions(-) diff --git a/fido2/extensions/extensions.c b/fido2/extensions/extensions.c index dd535be..4e76119 100644 --- a/fido2/extensions/extensions.c +++ b/fido2/extensions/extensions.c @@ -65,7 +65,7 @@ int16_t bridge_u2f_to_extensions(uint8_t * _chal, uint8_t * _appid, uint8_t klen u2f_response_writeback((uint8_t *)&ret,1); #ifdef IS_BOOTLOADER ret = bootloader_bridge(klen, keyh); -#else +#elif defined(WALLET_EXTENSION) ret = bridge_u2f_to_wallet(_chal, _appid, klen, keyh); #endif diff --git a/targets/stm32l442/bootloader/bootloader.h b/targets/stm32l442/bootloader/bootloader.h index 2f4c41b..8715bc4 100644 --- a/targets/stm32l442/bootloader/bootloader.h +++ b/targets/stm32l442/bootloader/bootloader.h @@ -4,7 +4,7 @@ #define DEBUG_UART USART1 -#define DEBUG_LEVEL 1 +#define DEBUG_LEVEL 0 #define NON_BLOCK_PRINTING 0 diff --git a/targets/stm32l442/bootloader/main.c b/targets/stm32l442/bootloader/main.c index 0d1d48a..3bee9f5 100644 --- a/targets/stm32l442/bootloader/main.c +++ b/targets/stm32l442/bootloader/main.c @@ -166,6 +166,7 @@ int main(int argc, char * argv[]) if (REBOOT_FLAG) { + delay(250); device_reboot(); } } diff --git a/targets/stm32l442/src/device.c b/targets/stm32l442/src/device.c index df0a73d..01417c5 100644 --- a/targets/stm32l442/src/device.c +++ b/targets/stm32l442/src/device.c @@ -102,7 +102,7 @@ void delay(uint32_t ms) } void device_reboot() { - + NVIC_SystemReset(); } void device_init() { @@ -586,7 +586,8 @@ int bootloader_bridge(uint8_t klen, uint8_t * keyh) switch(req->op){ case BootWrite: printf1(TAG_BOOT, "BootWrite: %08lx\r\n",(uint32_t)ptr); - if ((uint32_t)ptr < APPLICATION_START_ADDR || (uint32_t)ptr >= APPLICATION_END_ADDR) + if ((uint32_t)ptr < APPLICATION_START_ADDR || (uint32_t)ptr >= APPLICATION_END_ADDR + || ((uint32_t)ptr+req->len) > APPLICATION_END_ADDR) { printf1(TAG_BOOT,"Bound exceeded [%08lx, %08lx]\r\n",APPLICATION_START_ADDR,APPLICATION_END_ADDR); return CTAP2_ERR_NOT_ALLOWED; @@ -603,7 +604,7 @@ int bootloader_bridge(uint8_t klen, uint8_t * keyh) exit(1); } - flash_write((uint32_t)ptr,payload, req->len + (req->len%4)); + flash_write((uint32_t)ptr,payload, req->len); break; case BootDone: printf1(TAG_BOOT, "BootDone: "); diff --git a/web/js/wallet.js b/web/js/wallet.js index 639def4..b1be149 100644 --- a/web/js/wallet.js +++ b/web/js/wallet.js @@ -386,9 +386,7 @@ function send_msg_u2f(data, func, timeout) { appId: appid }; - console.log('sign attempt'); window.u2f.sign(appid,chal,[key], function(res){ - console.log('res',res); var d2 = new Date(); t2 = d2.getTime(); if (!res.signatureData) @@ -1087,7 +1085,6 @@ async function handleFirmware(files) console.log('addr ',addr.value + i); p = await dev.bootloader_write(addr.value + i, chunk); - console.log('writing',p); TEST(p.status == 'CTAP1_SUCCESS', 'Device wrote data'); var progress = (((i/data.length) * 100 * 100) | 0)/100; document.getElementById('progress').textContent = ''+progress+' %'; @@ -1427,7 +1424,8 @@ async function run_tests() { async function test_bootloader() { - var addr = 0x4000; + var start = 0x8000; + var size = 186 * 1024 - 8; var num_pages = 64; var p = await dev.is_bootloader(); @@ -1438,63 +1436,46 @@ async function run_tests() { p = await dev.bootloader_write(0, randdata); TEST(p.status == 'CTAP2_ERR_NOT_ALLOWED', 'Denies accessing invalid address'); - p = await dev.bootloader_write(addr-4, randdata); + p = await dev.bootloader_write(start-4, randdata); TEST(p.status == 'CTAP2_ERR_NOT_ALLOWED', 'Denies accessing invalid address'); - p = await dev.bootloader_write(2048 * (num_pages-3)-4, randdata); + p = await dev.bootloader_write(start, randdata); + TEST(p.status == 'CTAP1_SUCCESS', 'Allows write to beginning'); + + p = await dev.bootloader_write(start + size-16, randdata); + TEST(p.status == 'CTAP1_SUCCESS', 'Allows write to end'); + + p = await dev.bootloader_write(start + size-8, randdata); + TEST(p.status == 'CTAP2_ERR_NOT_ALLOWED', 'Denies overflow'); + + p = await dev.bootloader_write(start + size, randdata); TEST(p.status == 'CTAP2_ERR_NOT_ALLOWED', 'Denies accessing invalid address'); - p = await dev.bootloader_write(2048 * (num_pages-2), randdata); + p = await dev.bootloader_write(start + size + 1024, randdata); TEST(p.status == 'CTAP2_ERR_NOT_ALLOWED', 'Denies accessing invalid address'); - p = await dev.bootloader_write(2048 * (num_pages+1), randdata); + p = await dev.bootloader_write(start + size + 1024*10, randdata); TEST(p.status == 'CTAP2_ERR_NOT_ALLOWED', 'Denies accessing invalid address'); - - p = await get_firmware_http(); - var sig = websafe2array(p.signature); - var badsig = websafe2array(p.signature); + var badsig = new Uint8Array(64); badsig[40] = badsig[40] ^ 1; - var blocks = MemoryMap.fromHex(p.firmware); - var addresses = blocks.keys(); - - var addr = addresses.next(); - var chunk_size = 244; - while(!addr.done) { - var data = blocks.get(addr.value); - var i; - for (i = 0; i < data.length; i += chunk_size) { - var chunk = data.slice(i,i+chunk_size); - p = await dev.bootloader_write(addr.value + i, chunk); - TEST(p.status == 'CTAP1_SUCCESS', 'Device wrote data'); - var progress = (((i/data.length) * 100 * 100) | 0)/100; - document.getElementById('progress').textContent = ''+progress+' %'; - } - - addr = addresses.next(); - } - p = await dev.bootloader_finish(badsig); TEST(p.status == 'CTAP2_ERR_OPERATION_DENIED', 'Device rejected new image with bad signature'); - p = await dev.bootloader_finish(sig); - TEST(p.status == 'CTAP1_SUCCESS', 'Device booted new image with correct signature'); - - document.getElementById('progress').textContent = ''+100+' %'; } //while(1) { - await device_start_over(); + // await device_start_over(); //await test_pin(); - await test_crypto(); + // await test_crypto(); //await test_rng(); } //await benchmark(); //await test_persistence(); - //await test_bootloader(); + await test_bootloader(); }