diff --git a/fido2/ctaphid.c b/fido2/ctaphid.c index e815dd65..f051d828 100644 --- a/fido2/ctaphid.c +++ b/fido2/ctaphid.c @@ -542,6 +542,9 @@ extern void _check_ret(CborError ret, int line, const char * filename); uint8_t ctaphid_custom_command(int len, CTAP_RESPONSE * ctap_resp, CTAPHID_WRITE_BUFFER * wb); + +extern void solo_lock_if_not_already(); + uint8_t ctaphid_handle_packet(uint8_t * pkt_raw) { uint8_t cmd = 0; @@ -762,6 +765,16 @@ uint8_t ctaphid_custom_command(int len, CTAP_RESPONSE * ctap_resp, CTAPHID_WRITE return 1; break; + // Remove on next release +#if !defined(IS_BOOTLOADER) && defined(SOLO) + case 0x99: + solo_lock_if_not_already(); + wb->bcnt = 0; + ctaphid_write(wb, NULL, 0); + return 1; + break; +#endif + #if !defined(IS_BOOTLOADER) && (defined(SOLO_EXPERIMENTAL)) case CTAPHID_LOADKEY: /** diff --git a/targets/stm32l432/src/device.c b/targets/stm32l432/src/device.c index 1a83ebc5..b04a640f 100644 --- a/targets/stm32l432/src/device.c +++ b/targets/stm32l432/src/device.c @@ -199,6 +199,20 @@ int solo_is_locked(){ return tag == ATTESTATION_CONFIGURED_TAG && (device_settings & SOLO_FLAG_LOCKED) != 0; } +// Locks solo flash from debugging. Locks on next reboot. +// This should be removed in next Solo release. +void solo_lock_if_not_already() { + uint8_t buf[2048]; + + memmove(buf, (uint8_t*)ATTESTATION_PAGE_ADDR, 2048); + + ((flash_attestation_page *)buf)->device_settings |= SOLO_FLAG_LOCKED; + + flash_erase_page(ATTESTATION_PAGE); + + flash_write(ATTESTATION_PAGE_ADDR, buf, 2048); +} + /** device_migrate * Depending on version of device, migrates: * * Moves attestation certificate to data segment.