Go fournit sa cryptographie dans la bibliothèque standard, et depuis Go 1.24 les primitives de base résident dans le Go Cryptographic Module, conçu pour FIPS 140-3. crypto/ecdsa signe et vérifie, crypto/x509 lit les clés et les certificats, et Go 1.27.3 ajoute crypto/mlkem (ML-KEM-768/1024) et crypto/mldsa (ML-DSA-44/65/87) à côté de crypto/ed25519. Il n’y a pas de secp256k1 : le code Ethereum et Bitcoin utilise les packages de go-ethereum ou de decred.
Tout, dans crypto/ecdsa, opère sur un condensat que vous avez calculé : le package ne hache jamais. Pire qu’une signature fausse, une entrée longue est tronquée silencieusement à la taille de la courbe : une signature sur une entrée de 46 octets a été vérifiée pour une autre entrée ayant les mêmes 32 premiers octets. Hachez toujours d’abord, comme le fait l’exemple. SignASN1, VerifyASN1 et l’interface crypto.Signer utilisent le DER ASN.1 ; WebCrypto, JWS et les autres pairs en r‖s brut ont besoin de Sign/Verify avec des entiers complétés par FillBytes, car Bytes() supprime les octets nuls de tête : tout r ou s qui commence par un octet nul ressort avec un octet de moins.
Les signatures sont aléatoires et, depuis Go 1.26, l’io.Reader que vous passez est ignoré, sauf si GODEBUG=cryptocustomrand=1 est défini : deux signatures faites avec un Reader ne renvoyant que des zéros étaient différentes. Les tests qui comptaient sur un Reader fixe pour obtenir des signatures reproductibles ont cessé de fonctionner ; le remplacement documenté est testing/cryptotest.SetGlobalRandom. s n’est pas normalisé et VerifyASN1 accepte les deux moitiés : pour des vérificateurs low-S stricts, il faut remplacer s par n − s dans les signatures.
L’analyse des clés privilégie le DER. x509.ParsePKIXPublicKey appliqué à du texte PEM échoue avec asn1: structure error: tags don't match : appelez d’abord pem.Decode. ecdsa.ParseUncompressedPublicKey et ecdsa.ParseRawPrivateKey lisent le point SEC1 et le scalaire nus ; les points compressés sont refusés, et aucune fonction ne lit le PKCS#8 chiffré par phrase de passe. Une signature mal formée fait renvoyer false à VerifyASN1, jamais une erreur.
Pour comparer une signature Go avec une autre pile, convertissez-la dans le convertisseur DER ⇄ brut et contrôlez-la dans le vérificateur de signatures ; les problèmes d’analyse de certificats se voient le plus facilement dans le décodeur de certificats.