package ws import ( "crypto/ed25519" "crypto/rand" "encoding/hex" "os" "path/filepath" ) // LoadOrCreateServerKey 加载/生成服务器 Ed25519 密钥(hex 文件) func LoadOrCreateServerKey(path string) (ed25519.PrivateKey, error) { if raw, err := os.ReadFile(path); err == nil { seed, err := hex.DecodeString(string(raw)) if err == nil && len(seed) == ed25519.SeedSize { return ed25519.NewKeyFromSeed(seed), nil } } _, priv, err := ed25519.GenerateKey(rand.Reader) if err != nil { return nil, err } if err = os.MkdirAll(filepath.Dir(path), 0o755); err != nil { return nil, err } if err = os.WriteFile(path, []byte(hex.EncodeToString(priv.Seed())), 0o600); err != nil { return nil, err } return priv, nil }