Construction d'une bibliothèque cryptographique multi-plateformes formellement vérifiée à haute performance en F*

par Marina Polubelova

Thèse de doctorat en Informatique

Sous la direction de Karthikeyan Bhargavan.

Thèses en préparation à l'Université Paris sciences et lettres , dans le cadre de École doctorale Sciences mathématiques de Paris centre (Paris ; 2000-....) , en partenariat avec INRIA Paris (laboratoire) et de École normale supérieure (Paris ; 1985-....) (établissement opérateur d'inscription) .


  • Résumé

    Beaucoup de logiciels critiques d'un point de vue sécurité ont besoin d'implémentations d'algorithmes cryptographiques sûres et performantes. Pour répondre à ce besoin, des bibliothèques cryptographiques généralistes comme OpenSSL incluent des douzaines d'implémentations hybrides C/Assembleurs pour chaque primitive, chacune de ces implémentations étant spécialisée et optimisée pour une plateforme répandue. La plupart des optimisations présentes dans ces implémentations exploitent le parallélisme Single Instruction, Multiple Data (SIMD) qui nécessite de changer de manière significative la structure du code, de telle sorte qu'il ne ressemble plus que très peu à l'algorithme scalaire originel. Cependant, et malgré des années de conception et d'implémentation méticuleuse, des bugs et attaques continuent d'être trouvées dans ces bases de code optimisées. Ces bugs et attaques incluent des erreurs de sûreté mémoire, des fuites d'information par attaque temporelle et des bugs de correction fonctionnelle. La probabilité de détecter ces bugs par des méthodes de test est extrêmement faible, mais ils peuvent quand même être exploités pour conduire une attaque. Nous défendons l'utilisation de méthodes formelles afin de prouver mathématiquement l'absence de tels bugs dans les implémentations. À l'inverse d'autres approches comme le test ou l'audit, l'utilisation de méthodes formelles apporte des garanties forte concernant la sûreté mémoire du code, sa correction fonctionnelle par rapport à une spécification haut-niveau, et enfin son indépendance par rapport aux données secrètes (constant-time) qui protège contre certaines attaques temporelles par canaux auxiliaires. Le défi est ici de vérifier des centaines de milliers de lignes de code extrêmement optimisées ; nous avons donc besoin d'une approche systématique à ce problème. Cette dissertation présente une nouvelle approche pour la construction d'une bibliothèque cryptographique multi-plateforme formellement vérifiée qui compile du code générique vérifié écrit en F* vers du code C optimisé pour différentes plateformes, que l'on peut également composer avec de l'assembleur vérifiée. Notre approche réduit l'effort de programmation et de vérification en partageant le code entre les implémentations d'un même algorithme pour différentes plateformes, et entre les implémentations de primitives cryptographiques différentes. Notre bibliothèque incorpore les résultats de trois projets qui sont chacun décrit dans leur propre chapitre. Premièrement, nous montrons comment écrire des implémentations de la courbe elliptique Curve25519 en C pur (pour la portabilité) et en un mélange de C et d'assembleur. Deuxièmement, nous montrons comment écrire des implémentations vérifiées et vectorisées de l'algorithme de chiffrement Chacha20, de l'algorithme d'authentification à usage unique Poly13015, et des familles d'algorithmes de hash SHA-2 et Blake2, pour des plateformes qui supportent des vecteurs SIMD de 128, 256 et 512 bits. Troisièmement, nous montrons comment écrire des implémentations vérifiées en C pur (pour la portabilité) pour les schémas de signature RSA-PSS et Ed25519 pour l'échange de clés en champ fini Diffie-Hellman sur des groupes standards. Ainsi, nous développons une nouvelle version de la bibliothèque cryptographique open-source HACL*, qui inclue par exemple désormais les premières implémentations vérifiées de RSA-PSS et les premières implémentations vectorisées vérifiées sur ARM Neon et AVX512.

  • Titre traduit

    Building a Formally Verified High-Performance Multi-Platform Cryptographic Library in F*


  • Résumé

    Many security-critical applications need efficient and secure implementations of cryptographic algorithms. To address this demand, general-purpose cryptographic libraries like OpenSSL include dozens of mixed assembly-C implementations for each primitive, highly optimized for multiple popular platforms. Most of these optimizations exploit single-instruction, multiple-data (SIMD) parallelism that significantly changes the structure of the code, making it no longer resemble the original scalar algorithm. However, despite years of careful design and implementation, bugs and attacks continue to be found in such optimized code. These include memory safety errors, timing leaks, and functional correctness bugs. The probability of catching such bugs by testing is extremely low, but they still can be exploited to conduct an attack. We advocate the use of formal verification to mathematically prove the absence of such implementation bugs. Unlike other approaches, such as testing and auditing, it provides strong guarantees that code is memory safe, functionally correct against its high-level specification, and secret independent (``constant-time'') to protect against certain timing side-channel attacks. The challenge is to verify hundreds of thousands of lines of highly-optimized code, and, hence, a more systematic approach is needed. This thesis presents a new approach towards building a formally verified high-performance multi-platform cryptographic library that compiles generic verified code written in F* to optimized C code for different platforms, composable with verified assembly. Our approach reduces programming and verification effort by sharing code between implementations of an algorithm for different platforms and between implementations of different cryptographic primitives. Our library incorporates the results of three projects, each described in its own chapter. First, we show how to write verified portable C and mixed assembly-C implementations for the Curve25519 elliptic curve. Second, we show how to write verified vectorized implementations for platforms that support 128-bit, 256-bit, and 512-bit SIMD vector instructions for the ChaCha20 encryption algorithm, the Poly1305 one-time MAC, and the SHA-2 and Blake2 families of hash algorithms. Third, we show how to write verified portable C implementations for the RSA-PSS and Ed25519 signature schemes and for the Finite-Field Diffie-Hellman key exchange over standard groups. Hence, we developed a new version of the open-source cryptographic library HACL*, which now includes the first verified implementations of, for example, RSA-PSS and the first verified vectorized implementations on ARM Neon and AVX512. Our work closes the performance gap between verified and high-performance unverified cryptographic implementations. Various algorithms from our verified cryptographic library are already deployed in Mozilla's NSS cryptographic library, the Wireguard VPN, the Zinc crypto library for the Linux Kernel, the Tezos blockchain, ElectionGuard, and msQuic. The library can be further improved with respect to side-channels protections and performance. Future work can build upon our results to provide high-assurance implementations of newly designed constructions for post-quantum and lightweight cryptography and coming standards for multi-party threshold cryptography.