

# Génération du fichier de mise à jour du micrologiciel et de la signature
<a name="lorawan-script-fwupdate-sigkey"></a>

Les étapes de cette procédure sont facultatives et dépendent de la passerelle que vous utilisez. Les fabricants de passerelles fournissent leur propre mise à jour du micrologiciel sous la forme d’un fichier de mise à jour ou d’un script et Basics Station exécute ce script en arrière-plan. Dans ce cas, vous trouverez probablement le fichier de mise à jour du micrologiciel dans les notes de version de la passerelle que vous utilisez. Vous pouvez ensuite utiliser ce fichier ou script de mise à jour à la place et passer à [Téléchargement du fichier du micrologiciel vers un compartiment S3 et ajout d’un rôle IAM](lorawan-upload-firmware-s3bucket.md).

Si vous ne disposez pas de ce script, voici les commandes à exécuter pour générer le fichier de mise à jour du micrologiciel. Les mises à jour peuvent également être signées pour garantir que le code n’a pas été modifié ou corrompu et que les appareils exécutent du code publié uniquement par des auteurs fiables.

**Topics**
+ [Générer le fichier de mise à jour du micrologiciel](#lorawan-firmware-update-script)
+ [Générer une signature pour la mise à jour du micrologiciel](#lorawan-generate-signature-fwupdate)
+ [Passer en revue les étapes suivantes](#lorawan-fwupdate-sigkey-next-steps)

## Générer le fichier de mise à jour du micrologiciel
<a name="lorawan-firmware-update-script"></a>

Le logiciel LoRa Basics Station exécuté sur la passerelle est capable de recevoir des mises à jour du micrologiciel dans la réponse CUPS. Si vous n’avez pas de script fourni par le fabricant, reportez-vous au script de mise à jour du micrologiciel suivant, écrit pour la passerelle sans fil RAKWireless basée sur le Raspberry Pi. Nous avons un script de base et le nouveau binaire de la station, le fichier de version, et `station.conf` sont attachés à celui-ci.

**Note**  
Le script est spécifique à la passerelle RAKWireless, vous devrez donc l’adapter à votre application en fonction de la passerelle que vous utilisez.

**Script de base**  
Vous trouverez ci-dessous un exemple de script de base pour la passerelle sans fil RAKWireless basée sur le Raspberry Pi. Vous pouvez enregistrer les commandes suivantes dans un fichier `base.sh`, puis exécuter le script dans le terminal sur le navigateur Web du Raspberry Pi.

```
*#!/bin/bash*
execution_folder=/home/pi/Documents/basicstation/examples/aws_lorawan
station_path="$execution_folder/station"
version_path="$execution_folder/version.txt"
station_conf_path="$execution_folder/station_conf"

# Function to find the Basics Station binary at the end of this script 
# and store it in the station path
function prepare_station()
{
 match=$(grep --text --line-number '^STATION:$' $0 | cut -d ':' -f 1) 
 payload_start=$((match + 1)) 
 match_end=$(grep --text --line-number '^END_STATION:$' $0 | cut -d ':' -f 1) 
 payload_end=$((match_end - 1)) 
 lines=$(($payload_end-$payload_start+1)) 
 head -n $payload_end $0 | tail -n $lines  > $station_path
}

# Function to find the version.txt at the end of this script 
# and store it in the location for version.txt
function prepare_version()
{
  match=$(grep --text --line-number '^VERSION:$' $0 | cut -d ':' -f 1) 
  payload_start=$((match + 1))        
  match_end=$(grep --text --line-number '^END_VERSION:$' $0 | cut -d ':' -f 1) 
  payload_end=$((match_end - 1)) 
  lines=$(($payload_end-$payload_start+1)) 
  head -n $payload_end $0 | tail -n $lines  > $version_path
}

# Function to find the version.txt at the end of this script 
# and store it in the location for version.txt
function prepare_station_conf()
{
 match=$(grep --text --line-number '^CONF:$' $0 | cut -d ':' -f 1) 
 payload_start=$((match + 1)) 
 match_end=$(grep --text --line-number '^END_CONF:$' $0 | cut -d ':' -f 1) 
 payload_end=$((match_end - 1)) 
 lines=$(($payload_end-$payload_start+1)) 
 head -n $payload_end $0 | tail -n $lines  > $station_conf_path
}

# Stop the currently running Basics station so that it can be overwritten
# by the new one
killall station

# Store the different files
prepare_station
prepare_versionp
prepare_station_conf

# Provide execute permission for Basics station binary
chmod +x $station_path

# Remove update.bin so that it is not read again next time Basics station starts
rm -f /tmp/update.bin

# Exit so that rest of this script which has binaries attached does not get executed
exit 0
```

**Ajouter un script de charge utile**  
Au script de base, nous ajoutons le binaire Basics Station, le fichier version.txt qui identifie la version à mettre à jour, et `station.conf` dans un script appelé `addpayload.sh`. Exécutez ensuite ce script.

```
*#!/bin/bash
*
base.sh > fwstation

# Add station
echo "STATION:" >> fwstation
cat $1 >> fwstation
echo "" >> fwstation
echo "END_STATION:" >> fwstation

# Add version.txt
echo "VERSION:" >> fwstation
cat $2 >> fwstation
echo "" >> fwstation
echo "END_VERSION:" >> fwstation

# Add station.conf
echo "CONF:" >> fwstation
cat $3 >> fwstation
echo "END_CONF:" >> fwstation

# executable
chmod +x fwstation
```

Après avoir exécuté ces scripts, vous pouvez exécuter la commande suivante dans le terminal pour générer le fichier de mise à jour du micrologiciel, `fwstation`.

```
$ ./addpayload.sh station version.txt station.conf
```

## Générer une signature pour la mise à jour du micrologiciel
<a name="lorawan-generate-signature-fwupdate"></a>

Le logiciel LoRa Basics Station fournit des mises à jour du micrologiciel signées avec des signatures ECDSA. Pour prendre en charge les mises à jour signées, vous avez besoin des éléments suivants :
+ Signature qui doit être générée par une clé privée ECDSA et inférieure à 128 octets. 
+ La clé privée qui est utilisée pour la signature et doit être stockée dans la passerelle avec le nom de fichier au format `sig-%d.key`. Nous vous recommandons d’utiliser le nom du fichier `sig-0.key`.
+ Un CRC 32 bits sur la clé privée.

La signature et le CRC seront transmis aux API AWS IoT Core for LoRaWAN. Pour générer les fichiers précédents, vous pouvez utiliser le script `gen.sh` suivant, inspiré de l’exemple de [basicstation](https://github.com/lorabasics/basicstation/blob/master/examples/cups/prep.sh) du référentiel GitHub.

```
*#!/bin/bash

*function ecdsaKey() {
    # Key not password protected for simplicity    
    openssl ecparam -name prime256v1 -genkey | openssl ec -out $1
}

# Generate ECDSA key
ecdsaKey sig-0.prime256v1.pem

# Generate public key
openssl ec -in sig-0.prime256v1.pem -pubout -out sig-0.prime256v1.pub

# Generate signature private key
openssl ec -in sig-0.prime256v1.pub -inform PEM -outform DER -pubin | tail -c 64 > sig-0.key

# Generate signature
openssl dgst -sha512 -sign sig-0.prime256v1.pem $1 > sig-0.signature

# Convert signature to base64
openssl enc -base64 -in sig-0.signature -out sig-0.signature.base64

# Print the crc
crc_res=$(crc32 sig-0.key)printf "The crc for the private key=%d\n" $((16#$crc_res))

# Remove the generated files which won't be needed later
rm -rf sig-0.prime256v1.pem sig-0.signature sig-0.prime256v1.pub
```

La clé privée générée par le script doit être enregistrée dans la passerelle. Le fichier clé est au format binaire.

```
./gen_sig.sh fwstation 
read EC key
writing EC key
read EC key
writing EC key
read EC key
writing EC key
The crc for the private key=3434210794

$ cat sig-0.signature.base64 
MEQCIDPY/p2ssgXIPNCOgZr+NzeTLpX+WfBo5tYWbh5pQWN3AiBROen+XlIdMScv
AsfVfU/ZScJCalkVNZh4esyS8mNIgA==

$ ls sig-0.key
sig-0.key

$ scp sig-0.key pi@192.168.1.11:/home/pi/Documents/basicstation/examples/iotwireless
```

## Passer en revue les étapes suivantes
<a name="lorawan-fwupdate-sigkey-next-steps"></a>

Maintenant que vous avez généré le micrologiciel et la signature, passez à la rubrique suivante pour télécharger le fichier du micrologiciel dans un compartiment Amazon S3 `fwstation`. Le compartiment est un conteneur qui stockera le fichier de mise à jour du micrologiciel sous forme d’objet. Vous pouvez ajouter un rôle IAM qui autorisera le serveur CUPS à lire le fichier de mise à jour du micrologiciel dans le compartiment S3. 