From 0a8f3e30f8f83445f815fc5ca50b23e97814b3bc Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Wed, 27 Oct 2021 09:54:06 +0300 Subject: integration tests use separate ssh private key file --- internal/ssh/client/clientkeypair.go | 91 ++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 internal/ssh/client/clientkeypair.go (limited to 'internal/ssh/client/clientkeypair.go') diff --git a/internal/ssh/client/clientkeypair.go b/internal/ssh/client/clientkeypair.go new file mode 100644 index 0000000..0e21d0c --- /dev/null +++ b/internal/ssh/client/clientkeypair.go @@ -0,0 +1,91 @@ +package client + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "encoding/pem" + "fmt" + "io/ioutil" + "os" + + "github.com/mimecast/dtail/internal/io/dlog" + "golang.org/x/crypto/ssh" +) + +// GeneratePrivatePublicKeyPairIfNotExists generates a SSH key pair (used by the integration tests) +func GeneratePrivatePublicKeyPairIfNotExists(keyPath string, bitSize int) { + if _, err := os.Stat(keyPath); err == nil { + dlog.Common.Debug("Private/public key pair already exists", keyPath) + return + } + GeneratePrivatePublicKeyPair(keyPath, bitSize) +} + +// GeneratePrivatePublicKeyPair generates a SSH key pair (used by the integration tests) +func GeneratePrivatePublicKeyPair(keyPath string, bitSize int) { + privateKeyPath := keyPath + publicKeyPath := fmt.Sprintf("%s.pub", keyPath) + + dlog.Common.Debug("Generating private/public key pair", privateKeyPath, publicKeyPath) + + privateKey, err := generatePrivateKey(bitSize) + if err != nil { + dlog.Common.FatalPanic(err) + } + publicKeyBytes, err := generatePublicKey(&privateKey.PublicKey) + if err != nil { + dlog.Common.FatalPanic(err) + } + privateKeyBytes := encodePrivateKeyToPEM(privateKey) + err = writeKey(privateKeyBytes, privateKeyPath) + if err != nil { + dlog.Common.FatalPanic(err) + } + err = writeKey([]byte(publicKeyBytes), publicKeyPath) + if err != nil { + dlog.Common.FatalPanic(err) + } + + dlog.Common.Debug("Done generating private/public key pair", privateKeyPath, publicKeyPath) +} + +func generatePrivateKey(bitSize int) (*rsa.PrivateKey, error) { + privateKey, err := rsa.GenerateKey(rand.Reader, bitSize) + if err != nil { + return nil, err + } + err = privateKey.Validate() + if err != nil { + return nil, err + } + return privateKey, nil +} + +func encodePrivateKeyToPEM(privateKey *rsa.PrivateKey) []byte { + privDER := x509.MarshalPKCS1PrivateKey(privateKey) + privBlock := pem.Block{ + Type: "RSA PRIVATE KEY", + Headers: nil, + Bytes: privDER, + } + privatePEM := pem.EncodeToMemory(&privBlock) + return privatePEM +} + +func generatePublicKey(privatekey *rsa.PublicKey) ([]byte, error) { + publicRsaKey, err := ssh.NewPublicKey(privatekey) + if err != nil { + return nil, err + } + pubKeyBytes := ssh.MarshalAuthorizedKey(publicRsaKey) + return pubKeyBytes, nil +} + +func writeKey(keyBytes []byte, saveFileTo string) error { + err := ioutil.WriteFile(saveFileTo, keyBytes, 0600) + if err != nil { + return err + } + return nil +} -- cgit v1.2.3 From 045236cb49b0de24772e6e7a0b3263a471365849 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Fri, 29 Oct 2021 08:31:26 +0300 Subject: explicitly use dlog.Server for server packages and dlog.Clent for client packages for logging --- internal/ssh/client/clientkeypair.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'internal/ssh/client/clientkeypair.go') diff --git a/internal/ssh/client/clientkeypair.go b/internal/ssh/client/clientkeypair.go index 0e21d0c..b35b25d 100644 --- a/internal/ssh/client/clientkeypair.go +++ b/internal/ssh/client/clientkeypair.go @@ -16,7 +16,7 @@ import ( // GeneratePrivatePublicKeyPairIfNotExists generates a SSH key pair (used by the integration tests) func GeneratePrivatePublicKeyPairIfNotExists(keyPath string, bitSize int) { if _, err := os.Stat(keyPath); err == nil { - dlog.Common.Debug("Private/public key pair already exists", keyPath) + dlog.Client.Debug("Private/public key pair already exists", keyPath) return } GeneratePrivatePublicKeyPair(keyPath, bitSize) @@ -27,27 +27,27 @@ func GeneratePrivatePublicKeyPair(keyPath string, bitSize int) { privateKeyPath := keyPath publicKeyPath := fmt.Sprintf("%s.pub", keyPath) - dlog.Common.Debug("Generating private/public key pair", privateKeyPath, publicKeyPath) + dlog.Client.Debug("Generating private/public key pair", privateKeyPath, publicKeyPath) privateKey, err := generatePrivateKey(bitSize) if err != nil { - dlog.Common.FatalPanic(err) + dlog.Client.FatalPanic(err) } publicKeyBytes, err := generatePublicKey(&privateKey.PublicKey) if err != nil { - dlog.Common.FatalPanic(err) + dlog.Client.FatalPanic(err) } privateKeyBytes := encodePrivateKeyToPEM(privateKey) err = writeKey(privateKeyBytes, privateKeyPath) if err != nil { - dlog.Common.FatalPanic(err) + dlog.Client.FatalPanic(err) } err = writeKey([]byte(publicKeyBytes), publicKeyPath) if err != nil { - dlog.Common.FatalPanic(err) + dlog.Client.FatalPanic(err) } - dlog.Common.Debug("Done generating private/public key pair", privateKeyPath, publicKeyPath) + dlog.Client.Debug("Done generating private/public key pair", privateKeyPath, publicKeyPath) } func generatePrivateKey(bitSize int) (*rsa.PrivateKey, error) { -- cgit v1.2.3