libsodium propose un petit ensemble de primitives aux choix tranchés, derrière des fonctions difficiles à mal utiliser ; elle est intégrée à PHP, utilisée par de nombreux bindings dans d’autres langages et embarquée dans des applications de messagerie. Les signatures se limitent à Ed25519 : les en-têtes de la 1.0.22 (vérifiés sur le paquet Alpine 3.24.2) ne déclarent aucune fonction ECDSA, si bien que tout ce qui utilise ES256 ou secp256k1 nécessite une autre bibliothèque.
La signature Ed25519 est déterministe, comme le prévoit la RFC 8032 (deux signatures du même message étaient identiques), et les fonctions crypto_sign_*_ph implémentent Ed25519ph, dont les signatures ne sont pas interchangeables avec celles d’Ed25519 simple : lors des essais, le vérificateur simple en a rejeté une. La clé secrète fait 64 octets (la graine de 32 octets suivie de la clé publique), alors que la plupart des autres bibliothèques ne stockent que la graine ; crypto_sign_ed25519_sk_to_seed et crypto_sign_seed_keypair permettent de passer de l’une à l’autre, comme le montre l’exemple.
La vérification est stricte là où les implémentations divergent. Une signature dont S a été remplacé par S + L (la même valeur modulo l’ordre du groupe, ce que la RFC 8032 interdit) a été rejetée, tout comme une signature vérifiée avec l’élément neutre, un point de petit ordre, comme clé publique. Les bibliothèques qui acceptent ces entrées sont en désaccord avec libsodium sur ces cas limites, ce qui compte pour les systèmes de consensus qui doivent s’accorder sur la validité. crypto_sign_verify_detached ne prend pas de longueur de signature et lit exactement 64 octets : vérifiez donc la longueur avant de l’appeler.
Dans la 1.0.22, la prise en charge post-quantique se limite à l’encapsulation de clés : crypto_kem_mlkem768_* (clés publiques de 1184 octets, textes chiffrés de 1088 octets) et le KEM hybride X-Wing (crypto_kem_xwing_*, 1216 et 1120 octets), qui est aussi celui qu’utilisent par défaut les fonctions génériques crypto_kem_*. Il n’y a ni ML-DSA ni aucune autre signature post-quantique. Les clés sont partout des octets bruts (clés publiques et graines de 32 octets), sans prise en charge de PEM, DER ou JWK. Comparez les tailles des KEM dans le bac à sable des KEM post-quantiques.