verify_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package main
  2. import (
  3. "bytes"
  4. "crypto/rand"
  5. "os"
  6. "testing"
  7. "time"
  8. "github.com/stretchr/testify/assert"
  9. "golang.org/x/crypto/ed25519"
  10. )
  11. func Test_verifySummary(t *testing.T) {
  12. assert.Equal(t, "verify <flags>: verifies a certificate isn't expired and was signed by a trusted authority.", verifySummary())
  13. }
  14. func Test_verifyHelp(t *testing.T) {
  15. ob := &bytes.Buffer{}
  16. verifyHelp(ob)
  17. assert.Equal(
  18. t,
  19. "Usage of "+os.Args[0]+" verify <flags>: verifies a certificate isn't expired and was signed by a trusted authority.\n"+
  20. " -ca string\n"+
  21. " \tRequired: path to a file containing one or more ca certificates\n"+
  22. " -crt string\n"+
  23. " \tRequired: path to a file containing a single certificate\n",
  24. ob.String(),
  25. )
  26. }
  27. func Test_verify(t *testing.T) {
  28. time.Local = time.UTC
  29. ob := &bytes.Buffer{}
  30. eb := &bytes.Buffer{}
  31. // required args
  32. assertHelpError(t, verify([]string{"-ca", "derp"}, ob, eb), "-crt is required")
  33. assert.Equal(t, "", ob.String())
  34. assert.Equal(t, "", eb.String())
  35. assertHelpError(t, verify([]string{"-crt", "derp"}, ob, eb), "-ca is required")
  36. assert.Equal(t, "", ob.String())
  37. assert.Equal(t, "", eb.String())
  38. // no ca at path
  39. ob.Reset()
  40. eb.Reset()
  41. err := verify([]string{"-ca", "does_not_exist", "-crt", "does_not_exist"}, ob, eb)
  42. assert.Equal(t, "", ob.String())
  43. assert.Equal(t, "", eb.String())
  44. assert.EqualError(t, err, "error while reading ca: open does_not_exist: "+NoSuchFileError)
  45. // invalid ca at path
  46. ob.Reset()
  47. eb.Reset()
  48. caFile, err := os.CreateTemp("", "verify-ca")
  49. assert.Nil(t, err)
  50. defer os.Remove(caFile.Name())
  51. caFile.WriteString("-----BEGIN NOPE-----")
  52. err = verify([]string{"-ca", caFile.Name(), "-crt", "does_not_exist"}, ob, eb)
  53. assert.Equal(t, "", ob.String())
  54. assert.Equal(t, "", eb.String())
  55. assert.EqualError(t, err, "error while adding ca cert to pool: input did not contain a valid PEM encoded block")
  56. // make a ca for later
  57. caPub, caPriv, _ := ed25519.GenerateKey(rand.Reader)
  58. ca, _ := NewTestCaCert("test-ca", caPub, caPriv, time.Now().Add(time.Hour*-1), time.Now().Add(time.Hour*2), nil, nil, nil)
  59. b, _ := ca.MarshalPEM()
  60. caFile.Truncate(0)
  61. caFile.Seek(0, 0)
  62. caFile.Write(b)
  63. // no crt at path
  64. err = verify([]string{"-ca", caFile.Name(), "-crt", "does_not_exist"}, ob, eb)
  65. assert.Equal(t, "", ob.String())
  66. assert.Equal(t, "", eb.String())
  67. assert.EqualError(t, err, "unable to read crt; open does_not_exist: "+NoSuchFileError)
  68. // invalid crt at path
  69. ob.Reset()
  70. eb.Reset()
  71. certFile, err := os.CreateTemp("", "verify-cert")
  72. assert.Nil(t, err)
  73. defer os.Remove(certFile.Name())
  74. certFile.WriteString("-----BEGIN NOPE-----")
  75. err = verify([]string{"-ca", caFile.Name(), "-crt", certFile.Name()}, ob, eb)
  76. assert.Equal(t, "", ob.String())
  77. assert.Equal(t, "", eb.String())
  78. assert.EqualError(t, err, "error while parsing crt: input did not contain a valid PEM encoded block")
  79. // unverifiable cert at path
  80. crt, _ := NewTestCert(ca, caPriv, "test-cert", time.Now().Add(time.Hour*-1), time.Now().Add(time.Hour), nil, nil, nil)
  81. // Slightly evil hack to modify the certificate after it was sealed to generate an invalid signature
  82. pub := crt.PublicKey()
  83. for i, _ := range pub {
  84. pub[i] = 0
  85. }
  86. b, _ = crt.MarshalPEM()
  87. certFile.Truncate(0)
  88. certFile.Seek(0, 0)
  89. certFile.Write(b)
  90. err = verify([]string{"-ca", caFile.Name(), "-crt", certFile.Name()}, ob, eb)
  91. assert.Equal(t, "", ob.String())
  92. assert.Equal(t, "", eb.String())
  93. assert.EqualError(t, err, "certificate signature did not match")
  94. // verified cert at path
  95. crt, _ = NewTestCert(ca, caPriv, "test-cert", time.Now().Add(time.Hour*-1), time.Now().Add(time.Hour), nil, nil, nil)
  96. b, _ = crt.MarshalPEM()
  97. certFile.Truncate(0)
  98. certFile.Seek(0, 0)
  99. certFile.Write(b)
  100. err = verify([]string{"-ca", caFile.Name(), "-crt", certFile.Name()}, ob, eb)
  101. assert.Equal(t, "", ob.String())
  102. assert.Equal(t, "", eb.String())
  103. assert.Nil(t, err)
  104. }