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}