package tool import ( "crypto/ed25519" "encoding/pem" "errors" "fmt" "os" ) // GetPrivateKey 从 PEM 文件中加载 Ed25519 私钥 // // 参数: // - filePath: PEM 格式私钥文件的路径 // // 返回值: // - privateKey: 加载的 Ed25519 私钥指针 // - err: 错误信息,如果加载失败则返回错误 // // 示例: // // privateKey, err := GetPrivateKey("private.pem") // if err != nil { // // 处理错误 // } func GetPrivateKey(filePath string) (privateKey *ed25519.PrivateKey, err error) { // 读取文件内容 data, err := os.ReadFile(filePath) if err != nil { return nil, fmt.Errorf("读取私钥文件失败: %w", err) } // 解析 PEM 块 block, _ := pem.Decode(data) if block == nil { return nil, errors.New("无法解析 PEM 块") } // 检查 PEM 块类型 if block.Type != "PRIVATE KEY" && block.Type != "ED25519 PRIVATE KEY" { return nil, fmt.Errorf("不支持的 PEM 块类型: %s,期望 PRIVATE KEY 或 ED25519 PRIVATE KEY", block.Type) } // 从 PEM 块数据中解析私钥 // 注意:ed25519.PrivateKey 实际上是一个字节切片,不是结构体 // 所以我们需要直接使用字节数据 if len(block.Bytes) != ed25519.PrivateKeySize { return nil, fmt.Errorf("私钥长度无效: 期望 %d 字节,实际 %d 字节", ed25519.PrivateKeySize, len(block.Bytes)) } // 创建私钥(注意:ed25519.PrivateKey 是 []byte 类型) privKey := ed25519.PrivateKey(block.Bytes) // 验证私钥是否有效 if len(privKey) != ed25519.PrivateKeySize { return nil, errors.New("私钥长度验证失败") } // 返回私钥的指针 return &privKey, nil }