./22114 Non pas du tout. C'est le code qui est mal gaulé.
On en fait TRES grand cas dans la carte à puce.
Il ne faut pas que le code dépende des datas.
je peux donner un exemple.
Pour comparer deux buffers, tu fais comment?
int memcmp(unsigned char *a, unsigned char *b, int len) {
int i;
for(i=0;i<len;i++) {
if(a[i] != b[i]) return DIFFERENT;
}
return EQUAL;
}Ce code marche, mais c'est FATAL ERROR FAIL DO NOT WANT RAYE LES YEUX en crypto. Pourquoi? parce que son temps d'exécution dépend des données, donc en injectant des données choisies, tu peux, en mesurant le temps d'exécution, deviner les valeurs pondues par un truc secret interne, et ce octet par octet.
Tu fais ça, t'es MORT. N'importe quel hacker un peu malin en ressort une clé, un buffer, etc.
Voici ce qu'il faut faire:
int memcmp_secure(unsigned char *a, unsigned char *b, int len) {
int i;
unsigned char resultat=0;
for(i=0;i<len;i++) {
resultat |= (a[i] ^ b[i]);
}
return resultat;
}Ici, on accumule tous les bits différents de a et b dans resultat, ça ne dépend ni du contenu des données, ni de la longueur à comparer (qui est généralement fixée à une taille style 8 ou 16)
a la fin, resultat vaut zero si et seulement si les contenus de a et b sont égaux.
c'est bien mieux.
Et encore, on peut mieux faire au moins 3 choses différentes.
La difficulté, c'est qu'il faut TOUT coder en ayant ces principes en tête. Il y a d'autres techniques, que je ne peux pas révéler, mais du même goût, dont l'objectif est de cacher la dépendance aux données.
Les techniques à utiliser ne sont pas publiées, mais l'ouverture du code ne change absolument rien au problème.