#define BOOTSTUB #include "config.h" #include "obj/gitversion.h" #ifdef STM32F4 #define PANDA #include "stm32f4xx.h" #include "stm32f4xx_hal_gpio_ex.h" #else #include "stm32f2xx.h" #include "stm32f2xx_hal_gpio_ex.h" #endif #include "libc.h" #include "provision.h" #include "drivers/drivers.h" #include "drivers/llgpio.h" #include "gpio.h" #include "drivers/spi.h" #include "drivers/usb.h" //#include "drivers/uart.h" int puts(const char *a) { return 0; } void puth(unsigned int i) {} #include "crypto/rsa.h" #include "crypto/sha.h" #include "obj/cert.h" #include "spi_flasher.h" void __initialize_hardware_early() { early(); } void fail() { soft_flasher_start(); } // know where to sig check extern void *_app_start[]; int main() { __disable_irq(); clock_init(); detect(); if (revision == PANDA_REV_C) { set_usb_power_mode(USB_POWER_CLIENT); } if (enter_bootloader_mode == ENTER_SOFTLOADER_MAGIC) { enter_bootloader_mode = 0; soft_flasher_start(); } // validate length int len = (int)_app_start[0]; if ((len < 8) || (len > (0x1000000 - 0x4000 - 4 - RSANUMBYTES))) goto fail; // compute SHA hash uint8_t digest[SHA_DIGEST_SIZE]; SHA_hash(&_app_start[1], len-4, digest); // verify RSA signature if (RSA_verify(&release_rsa_key, ((void*)&_app_start[0]) + len, RSANUMBYTES, digest, SHA_DIGEST_SIZE)) { goto good; } // allow debug if built from source #ifdef ALLOW_DEBUG if (RSA_verify(&debug_rsa_key, ((void*)&_app_start[0]) + len, RSANUMBYTES, digest, SHA_DIGEST_SIZE)) { goto good; } #endif // here is a failure fail: fail(); return 0; good: // jump to flash ((void(*)()) _app_start[1])(); return 0; }