GnuTLS assure la gestion de TLS, de X.509 et de PKCS pour de nombreux composants GNU et Linux, et fournit certtool et gnutls-cli. Ses interfaces abstraites gnutls_privkey_* et gnutls_pubkey_* fonctionnent de la même façon pour les clés logicielles, les jetons PKCS#11 et les TPM. Les faits présentés ici ont été vérifiés sur le paquet Alpine 3.24.2, GnuTLS 3.8.13, qui utilise Nettle pour l’arithmétique. Depuis GnuTLS 3.8.10, les algorithmes post-quantiques proviennent uniquement de la bibliothèque optionnelle leancrypto, avec laquelle ce paquet n’est pas lié.
gnutls_privkey_sign_data renvoie des signatures ECDSA en DER avec un nonce aléatoire ; l’indicateur GNUTLS_PRIVKEY_FLAG_REPRODUCIBLE fait passer à la RFC 6979, et avec lui le vecteur de test P-256 de la RFC a été reproduit exactement. s n’est pas normalisé et les signatures high-S passent la vérification. gnutls_privkey_sign_hash2 signe un condensat que vous avez calculé.
En cas d’échec, la vérification renvoie un code d’erreur négatif, et tous les types d’échec se sont présentés de la même façon : une signature r‖s brute, un blob de 3 octets et une signature valide portant sur d’autres données ont tous donné GNUTLS_E_PK_SIG_VERIFY_FAILED (-89). Utilisez le convertisseur DER ⇄ brut pour écarter un problème d’encodage.
ECDSA est limité aux courbes NIST de P-224 à P-521 (gnutls_ecc_curve_get_id("SECP256K1") a renvoyé 0, c’est-à-dire courbe inconnue), alors qu’Ed25519 et Ed448 ont tous deux réussi la signature et la vérification. Les en-têtes déclarent GNUTLS_PK_MLKEM768 et GNUTLS_PK_MLDSA65, mais ce build n’implémente ni l’un ni l’autre : ils sont absents de gnutls_pk_list(), la génération de clés ML-DSA-65 échoue avec GNUTLS_E_UNSUPPORTED_SIGNATURE_ALGORITHM, et les groupes TLS listés par gnutls-cli --list comprennent X25519 et X448, mais aucun hybride ML-KEM. Un code qui compile avec ces constantes peut donc quand même échouer à l’exécution : vérifiez la liste fournie par l’environnement d’exécution. Examinez les certificats produits par certtool avec le décodeur de certificats.