Pourquoi Dunitrust ne peut pas lire les clés privées ed25519 ?
J’ai déjà répondu a cette question dans le 1er post en indiquant que cela est dit au fait que Duniter utilise ring, et que ring ne peut pas lire les clés privées ed25519 ce qui est vrai.
Mais personne ne m’a demandé pourquoi je ne pourrais pas tout simplement utiliser une autre lib de crypto ou forker ring ? II y a des raisons précises à cela, que je n’ai volontairement pas explicité dans mon 1er post pour ne pas faire trop long, me disant qu’on finirait de toute façon par me poser la question.
J’ai préféré insister sur le fait que cette limitation n’est pas spécifique a ring mais s’inscrit dans la continuité de l’esprit « safe by design » qui est un des fondements du langage Rust et qui est fortement respecté par la plupart des librairies Rust, ce qui est vrai.
Évacuons déjà la possibilité du fork :
Je ne souhaite pas maintenir un fork d’une librairie de crypto tierce, cela représente plus de travail et augmente les risques de failles de sécurité par maintenance non assidue du fork. C’est exactement ce qui s’est produit dans Duniter avec le bug de TweetNacl, ce dernier a été corrigé dans TweetNacl dés 2015, mais cgeek ayant créé son propre fork “naclb”, ce dernier n’a pas bénéficié du correctif.
C’est précisément parce que je sais qu’un tel problème pourrais se reproduire dans Dunitrust si j’utilise un fork d’une lib de crypto tierce que je me refuse à le faire.
Nous avons eu beaucoup de chances que le bug de tweetnacl n’était pas exploitable de façon malveillante, mais on ne peut pas parier qu’il en sera de même à l’avenir (ce serait un pari très dangereux qui me semble irresponsable de faire).
Enfin concernant la possibilité d’utiliser une autre lib de crypto, je me suis fixé plusieurs contraintes :
- La lib doit être activement maintenue par beaucoup de développeurs et depuis longtemps, pour s’assurer qu’elle sera bien maintenue dans les années à venir lorsque des failles de sécurité seront découvertes dans les algorithmes qu’elle expose.
- La lib doit dépendre d’aucune librairie dynamique (donc exclu un wrapper rust de libsodium), afin de faciliter le build et l’installation sur tous type de plateforme et d’OS.
- La lib doit être la plus performante parmi celles qui respectent les autres contraintes.
- Si d’autres dépendances de Dunitrust utilisent déjà indirectement une lib de crypto gérant ed25519, utiliser celle-ci de préférence pour ne pas alourdir le binaire Dunitrust avec 2 lib de crypto.
Historiquement, Dunitrust utilisait rust-crypto. C’est @nanocryk qui avait choisi cette lib a l’époque. Mais cette lib n’est plus maintenue depuis plus de 4 ans, car les dev initiaux de cette lib ont décidé il y a un peu plus de 4 ans de faire exploser cette grosse crate en plein de petites crates pour être plus “rusty way”. Ed25519 n’a jamais été réimplémenté, l’équipe de rust-crypto s’est contenté de l’écriture d’une abstraction utilisable par le “backend” de son choix : GitHub - RustCrypto/signatures: Cryptographic signature algorithms: DSA, ECDSA, Ed25519.
Il me fallait donc choisir un “backend” une implémentation concrète d’ed25519. J’ai donc passé plusieurs semaines (voir mois je ne sais plus) à étudier l’état de l’art dans l’éco-système rust, j’ai retenu 3 librairies sérieuses : ed25519‑dalek, sodiumoxide et ring.
Ne souhaitant pas dépendre de lib dynamiques, j’ai exclu sodiumoxyde. je trouvais également très dommage de faire une implémentation en Rust pour se baser sur du code C++ pour la partie la plus critique(la crypto), on perd les garanties apportées par le Rust.
J"ai donc expérimenté les 2 restantes :
ed25519‑dalek : 17 contributeurs, projet qui n’a que 3 ans et qui a déjà connu des trous d’inactivités importante dans le graphe des contributions. 340000 téléchargements, utilisé par 63 crates rust.
ring: 171 contributeurs, projet qui a déjà 6 ans et qui n’a jamais connu aucun trou d’inactivité depuis 6 ans. 2,8 millions de téléchargements, utilisé par 236 autres crates rust.
Les chiffres sont explicites, et confirme les conseils que j’ai reçu en meetup rust ou dans les channel irc rust, ring est l’état de l’art de Rust pour la crypto, c’est LA librairie que tous le monde recommande d’utiliser.
De plus, ring présente de meilleurs benchmark que ed25519‑dalek.
Et pour couronner le tous, ring est déjà utilisé par rustls
, une implémentation en Rust de TLS/httpS, qui est utilisée par actix, le framework web que j’utilise dans Dunitrust. Donc je dépends déjà de cette crate.
Pour toutes ces raisons, je ne souhaite pas utiliser une autre lib. je vous avait prévenu que ce serait long