Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Génération d'image mémoire

1 view
Skip to first unread message

JKB

unread,
May 26, 2021, 9:46:36 AM5/26/21
to
Bonjour à tous,

Je sèche sur un point très particulier. Je pense qu'il y a une
technique pour résoudre le problème, mais je ne vois pas.

J'écris un firmware tournant sur un processeur AVR. Ce processeur
contient :
- RAM ;
- EEPROM (données non volatiles) ;
- FLASH (programme).

Très bien.

J'ai jusqu'à présent un bout de code trivial pour initialiser
quelques valeurs en EEPROM :

typedef struct __attribute__((__packed__))
{
uint8_t appKey[16]; // Chiffrement sur le serveur d'application
uint8_t nwkKey[16]; // Authentification sur le serveur de réseau
struct
{
uint8_t luminosite;
int8_t offset_utc;
uint8_t unites_si;
} config;
} eeprom;

eeprom emap EEMEM = {
// appKey
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
// nwkKey
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },

// config
{
0x01, // Luminosite
1, // Offset UTC
1 // Unités SI
}
};

int
main()
{
exit(EXIT_SUCCESS);
}

La compilation de ce programme permet de récupérer un fichier hex
pour flasher l'EEPROM avec la commande suivante :

avr-objcopy -j .eeprom --change-section-lma .eeprom=0 -O ihex \
eeprom.elf eeprom.hex

Ça fonctionne, c'est parfait, l'image mémoire commence à l'adresse 0
en EEPROM :

:1000000000000000000000000000000000000000F0
:1000100000000000000000000000000000000000E0
:03002000010101DA
:00000001FF

Sauf que je dois rajouter dans mon firmware une gestion de clef RSA.
J'ai généré les clefs sur un poste de travail, j'ai enregistré les clefs
dans un fichier au bon format (avec les adresses du CPU réelle sur 16 bits).

En d'autres termes, j'ai une chaîne de caractère de longueur 4096
(la taille de l'EEPROM) contenant une image de l'EEPROM contenant
les différents bigint_t nécessaires au fonctionnement des algos RSA.
La première clef (la clef publique) est à l'adresse $0200, la clef
privée est à l'adresse $0400.

Je peux à la limite faire que ma chaîne de caractère commence à
l'adresse $0200. Mais comment déclarer ma structure ?

J'ai pensé à ceci :

typedef union __attribute__((__packed__))
{
struct __attribute__((__packed__))
{
uint8_t appKey[16]; // Chiffrement sur le serveur d'application
uint8_t nwkKey[16]; // Authentification sur le serveur de réseau
struct
{
uint8_t luminosite;
int8_t offset_utc;
uint8_t unites_si;
} config;
};

struct __attribute__((__packed__))
{
uint8_t reserve[0x0200];
uint8_t clef_publique = ".....";
uint8_t clef_privee = ".....";
};
} eeprom;

mais ça me semble être un marteau-pilon pour écraser une mouche. Y
a-t-il plus simple ?

Bien cordialement,

JKB

--
Si votre demande me parvient en code 29, je vous titiouillerai volontiers
une réponse.
0 new messages