sshkey 1.6.1 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +9 -30
- data/Gemfile +2 -1
- data/LICENSE +1 -1
- data/README.md +23 -7
- data/lib/sshkey.rb +53 -0
- data/lib/sshkey/version.rb +1 -1
- data/sshkey.gemspec +1 -0
- data/test/sshkey_test.rb +78 -0
- metadata +23 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d776647717b5c6c632f8b567e5f24ce5453e9dc
|
4
|
+
data.tar.gz: 4a6a78036abf72069b7facea22e76210a8285e21
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 618febbb798fe552b6304616112826bfc62a190217c4dda38821b6440986958f0f0f1d4d834d48698d9c58ccd285db2361d97175d38403df17f8059e8ccb26c6
|
7
|
+
data.tar.gz: 6b17d1441004cd505882b2d17099be24853a8a360979820d93ae324b309fa2658620f145cf8b75ed179813de10b6ddc3987ae3d8fb222202a5a869135c4bf682
|
data/.travis.yml
CHANGED
@@ -1,41 +1,20 @@
|
|
1
|
+
language: ruby
|
2
|
+
|
1
3
|
rvm:
|
2
4
|
- 1.8.7
|
3
5
|
- 1.9.2
|
4
6
|
- 1.9.3
|
5
|
-
- 2.0
|
6
|
-
-
|
7
|
+
- 2.0
|
8
|
+
- 2.1
|
9
|
+
- 2.2
|
7
10
|
- ruby-head
|
8
|
-
-
|
9
|
-
- jruby
|
10
|
-
- jruby-20mode
|
11
|
+
- ree
|
12
|
+
- jruby
|
11
13
|
- jruby-head
|
12
|
-
- rbx-2.1.1
|
13
14
|
|
14
15
|
matrix:
|
15
16
|
allow_failures:
|
16
17
|
- rvm: ruby-head
|
17
|
-
include:
|
18
|
-
- rvm: jruby-18mode
|
19
|
-
jdk: openjdk6
|
20
|
-
- rvm: jruby-18mode
|
21
|
-
jdk: openjdk7
|
22
|
-
- rvm: jruby-18mode
|
23
|
-
jdk: oraclejdk7
|
24
|
-
- rvm: jruby-19mode
|
25
|
-
jdk: openjdk6
|
26
|
-
- rvm: jruby-19mode
|
27
|
-
jdk: openjdk7
|
28
|
-
- rvm: jruby-19mode
|
29
|
-
jdk: oraclejdk7
|
30
|
-
- rvm: jruby-20mode
|
31
|
-
jdk: openjdk6
|
32
|
-
- rvm: jruby-20mode
|
33
|
-
jdk: openjdk7
|
34
|
-
- rvm: jruby-20mode
|
35
|
-
jdk: oraclejdk7
|
36
18
|
- rvm: jruby-head
|
37
|
-
|
38
|
-
|
39
|
-
jdk: openjdk7
|
40
|
-
- rvm: jruby-head
|
41
|
-
jdk: oraclejdk7
|
19
|
+
|
20
|
+
sudo: false
|
data/Gemfile
CHANGED
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -4,9 +4,9 @@ Generate private and public SSH keys (RSA and DSA supported) using pure Ruby.
|
|
4
4
|
|
5
5
|
gem install sshkey
|
6
6
|
|
7
|
-
Tested on the following Rubies: MRI 1.8.7, 1.9.2, 1.9.3, 2.0.0,
|
7
|
+
Tested on the following Rubies: MRI 1.8.7, 1.9.2, 1.9.3, 2.0.0, 2.1.x, 2.2.x, REE. Ruby must be compiled with OpenSSL support.
|
8
8
|
|
9
|
-
[](http://travis-ci.org/bensie/sshkey)
|
10
10
|
|
11
11
|
## Usage
|
12
12
|
|
@@ -18,7 +18,12 @@ You can also (optionally) supply a `comment` or `passphrase`.
|
|
18
18
|
```ruby
|
19
19
|
k = SSHKey.generate
|
20
20
|
|
21
|
-
k = SSHKey.generate(
|
21
|
+
k = SSHKey.generate(
|
22
|
+
type: "DSA",
|
23
|
+
bits: 1024,
|
24
|
+
comment: "foo@bar.com",
|
25
|
+
passphrase: "foobar"
|
26
|
+
)
|
22
27
|
```
|
23
28
|
|
24
29
|
### Use your existing key
|
@@ -26,7 +31,7 @@ k = SSHKey.generate(:type => "DSA", :bits => 1024, :comment => "foo@bar.com", :p
|
|
26
31
|
Return an SSHKey object from an existing RSA or DSA private key (provided as a string).
|
27
32
|
|
28
33
|
```ruby
|
29
|
-
k = SSHKey.new(File.read("~/.ssh/id_rsa"), :
|
34
|
+
k = SSHKey.new(File.read("~/.ssh/id_rsa"), comment: "foo@bar.com")
|
30
35
|
```
|
31
36
|
|
32
37
|
### The SSHKey object
|
@@ -77,8 +82,10 @@ k.comment = "me@me.com"
|
|
77
82
|
|
78
83
|
k.ssh_public_key
|
79
84
|
# => "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9HuXvYJPtQE/o/7TYi63yAopsrJ6TP+lDGdyQ+nVVp+5ojAIy9h8/h99UlNxjkiFT2YhI3Fl/pgNDRO4PVo6tlgb3CwiAZjSdeE5RnF79Dkj5XsM4j+FLMoXtbRw0K9ok9RKjz6ygIs1JDmaOdXexFnq4nAYU3fSLUa6WoccqTHe8bFuJoAv1gbnx09Js8YcVMD96mpTJ3V/MK5YfIv10dbtrDhGug3IS1V2J+0BB9orbQja554N+4S0I9rFBgVCpvPmQqddDHd/AdGkLv/zjEfGytjnvp68bEfDinkQkPfuxw01yd5MbcvLv39VVICWtKbqW263HT5LvSxwKorR7 me@me.com"
|
80
|
-
```
|
81
85
|
|
86
|
+
k.ssh2_public_key
|
87
|
+
# => "---- BEGIN SSH2 PUBLIC KEY ----\nComment: me@me.com\nAAAAB3NzaC1yc2EAAAADAQABAAABAQC9HuXvYJPtQE/o/7TYi63yAopsrJ6TP+lDGdyQ+n\nVVp+5ojAIy9h8/h99UlNxjkiFT2YhI3Fl/pgNDRO4PVo6tlgb3CwiAZjSdeE5RnF79Dkj5\nXsM4j+FLMoXtbRw0K9ok9RKjz6ygIs1JDmaOdXexFnq4nAYU3fSLUa6WoccqTHe8bFuJoA\nv1gbnx09Js8YcVMD96mpTJ3V/MK5YfIv10dbtrDhGug3IS1V2J+0BB9orbQja554N+4S0I\n9rFBgVCpvPmQqddDHd/AdGkLv/zjEfGytjnvp68bEfDinkQkPfuxw01yd5MbcvLv39VVIC\nWtKbqW263HT5LvSxwKorR7\n---- END SSH2 PUBLIC KEY ----"
|
88
|
+
```
|
82
89
|
#### Bit length
|
83
90
|
|
84
91
|
Determine the strength of the key in bits as an integer.
|
@@ -126,7 +133,7 @@ k.ssh_public_key
|
|
126
133
|
|
127
134
|
#### Randomart
|
128
135
|
|
129
|
-
Generate [OpenSSH compatible](http://www.opensource.apple.com/source/OpenSSH/OpenSSH-175/openssh/key.c) ASCII art fingerprints
|
136
|
+
Generate [OpenSSH compatible](http://www.opensource.apple.com/source/OpenSSH/OpenSSH-175/openssh/key.c) ASCII art fingerprints.
|
130
137
|
|
131
138
|
```ruby
|
132
139
|
puts k.randomart
|
@@ -184,6 +191,15 @@ SSHKey.sha1_fingerprint "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9HuXvYJPtQE/o/7T
|
|
184
191
|
# => "e5:c2:43:9e:e4:0c:0c:47:82:7a:3b:e9:61:13:bd:9c:43:eb:4c:b7"
|
185
192
|
```
|
186
193
|
|
194
|
+
#### Convert to SSH2 Public Key
|
195
|
+
|
196
|
+
Convert an existing SSH Public Key into an SSH2 Public key. Returns `SSHKey::PublicKeyError` if a valid key cannot be generated.
|
197
|
+
|
198
|
+
```ruby
|
199
|
+
SSHKey.ssh_public_key_to_ssh2_public_key "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9HuXvYJPtQE/o/7TYi63yAopsrJ6TP+lDGdyQ+nVVp+5ojAIy9h8/h99UlNxjkiFT2YhI3Fl/pgNDRO4PVo6tlgb3CwiAZjSdeE5RnF79Dkj5XsM4j+FLMoXtbRw0K9ok9RKjz6ygIs1JDmaOdXexFnq4nAYU3fSLUa6WoccqTHe8bFuJoAv1gbnx09Js8YcVMD96mpTJ3V/MK5YfIv10dbtrDhGug3IS1V2J+0BB9orbQja554N+4S0I9rFBgVCpvPmQqddDHd/AdGkLv/zjEfGytjnvp68bEfDinkQkPfuxw01yd5MbcvLv39VVICWtKbqW263HT5LvSxwKorR7 me@me.com"
|
200
|
+
# => "---- BEGIN SSH2 PUBLIC KEY ----\nComment: me@me.com\nAAAAB3NzaC1yc2EAAAADAQABAAABAQC9HuXvYJPtQE/o/7TYi63yAopsrJ6TP+lDGdyQ+n\nVVp+5ojAIy9h8/h99UlNxjkiFT2YhI3Fl/pgNDRO4PVo6tlgb3CwiAZjSdeE5RnF79Dkj5\nXsM4j+FLMoXtbRw0K9ok9RKjz6ygIs1JDmaOdXexFnq4nAYU3fSLUa6WoccqTHe8bFuJoA\nv1gbnx09Js8YcVMD96mpTJ3V/MK5YfIv10dbtrDhGug3IS1V2J+0BB9orbQja554N+4S0I\n9rFBgVCpvPmQqddDHd/AdGkLv/zjEfGytjnvp68bEfDinkQkPfuxw01yd5MbcvLv39VVIC\nWtKbqW263HT5LvSxwKorR7\n---- END SSH2 PUBLIC KEY ----"
|
201
|
+
```
|
202
|
+
|
187
203
|
## Copyright
|
188
204
|
|
189
|
-
Copyright (c) 2011-
|
205
|
+
Copyright (c) 2011-2015 James Miller
|
data/lib/sshkey.rb
CHANGED
@@ -9,6 +9,7 @@ require 'sshkey/exception'
|
|
9
9
|
class SSHKey
|
10
10
|
SSH_TYPES = {"rsa" => "ssh-rsa", "dsa" => "ssh-dss"}
|
11
11
|
SSH_CONVERSION = {"rsa" => ["e", "n"], "dsa" => ["p", "q", "g", "pub_key"]}
|
12
|
+
SSH2_LINE_LENGTH = 70 # +1 (for line wrap '/' character) must be <= 72
|
12
13
|
|
13
14
|
class << self
|
14
15
|
# Generate a new keypair and return an SSHKey object
|
@@ -88,6 +89,29 @@ class SSHKey
|
|
88
89
|
end
|
89
90
|
end
|
90
91
|
|
92
|
+
# Convert an existing SSH public key to SSH2 (RFC4716) public key
|
93
|
+
#
|
94
|
+
# ==== Parameters
|
95
|
+
# * ssh_public_key<~String> - "ssh-rsa AAAAB3NzaC1yc2EA...."
|
96
|
+
# * headers<~Hash> - The Key will be used as the header-tag and the value as the header-value
|
97
|
+
#
|
98
|
+
def ssh_public_key_to_ssh2_public_key(ssh_public_key, headers = nil)
|
99
|
+
raise PublicKeyError, "invalid ssh public key" unless SSHKey.valid_ssh_public_key?(ssh_public_key)
|
100
|
+
|
101
|
+
source_format, source_key = parse_ssh_public_key(ssh_public_key)
|
102
|
+
|
103
|
+
# Add a 'Comment' Header Field unless others are explicitly passed in
|
104
|
+
if source_comment = ssh_public_key.split(source_key)[1]
|
105
|
+
headers = {'Comment' => source_comment.strip} if headers.nil? && !source_comment.empty?
|
106
|
+
end
|
107
|
+
header_fields = build_ssh2_headers(headers)
|
108
|
+
|
109
|
+
ssh2_key = "---- BEGIN SSH2 PUBLIC KEY ----\n"
|
110
|
+
ssh2_key << header_fields unless header_fields.nil?
|
111
|
+
ssh2_key << source_key.scan(/.{1,#{SSH2_LINE_LENGTH}}/).join("\n")
|
112
|
+
ssh2_key << "\n---- END SSH2 PUBLIC KEY ----"
|
113
|
+
end
|
114
|
+
|
91
115
|
private
|
92
116
|
|
93
117
|
def unpacked_byte_array(ssh_type, encoded_key)
|
@@ -121,12 +145,28 @@ class SSHKey
|
|
121
145
|
end
|
122
146
|
|
123
147
|
def parse_ssh_public_key(public_key)
|
148
|
+
raise PublicKeyError, "newlines are not permitted between key data" if public_key =~ /\n(?!$)/
|
149
|
+
|
124
150
|
parsed = public_key.split(" ")
|
125
151
|
parsed.each_with_index do |el, index|
|
126
152
|
return parsed[index..(index+1)] if SSH_TYPES.invert[el]
|
127
153
|
end
|
128
154
|
raise PublicKeyError, "cannot determine key type"
|
129
155
|
end
|
156
|
+
|
157
|
+
def build_ssh2_headers(headers = {})
|
158
|
+
return nil if headers.nil? || headers.empty?
|
159
|
+
|
160
|
+
headers.keys.sort.collect do |header_tag|
|
161
|
+
# header-tag must be us-ascii & <= 64 bytes and header-data must be UTF-8 & <= 1024 bytes
|
162
|
+
raise PublicKeyError, "SSH2 header-tag '#{header_tag}' must be US-ASCII" unless header_tag.each_byte.all? {|b| b < 128 }
|
163
|
+
raise PublicKeyError, "SSH2 header-tag '#{header_tag}' must be <= 64 bytes" unless header_tag.size <= 64
|
164
|
+
raise PublicKeyError, "SSH2 header-value for '#{header_tag}' must be <= 1024 bytes" unless headers[header_tag].size <= 1024
|
165
|
+
|
166
|
+
header_field = "#{header_tag}: #{headers[header_tag]}"
|
167
|
+
header_field.scan(/.{1,#{SSH2_LINE_LENGTH}}/).join("\\\n")
|
168
|
+
end.join("\n") << "\n"
|
169
|
+
end
|
130
170
|
end
|
131
171
|
|
132
172
|
attr_reader :key_object, :type
|
@@ -185,6 +225,19 @@ class SSHKey
|
|
185
225
|
[directives.join(",").strip, SSH_TYPES[type], Base64.encode64(ssh_public_key_conversion).gsub("\n", ""), comment].join(" ").strip
|
186
226
|
end
|
187
227
|
|
228
|
+
# SSH2 public key (RFC4716)
|
229
|
+
#
|
230
|
+
# ==== Parameters
|
231
|
+
# * headers<~Hash> - Keys will be used as header-tags and values as header-values.
|
232
|
+
#
|
233
|
+
# ==== Examples
|
234
|
+
# {'Comment' => '2048-bit RSA created by user@example'}
|
235
|
+
# {'x-private-use-tag' => 'Private Use Value'}
|
236
|
+
#
|
237
|
+
def ssh2_public_key(headers = nil)
|
238
|
+
self.class.ssh_public_key_to_ssh2_public_key(ssh_public_key, headers)
|
239
|
+
end
|
240
|
+
|
188
241
|
# Fingerprints
|
189
242
|
#
|
190
243
|
# MD5 fingerprint for the given SSH public key
|
data/lib/sshkey/version.rb
CHANGED
data/sshkey.gemspec
CHANGED
data/test/sshkey_test.rb
CHANGED
@@ -127,6 +127,46 @@ EOF
|
|
127
127
|
| |
|
128
128
|
| |
|
129
129
|
+-----------------+
|
130
|
+
EOF
|
131
|
+
|
132
|
+
SSH2_PUBLIC_KEY1 = <<-EOF.rstrip
|
133
|
+
---- BEGIN SSH2 PUBLIC KEY ----
|
134
|
+
Comment: me@example.com
|
135
|
+
AAAAB3NzaC1yc2EAAAABIwAAAQEArfTA/lKVR84IMc9ZzXOCHr8DVtR8hzWuEVHF6KElav
|
136
|
+
RHlk14g0SZu3m908Ejm/XF3EfNHjX9wN+62IMA0QBxkBMFCuLF+U/oeUs0NoDdAEKxjj4n
|
137
|
+
6lq6Ss8aLct+anMy7D1jwvOLbcwV54w1d5JDdlZVdZ6AvHm9otwJq6rNpDgdmXY4HgC2nM
|
138
|
+
9csFpuy0cDpL6fdJx9lcNL2RnkRC4+RMsIB+PxDw0j3vDi04dYLBXMGYjyeGH+mIFpL3PT
|
139
|
+
PXGXwL2XDYXZ2H4SQX6bOoKmazTXq6QXuEB665njh1GxXldoIMcSshoJL0hrk3WrTOG22N
|
140
|
+
2CQA+IfHgrXJ+A+QUzKQ==
|
141
|
+
---- END SSH2 PUBLIC KEY ----
|
142
|
+
EOF
|
143
|
+
|
144
|
+
SSH2_PUBLIC_KEY2 = <<-EOF.rstrip
|
145
|
+
---- BEGIN SSH2 PUBLIC KEY ----
|
146
|
+
AAAAB3NzaC1yc2EAAAABIwAAAQEAxl6TpN7uFiY/JZ8qDnD7UrxDP+ABeh2PVg8Du1LEgX
|
147
|
+
Nk0+YWCeP5S6oHklqaWeDlbmAs1oHsBwCMAVpMa5tgONOLvz4JgwgkiqQEbKR8ofWJ+LAD
|
148
|
+
UElvqRVGmGiNEMLI6GJWeneL4sjmbb8d6U+M53c6iWG0si9XE5m7teBQSsCl0Tk3qMIkQG
|
149
|
+
w5zpJeCXjZ8KpJhIJRYgexFkGgPlYRV+UYIhxpUW90t0Ra5i6JOFYwq98k5S/6SJIZQ/A9
|
150
|
+
F4JNzwLw3eVxZj0yVHWxkGz1+TyELNY1kOyMxnZaqSfGzSQJTrnIXpdweVHuYh1LtOgedR
|
151
|
+
QhCyiELeSMGwio1vRPKw==
|
152
|
+
---- END SSH2 PUBLIC KEY ----
|
153
|
+
EOF
|
154
|
+
|
155
|
+
SSH2_PUBLIC_KEY3 = <<-EOF.rstrip
|
156
|
+
---- BEGIN SSH2 PUBLIC KEY ----
|
157
|
+
Comment: 1024-bit DSA with provided comment
|
158
|
+
x-private-use-header: some value that is long enough to go to wrap aro\\
|
159
|
+
und to a new line.
|
160
|
+
AAAAB3NzaC1kc3MAAACBALyVy5dwVwgL3CxXzsvo8DBh58qArQLBNIPW/f9pptmy7jD5QX
|
161
|
+
zOw+12w0/z4lZ86ncoVutRMf44OABcX9ovhRl+luxB7jjpkVXy/p2ZaqPbeyTQUtdTmXa2
|
162
|
+
y4n053Jd61VeMG+iLP7+viT+Ib96y9aVUYQfCrl5heBDUZ9cAFjdAAAAFQDFXnO7JJpFKw
|
163
|
+
keoor4GWGHtz0D2QAAAIEAqel0RUBO0MY5b3DZ69J/mRzUifN1O6twk4er2ph0JpryuUwZ
|
164
|
+
ohLpcVZwqoGWmPQy/ZHmV1b3RtT9GWUa+HUqKdMhFVOx/iq1khVfLi83whjMMvXj3ecqd0
|
165
|
+
yzGxGHnSsjVKefa2ywCLHrh4nlUVIaXI5gQpgMyVbMcromDe1WZzoAAACBAIwTRPAEcroq
|
166
|
+
OzaebiVspFcmsXxDQ4wXQZQdho1ExW6FKS8s7/6pItmZYXTvJDwLXgq2/iK1fRRcKk2PJE
|
167
|
+
aSuJR7WeNGsJKfWmQ2UbOhqA3wWLDazIZtcMKjFzD0hM4E8qgjHjMvKDE6WgT6SFP+tqx3
|
168
|
+
nnh7pJWwsbGjSMQexpyR
|
169
|
+
---- END SSH2 PUBLIC KEY ----
|
130
170
|
EOF
|
131
171
|
|
132
172
|
def setup
|
@@ -202,6 +242,20 @@ EOF
|
|
202
242
|
assert_equal expected4, @key_without_comment.ssh_public_key
|
203
243
|
end
|
204
244
|
|
245
|
+
def test_ssh2_public_key_output
|
246
|
+
expected1 = SSH2_PUBLIC_KEY1
|
247
|
+
expected2 = SSH2_PUBLIC_KEY2
|
248
|
+
expected3 = SSH2_PUBLIC_KEY3
|
249
|
+
public_key1 = "ssh-rsa #{SSH_PUBLIC_KEY1} me@example.com"
|
250
|
+
public_key2 = "ssh-rsa #{SSH_PUBLIC_KEY2}"
|
251
|
+
public_key3 = "ssh-rsa #{SSH_PUBLIC_KEY3} 1024-bit DSA with provided comment"
|
252
|
+
|
253
|
+
assert_equal expected1, @key1.ssh2_public_key
|
254
|
+
assert_equal expected2, @key2.ssh2_public_key({})
|
255
|
+
assert_equal expected3, @key3.ssh2_public_key({'Comment' => '1024-bit DSA with provided comment',
|
256
|
+
'x-private-use-header' => 'some value that is long enough to go to wrap around to a new line.'})
|
257
|
+
end
|
258
|
+
|
205
259
|
def test_public_key_directives
|
206
260
|
assert_equal [], SSHKey.generate.directives
|
207
261
|
|
@@ -253,6 +307,19 @@ EOF
|
|
253
307
|
assert !SSHKey.valid_ssh_public_key?(invalid5)
|
254
308
|
end
|
255
309
|
|
310
|
+
def test_ssh_public_key_validation_with_newlines
|
311
|
+
expected1 = "ssh-rsa #{SSH_PUBLIC_KEY1}\n"
|
312
|
+
invalid1 = "ssh-rsa #{SSH_PUBLIC_KEY1}\nme@example.com"
|
313
|
+
invalid2 = "ssh-rsa #{SSH_PUBLIC_KEY1}\n me@example.com"
|
314
|
+
invalid3 = "ssh-rsa #{SSH_PUBLIC_KEY1} \nme@example.com"
|
315
|
+
|
316
|
+
assert SSHKey.valid_ssh_public_key?(expected1)
|
317
|
+
|
318
|
+
assert !SSHKey.valid_ssh_public_key?(invalid1)
|
319
|
+
assert !SSHKey.valid_ssh_public_key?(invalid2)
|
320
|
+
assert !SSHKey.valid_ssh_public_key?(invalid3)
|
321
|
+
end
|
322
|
+
|
256
323
|
def test_ssh_public_key_bits
|
257
324
|
expected1 = "ssh-rsa #{SSH_PUBLIC_KEY1} me@example.com"
|
258
325
|
expected2 = "ssh-rsa #{SSH_PUBLIC_KEY2} me@example.com"
|
@@ -276,6 +343,17 @@ EOF
|
|
276
343
|
assert_equal( "byte array too short", exception2.message )
|
277
344
|
assert_equal( "cannot determine key type", exception3.message )
|
278
345
|
end
|
346
|
+
|
347
|
+
def test_ssh2_public_key_bits
|
348
|
+
public_key1 = "ssh-rsa #{SSH_PUBLIC_KEY1} me@example.com"
|
349
|
+
public_key2 = "ssh-rsa #{SSH_PUBLIC_KEY2}"
|
350
|
+
public_key3 = "ssh-dss #{SSH_PUBLIC_KEY3} 1024-bit DSA with provided comment"
|
351
|
+
|
352
|
+
assert_equal(SSH2_PUBLIC_KEY1, SSHKey.ssh_public_key_to_ssh2_public_key(public_key1))
|
353
|
+
assert_equal(SSH2_PUBLIC_KEY2, SSHKey.ssh_public_key_to_ssh2_public_key(public_key2))
|
354
|
+
assert_equal(SSH2_PUBLIC_KEY2, SSHKey.ssh_public_key_to_ssh2_public_key(public_key2, {}))
|
355
|
+
assert_equal(SSH2_PUBLIC_KEY3, SSHKey.ssh_public_key_to_ssh2_public_key(public_key3, {'Comment' => '1024-bit DSA with provided comment', 'x-private-use-header' => 'some value that is long enough to go to wrap around to a new line.'}))
|
356
|
+
end
|
279
357
|
|
280
358
|
def test_exponent
|
281
359
|
assert_equal 35, @key1.key_object.e.to_i
|
metadata
CHANGED
@@ -1,27 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sshkey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Miller
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: test-unit
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '0'
|
27
41
|
description: Generate private/public SSH keypairs using pure Ruby
|
@@ -31,8 +45,8 @@ executables: []
|
|
31
45
|
extensions: []
|
32
46
|
extra_rdoc_files: []
|
33
47
|
files:
|
34
|
-
- .gitignore
|
35
|
-
- .travis.yml
|
48
|
+
- ".gitignore"
|
49
|
+
- ".travis.yml"
|
36
50
|
- Gemfile
|
37
51
|
- LICENSE
|
38
52
|
- README.md
|
@@ -52,17 +66,17 @@ require_paths:
|
|
52
66
|
- lib
|
53
67
|
required_ruby_version: !ruby/object:Gem::Requirement
|
54
68
|
requirements:
|
55
|
-
- -
|
69
|
+
- - ">="
|
56
70
|
- !ruby/object:Gem::Version
|
57
71
|
version: '0'
|
58
72
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
73
|
requirements:
|
60
|
-
- -
|
74
|
+
- - ">="
|
61
75
|
- !ruby/object:Gem::Version
|
62
76
|
version: '0'
|
63
77
|
requirements: []
|
64
78
|
rubyforge_project: sshkey
|
65
|
-
rubygems_version: 2.
|
79
|
+
rubygems_version: 2.4.5
|
66
80
|
signing_key:
|
67
81
|
specification_version: 4
|
68
82
|
summary: SSH private/public key generator in Ruby
|