1package sshutils
  2
  3import (
  4	"testing"
  5
  6	"github.com/charmbracelet/keygen"
  7	"golang.org/x/crypto/ssh"
  8)
  9
 10func generateKeys(tb testing.TB) (*keygen.SSHKeyPair, *keygen.SSHKeyPair) {
 11	goodKey1, err := keygen.New("", keygen.WithKeyType(keygen.Ed25519))
 12	if err != nil {
 13		tb.Fatal(err)
 14	}
 15	goodKey2, err := keygen.New("", keygen.WithKeyType(keygen.RSA))
 16	if err != nil {
 17		tb.Fatal(err)
 18	}
 19
 20	return goodKey1, goodKey2
 21}
 22
 23func TestParseAuthorizedKey(t *testing.T) {
 24	goodKey1, goodKey2 := generateKeys(t)
 25	cases := []struct {
 26		in   string
 27		good bool
 28	}{
 29		{
 30			goodKey1.AuthorizedKey(),
 31			true,
 32		},
 33		{
 34			goodKey2.AuthorizedKey(),
 35			true,
 36		},
 37		{
 38			goodKey1.AuthorizedKey() + "test",
 39			false,
 40		},
 41		{
 42			goodKey2.AuthorizedKey() + "bad",
 43			false,
 44		},
 45	}
 46	for _, c := range cases {
 47		_, _, err := ParseAuthorizedKey(c.in)
 48		if c.good && err != nil {
 49			t.Errorf("ParseAuthorizedKey(%q) returned error: %v", c.in, err)
 50		}
 51		if !c.good && err == nil {
 52			t.Errorf("ParseAuthorizedKey(%q) did not return error", c.in)
 53		}
 54	}
 55}
 56
 57func TestMarshalAuthorizedKey(t *testing.T) {
 58	goodKey1, goodKey2 := generateKeys(t)
 59	cases := []struct {
 60		in       ssh.PublicKey
 61		expected string
 62	}{
 63		{
 64			goodKey1.PublicKey(),
 65			goodKey1.AuthorizedKey(),
 66		},
 67		{
 68			goodKey2.PublicKey(),
 69			goodKey2.AuthorizedKey(),
 70		},
 71		{
 72			nil,
 73			"",
 74		},
 75	}
 76	for _, c := range cases {
 77		out := MarshalAuthorizedKey(c.in)
 78		if out != c.expected {
 79			t.Errorf("MarshalAuthorizedKey(%v) returned %q, expected %q", c.in, out, c.expected)
 80		}
 81	}
 82}
 83
 84func TestKeysEqual(t *testing.T) {
 85	goodKey1, goodKey2 := generateKeys(t)
 86	cases := []struct {
 87		in1      ssh.PublicKey
 88		in2      ssh.PublicKey
 89		expected bool
 90	}{
 91		{
 92			goodKey1.PublicKey(),
 93			goodKey1.PublicKey(),
 94			true,
 95		},
 96		{
 97			goodKey2.PublicKey(),
 98			goodKey2.PublicKey(),
 99			true,
100		},
101		{
102			goodKey1.PublicKey(),
103			goodKey2.PublicKey(),
104			false,
105		},
106		{
107			nil,
108			nil,
109			false,
110		},
111		{
112			nil,
113			goodKey1.PublicKey(),
114			false,
115		},
116	}
117
118	for _, c := range cases {
119		out := KeysEqual(c.in1, c.in2)
120		if out != c.expected {
121			t.Errorf("KeysEqual(%v, %v) returned %v, expected %v", c.in1, c.in2, out, c.expected)
122		}
123	}
124}