Skip to content

Commit a1c51e4

Browse files
authored
Merge pull request #12 from github/critical-options
Support for force-command and source-address critical options
2 parents 55cd100 + 6f5025c commit a1c51e4

27 files changed

+415
-0
lines changed

lib/ssh_data/certificate.rb

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require "securerandom"
2+
require "ipaddr"
23

34
module SSHData
45
class Certificate
@@ -23,6 +24,9 @@ class Certificate
2324
ALGO_ED25519
2425
]
2526

27+
CRITICAL_OPTION_FORCE_COMMAND = "force-command"
28+
CRITICAL_OPTION_SOURCE_ADDRESS = "source-address"
29+
2630
attr_reader :algo, :nonce, :public_key, :serial, :type, :key_id,
2731
:valid_principals, :valid_after, :valid_before,
2832
:critical_options, :extensions, :reserved, :ca_key, :signature
@@ -163,6 +167,55 @@ def verify
163167
ca_key.verify(signed_data, signature)
164168
end
165169

170+
# The force-command critical option, if present.
171+
#
172+
# Returns a String or nil.
173+
def force_command
174+
case value = critical_options[CRITICAL_OPTION_FORCE_COMMAND]
175+
when String, NilClass
176+
value
177+
else
178+
raise DecodeError, "bad force-request"
179+
end
180+
end
181+
182+
# The source-address critical option, if present.
183+
#
184+
# Returns an Array of IPAddr instances or nil.
185+
def source_address
186+
return @source_address if defined?(@source_address)
187+
188+
value = critical_options[CRITICAL_OPTION_SOURCE_ADDRESS]
189+
190+
@source_address = case value
191+
when String
192+
value.split(",").map do |str_addr|
193+
begin
194+
IPAddr.new(str_addr.strip)
195+
rescue IPAddr::InvalidAddressError => e
196+
raise DecodeError, "bad source-address: #{e.message}"
197+
end
198+
end
199+
when NilClass
200+
nil
201+
else
202+
raise DecodeError, "bad source-address"
203+
end
204+
end
205+
206+
# Check if the given IP address is allowed for use with this certificate.
207+
#
208+
# address - A String IP address.
209+
#
210+
# Returns boolean.
211+
def allowed_source_address?(address)
212+
return true if source_address.nil?
213+
parsed_addr = IPAddr.new(address)
214+
source_address.any? { |a| a.include?(parsed_addr) }
215+
rescue IPAddr::InvalidAddressError
216+
return false
217+
end
218+
166219
private
167220

168221
# The portion of the certificate over which the signature is calculated.

spec/certificate_spec.rb

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,110 @@
5656
}.not_to raise_error
5757
end
5858

59+
describe "#force_command" do
60+
it "parses valid option" do
61+
parsed = described_class.parse_openssh(fixture("valid_force_command-cert.pub"))
62+
expect(parsed.force_command).to eq("asdf")
63+
end
64+
65+
it "raises on invalid option" do
66+
parsed = described_class.parse_openssh(fixture("invalid_force_command-cert.pub"))
67+
68+
expect {
69+
parsed.force_command
70+
}.to raise_error(SSHData::DecodeError)
71+
end
72+
end
73+
74+
describe "#source_address" do
75+
it "is without option" do
76+
parsed = described_class.parse_openssh(fixture("rsa_leaf_for_rsa_ca-cert.pub"))
77+
expect(parsed.source_address).to be_nil
78+
end
79+
80+
it "parses single address" do
81+
parsed = described_class.parse_openssh(fixture("single_source_address-cert.pub"))
82+
expect(parsed.source_address).to eq([IPAddr.new("1.1.1.1")])
83+
end
84+
85+
it "parses single CIDR range" do
86+
parsed = described_class.parse_openssh(fixture("single_cidr_source_address-cert.pub"))
87+
expect(parsed.source_address).to eq([IPAddr.new("1.1.1.0/24")])
88+
end
89+
90+
it "parses multiple CIDR range" do
91+
parsed = described_class.parse_openssh(fixture("multiple_cidr_source_address-cert.pub"))
92+
expect(parsed.source_address).to eq([IPAddr.new("1.1.1.0/24"), IPAddr.new("2.2.2.0/24")])
93+
end
94+
95+
it "parses option with spaces" do
96+
parsed = described_class.parse_openssh(fixture("spaces_source_address-cert.pub"))
97+
expect(parsed.source_address).to eq([IPAddr.new("1.1.1.1"), IPAddr.new("2.2.2.2")])
98+
end
99+
100+
it "raises on invalid option" do
101+
parsed = described_class.parse_openssh(fixture("invalid_source_address_flag-cert.pub"))
102+
103+
expect {
104+
parsed.source_address
105+
}.to raise_error(SSHData::DecodeError)
106+
end
107+
108+
it "raises on invalid IP address in option" do
109+
parsed = described_class.parse_openssh(fixture("invalid_source_address_bad_ip-cert.pub"))
110+
111+
expect {
112+
parsed.source_address
113+
}.to raise_error(SSHData::DecodeError)
114+
end
115+
end
116+
117+
describe "#allowed_source_address?" do
118+
let(:public_key) { SSHData::PrivateKey::ED25519.generate.public_key }
119+
let(:key_id) { "some-id" }
120+
121+
subject {
122+
described_class.new(public_key: public_key, key_id: key_id)
123+
}
124+
125+
it "checks single address" do
126+
subject.critical_options["source-address"] = "1.1.1.1"
127+
expect(subject.allowed_source_address?("1.1.1.1")).to be(true)
128+
expect(subject.allowed_source_address?("2.2.2.2")).to be(false)
129+
end
130+
131+
it "checks multiple addresses" do
132+
subject.critical_options["source-address"] = "1.1.1.1,2.2.2.2"
133+
expect(subject.allowed_source_address?("1.1.1.1")).to be(true)
134+
expect(subject.allowed_source_address?("2.2.2.2")).to be(true)
135+
expect(subject.allowed_source_address?("3.3.3.3")).to be(false)
136+
end
137+
138+
it "checks single CIDR range" do
139+
subject.critical_options["source-address"] = "1.1.1.0/24"
140+
expect(subject.allowed_source_address?("1.1.1.1")).to be(true)
141+
expect(subject.allowed_source_address?("1.1.1.2")).to be(true)
142+
expect(subject.allowed_source_address?("2.2.2.2")).to be(false)
143+
expect(subject.allowed_source_address?("1.1.2.1")).to be(false)
144+
end
145+
146+
it "checks multiple CIDR ranges" do
147+
subject.critical_options["source-address"] = "1.1.1.0/24,2.2.2.0/24"
148+
expect(subject.allowed_source_address?("1.1.1.1")).to be(true)
149+
expect(subject.allowed_source_address?("2.2.2.2")).to be(true)
150+
expect(subject.allowed_source_address?("3.3.3.3")).to be(false)
151+
end
152+
153+
it "returns false for bad addresses" do
154+
subject.critical_options["source-address"] = "1.1.1.1"
155+
expect(subject.allowed_source_address?("foo")).to be(false)
156+
end
157+
158+
it "allows any address if option is missing" do
159+
expect(subject.allowed_source_address?("1.1.1.1")).to be(true)
160+
end
161+
end
162+
59163
test_cases = []
60164

61165
test_cases << [

spec/fixtures/gen.sh

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,24 @@ ssh-keygen -s rsa_ca -z 123 -n p1,p2 -O clear -I my-ident -O critical:foo=bar -O
3434
ssh-keygen -ted25519 -N "" -f ./ed25519_leaf_for_rsa_ca
3535
ssh-keygen -s rsa_ca -z 123 -n p1,p2 -O clear -I my-ident -O critical:foo=bar -O extension:baz=qwer -O permit-X11-forwarding ed25519_leaf_for_rsa_ca.pub
3636

37+
# critical opts
38+
ssh-keygen -trsa -N "" -f ./valid_force_command
39+
ssh-keygen -s rsa_ca -z 123 -O clear -I my-ident -O force-command=asdf valid_force_command.pub
40+
ssh-keygen -trsa -N "" -f ./invalid_force_command
41+
ssh-keygen -s rsa_ca -z 123 -O clear -I my-ident -O critical:force-command invalid_force_command.pub
42+
ssh-keygen -trsa -N "" -f ./single_source_address
43+
ssh-keygen -s rsa_ca -z 123 -O clear -I my-ident -O source-address=1.1.1.1 single_source_address.pub
44+
ssh-keygen -trsa -N "" -f ./single_cidr_source_address
45+
ssh-keygen -s rsa_ca -z 123 -O clear -I my-ident -O source-address=1.1.1.0/24 single_cidr_source_address.pub
46+
ssh-keygen -trsa -N "" -f ./multiple_cidr_source_address
47+
ssh-keygen -s rsa_ca -z 123 -O clear -I my-ident -O source-address=1.1.1.0/24,2.2.2.0/24 multiple_cidr_source_address.pub
48+
ssh-keygen -trsa -N "" -f ./spaces_source_address
49+
ssh-keygen -s rsa_ca -z 123 -O clear -I my-ident -O critical:source-address="1.1.1.1, 2.2.2.2" spaces_source_address.pub
50+
ssh-keygen -trsa -N "" -f ./invalid_source_address_flag
51+
ssh-keygen -s rsa_ca -z 123 -O clear -I my-ident -O critical:source-address invalid_source_address_flag.pub
52+
ssh-keygen -trsa -N "" -f ./invalid_source_address_bad_ip
53+
ssh-keygen -s rsa_ca -z 123 -O clear -I my-ident -O critical:source-address=foo invalid_source_address_bad_ip.pub
54+
3755
# pem encoded keys
3856
openssl genrsa -out rsa.plaintext.pem 2048
3957
openssl rsa -aes-128-cbc -passout pass:mypass -in rsa.plaintext.pem -out rsa.encrypted.pem
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN OPENSSH PRIVATE KEY-----
2+
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
3+
NhAAAAAwEAAQAAAQEAqywAJgqnv8oeuuqr4Ta7ZDixyePRBnO4wjwP3hH+RD+U7POSTmIH
4+
+LmvAN3M+id9pCmbpiuEFvksuXHISW5+qJHazWuZ7e5NWYwM1qS6sX608/wsce/8/IOZGC
5+
A/7f0fz9KXgSH52IYenHglL7KalwBrwzCUMKoAOFe7kWb/Hb9KrYFzpSfbKN6fkIMP103N
6+
Yiwj6YL+HyJ23Y84u1mH9oNZWtLw+UUk3Z7MnxiFFqAgjXquXKGOkcB4veNDf8QEq7+Q7T
7+
4iTUA94hfCkLOuV1Dwlew1CQbt+nhbZoEh4huYY1TKphyqc6Xr+dkF5ANqizToXWh9WoNO
8+
PVz+UpGgBQAAA+CicMu7onDLuwAAAAdzc2gtcnNhAAABAQCrLAAmCqe/yh666qvhNrtkOL
9+
HJ49EGc7jCPA/eEf5EP5Ts85JOYgf4ua8A3cz6J32kKZumK4QW+Sy5cchJbn6okdrNa5nt
10+
7k1ZjAzWpLqxfrTz/Cxx7/z8g5kYID/t/R/P0peBIfnYhh6ceCUvspqXAGvDMJQwqgA4V7
11+
uRZv8dv0qtgXOlJ9so3p+Qgw/XTc1iLCPpgv4fInbdjzi7WYf2g1la0vD5RSTdnsyfGIUW
12+
oCCNeq5coY6RwHi940N/xASrv5DtPiJNQD3iF8KQs65XUPCV7DUJBu36eFtmgSHiG5hjVM
13+
qmHKpzpev52QXkA2qLNOhdaH1ag049XP5SkaAFAAAAAwEAAQAAAQBNnQHkPeiaGfedIVMW
14+
J08Ivnw+4sGgf1BDIiC/vMDiCUJpvneUevbKXMdxSSDsPIPHr+YXjpuyHwGchG8gfK2Jmb
15+
jwc92z+N2xwMMBgGf2m1FJYAp3Dy5TAQil29mg+6k0/nQb5V/4QbgXkpKp8f4Oge5a7ugC
16+
uNKouX8fCuiaf6fYWg8Cbnmz0SuOGfu8KR6vlfFQmw+0QNpHGN1gePjWUm3Gy4kWEhcNwu
17+
t03Fc6qs7/+Yjktnabme4QHFCcFygYkTlC8Jv8WSGvRk4ZEAnNlbtiEhBylxxRu91Xzo1o
18+
OvP+pDD0vjvlpj1DP28j4GkMa92SUF9Y9dgYhSr5V7XxAAAAgQCKCCoZWUnVb05hhi10Si
19+
JRf7WEIz6FG38CFWlAC5B6eHbRtRzYF7wl1MQ5aqoPf3DA95qJ9n1Ty5eiKslGneP3nIFQ
20+
v7dwaj9fhB5xYyAJGKElydZP7GaHZGEzkJX7Ww3YmiIFvDytUZougbB8v0QkCbXUMPAlfr
21+
uohz1KPCSkNgAAAIEA4rY5PlGDCTYjlokNunuPPyYsFVH6+MfL7KNp6WjwV0GJERSQip3l
22+
TTjSlapDZ0a4xCULnhC7wWcZ0HX5xAuw549ZrzZdLVQvXkuF6CoyBx9ZSzUzu3DJsxqzkQ
23+
wnrDe0sc6mtFvRQI+6yGJOQjd2sVv7e7pH6aIrg9VpZXtMrM8AAACBAMFI+CE7izcrquEP
24+
9OMJnrDBu3mITAYskaaWeGNDMaomAuV3538emEcEroADNDCIPqrHiZ/evD/C43+isUnDDt
25+
bQ2ez7MicjROycQXJ50eKCcD8ADJGtIB79MhHTKmCfD8j3Xt43avBIl0YbjPL+MDEHEjE1
26+
zgg3YpFAczSB7KLrAAAAJm1hc3RhaHlldGlAQmVuamFtaW5zLU1hY0Jvb2stUHJvLmxvY2
27+
FsAQIDBA==
28+
-----END OPENSSH PRIVATE KEY-----
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[email protected] AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAg/uUd7j9dIZaug62kubG3uLaEZaH5SepUWhr53g/1wL8AAAADAQABAAABAQCrLAAmCqe/yh666qvhNrtkOLHJ49EGc7jCPA/eEf5EP5Ts85JOYgf4ua8A3cz6J32kKZumK4QW+Sy5cchJbn6okdrNa5nt7k1ZjAzWpLqxfrTz/Cxx7/z8g5kYID/t/R/P0peBIfnYhh6ceCUvspqXAGvDMJQwqgA4V7uRZv8dv0qtgXOlJ9so3p+Qgw/XTc1iLCPpgv4fInbdjzi7WYf2g1la0vD5RSTdnsyfGIUWoCCNeq5coY6RwHi940N/xASrv5DtPiJNQD3iF8KQs65XUPCV7DUJBu36eFtmgSHiG5hjVMqmHKpzpev52QXkA2qLNOhdaH1ag049XP5SkaAFAAAAAAAAAHsAAAABAAAACG15LWlkZW50AAAAAAAAAAAAAAAA//////////8AAAAVAAAADWZvcmNlLWNvbW1hbmQAAAAAAAAAAAAAAAAAAAEXAAAAB3NzaC1yc2EAAAADAQABAAABAQDPB20SS4Ry0ahVJGIf5aYRU81PwtUiDLj2ChUnMfYtCYemucIRjkfTUquHzePbecUaWx/NHX0GHRv7c4NO+TYx/UPDC6e2ZmRhDRy/pc5qtyRu7fqBSsrhBAvAdv13F5LzMlRv+oZXIEBeNM8Zd3NIgapztMdxkBF+LsNksbisg9ixTJcOb3iSZVzQP4vmQH1wviO0/WFYj+rS3TroT6gPxUuafzThcXFtxLWAXAM+f9bLP9cJHW3AAGfohylRKTcVsxS7x7YljrK0EwfAh4KvjTAnk5gpbdLHaPweRrN62eYfIRZxCubdedDVuZ3PVlUmQWAhntHUkInB+mlkP/HvAAABDwAAAAdzc2gtcnNhAAABAKVT5p0dl5tYjbf4KC3Li7/GJragrAT+JFCKTCIlusetinvveUN/v01f31xXKqGK3JbUXdZcFrjjt/XyhAEGIUoaY2+GRZk5OSrvHB95xmFgbUUP53xzY1+DbHX9H9TmeHhTioIOXta23tUSHmfoYNW55ETxgxX4ZydRHrnbX3Qk5TlvXFYwztLKpq6NqBBu4bIQ+EKBy6x2dBEu8D9j4Wg3JOYYFUpLmDg/Q8rq5LQD0FEnIcEgoycl7S+B4UCNSJBPcccySfmjuwwcsTuWSp5CNoa0UCLd6qso7g8ZtnPVJJRD9ZdfuWzpaz8RujEnc1Dmnjw+Afp/2O9/3KIo0Lc= [email protected]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCrLAAmCqe/yh666qvhNrtkOLHJ49EGc7jCPA/eEf5EP5Ts85JOYgf4ua8A3cz6J32kKZumK4QW+Sy5cchJbn6okdrNa5nt7k1ZjAzWpLqxfrTz/Cxx7/z8g5kYID/t/R/P0peBIfnYhh6ceCUvspqXAGvDMJQwqgA4V7uRZv8dv0qtgXOlJ9so3p+Qgw/XTc1iLCPpgv4fInbdjzi7WYf2g1la0vD5RSTdnsyfGIUWoCCNeq5coY6RwHi940N/xASrv5DtPiJNQD3iF8KQs65XUPCV7DUJBu36eFtmgSHiG5hjVMqmHKpzpev52QXkA2qLNOhdaH1ag049XP5SkaAF [email protected]
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN OPENSSH PRIVATE KEY-----
2+
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
3+
NhAAAAAwEAAQAAAQEA7G8r4vhsINJH6uq3mZwZrPwbObo/fUHynwgIAE7ROX/icXwlUy/V
4+
1VnfNNSinhRcm41QB+057eT0NB7TE7VK6YjIXCppRRz5I7WShoQmV4bhqKP8eTw8FbEcoH
5+
YFGGiFgnaNr84Vfisl8J7DO5t3ZUwcI81lhSGNn66lEOdhvt/sPJN4xDSLNMa4Th92rrzE
6+
wkNvQ41JF3jlDUH94JoH5ZW5lhFJBbHUSk/S1qbAxeNyFlFMUcxrPWmsUUDF0fSem4zWqU
7+
2yxSa9yqbrY9H2zY26j1Iyd5PtsOUiUYg5fmI24zlh76oniPM92Hv/fp6JJ6oSFqqUtila
8+
ad6UkQporwAAA+Bqvtp5ar7aeQAAAAdzc2gtcnNhAAABAQDsbyvi+Gwg0kfq6reZnBms/B
9+
s5uj99QfKfCAgATtE5f+JxfCVTL9XVWd801KKeFFybjVAH7Tnt5PQ0HtMTtUrpiMhcKmlF
10+
HPkjtZKGhCZXhuGoo/x5PDwVsRygdgUYaIWCdo2vzhV+KyXwnsM7m3dlTBwjzWWFIY2frq
11+
UQ52G+3+w8k3jENIs0xrhOH3auvMTCQ29DjUkXeOUNQf3gmgfllbmWEUkFsdRKT9LWpsDF
12+
43IWUUxRzGs9aaxRQMXR9J6bjNapTbLFJr3Kputj0fbNjbqPUjJ3k+2w5SJRiDl+YjbjOW
13+
HvqieI8z3Ye/9+noknqhIWqpS2KVpp3pSRCmivAAAAAwEAAQAAAQBeXXypqTcW3na/xxCi
14+
aZBB35lKMBDZAHJCkOUIomyVQ3pwivkmu4fgEG+q2VdSOpQ/rWYM09z0GxZwmwDp88jDbs
15+
lxJ6g+YnL5kqW5tJLNClOUiGbjSGw+yCLB1HjyJf1rdb/VNC6V3cjVwbfwWXuM3ZS5oWfs
16+
e9jXq8/L8F2t3VM6WLFANrjfBNVgi/L+jXvyeYCxBaEjwzMpC4Vi4sQyOTC8cHg0/CR71R
17+
PLf3ObgEI9OybVnLnguzTQlpJSL0DSq36qDzeRX1OU7oMOgHtyr2AIyLe20wEfGzwltsPu
18+
kkDPTohIvGZEEdbhfDF/AU4mdojczbfJM17x1kFTaeWhAAAAgQDe0kkXTLHO49VCHlFrsv
19+
Tuaiq9/YsJxDTEG4uP8PdJ/dZEOwz/yjwGjuawhKqIlMoi9LljSqidnP8LeLMMqJvpX9uq
20+
DF5YucDhKPGt1MuoTlozskM3XLlfxk1oKISxsuLUX6g55R3gVLcIXPJPcu5JUiE99pqnHV
21+
v6A1xjVXoUxQAAAIEA+CbKBKlrEPHNeOWX/+2hjSkIJoWUPsLgqdnhHIFiOQXqiKAN62oz
22+
ARSGvLJqS/2AEkXpuF7u0kq7xjwpXx0J0Kk/9CAUFJ2wWPgOCZPUrmJ3/PAae3L4Wq8VVo
23+
pkCvFO6lPUAseYKVIyV/2aTf4uxmDDTAF8WLlZ9pQE1jJMVZ8AAACBAPPpgtWGoX8jWsMU
24+
YvtzvCaPSJVIEKUoZxxb+m9eS+jvzcTx5ApuvFyIUvNaTCTQLhOWc52IU/oUe6MLBssf0M
25+
pYeV0iD5YGbqSXsqHGjyZPC/dYLQNF/26eIwhNMgs06+wI455yYG+uLxS92jxeSByp3ck7
26+
GYnpschgMEn503LxAAAAJm1hc3RhaHlldGlAQmVuamFtaW5zLU1hY0Jvb2stUHJvLmxvY2
27+
FsAQIDBA==
28+
-----END OPENSSH PRIVATE KEY-----
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[email protected] AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgCLml2Sct3oQ3IB7gYfDY9lAxCO7C0NWGNS8qn+ZEZ50AAAADAQABAAABAQDsbyvi+Gwg0kfq6reZnBms/Bs5uj99QfKfCAgATtE5f+JxfCVTL9XVWd801KKeFFybjVAH7Tnt5PQ0HtMTtUrpiMhcKmlFHPkjtZKGhCZXhuGoo/x5PDwVsRygdgUYaIWCdo2vzhV+KyXwnsM7m3dlTBwjzWWFIY2frqUQ52G+3+w8k3jENIs0xrhOH3auvMTCQ29DjUkXeOUNQf3gmgfllbmWEUkFsdRKT9LWpsDF43IWUUxRzGs9aaxRQMXR9J6bjNapTbLFJr3Kputj0fbNjbqPUjJ3k+2w5SJRiDl+YjbjOWHvqieI8z3Ye/9+noknqhIWqpS2KVpp3pSRCmivAAAAAAAAAHsAAAABAAAACG15LWlkZW50AAAAAAAAAAAAAAAA//////////8AAAAdAAAADnNvdXJjZS1hZGRyZXNzAAAABwAAAANmb28AAAAAAAAAAAAAARcAAAAHc3NoLXJzYQAAAAMBAAEAAAEBAM8HbRJLhHLRqFUkYh/lphFTzU/C1SIMuPYKFScx9i0Jh6a5whGOR9NSq4fN49t5xRpbH80dfQYdG/tzg075NjH9Q8MLp7ZmZGENHL+lzmq3JG7t+oFKyuEEC8B2/XcXkvMyVG/6hlcgQF40zxl3c0iBqnO0x3GQEX4uw2SxuKyD2LFMlw5veJJlXNA/i+ZAfXC+I7T9YViP6tLdOuhPqA/FS5p/NOFxcW3EtYBcAz5/1ss/1wkdbcAAZ+iHKVEpNxWzFLvHtiWOsrQTB8CHgq+NMCeTmClt0sdo/B5Gs3rZ5h8hFnEK5t150NW5nc9WVSZBYCGe0dSQicH6aWQ/8e8AAAEPAAAAB3NzaC1yc2EAAAEAygVdwy80/K65d28IZJfbTGf/5L+GVAvdQFW3vPLCmzoCPz1NzueLv8pwkAkQyvyK50puOpKFn0pPNfdGo3gDQboOzBQ5Cw2m+A8OtlbyVUv5yXsnUjJPM6mi3yacerwWy6cur4yZZ/4fRir6vhC9AGt8+Pk1Lby41Ujdp33x+SiuhrRG2Ma/p+KnsFma8qsTlOT6knKvhQhb9ygYVV6giR7S8lnXrmhqlW026wy3u/JgCgSTRox4Ljf2HJu1B5XnS2xH5XNzO8Zfjsf+UXZ0tnvndwtXqNAd+LEjg5H/S8Mted8L8xzVDfFjeuBBhEhmwzOe4lbUbfFmKP/fzwNZqg== [email protected]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDsbyvi+Gwg0kfq6reZnBms/Bs5uj99QfKfCAgATtE5f+JxfCVTL9XVWd801KKeFFybjVAH7Tnt5PQ0HtMTtUrpiMhcKmlFHPkjtZKGhCZXhuGoo/x5PDwVsRygdgUYaIWCdo2vzhV+KyXwnsM7m3dlTBwjzWWFIY2frqUQ52G+3+w8k3jENIs0xrhOH3auvMTCQ29DjUkXeOUNQf3gmgfllbmWEUkFsdRKT9LWpsDF43IWUUxRzGs9aaxRQMXR9J6bjNapTbLFJr3Kputj0fbNjbqPUjJ3k+2w5SJRiDl+YjbjOWHvqieI8z3Ye/9+noknqhIWqpS2KVpp3pSRCmiv [email protected]
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN OPENSSH PRIVATE KEY-----
2+
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
3+
NhAAAAAwEAAQAAAQEAwNePR8FplXpACjGterqAbAcu0Agef+Qo4fUPE34JPIjg59qn/wNX
4+
sAFqcAt6PBxVtSa9h46JNndpXJTsGGy34CTtTe0e8Ju3fzUsgOIbnog+V9PGQoy7VrK/2V
5+
h2z1OOPB+7PjFC1CosjmBT0XUfpj4XN2n7WXixvoGEwU6BmrzVMQuRfGoSe+JUkN18uTJu
6+
eaMce7MqdfGj3Q0c5ZBnfz4eczgY9LkF/sjEE/oWoHynXt+DPf3FP0wNkg9EWCl2XSKE0s
7+
3xCL2oAd27ZC5Ui+VrTA8hPXlEJvSFAY1aSimwDtOoA+6+MTCsSIXQAm1JQXKFlPUdaEE/
8+
pPdqoybxtwAAA+AM4Do1DOA6NQAAAAdzc2gtcnNhAAABAQDA149HwWmVekAKMa16uoBsBy
9+
7QCB5/5Cjh9Q8Tfgk8iODn2qf/A1ewAWpwC3o8HFW1Jr2Hjok2d2lclOwYbLfgJO1N7R7w
10+
m7d/NSyA4hueiD5X08ZCjLtWsr/ZWHbPU448H7s+MULUKiyOYFPRdR+mPhc3aftZeLG+gY
11+
TBToGavNUxC5F8ahJ74lSQ3Xy5Mm55oxx7syp18aPdDRzlkGd/Ph5zOBj0uQX+yMQT+hag
12+
fKde34M9/cU/TA2SD0RYKXZdIoTSzfEIvagB3btkLlSL5WtMDyE9eUQm9IUBjVpKKbAO06
13+
gD7r4xMKxIhdACbUlBcoWU9R1oQT+k92qjJvG3AAAAAwEAAQAAAQAuk6Hqrd9nmBhhnfAN
14+
pYAhF3cKDfv33c62DK9wgM+QTGst9NUAtfj27NCdcVg7rohQ8aNzW0zu19ad4uZHW/Lpc2
15+
HRoYUIjkO6uMgf9PzAxJ1yLxdCuaUB4riNsV045DCFexCJi/JdNjZ+yOtVutlDGNoYq0Nn
16+
L8yWe8fpvKF3EttqJOIvB55ErkwzE1lutjIXyWOhotsnkZPejt5gW2H3a2k3N84CPoFtDh
17+
e0DFZ7WNwGy3utk+MMdbfqaXFLAOagKO2FusX/uiu7Pr+8tE+lr8QG1HLALte0VTRE3jkP
18+
hExxfJc6aw3j67abh4GnfrHddqwAc6zw3jvFMcgUWW0JAAAAgQCQOZ4jOLODAXJ34eobN3
19+
NU90WrzggR7WdvKD2rFkChQCgCnqR9uo2BeZIByTPGtUc80tWWcA/5QqU9weeA+tmuWpgt
20+
UVsO8WDwR3qyexF1vfbCwK9HDvKEoH5p7phs5Xi63CLKAiYzjaCHJk9u63g9sik4PWTHfm
21+
HH7xPyUW43agAAAIEA579mfbzJJyAzv8gvdQnsmsUS9iQzGKgt/mwv227MVTeq8JizVwga
22+
4ddbM+DVdn5/zVnWHMaeJeKJIsREwCssUb/wE0hVlW6o/SV+4mItknomt8LwNlV9RDaI2R
23+
hA1rODoA253pXJgKPQCH2JN8mH15Fl9VylKr3iXkOaWN/ON6UAAACBANUF3TlV7RKOaDLq
24+
fQSgg1G9mI2KUtqIxnQH15BeGzB2GRzDz8N1vS6oRMd+Ejp5sAImbOd1v0IzffdeOZigjo
25+
8gn/R7WAAWesJabhlWCUqqS/WoIfLeg39pIt4owNBp6KWTAvi4MkVQzOiSdfPj0kokfCHe
26+
4bUaVRoG4jtwOeUrAAAAJm1hc3RhaHlldGlAQmVuamFtaW5zLU1hY0Jvb2stUHJvLmxvY2
27+
FsAQIDBA==
28+
-----END OPENSSH PRIVATE KEY-----

0 commit comments

Comments
 (0)