Aller au contenu principal

3. Implementation Advice

3. Conseils de mise en œuvre

Chaque bloc de ChaCha20 implique 16 opérations de déplacement et une opération d'incrément pour charger l'état, 80 opérations XOR, d'addition et de rotation (roll) pour les tours, 16 additions supplémentaires et 16 opérations XOR pour protéger le texte clair. La section 2.3 décrit la fonction de bloc ChaCha comme « adding the original input words » (addition des mots d'entrée d'origine). Cela implique qu'avant de commencer les tours sur l'état ChaCha, on le copie à part pour n'y additionner plus tard. C'est correct, mais on peut économiser quelques opérations en copiant plutôt l'état et en effectuant le travail sur la copie. Ainsi, pour le bloc suivant, il n'est pas nécessaire de recréer l'état, mais seulement d'incrémenter le compteur de blocs. Cela économise environ 5,5 % des cycles.

Il n'est pas recommandé d'utiliser une bibliothèque générique d'arithmétique multiprécision telle que celle d'OpenSSL pour les opérations arithmétiques de Poly1305. De telles bibliothèques utilisent une allocation dynamique pour manipuler des entiers de taille arbitraire, mais cette flexibilité se fait au détriment des performances ainsi que de la sécurité face aux canaux auxiliaires. Des implémentations plus efficaces s'exécutant en temps constant sont disponibles, dont une dans la propre bibliothèque NaCl de D. J. Bernstein ([NaCl]). Une approche en temps constant mais non optimale consisterait à implémenter naïvement l'arithmétique sur des entiers de 288 bits, car même une implémentation naïve ne dépassera pas 2^288 dans la multiplication de (acc+block) et r. Une implémentation efficace en temps constant se trouve dans la bibliothèque du domaine public poly1305-donna ([Poly1305_Donna]).