JKB
unread,May 26, 2021, 9:46:36 AM5/26/21You do not have permission to delete messages in this group
Sign in to report message
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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.