keygen_test.go 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package main
  2. import (
  3. "bytes"
  4. "os"
  5. "testing"
  6. "github.com/slackhq/nebula/cert"
  7. "github.com/stretchr/testify/assert"
  8. "github.com/stretchr/testify/require"
  9. )
  10. func Test_keygenSummary(t *testing.T) {
  11. assert.Equal(t, "keygen <flags>: create a public/private key pair. the public key can be passed to `nebula-cert sign`", keygenSummary())
  12. }
  13. func Test_keygenHelp(t *testing.T) {
  14. ob := &bytes.Buffer{}
  15. keygenHelp(ob)
  16. assert.Equal(
  17. t,
  18. "Usage of "+os.Args[0]+" keygen <flags>: create a public/private key pair. the public key can be passed to `nebula-cert sign`\n"+
  19. " -curve string\n"+
  20. " \tECDH Curve (25519, P256) (default \"25519\")\n"+
  21. " -out-key string\n"+
  22. " \tRequired: path to write the private key to\n"+
  23. " -out-pub string\n"+
  24. " \tRequired: path to write the public key to\n"+
  25. optionalPkcs11String(" -pkcs11 string\n \tOptional: PKCS#11 URI to an existing private key\n"),
  26. ob.String(),
  27. )
  28. }
  29. func Test_keygen(t *testing.T) {
  30. ob := &bytes.Buffer{}
  31. eb := &bytes.Buffer{}
  32. // required args
  33. assertHelpError(t, keygen([]string{"-out-pub", "nope"}, ob, eb), "-out-key is required")
  34. assert.Equal(t, "", ob.String())
  35. assert.Equal(t, "", eb.String())
  36. assertHelpError(t, keygen([]string{"-out-key", "nope"}, ob, eb), "-out-pub is required")
  37. assert.Equal(t, "", ob.String())
  38. assert.Equal(t, "", eb.String())
  39. // failed key write
  40. ob.Reset()
  41. eb.Reset()
  42. args := []string{"-out-pub", "/do/not/write/pleasepub", "-out-key", "/do/not/write/pleasekey"}
  43. require.EqualError(t, keygen(args, ob, eb), "error while writing out-key: open /do/not/write/pleasekey: "+NoSuchDirError)
  44. assert.Equal(t, "", ob.String())
  45. assert.Equal(t, "", eb.String())
  46. // create temp key file
  47. keyF, err := os.CreateTemp("", "test.key")
  48. require.NoError(t, err)
  49. defer os.Remove(keyF.Name())
  50. // failed pub write
  51. ob.Reset()
  52. eb.Reset()
  53. args = []string{"-out-pub", "/do/not/write/pleasepub", "-out-key", keyF.Name()}
  54. require.EqualError(t, keygen(args, ob, eb), "error while writing out-pub: open /do/not/write/pleasepub: "+NoSuchDirError)
  55. assert.Equal(t, "", ob.String())
  56. assert.Equal(t, "", eb.String())
  57. // create temp pub file
  58. pubF, err := os.CreateTemp("", "test.pub")
  59. require.NoError(t, err)
  60. defer os.Remove(pubF.Name())
  61. // test proper keygen
  62. ob.Reset()
  63. eb.Reset()
  64. args = []string{"-out-pub", pubF.Name(), "-out-key", keyF.Name()}
  65. require.NoError(t, keygen(args, ob, eb))
  66. assert.Equal(t, "", ob.String())
  67. assert.Equal(t, "", eb.String())
  68. // read cert and key files
  69. rb, _ := os.ReadFile(keyF.Name())
  70. lKey, b, curve, err := cert.UnmarshalPrivateKeyFromPEM(rb)
  71. assert.Equal(t, cert.Curve_CURVE25519, curve)
  72. assert.Empty(t, b)
  73. require.NoError(t, err)
  74. assert.Len(t, lKey, 32)
  75. rb, _ = os.ReadFile(pubF.Name())
  76. lPub, b, curve, err := cert.UnmarshalPublicKeyFromPEM(rb)
  77. assert.Equal(t, cert.Curve_CURVE25519, curve)
  78. assert.Empty(t, b)
  79. require.NoError(t, err)
  80. assert.Len(t, lPub, 32)
  81. }