// Regenerate `gateway-response.pem` and `gateway-response.pub`. // // Run from this directory: `go run ./regenerate.go`. The keys are // committed and used only by the `tools/local-dev/` stack; rotate by // re-running and committing both files together with the matching // `VITE_GATEWAY_RESPONSE_PUBLIC_KEY` update in // `ui/frontend/.env.development`. //go:build ignore package main import ( "crypto/ed25519" "crypto/rand" "crypto/x509" "encoding/base64" "encoding/pem" "fmt" "os" ) func main() { pub, priv, err := ed25519.GenerateKey(rand.Reader) if err != nil { fmt.Fprintln(os.Stderr, "generate:", err) os.Exit(1) } pkcs8, err := x509.MarshalPKCS8PrivateKey(priv) if err != nil { fmt.Fprintln(os.Stderr, "marshal:", err) os.Exit(1) } pemBytes := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: pkcs8}) if err := os.WriteFile("gateway-response.pem", pemBytes, 0o600); err != nil { fmt.Fprintln(os.Stderr, "write pem:", err) os.Exit(1) } pubB64 := base64.StdEncoding.EncodeToString(pub) pubBlock := fmt.Sprintf("# DEV-ONLY gateway response-signing public key (raw 32-byte Ed25519,\n# standard non-URL-safe base64). Pairs with `gateway-response.pem`.\n# Never use in any non-local environment.\n%s\n", pubB64) if err := os.WriteFile("gateway-response.pub", []byte(pubBlock), 0o644); err != nil { fmt.Fprintln(os.Stderr, "write pub:", err) os.Exit(1) } fmt.Printf("VITE_GATEWAY_RESPONSE_PUBLIC_KEY=%s\n", pubB64) }