---
# System prepended metadata

title: Sécurité Matérielle

---

# Sécurité Matérielle

### 1. SPA-like attacks - timing

Manipulation : 
Retrouver les valeurs 0|1 d'un secret en distinguant (1 x nop10) vs (2 x nop10). Si (2 x nop10), d'après le code, le bit secret est 1.


Programme chargé : 

```c=
#define LED         5
#define TRIGGER     0    
#define TX          1

#define nop __asm__ __volatile__ ("nop\n\t")
#define nop10 nop; nop; nop; nop; nop; nop; nop; nop; nop; nop;

#define N 8

unsigned int secret[N] = {0, 1, 1, 0, 1, 0, 0, 1};

int main(void)
{
   unsigned char i; 

   setup();

   while (1)
   {
      PORTB = PORTB ^ (1<< TRIGGER); 
      for (i=0 ; i<N ; i++)
      {
         PORTB = PORTB ^ (1<< TX); 
         PORTB = PORTB ^ (1<< TX); 
         nop10;
         if (secret[i] == 1)
         {
            nop10;
         }
      }
      PORTB = PORTB ^ (1<< TRIGGER); 
      nop10;
    }
    return(0);
}
```

L'objectif de ce scénario est de retrouver un secret défini grâce à une identification de la durée d'une série d'opérations. Dans un premier temps, la série d'opération `nop10` est exécutée. Ensuite, on exécute dans une boucle une nouvelle série `nop10` si le bit du secret itéré est égal à 1. Si le bit = 0, un signal est généré pour permettre la dissociation de la fin de l'itération.

On a donc une période *SIGNAL - NOP10 - SIGNAL* si le bit comparé = 0 et *SIGNAL - NOP10 - NOP10 - SIGNAL*. 

Sur la trace réalisée, il est possible de distinuger ces 2 phases, détermninant ainsi la valeur du secret : 


schema-description

### 2. SPA-like attacks - operators

Objectif : différencier deux opérations MUL et NOP

```c=

#define nop10 nop; nop; nop; nop; nop; nop; nop; nop; nop; nop;
#define nop5 nop; nop; nop; nop; nop;


#define mul1 __asm__ __volatile__ ("mul r20, r21\n\t")
#define mul2 __asm__ __volatile__ ("mul r17, r18\n\t")
#define mul5 mul1; mul2; mul1; mul2; mul1;

int main(void)
{
    setup();
    while (1)
    {
        PORTB = PORTB ^ (1<< TRIGGER); 

        mul5; nop5; mul5; nop5; mul5; nop5; mul5;

        PORTB = PORTB ^ (1<< TRIGGER);
        nop10;
    }
    return(0);
}
```

Dans ce scénario, le programme chargé va nous permettre d'identifier une différence de consommation lors de l'exécution d'opérations, dont une requierant moins d'énergie que l'autre :

4 opérations sont ainsi définies : 
- **mul5** : un enchainement de multiplications **mul1** et **mul2**
- **mul1** : une multiplication entre les registres *r20* et *r21*
- **mul2** : une multiplication entre les registres *r17* et *r18*
- **nop5** : un enchainement de 5 nop

Ici, on recherche une différence de consommation entre la suite **mul5** et la suite **nop5** lors d'une séquence *mul5; nop5; mul5; nop5; mul5; nop5; mul5;*. 

On est donc bien capable de différencier le type d'opération en fonction de la puissance requise et consommée pour chaque opération.

rayonnement elm mesuré (fonction de la consommatino energetique)

### 3. Noise filtering - operator

```c=
#define mul3 __asm__ __volatile__ ("mul r20, r21\n\t")
#define mul4 __asm__ __volatile__ ("mul r0, r20 \n\t")
#define mul13 mul3; mul3; mul3; mul3; mul3; mul3; mul3; mul3; mul3; mul3;
#define mul14 mul4; mul4; mul4; mul4; mul4; mul4; mul4; mul4; mul4; mul4;

int main(void)
{
    setup();
    while (1)
    {
       zeror0;
       PORTB = PORTB ^ (1<< TRIGGER); 

       nop10;nop10;
       mul13;mul13;mul13;
       mul14;mul14;mul14;

       PORTB = PORTB ^ (1<< TRIGGER);
       nop10;
    }
    return(0);
}
```

Dans ce scénario, le programme chargé va nous permettre d'identifier une différence de consommation lors de l'exécution d'une même opération avec des valeurs différentes.

Ici, deux opérations sont définies : 
- **mul3** :  multiplication entre les registres r20 et r21
- **mul4** :  multiplication entre les registres r0 et r20

Les chaines **mul13** et **mul14** sont alors des enchainements respectifs de 10 opérations **mul3** et **mul4**.

Il est alors possible d'identifier sur la capture suivante la période suivante : SIGNAL - NOP10 NOP10 - MUL13 MUL13 MUL13 - MUL14 MUL14 MUL14 - NOP10 - SIGNAL.

schema-description

On est donc bien capable de différencier des valeurs manipulées par une même instruction en fonction de leurs consommations.

Il n'est cependant pas possible de déterminer la valeur des registres manipulées au travers de cette capture. On pourrait obtenir une estimation en se basant sur des statistiques et probabilités.

___
notes 
Modifier la durée d'une trace pour avoir une période entière
Mieux on est positionnés, le moins de traces sont nécessaires pour avoir de bons résultats (dépend aussi de la qualité du matériel)


Si pas de meilleurs résultats en augmentant nombres de traces, on change la position de la sonde 

___




### 4. DPA attack - SBOX

___     
notes

Systeme crypto : Amener de la Confusion / diffusion

Voir dans traces différences de poids de Hamming
Fuite d'infos = écart entre les courbes (diff de conso qui dépend du poids de Hamming de la donnée)

On est alors capable de différencier le poids de Hamming en sortie de la sbox

___