helpers.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package e2e
  2. import (
  3. "crypto/rand"
  4. "io"
  5. "net/netip"
  6. "time"
  7. "github.com/slackhq/nebula/cert"
  8. "golang.org/x/crypto/curve25519"
  9. "golang.org/x/crypto/ed25519"
  10. )
  11. // NewTestCaCert will generate a CA cert
  12. func NewTestCaCert(before, after time.Time, networks, unsafeNetworks []netip.Prefix, groups []string) (cert.Certificate, []byte, []byte, []byte) {
  13. pub, priv, err := ed25519.GenerateKey(rand.Reader)
  14. if before.IsZero() {
  15. before = time.Now().Add(time.Second * -60).Round(time.Second)
  16. }
  17. if after.IsZero() {
  18. after = time.Now().Add(time.Second * 60).Round(time.Second)
  19. }
  20. t := &cert.TBSCertificate{
  21. Version: cert.Version1,
  22. Name: "test ca",
  23. NotBefore: time.Unix(before.Unix(), 0),
  24. NotAfter: time.Unix(after.Unix(), 0),
  25. PublicKey: pub,
  26. Networks: networks,
  27. UnsafeNetworks: unsafeNetworks,
  28. Groups: groups,
  29. IsCA: true,
  30. }
  31. c, err := t.Sign(nil, cert.Curve_CURVE25519, priv)
  32. if err != nil {
  33. panic(err)
  34. }
  35. pem, err := c.MarshalPEM()
  36. if err != nil {
  37. panic(err)
  38. }
  39. return c, pub, priv, pem
  40. }
  41. // NewTestCert will generate a signed certificate with the provided details.
  42. // Expiry times are defaulted if you do not pass them in
  43. func NewTestCert(ca cert.Certificate, key []byte, name string, before, after time.Time, networks, unsafeNetworks []netip.Prefix, groups []string) (cert.Certificate, []byte, []byte, []byte) {
  44. if before.IsZero() {
  45. before = time.Now().Add(time.Second * -60).Round(time.Second)
  46. }
  47. if after.IsZero() {
  48. after = time.Now().Add(time.Second * 60).Round(time.Second)
  49. }
  50. pub, rawPriv := x25519Keypair()
  51. nc := &cert.TBSCertificate{
  52. Version: cert.Version1,
  53. Name: name,
  54. Networks: networks,
  55. UnsafeNetworks: unsafeNetworks,
  56. Groups: groups,
  57. NotBefore: time.Unix(before.Unix(), 0),
  58. NotAfter: time.Unix(after.Unix(), 0),
  59. PublicKey: pub,
  60. IsCA: false,
  61. }
  62. c, err := nc.Sign(ca, ca.Curve(), key)
  63. if err != nil {
  64. panic(err)
  65. }
  66. pem, err := c.MarshalPEM()
  67. if err != nil {
  68. panic(err)
  69. }
  70. return c, pub, cert.MarshalPrivateKeyToPEM(cert.Curve_CURVE25519, rawPriv), pem
  71. }
  72. func x25519Keypair() ([]byte, []byte) {
  73. privkey := make([]byte, 32)
  74. if _, err := io.ReadFull(rand.Reader, privkey); err != nil {
  75. panic(err)
  76. }
  77. pubkey, err := curve25519.X25519(privkey, curve25519.Basepoint)
  78. if err != nil {
  79. panic(err)
  80. }
  81. return pubkey, privkey
  82. }