2020-12-17 23:31:53 +00:00
|
|
|
package certificate
|
|
|
|
|
|
|
|
|
|
import (
|
2023-04-27 11:44:39 +00:00
|
|
|
"crypto/tls"
|
|
|
|
|
"os"
|
2020-12-17 23:31:53 +00:00
|
|
|
"path/filepath"
|
|
|
|
|
"testing"
|
|
|
|
|
|
2021-01-13 03:00:16 +00:00
|
|
|
"github.com/stretchr/testify/assert"
|
2020-12-17 23:31:53 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
)
|
|
|
|
|
|
2021-02-25 00:36:55 +00:00
|
|
|
func TestLoadPEM(t *testing.T) {
|
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
|
|
pool, err := LoadPEM(filepath.Join("testdata", "test.crt"))
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
assert.True(t, len(pool.Subjects()) > 0)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestLoadErrorNoCertificates(t *testing.T) {
|
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
|
|
_, err := LoadPEM(filepath.Join("testdata", "empty.crt"))
|
|
|
|
|
require.Error(t, err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestLoadErrorMissingFile(t *testing.T) {
|
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
|
|
_, err := LoadPEM(filepath.Join("testdata", "invalid_path"))
|
|
|
|
|
require.Error(t, err)
|
|
|
|
|
}
|
2023-04-27 11:44:39 +00:00
|
|
|
|
|
|
|
|
func TestLoadClientCertificate(t *testing.T) {
|
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
|
|
validCrt, err := os.ReadFile(filepath.Join("testdata", "test.crt"))
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
validKey, err := os.ReadFile(filepath.Join("testdata", "test.key"))
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
for _, tc := range []struct {
|
|
|
|
|
name string
|
|
|
|
|
crt string
|
|
|
|
|
key string
|
|
|
|
|
checkReturnFn func(*tls.Certificate, error) bool
|
|
|
|
|
}{
|
|
|
|
|
{
|
|
|
|
|
name: "both values not set",
|
|
|
|
|
crt: "",
|
|
|
|
|
key: "",
|
|
|
|
|
checkReturnFn: func(crt *tls.Certificate, err error) bool {
|
|
|
|
|
return crt == nil && err == nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "key not set",
|
|
|
|
|
crt: "foo",
|
|
|
|
|
key: "",
|
|
|
|
|
checkReturnFn: func(crt *tls.Certificate, err error) bool {
|
|
|
|
|
return err != nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "crt not set",
|
|
|
|
|
crt: "",
|
|
|
|
|
key: "bar",
|
|
|
|
|
checkReturnFn: func(crt *tls.Certificate, err error) bool {
|
|
|
|
|
return err != nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "crt and key both set and invalid",
|
|
|
|
|
crt: "foo",
|
|
|
|
|
key: "bar",
|
|
|
|
|
checkReturnFn: func(crt *tls.Certificate, err error) bool {
|
|
|
|
|
return err != nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "crt and key both set but crt invalid",
|
|
|
|
|
crt: "foo",
|
|
|
|
|
key: string(validKey),
|
|
|
|
|
checkReturnFn: func(crt *tls.Certificate, err error) bool {
|
|
|
|
|
return err != nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "crt and key both set but key invalid",
|
|
|
|
|
crt: string(validCrt),
|
|
|
|
|
key: "bar",
|
|
|
|
|
checkReturnFn: func(crt *tls.Certificate, err error) bool {
|
|
|
|
|
return err != nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "crt and key set and valid",
|
|
|
|
|
crt: string(validCrt),
|
|
|
|
|
key: string(validKey),
|
|
|
|
|
checkReturnFn: func(crt *tls.Certificate, err error) bool {
|
|
|
|
|
return crt != nil && err == nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
} {
|
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
|
|
|
crt, err := LoadClientCertificate(tc.crt, tc.key)
|
|
|
|
|
require.True(t, tc.checkReturnFn(crt, err))
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestLoadClientCertificateFromFiles(t *testing.T) {
|
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
|
|
validCrtPath := filepath.Join("testdata", "test.crt")
|
|
|
|
|
validKeyPath := filepath.Join("testdata", "test.key")
|
|
|
|
|
nonExistentPath := filepath.Join("testdata", "not-existent-file")
|
|
|
|
|
invalidFilePath := filepath.Join("testdata", "empty.crt")
|
|
|
|
|
|
|
|
|
|
for _, tc := range []struct {
|
|
|
|
|
name string
|
|
|
|
|
crtPath string
|
|
|
|
|
keyPath string
|
|
|
|
|
checkReturnFn func(*Certificate, error) bool
|
|
|
|
|
}{
|
|
|
|
|
{
|
|
|
|
|
name: "both values not set",
|
|
|
|
|
crtPath: "",
|
|
|
|
|
keyPath: "",
|
|
|
|
|
checkReturnFn: func(crt *Certificate, err error) bool {
|
|
|
|
|
return crt == nil && err == nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "key not set",
|
|
|
|
|
crtPath: "foo",
|
|
|
|
|
keyPath: "",
|
|
|
|
|
checkReturnFn: func(crt *Certificate, err error) bool {
|
|
|
|
|
return err != nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "crt not set",
|
|
|
|
|
crtPath: "",
|
|
|
|
|
keyPath: "bar",
|
|
|
|
|
checkReturnFn: func(crt *Certificate, err error) bool {
|
|
|
|
|
return err != nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "crt and key both set and not existent",
|
|
|
|
|
crtPath: nonExistentPath,
|
|
|
|
|
keyPath: nonExistentPath,
|
|
|
|
|
checkReturnFn: func(crt *Certificate, err error) bool {
|
|
|
|
|
return crt == nil && err == nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "crt and key both set but crt file does not exist",
|
|
|
|
|
crtPath: nonExistentPath,
|
|
|
|
|
keyPath: validKeyPath,
|
|
|
|
|
checkReturnFn: func(crt *Certificate, err error) bool {
|
|
|
|
|
return err != nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "crt and key both set but key file does not exist",
|
|
|
|
|
crtPath: validCrtPath,
|
|
|
|
|
keyPath: nonExistentPath,
|
|
|
|
|
checkReturnFn: func(crt *Certificate, err error) bool {
|
|
|
|
|
return err != nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "crt and key both set but crt file contents are invalid",
|
|
|
|
|
crtPath: invalidFilePath,
|
|
|
|
|
keyPath: validKeyPath,
|
|
|
|
|
checkReturnFn: func(crt *Certificate, err error) bool {
|
|
|
|
|
return err != nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "crt and key both set but key file contents are invalid",
|
|
|
|
|
crtPath: validCrtPath,
|
|
|
|
|
keyPath: invalidFilePath,
|
|
|
|
|
checkReturnFn: func(crt *Certificate, err error) bool {
|
|
|
|
|
return err != nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "crt and key set and valid",
|
|
|
|
|
crtPath: validCrtPath,
|
|
|
|
|
keyPath: validKeyPath,
|
|
|
|
|
checkReturnFn: func(crt *Certificate, err error) bool {
|
|
|
|
|
return crt != nil && len(crt.Crt.Certificate) > 0 && crt.RawCrt != nil && crt.RawKey != nil && crt.Crt.Leaf != nil && err == nil
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
} {
|
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
|
|
|
crt, err := LoadClientCertificateFromFiles(tc.crtPath, tc.keyPath)
|
|
|
|
|
require.True(t, tc.checkReturnFn(crt, err))
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|