Vérifier en Go
Vérifiez la signature Ed25519 d’une sortie acf-mcp en Go avec uniquement la bibliothèque standard, crypto/ed25519 et crypto/x509. Aucune dépendance externe.
iNote
Aucune dépendance Go modules.
crypto/ed25519 est dans la stdlib depuis Go 1.13. Compilez avec go build -trimpath pour un binaire reproductible utilisable en CI ou comme outil CLI d’audit.Snippet complet
verify_doctrine.gogo
package main
import (
"crypto/ed25519"
"crypto/x509"
"encoding/base64"
"encoding/json"
"fmt"
"os"
"strings"
)
const publicKeySPKIB64 = "MCowBQYDK2VwAyEAojtKfh20SGGV63LMETjZBXRWo2tY0viAYziG/y3/L0s="
type Signed struct {
DoctrineHash string `json:"doctrine_hash"`
DoctrineSignature string `json:"doctrine_signature"`
}
func main() {
// 1. Decode the SPKI public key.
spki, err := base64.StdEncoding.DecodeString(publicKeySPKIB64)
if err != nil {
fmt.Println("invalid public key encoding:", err)
os.Exit(1)
}
pubAny, err := x509.ParsePKIXPublicKey(spki)
if err != nil {
fmt.Println("cannot parse public key:", err)
os.Exit(1)
}
pub, ok := pubAny.(ed25519.PublicKey)
if !ok {
fmt.Println("public key is not Ed25519")
os.Exit(1)
}
// 2. Load the signed tool output.
bytesIn, err := os.ReadFile("tool-output.json")
if err != nil {
fmt.Println("cannot read tool output:", err)
os.Exit(1)
}
var signed Signed
if err := json.Unmarshal(bytesIn, &signed); err != nil {
fmt.Println("cannot parse tool output:", err)
os.Exit(1)
}
// 3. Recompute the signed message.
message := []byte(signed.DoctrineHash)
// 4. Decode the signature (strip "ed25519:" prefix, base64-decode).
sigB64 := strings.TrimPrefix(signed.DoctrineSignature, "ed25519:")
signature, err := base64.StdEncoding.DecodeString(sigB64)
if err != nil {
fmt.Println("invalid signature encoding:", err)
os.Exit(1)
}
// 5. Verify.
if ed25519.Verify(pub, message, signature) {
fmt.Println("✓ signature valid")
} else {
fmt.Println("✗ signature INVALID")
os.Exit(1)
}
}
L’empaqueter en CLI
build.shbash
go build -trimpath -ldflags="-s -w" -o acf-verify ./verify_doctrine.go
# Use:
./acf-verify # reads ./tool-output.json
echo "exit=$?"Modes d’échec
signature INVALID+ exit 1: altération de contenu ou mauvaise clé publique. Rejouer la sortie de bout en bout.public key is not Ed25519: la chaîne SPKI passée n’encode pas une clé Ed25519. Vérifier la version d’acf-mcp et la copie de la clé.cannot parse public key: le base64 n’est pas du DER valide. Vérifier qu’aucun retour à la ligne n’a été inséré.