Estude Microcontroladores e Programação
Olá Prof°...
Aprenda a como proteger a memória flash do ESP32 contra leitura ou atualizações.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# Procedimento para Criptografia da Flash Interna do ESP32 ''' ATENÇÃO: Este procedimento deverá ser utilizado quando seu projeto estiver pronto e você desejar colocá-lo em produção. Este procedimento garante que a partição "app" e o "fimware do bootloader" sejam criptografados, porém outras possíveis partições existentes permanecerão desprotegida, como por exemplo a NVS. ATENÇÃO: A proteção da flash é irreversível, ou seja, caso algo ocorra errado você vai perder seu kit!!! Portanto, tenha certeza que deseja proteger o ESP32. ATENÇÃO: Os procedimentos a seguir foram extraidas do site oficial da Espressif conforme o site: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/security/flash-encryption.html#reflashing-via-pregenerated-flash-encryption-key Recomendo que leia atentamente todo o site (link acima) antes de realizar o procedimento abaixo. ''' # Instala o conjunto de programas de gravação (esptool, espefuse e espsecure...) $ pip install esptool # Apresenta os status dos fusíveis de proteção do ESP32; $ espefuse.py --port "COM8" summary # 1° PRIMEIRO PASSO: # mantenha DESABILITADA a opção make menuconfig -> security options -> enable encryption on boot # compile o projeto por meio do comando make; # Atenção: Na saída de log do console, certifique-se qual o valor de offset do setor de memória no qual foi reservado para # sua aplicação (app). # # Exemplo: # Ao executar o comando "make all" na saída do console você verá a mensagem a seguir: # python /home/USER/esp/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32 --port COM8 --baud 115200 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 /home/USER/esp/esp-idf/examples/get-started/hello_world/build/bootloader/bootloader.bin 0x10000 /home/USER/esp/esp-idf/examples/get-started/hello_world/build/hello-world.bin 0x8000 /home/USER/esp/esp-idf/examples/get-started/hello_world/build/partitions_singleapp.bin # Veja que o endereço de offset do projeto Hello-World tem o valor 0x10000. Este valor de offset será utilizado em breve. $ make all # 2° PASSO: # Gere a chave ".bin" que será armazenada no setor de proteção de flash interna do ESP32 (BLK1); # Key.bin é o nome da chave que se deseja criar. Altere o nome conforme sua necessidade. $ espsecure.py generate_flash_encryption_key "C:\msys32\home\Fernando\esp\esp-idf\examples\outros\COSMOS_RF1-A\key.bin" # 3° PASSO: # Grave a chave "key.bin" no setor BLK1 do ESP32 # altere a porta COM8 de acordo com a porta de comunicação com o ESP32. $ espefuse.py --port COM8 burn_key flash_encryption "C:\msys32\home\Fernando\esp\esp-idf\examples\outros\COSMOS_RF1-A\key.bin" # Enabling Flash Encryption mechanism $ espefuse.py --port COM8 burn_key FLASH_CRYPT_CNT # Configuring Flash Encryption to use all address bits together with Encryption key (max value 0x0F) $ espefuse.py --port COM8 burn_efuse FLASH_CRYPT_CONFIG 0X0F # Opcional: Caso queira verificar se os fusíveis foram alterados, utilize o comando a seguir. #$ espfuse.py --port COM8 summary #Os campos WR_DIS e RD_DIS passaram a assumir valores diferentes de zero. # 4° PASSO: # Faça a criptografia do arquivo "hello-world.bin" do seu projeto (após a compilação) utilizando a chave "key.bin" # onde 0x10000 corresponde ao endereço de offset do programa Hello-World encontrado no 1° PASSO. # Verifique que será criado um arquivo chamado "hello-world-encrypted.bin" no mesmo diretório do projeto. # Além da aplicação a partição e bootloader precisam ser criptografados. $ espsecure.py encrypt_flash_data --keyfile "C:\msys32\home\Fernando\esp\esp-idf\examples\outros\COSMOS_RF1-A\key.bin" --address 0x10000 -o "C:\msys32\home\Fernando\esp\esp-idf\examples\outros\COSMOS_RF1-A\build\m1-encrypted.bin" "C:\msys32\home\Fernando\esp\esp-idf\examples\outros\COSMOS_RF1-A\build\m1.bin" $ espsecure.py encrypt_flash_data --keyfile "C:\msys32\home\Fernando\esp\esp-idf\examples\outros\COSMOS_RF1-A\key.bin" --address 0x8000 -o "C:\msys32\home\Fernando\esp\esp-idf\examples\outros\COSMOS_RF1-A\build\partitions_singleapp-encrypted.bin" "C:\msys32\home\Fernando\esp\esp-idf\examples\outros\COSMOS_RF1-A\build\partitions_singleapp.bin" $ espsecure.py encrypt_flash_data --keyfile "C:\msys32\home\Fernando\esp\esp-idf\examples\outros\COSMOS_RF1-A\key.bin" --address 0x1000 -o "C:\msys32\home\Fernando\esp\esp-idf\examples\outros\COSMOS_RF1-A\build\bootloader\bootloader-encrypted.bin" "C:\msys32\home\Fernando\esp\esp-idf\examples\outros\COSMOS_RF1-A\build\bootloader\bootloader.bin" # 5° PASSO: # Por meio do programa msys32.exe faça a gravação do ESP32 carregando o novo programa criptografado "hello-world-encrypted.bin". # Altere o nome "USER" pelo usuário em seu computador. # Caso queira gravar apenas o programa criptografado "hello-world-encrypted.bin" use o comando abaixo. # Porém, o programa de bootloader e demais partições precisam ser gravados também no ESP32. #$ esptool.py --port COM8 write_flash 0x10000 "C:\msys32\home\Fernando\esp\esp-idf\examples\outros\COSMOS_RF1-A\build\m1-encrypted.bin" # Use o comando abaixo. $ python /home/Fernando/esp/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32 --port COM8 --baud 115200 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 "C:\msys32\home\Fernando\esp\esp-idf\examples\outros\COSMOS_RF1-A\build\bootloader\bootloader-encrypted.bin" 0x10000 "C:\msys32\home\Fernando\esp\esp-idf\examples\outros\COSMOS_RF1-A\build\m1-encrypted.bin" 0x8000 "C:\msys32\home\Fernando\esp\esp-idf\examples\outros\COSMOS_RF1-A\build\partitions_singleapp-encrypted.bin" # 6° PASSO: # Certifique que o fusível de proteção FLASH_CRYPT_CNT esteja com o valor 1. $ espefuse.py --port "COM8" summary # 7° PASSO: # Desligue e ligue novamente seu kit ESP32. # Caso a mensagem "Flash encryption Enable" aparecer na saída do console é porque a criptografia foi realizada com sucesso. # caso contrário (...) houve algum erro durante a execução dos procedimentos. Caso queira repetir o procedimento você terá # que ter outro ESP32 em mãos, pois o sistema de criptografia é irreversível. //////////////////////////////////////////////// #include "esp_flash_encrypt.h" if( esp_flash_encryption_enabled() ) { printf("\r\nStatus: Encryption Enabled\n"); } //////////////////////////////////////////////// |
Olá,
Não é 100% seguro. Todos os ESP32 anteriores ao V3 são sucetíveis a um ataque de fault injection. Melhor atualizar o vídeo.
https://www.espressif.com/en/news/Security_Advisory_Concerning_Fault_Injection_and_eFuse_Protections