Deutsch English

Verschlüsselte Dateien flashen

Zum Flashen von verschlüsselten Dateien muss der Schlüssel innerhalb des roloFlash gespeichert werden. Damit dieser nicht von einem anderen Skript auf einer SD-Karte ausgelesen kann, muß auch das auszuführende Skript innerhalb des roloFlash gespeichert und ausgeführt werden.

Dazu empfehlen wir folgenden Ablauf:

1. Verschlüsseln der zu flashenden Daten

Zwar können die Daten auch am PC verschlüsselt werden, allerdings bietet sich hier die Verschlüsselung mit roloFlash an, weil Sie somit sicher sein können, daß Ver- und Entschlüsselung 100%ig zueinander passen. Daher wird hier die Verschlüsselung mit roloFlash demonstriert.

Kopieren Sie ihre zu flashenden Daten auf die SD-Karte und ändern gegebenenfalls noch den Dateinamen, so das er dem 8.3-Format entspricht (z. B. NAME5678.HEX). Wir verwendet ab nun in dieser Dokumentation den Namen “FLASH.HEX”.

Unter ENCRYPT_DATA.BAS befindet sich ein Skript zum Verschlüsseln von Dateien. Kopieren Sie dieses Skript auf die SD-Karte, benennen Sie es um in RUN_V07.BAS und passen am Anfang der Datei die Einstellungen an. ERSETZEN SIE UNBEDINGT DEN SCHLÜSSEL DURCH EIGENE GEHEIME WERTE:

plainFilename     = "FLASH.HEX"    ! Any file you want to encrypt, for a example
                                   ! a hex file.
plainFileSystem   = SDCARD         ! The filesystem of the given file.
                                   ! Can be SDCARD, FLASHVARS or FLASHDISK.
cryptedFilename   = "FLASH.CRY"    ! The name of the encrypted file to create. 
cryptedFileSystem = SDCARD         ! The filesystem of the given file.
                                   ! Can be SDCARD, FLASHVARS or FLASHDISK.
algo              = SEC_AES        ! Specify the Crypt Algorithm, here:
width             = 256            ! AES with 256 bit in CBC mode, which needs
mode              = SEC_CBC        ! an additional initialisation vector (iv)
padding           = SEC_PKCS7      ! Crypt algorthm is a blockcyper. To
                                   ! encrypt/decrpyt the padding algorithm PKCS7
                                   ! is recommended.
! A key and an initialisation vector (iv) is needed, REPLACE BY OWN KEY AND IV!
! For AES-256 a 32 Byte bey is needed.
! For CBC mode a 16 Byte initialisation vector is needed.
key               = char($b0, $cd, $18, $be, $a5, $66, $92, $49, _
                         $11, $05, $f6, $29, $34, $18, $27, $12, _
                         $90, $d0, $71, $ff, $c9, $72, $21, $c2, _
                         $e4, $d7, $de, $e9, $05, $9e, $b7, $0d, _
                         $7d, $21, $09, $40, $33, $d4, $a3, $bb, _
                         $89, $13, $bd, $54, $88, $ea, $3b, $a6, _
                         $8c, $1a, $c2, $08, $87, $5a, $9b, $01, _
                         $9a, $1d, $1d, $e5, $50, $ee, $d9, $1f) 
iv                = char($48, $09, $fc, $c2, $3f, $1d, $a8, $e0, _
                         $39, $d6, $a8, $8d, $5d, $bb, $f5, $30, _
                         $2d, $1b, $50, $bf, $57, $38, $9e, $8c, _
                         $31, $be, $81, $f0, $78, $3e, $bf, $d3)  

Rufen Sie den Compiler mit Datei compile_V07.bat auf. Es entsteht die Datei RUN_V07.BIN. Dieses muss nun auf dem roloFlash einmal ausgeführt werden. Nachdem das Skript fertig ist, leuchtet die LED 5 grün. Sie können nun die SD-Karte an den PC anschließen. Als Ergebnis ist jetzt die verschlüsselte Datei FLASH.CRY entstanden.

Speichern Sie die RUN_V07.BAS Datei, die FLASH.HEX Datei und die FLASH.CRY Datei auf Ihrem PC an einem sicheren Ort. Wir schlagen vor in einem Verzeichnis den Ordner encrypt-data anzulegen und dazu zu verwenden.

2. Testen mit unverschlüsselten Daten

Auf der SD-Karte befinden sich Vorlagen für verschiedene Controller. Suchen Sie dort eine für Ihren Controller passende Vorlage aus und kopieren Sie diese in das Hauptverzeichnis der SD-Karte. Diese Datei heißt RUN_V07.BAS.

Passen Sie den genauen Typen gemäß den Bezeichnungen aus dem Handbuch an.

Die zu flashende Datei habe Sie bereits im vorherigen Kapitel auf die SD-Karte kopiert.

Tragen Sie deren Namen in die RUN_V07.BAS ein und rufen Sie den Compiler mit Datei compile_V07.bat auf. Es entsteht die Datei RUN_V07.BIN.

Stecken Sie die SD-Karte in den roloFlash und überprüfen Sie den Flash-Vorgang mit den unverschlüsselten Daten. Wenn dies funktioniert, schließen Sie die SD-Karte an den PC an. Speichern Sie die RUN_V07.BAS-Datei und die RUN_V07.BIN-Datei auf Ihrem PC an einem sicheren Ort. Wir schlagen vor, in einem Verzeichnis den Ordner flash-uncrypted anzulegen und dazu zu verwenden.

3. Testen mit verschlüsselten Daten

Der nächste Schritt ist die Erweiterung Ihres Skripts aus dem vorherigen Kapitel zum Flashen von verschlüsselten Daten.

Dateinamen in der Konfiguration ändern:

Sie finden in Ihrem Skript am Anfang einen Block für die Konfiguration. Ändern Sie darin den Namen der zu flashenden Datei auf den Namen der verschlüsselten Datei. Zum Beispiel:

von:
flashFile = "FLASH.HEX"
zu:
flashFile = "FLASH.CRY"
Konfiguration erweitern:

Fügen Sie dem Block für die Konfiguration folgendes hinzu und passen es so an, dass es Ihren Einstellungen aus Kapitel 1 entspricht:

algo = SEC_AES      ! Specify the Crypt Algorithm, here:
width = 256         ! AES with 256 bit in CBC mode, which needs
mode = SEC_CBC      ! an additional initialisation vector (iv)
padding = SEC_PKCS7 ! Crypt algorthm is a blockcyper. To
                    ! encrypt/decrpyt the padding algorithm PKCS7
                    ! is recommended.
                    ! A key and iv is needed, REPLACE BY OWN KEY AND IV FROM CHAPTER 1!
                    ! For AES-256 a 32 Byte bey is needed.
                    ! For CBC mode a 16 Byte initialisation vector is needed.
key = char($b0, $cd, $18, $be, $a5, $66, $92, $49, _
           $11, $05, $f6, $29, $34, $18, $27, $12, _
           $90, $d0, $71, $ff, $c9, $72, $21, $c2, _
           $e4, $d7, $de, $e9, $05, $9e, $b7, $0d, _
           $7d, $21, $09, $40, $33, $d4, $a3, $bb, _
           $89, $13, $bd, $54, $88, $ea, $3b, $a6, _
           $8c, $1a, $c2, $08, $87, $5a, $9b, $01, _
           $9a, $1d, $1d, $e5, $50, $ee, $d9, $1f)
iv  = char($48, $09, $fc, $c2, $3f, $1d, $a8, $e0, _
           $39, $d6, $a8, $8d, $5d, $bb, $f5, $30, _
           $2d, $1b, $50, $bf, $57, $38, $9e, $8c, _
           $31, $be, $81, $f0, $78, $3e, $bf, $d3)
Fügen Sie folgenden Block darunter hinzu:
algoSpec = vari(algo, width, mode)
dataSpec = vari(key, iv, padding)
cryptSpec = vari(algoSpec, dataSpec)
Fügen Sie bei der eigentlichen Zeile zum Flashen die cryptSpec hinzu:
Zum Beispiel von:
target_writeFromFile targetHandle, SDCARD, flashFile, HEX, FLASH, WRITEVERIFY
zu:
target_writeFromFile targetHandle, SDCARD, flashFile, HEX, FLASH, WRITEVERIFY, cryptSpec

Rufen Sie den Compiler mit compile_V07.bat auf. Es entsteht die Datei RUN_V07.BIN.

Entfernen Sie die unverschlüsselte Datei FLASH.HEX von der SD-Karte um sicherzustellen, das diese nicht verwendet werden kann.

Jetzt können Sie die SD-Karte in den roloFlash stecken und den Flash- Vorgang mit verschlüsselten Daten überprüfen.

Wenn dieses funktioniert schließen Sie die SD-Karte an den PC an.

Speichern Sie die RUN_V07.BAS-Datei und die RUN_V07.BIN-Datei auf Ihrem PC an einem sicheren Ort. Wir schlagen vor in einem Verzeichnis den Ordner flash-crypted anzulegen und dazu zu verwenden.

4. Kopieren der RUN_V07.BIN in die FlashDisk

Erstellen Sie auf der SD-Karte einen Ordner „TO-RF“ und verschieben Sie die RUN_V07.BAS-Datei und die RUN_V07.BIN-Datei aus dem vorherigen Kapitel in diesen Ordner.

Unter COPY_TO_FLASHDISK.BAS befindet sich ein Skript um Ihre RUN_V07.BIN-Datei vom Ordner „TO-RF“ in die Flashdisk des roloFlash zu kopieren. Kopieren dieses in das Hauptverzeichnis der SD-Karte, benennen Sie es um in RUN_V07.BAS und übersetzten Sie diese mittels compile_V07.bat in die Datei RUN_V07.BIN.

Legen Sie die SD-Karte in den roloFlash und führen das mit Hilfe eines beliebigen Targets einmal aus.

5. Testen des verschlüsselten Flashens

Nehmen Sie eine frische SD-Karte um sicherzustellen, dass keine Geheimnisse vorhanden sind. Bei einem einfachen Löschen aller Daten oder Formatieren können Fragmente Ihrer Daten auf dem Datenträger verbleiben.

Kopieren Sie lediglich die Datei FLASH.CRY auf die SD-Karte. Wir hatten Ihnen dazu im Kapitel 1 vorgeschlagen diesen in einem Verzeichnis auf Ihrem PC im Ordner encrypt-data abzulegen.

Legen Sie die SD-Karte in den roloFlash und testen Sie den Ablauf. Wenn alles funktioniert können Sie diesen roloFlash mit der SD-Karte weitergeben.

Anhang 1: Skript für encrypt-data

#roloFlash 2, v07.*

! ***************************************************************************
! *
! *  Sample script for encrypt any file
! *
! *  Copyright (C) 2009-2025 by halec embedded solutions
! *
! ***************************************************************************


! For all files on the microSD card, the following applies:
!  - File name has to be in 8.3 format
!  - File name must contain only CAPITAL LETTERS
!  - (see manual, chapter "Files")


! *** Please adapt to your requirements! ***


plainFilename     = "FLASH.HEX"    ! Any file you want to encrypt, for a example
                                   ! a hex file.
plainFileSystem   = SDCARD         ! The filesystem of the given file.
                                   ! Can be SDCARD, FLASHVARS or FLASHDISK.
cryptedFilename   = "FLASH.CRY"    ! The name of the encrypted file to create.            
cryptedFileSystem = SDCARD         ! The filesystem of the given file.
                                   ! Can be SDCARD, FLASHVARS or FLASHDISK.
algo              = SEC_AES        ! Specify the Crypt Algorithm, here:
width             = 256            ! AES with 256 bit in CBC mode, which needs
mode              = SEC_CBC        ! an additional initialisation vector (iv)
padding           = SEC_PKCS7      ! Crypt algorthm is a blockcyper. To
                                   ! encrypt/decrpyt the padding algorithm PKCS7
                                   ! is recommended.

! A key and an initialisation vector (iv) is needed, REPLACE BY OWN KEY AND IV!
! For AES-256 a 32 Byte bey is needed.
! For CBC mode a 16 Byte initialisation vector is needed.
key               = char($b0, $cd, $18, $be, $a5, $66, $92, $49, _
                         $11, $05, $f6, $29, $34, $18, $27, $12, _
                         $90, $d0, $71, $ff, $c9, $72, $21, $c2, _
                         $e4, $d7, $de, $e9, $05, $9e, $b7, $0d, _
                         $7d, $21, $09, $40, $33, $d4, $a3, $bb, _
                         $89, $13, $bd, $54, $88, $ea, $3b, $a6, _
                         $8c, $1a, $c2, $08, $87, $5a, $9b, $01, _
                         $9a, $1d, $1d, $e5, $50, $ee, $d9, $1f) 
iv                = char($48, $09, $fc, $c2, $3f, $1d, $a8, $e0, _
                         $39, $d6, $a8, $8d, $5d, $bb, $f5, $30, _
                         $2d, $1b, $50, $bf, $57, $38, $9e, $8c, _
                         $31, $be, $81, $f0, $78, $3e, $bf, $d3) 




! Green running light from LED 1 to LED 2 -> symbolizes script processing
! (LED 5 is kept free for display of "Done")
led_runningLight 1, 2, COLOR_GREEN, 200


! ---- Preparations ----
! Delete old log file, if present
!
f = "LOG.TXT"
if fs_fileExists(0,f)
  fs_remove 0, f
endif


! Write software version of roloFlash and script name to LOG.TXT
print "softwareVersion=", sys_softwareVersion, "\r\n"
print "Running script copied from scripts/secureApi/ENCRYPT.BAS\r\n"

!
! ---- A general purpose file encrypt/decrpyt procedure ----
!
procedure copyFileSEC fsSrc, filenameSrc, fsDst, filenameDst, cryptSpec, doEncrypt
  fileSizeSrc = fs_fileSize(fsSrc, filenameSrc)
  src = fs_open(fsSrc, filenameSrc)
  for pass = 0 to 1
    if pass = 0
      pass = 1
      if fsDst <> SDCARD
        if doEncrypt
          fileSizeDst = (fileSizeSrc and $fffffff0) + 16
        elseif cryptSpec[0][2] = SEC_ECB
          filePos = fileSizeSrc - 16
          a = fs_read(src, filePos, 16)
          sec_decrypt a, cryptSpec, SEC_SINGLEBLOCK
          fileSizeDst = filePos + size(a)
        else
          pass = 0        
        endif
      endif
    endif      
    if pass = 1
      if fsDst = SDCARD
        fs_create fsDst, filenameDst
      else  
        fs_create fsDst, filenameDst, fileSizeDst
      endif
      dst = fs_open(fsDst, filenameDst)
    endif
    blockSize = 8192
    filePos = 0
    do while filePos < filesizeSrc > 0
      mySize = blockSize
      if mySize > filesizeSrc - filePos
        mySize = filesizeSrc - filePos
      endif
      a = fs_read(src, filePos, mySize)
      if filesizeSrc <= blockSize
        opState = SEC_SINGLEBLOCK
      elseif filePos = 0
        opState = SEC_FIRSTBLOCK
      elseif mySize >= filesizeSrc - filePos
        opState = SEC_LASTBLOCK
      else
        opState = SEC_NEXTBLOCK
      endif
      if doEncrypt
        sec_encrypt a, cryptSpec, opState  
      else  
        sec_decrypt a, cryptSpec, opState    
      endif
      if pass = 1
        fs_write dst, filePos, a
      endif  
      filePos = filePos + mySize
    loop
    if pass = 0
      fileSizeDst = fileSizeSrc - 16 + size(a)
    endif  
  next
  fs_close dst
  fs_close src
end


!
! Build cryptSpec and encrypt
! 
algoSpec  = vari(algo, width, mode)
dataSpec  = vari(key, iv, padding)
cryptSpec = vari(algoSpec, dataSpec)


copyFileSEC plainFileSystem, plainFilename, cryptedFileSystem, cryptedFilename, cryptSpec, 1


! ---- Check for possibly occurred exceptions, write           ----
! ---- evaluation to log file and signal it via LEDs           ----
catch exception
print "Duration [ms]: ", sys_getSystemTime(), "\r\n"
catch dummyException  ! If the last print throws an exception
if exception <> 0
  ! There has been an error, record the error in  LOG.TXT
  print "ERROR: Exception ", exception
  ! Throw exception again, after it has been caught. As a result, the number
  ! of the exception gets displayed via LED blink codes. The blink codes
  ! are documented in the manual, chapter "Meaning of LED Codes", subchapter
  ! "Exception has Occurred"
  throw exception
else
  ! No errors: write to log file and switch LED 5 to green
  print "Script ran successfully.\r\n"
  led_on 5, COLOR_GREEN
endif

Anhang 2: Skript um eine RUN_V07.BIN in die FlashDisk zu kopieren

#roloFlash 2, v07+

! ***************************************************************************
! *
! *  script for copying:
! *  from: SD-card /TO_RF/RUN_V07.BIN
! *  to:   roloFlash flashDisk RUN_V07.BIN
! *
! *  Copyright (C) 2009-2025 by halec embedded solutions
! *
! ***************************************************************************

! Green running light from LED 1 to LED 4 -> symbolizes script processing
! (Data transfer direction: write)
! (LED 5 is kept free for display of "Done")
led_runningLight 1, 4, COLOR_GREEN, 200

! ---- Preparations ----
! Delete old log file, if present
f = "LOG.TXT"
if fs_fileExists(0,f)
  fs_remove 0, f
endif

procedure copyFile fsSrc, filenameSrc, fsDst, filenameDst
  dataSize = fs_fileSize(fsSrc, filenameSrc)
  fs_create fsDst, filenameDst, dataSize
  src = fs_open(fsSrc, filenameSrc)
  dst = fs_open(fsDst, filenameDst)
  blockSize = 512
  filePos = 0
  do while dataSize > 0
    mySize = blockSize
    if mySize > dataSize
      mySize = dataSize
    endif
    a = fs_read(src, filePos, mySize)
    fs_write dst, filePos, a
    filePos = filePos + mySize
    dataSize = dataSize - mySize
  loop  
  fs_close dst
  fs_close src
end


! -- copy "RUN_V07.BIN" from SD-card (folder TO_RF) to FlashDisk (root folder):
copyFile SDCARD, "TO_RF/RUN_V07.BIN", FLASHDISK, "RUN_V07.BIN"

! ---- Check for possibly occurred exceptions, write           ----
! ---- evaluation to log file and signal it via LEDs           ----
catch exception
print "Duration [ms]: ", sys_getSystemTime(), "\r\n"
catch dummyException  ! If the last print throws an exception
if exception <> 0
  ! There has been an error, record the error in  LOG.TXT
  print "ERROR: Exception ", exception
  ! Throw exception again, after it has been caught. As a result, the number
  ! of the exception gets displayed via LED blink codes. The blink codes
  ! are documented in the manual, chapter "Meaning of LED Codes", subchapter
  ! "Exception has Occurred"
  throw exception
else
  ! No errors: write to log file and switch LED 5 to green
  print "Script ran successfully.\r\n"
  led_on 5, COLOR_GREEN
endif