1
0

keygen_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. " Pass \"-\" to any path flag to read from stdin or write to stdout.\n"+
  20. " -curve string\n"+
  21. " \tECDH Curve (25519, P256) (default \"25519\")\n"+
  22. " -out-key string\n"+
  23. " \tRequired: path to write the private key to\n"+
  24. " -out-pub string\n"+
  25. " \tRequired: path to write the public key to\n"+
  26. optionalPkcs11String(" -pkcs11 string\n \tOptional: PKCS#11 URI to an existing private key\n"),
  27. ob.String(),
  28. )
  29. }
  30. func Test_keygen(t *testing.T) {
  31. ob := &bytes.Buffer{}
  32. eb := &bytes.Buffer{}
  33. // required args
  34. assertHelpError(t, keygen([]string{"-out-pub", "nope"}, ob, eb), "-out-key is required")
  35. assert.Empty(t, ob.String())
  36. assert.Empty(t, eb.String())
  37. assertHelpError(t, keygen([]string{"-out-key", "nope"}, ob, eb), "-out-pub is required")
  38. assert.Empty(t, ob.String())
  39. assert.Empty(t, eb.String())
  40. // failed key write
  41. ob.Reset()
  42. eb.Reset()
  43. args := []string{"-out-pub", "/do/not/write/pleasepub", "-out-key", "/do/not/write/pleasekey"}
  44. require.EqualError(t, keygen(args, ob, eb), "error while writing out-key: open /do/not/write/pleasekey: "+NoSuchDirError)
  45. assert.Empty(t, ob.String())
  46. assert.Empty(t, eb.String())
  47. // create temp key file
  48. keyF, err := os.CreateTemp("", "test.key")
  49. require.NoError(t, err)
  50. defer os.Remove(keyF.Name())
  51. // failed pub write
  52. ob.Reset()
  53. eb.Reset()
  54. args = []string{"-out-pub", "/do/not/write/pleasepub", "-out-key", keyF.Name()}
  55. require.EqualError(t, keygen(args, ob, eb), "error while writing out-pub: open /do/not/write/pleasepub: "+NoSuchDirError)
  56. assert.Empty(t, ob.String())
  57. assert.Empty(t, eb.String())
  58. // create temp pub file
  59. pubF, err := os.CreateTemp("", "test.pub")
  60. require.NoError(t, err)
  61. defer os.Remove(pubF.Name())
  62. // test proper keygen
  63. ob.Reset()
  64. eb.Reset()
  65. args = []string{"-out-pub", pubF.Name(), "-out-key", keyF.Name()}
  66. require.NoError(t, keygen(args, ob, eb))
  67. assert.Empty(t, ob.String())
  68. assert.Empty(t, eb.String())
  69. // read cert and key files
  70. rb, _ := os.ReadFile(keyF.Name())
  71. lKey, b, curve, err := cert.UnmarshalPrivateKeyFromPEM(rb)
  72. assert.Equal(t, cert.Curve_CURVE25519, curve)
  73. assert.Empty(t, b)
  74. require.NoError(t, err)
  75. assert.Len(t, lKey, 32)
  76. rb, _ = os.ReadFile(pubF.Name())
  77. lPub, b, curve, err := cert.UnmarshalPublicKeyFromPEM(rb)
  78. assert.Equal(t, cert.Curve_CURVE25519, curve)
  79. assert.Empty(t, b)
  80. require.NoError(t, err)
  81. assert.Len(t, lPub, 32)
  82. }
  83. func Test_keygen_stdio(t *testing.T) {
  84. keyF, err := os.CreateTemp("", "test.key")
  85. require.NoError(t, err)
  86. os.Remove(keyF.Name())
  87. defer os.Remove(keyF.Name())
  88. pubF, err := os.CreateTemp("", "test.pub")
  89. require.NoError(t, err)
  90. os.Remove(pubF.Name())
  91. defer os.Remove(pubF.Name())
  92. // out-pub on stdout, out-key on disk
  93. ob := &bytes.Buffer{}
  94. eb := &bytes.Buffer{}
  95. require.NoError(t, keygen([]string{"-out-pub", "-", "-out-key", keyF.Name()}, ob, eb))
  96. assert.Empty(t, eb.String())
  97. lPub, _, curve, err := cert.UnmarshalPublicKeyFromPEM(ob.Bytes())
  98. require.NoError(t, err)
  99. assert.Equal(t, cert.Curve_CURVE25519, curve)
  100. assert.Len(t, lPub, 32)
  101. // out-key on stdout, out-pub on disk
  102. os.Remove(keyF.Name())
  103. ob.Reset()
  104. eb.Reset()
  105. require.NoError(t, keygen([]string{"-out-pub", pubF.Name(), "-out-key", "-"}, ob, eb))
  106. assert.Empty(t, eb.String())
  107. lKey, _, curve, err := cert.UnmarshalPrivateKeyFromPEM(ob.Bytes())
  108. require.NoError(t, err)
  109. assert.Equal(t, cert.Curve_CURVE25519, curve)
  110. assert.Len(t, lKey, 32)
  111. // both on stdout is a conflict caught up front
  112. ob.Reset()
  113. eb.Reset()
  114. require.EqualError(t, keygen([]string{"-out-pub", "-", "-out-key", "-"}, ob, eb),
  115. `-out-key and -out-pub both set to "-", only one output may write to stdout`)
  116. assert.Empty(t, ob.String())
  117. }