GnuTLS proporciona TLS, X.509 y manejo de PKCS a muchos componentes de GNU y Linux, e incluye certtool y gnutls-cli. Sus interfaces abstractas gnutls_privkey_* y gnutls_pubkey_* funcionan igual con claves de software, tokens PKCS#11 y TPM. Los datos de esta página se comprobaron con el paquete de Alpine 3.24.2, GnuTLS 3.8.13, que usa Nettle para la aritmética. Desde GnuTLS 3.8.10, los algoritmos poscuánticos solo llegan a través de la biblioteca opcional leancrypto, y este paquete no la enlaza.
gnutls_privkey_sign_data devuelve firmas ECDSA en DER con un nonce aleatorio; el indicador GNUTLS_PRIVKEY_FLAG_REPRODUCIBLE cambia a RFC 6979, y con él el vector de prueba P-256 del RFC se reprodujo exactamente. s no se normaliza y las firmas high-S se verifican. gnutls_privkey_sign_hash2 firma un resumen que calculas tú.
La verificación devuelve un código de error negativo cuando falla, y todos los tipos de fallo tenían el mismo aspecto: una firma r‖s en bruto, un blob de 3 bytes y una firma válida sobre otros datos dieron todos GNUTLS_E_PK_SIG_VERIFY_FAILED (-89). Usa el conversor DER ⇄ en bruto para descartar un problema de codificación.
ECDSA se limita a las curvas NIST de P-224 a P-521 —gnutls_ecc_curve_get_id("SECP256K1") devolvió 0, desconocida—, mientras que tanto Ed25519 como Ed448 firmaron y verificaron. Los archivos de cabecera declaran GNUTLS_PK_MLKEM768 y GNUTLS_PK_MLDSA65, pero esta compilación no implementa ninguno de los dos: faltan en gnutls_pk_list(), la generación de claves ML-DSA-65 falla con GNUTLS_E_UNSUPPORTED_SIGNATURE_ALGORITHM, y los grupos TLS que lista gnutls-cli --list incluyen X25519 y X448, pero ningún híbrido ML-KEM. El código que compila con estas constantes puede fallar igualmente en tiempo de ejecución, así que comprueba la lista que ofrece el entorno de ejecución. Inspecciona los certificados que produce certtool con el decodificador de certificados.