keygen_test.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // token 测试密钥生成助手(PKCS1 / PKCS8 两种私钥形态,均配 PKIX 公钥)。
  2. //
  3. // 密钥仅内存生成(不依赖 config/dev.json,不入库);RSA 2048 足够 RS256 测试。
  4. package token
  5. import (
  6. "crypto/rand"
  7. "crypto/rsa"
  8. "crypto/x509"
  9. "encoding/pem"
  10. "testing"
  11. )
  12. // genKeyPair 生成 RS2048 密钥对(PKCS1 私钥 PEM + PKIX 公钥 PEM)。
  13. func genKeyPair(t *testing.T) (privPEM, pubPEM string) {
  14. t.Helper()
  15. key, err := rsa.GenerateKey(rand.Reader, 2048)
  16. if err != nil {
  17. t.Fatalf("生成 RSA 私钥: %v", err)
  18. }
  19. privPEM = string(pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(key)}))
  20. pubPEM, err = pubPEMOf(t, key)
  21. if err != nil {
  22. t.Fatalf("序列化公钥: %v", err)
  23. }
  24. return privPEM, pubPEM
  25. }
  26. // genKeyPairPKCS8 生成 RS2048 密钥对(PKCS8 私钥 PEM + PKIX 公钥 PEM)。
  27. func genKeyPairPKCS8(t *testing.T) (privPEM, pubPEM string) {
  28. t.Helper()
  29. key, err := rsa.GenerateKey(rand.Reader, 2048)
  30. if err != nil {
  31. t.Fatalf("生成 RSA 私钥: %v", err)
  32. }
  33. der, err := x509.MarshalPKCS8PrivateKey(key)
  34. if err != nil {
  35. t.Fatalf("PKCS8 序列化: %v", err)
  36. }
  37. privPEM = string(pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: der}))
  38. pubPEM, err = pubPEMOf(t, key)
  39. if err != nil {
  40. t.Fatalf("序列化公钥: %v", err)
  41. }
  42. return privPEM, pubPEM
  43. }
  44. // pubPEMOf 由 *rsa.PrivateKey 取公钥并序列化为 PKIX PEM。
  45. func pubPEMOf(t *testing.T, key *rsa.PrivateKey) (string, error) {
  46. t.Helper()
  47. der, err := x509.MarshalPKIXPublicKey(&key.PublicKey)
  48. if err != nil {
  49. return "", err
  50. }
  51. return string(pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY", Bytes: der})), nil
  52. }