| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- 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
- }
|