Go incluye su criptografía en la biblioteca estándar, y desde Go 1.24 las primitivas básicas residen en el Go Cryptographic Module, creado para FIPS 140-3. crypto/ecdsa firma y verifica, crypto/x509 lee claves y certificados, y Go 1.27.3 añade crypto/mlkem (ML-KEM-768/1024) y crypto/mldsa (ML-DSA-44/65/87) junto a crypto/ed25519. No hay secp256k1: el código de Ethereum y Bitcoin usa los paquetes de go-ethereum o de decred.
Todo en crypto/ecdsa opera sobre un resumen que calculas tú: el paquete nunca calcula el hash. Algo peor que una firma errónea: una entrada larga se trunca en silencio al tamaño de la curva, y una firma sobre una entrada de 46 bytes se verificó para otra entrada con los mismos 32 primeros bytes. Calcula siempre el hash primero, como hace el ejemplo. SignASN1, VerifyASN1 y la interfaz crypto.Signer trabajan con DER ASN.1; WebCrypto, JWS y otras implementaciones de r‖s en bruto necesitan Sign/Verify con los enteros rellenados mediante FillBytes: Bytes() elimina los bytes cero iniciales, así que cada r o s que empieza por un byte cero sale un byte más corto.
Las firmas son aleatorias y, desde Go 1.26, el io.Reader que pasas se ignora salvo que se establezca GODEBUG=cryptocustomrand=1: dos firmas hechas con un Reader de solo ceros fueron distintas. Las pruebas que dependían de un Reader fijo para obtener firmas reproducibles dejaron de funcionar; el sustituto documentado es testing/cryptotest.SetGlobalRandom. s no se normaliza y VerifyASN1 acepta ambas mitades, así que, para los verificadores low-S estrictos, hay que sustituir s por n − s en las firmas.
El análisis de claves está pensado para DER. x509.ParsePKIXPublicKey falla con asn1: structure error: tags don't match si recibe texto PEM: llama antes a pem.Decode. ecdsa.ParseUncompressedPublicKey y ecdsa.ParseRawPrivateKey leen el punto SEC1 y el escalar sin envoltorio; los puntos comprimidos se rechazan, y no hay lector para PKCS#8 cifrado con frase de contraseña. Una firma mal formada hace que VerifyASN1 devuelva false, nunca un error.
Para comparar una firma de Go con otra pila, conviértela en el conversor DER ⇄ en bruto y compruébala en el verificador de firmas; los problemas de análisis de certificados se ven con más facilidad en el decodificador de certificados.