Network Security Services es la biblioteca que hay debajo de Firefox, Thunderbird y varios componentes del sistema en Linux, incluida la implementación de WebCrypto de Firefox. Funciona a través de PKCS#11: las claves residen en un token (el softoken integrado, o una tarjeta inteligente o un HSM), y todo lo que está por encima llama a las funciones PK11_*. Los datos de esta página se comprobaron con el paquete de Alpine 3.24.2, NSS 3.124, inicializado sin base de datos de claves (NSS_NoDB_Init).
ECDSA tiene dos capas que producen codificaciones distintas. SEC_SignData y VFY_VerifyData, en cryptohi, calculan el hash del mensaje y usan DER, la forma que esperan X.509, CMS y OpenSSL. PK11_Sign y PK11_Verify reciben un resumen y usan la forma r‖s en bruto, de 64 bytes en P-256. Mezclarlas es el error clásico con NSS; convierte con el conversor DER ⇄ en bruto. PK11_Sign también aceptó un resumen de 64 bytes en P-256 y firmó sus primeros 32 bytes, así que pasa un resumen que corresponda a la curva.
Los nonces son aleatorios —dos firmas del mismo mensaje fueron distintas— y s no se normaliza; una firma high-S se verificó. Con una clave P-384 se firmó y se verificó con ECDSA y SHA-256, así que el hash no está ligado a la curva. Los fallos se pueden distinguir: después de que VFY_VerifyData devuelva SECFailure, PORT_GetError() devuelve SEC_ERROR_BAD_DER para una firma en bruto o truncada y SEC_ERROR_BAD_SIGNATURE para una firma válida sobre otros datos.
El softoken solo generó claves en P-256, P-384 y P-521; P-224 y secp256k1 fallaron con SEC_ERROR_INVALID_KEY. Ed25519 funciona mediante CKM_EC_EDWARDS_KEY_PAIR_GEN y CKM_EDDSA; Ed448, no. La encapsulación ML-KEM-768 supera la prueba de ida y vuelta (PK11_Encapsulate, PK11_Decapsulate), mientras que los archivos de cabecera declaran mecanismos ML-DSA que el softoken de esta compilación no ofrece. Compara el KEM con la herramienta de ML-KEM.