O GnuTLS fornece o tratamento de TLS, X.509 e PKCS para muitos componentes GNU e Linux e inclui o certtool e o gnutls-cli. Suas interfaces abstratas gnutls_privkey_* e gnutls_pubkey_* funcionam da mesma forma para chaves em software, tokens PKCS#11 e TPMs. Os fatos desta página foram verificados no pacote do Alpine 3.24.2, GnuTLS 3.8.13, que usa o Nettle para a aritmética. Desde o GnuTLS 3.8.10, os algoritmos pós-quânticos vêm apenas da biblioteca opcional leancrypto, e este pacote não é vinculado a ela.
gnutls_privkey_sign_data retorna assinaturas ECDSA em DER com um nonce aleatório; a flag GNUTLS_PRIVKEY_FLAG_REPRODUCIBLE muda para a RFC 6979, e com ela o vetor de teste P-256 da RFC foi reproduzido exatamente. O s não é normalizado, e assinaturas high-S passam na verificação. gnutls_privkey_sign_hash2 assina um digest calculado por você.
A verificação retorna um código de erro negativo em caso de falha, e todos os tipos de falha pareceram iguais: uma assinatura r‖s bruta, um blob de 3 bytes e uma assinatura válida sobre outros dados deram GNUTLS_E_PK_SIG_VERIFY_FAILED (-89). Use o conversor DER ⇄ bruto para descartar um problema de codificação.
O ECDSA fica limitado às curvas do NIST de P-224 a P-521 — gnutls_ecc_curve_get_id("SECP256K1") retornou 0, ou seja, curva desconhecida —, enquanto Ed25519 e Ed448 assinaram e verificaram. Os arquivos de cabeçalho declaram GNUTLS_PK_MLKEM768 e GNUTLS_PK_MLDSA65, mas este build não implementa nenhum dos dois: eles não aparecem em gnutls_pk_list(), a geração de chaves ML-DSA-65 falha com GNUTLS_E_UNSUPPORTED_SIGNATURE_ALGORITHM, e os grupos TLS listados por gnutls-cli --list incluem X25519 e X448, mas nenhum híbrido com ML-KEM. Um código que compila com essas constantes ainda pode falhar em tempo de execução, então confira a lista disponível em tempo de execução. Inspecione os certificados gerados pelo certtool com o decodificador de certificados.