GetPrivateKey.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package tool
  2. import (
  3. "crypto/ed25519"
  4. "encoding/pem"
  5. "errors"
  6. "fmt"
  7. "os"
  8. )
  9. // GetPrivateKey 从 PEM 文件中加载 Ed25519 私钥
  10. //
  11. // 参数:
  12. // - filePath: PEM 格式私钥文件的路径
  13. //
  14. // 返回值:
  15. // - privateKey: 加载的 Ed25519 私钥指针
  16. // - err: 错误信息,如果加载失败则返回错误
  17. //
  18. // 示例:
  19. //
  20. // privateKey, err := GetPrivateKey("private.pem")
  21. // if err != nil {
  22. // // 处理错误
  23. // }
  24. func GetPrivateKey(filePath string) (privateKey *ed25519.PrivateKey, err error) {
  25. // 读取文件内容
  26. data, err := os.ReadFile(filePath)
  27. if err != nil {
  28. return nil, fmt.Errorf("读取私钥文件失败: %w", err)
  29. }
  30. // 解析 PEM 块
  31. block, _ := pem.Decode(data)
  32. if block == nil {
  33. return nil, errors.New("无法解析 PEM 块")
  34. }
  35. // 检查 PEM 块类型
  36. if block.Type != "PRIVATE KEY" && block.Type != "ED25519 PRIVATE KEY" {
  37. return nil, fmt.Errorf("不支持的 PEM 块类型: %s,期望 PRIVATE KEY 或 ED25519 PRIVATE KEY", block.Type)
  38. }
  39. // 从 PEM 块数据中解析私钥
  40. // 注意:ed25519.PrivateKey 实际上是一个字节切片,不是结构体
  41. // 所以我们需要直接使用字节数据
  42. if len(block.Bytes) != ed25519.PrivateKeySize {
  43. return nil, fmt.Errorf("私钥长度无效: 期望 %d 字节,实际 %d 字节", ed25519.PrivateKeySize, len(block.Bytes))
  44. }
  45. // 创建私钥(注意:ed25519.PrivateKey 是 []byte 类型)
  46. privKey := ed25519.PrivateKey(block.Bytes)
  47. // 验证私钥是否有效
  48. if len(privKey) != ed25519.PrivateKeySize {
  49. return nil, errors.New("私钥长度验证失败")
  50. }
  51. // 返回私钥的指针
  52. return &privKey, nil
  53. }