sshkey 1.3.3 → 1.4.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.
- data/lib/sshkey.rb +57 -0
- data/lib/sshkey/version.rb +1 -1
- data/test/sshkey_test.rb +49 -1
- metadata +1 -1
data/lib/sshkey.rb
CHANGED
@@ -193,6 +193,63 @@ class SSHKey
|
|
193
193
|
key_object.to_text.match(/Private-Key:\s\((\d*)\sbit\)/)[1].to_i
|
194
194
|
end
|
195
195
|
|
196
|
+
# Randomart
|
197
|
+
#
|
198
|
+
# Generate OpenSSH compatible ASCII art fingerprints
|
199
|
+
# See http://www.opensource.apple.com/source/OpenSSH/OpenSSH-175/openssh/key.c (key_fingerprint_randomart function)
|
200
|
+
#
|
201
|
+
# Example:
|
202
|
+
# +--[ RSA 2048]----+
|
203
|
+
# |o+ o.. |
|
204
|
+
# |..+.o |
|
205
|
+
# | ooo |
|
206
|
+
# |.++. o |
|
207
|
+
# |+o+ + S |
|
208
|
+
# |.. + o . |
|
209
|
+
# | . + . |
|
210
|
+
# | . . |
|
211
|
+
# | Eo. |
|
212
|
+
# +-----------------+
|
213
|
+
def randomart
|
214
|
+
fieldsize_x = 17
|
215
|
+
fieldsize_y = 9
|
216
|
+
x = fieldsize_x / 2
|
217
|
+
y = fieldsize_y / 2
|
218
|
+
raw_digest = Digest::MD5.digest(ssh_public_key_conversion)
|
219
|
+
num_bytes = raw_digest.bytesize
|
220
|
+
|
221
|
+
field = Array.new(fieldsize_x) { Array.new(fieldsize_y) {0} }
|
222
|
+
|
223
|
+
raw_digest.bytes.each do |byte|
|
224
|
+
4.times do
|
225
|
+
x += (byte & 0x1 != 0) ? 1 : -1
|
226
|
+
y += (byte & 0x2 != 0) ? 1 : -1
|
227
|
+
|
228
|
+
x = [[x, 0].max, fieldsize_x - 1].min
|
229
|
+
y = [[y, 0].max, fieldsize_y - 1].min
|
230
|
+
|
231
|
+
field[x][y] += 1 if (field[x][y] < num_bytes - 2)
|
232
|
+
|
233
|
+
byte >>= 2
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
field[fieldsize_x / 2][fieldsize_y / 2] = num_bytes - 1
|
238
|
+
field[x][y] = num_bytes
|
239
|
+
augmentation_string = " .o+=*BOX@%&#/^SE"
|
240
|
+
output = "+--#{sprintf("[%4s %4u]", type.upcase, bits)}----+\n"
|
241
|
+
fieldsize_y.times do |y|
|
242
|
+
output << "|"
|
243
|
+
fieldsize_x.times do |x|
|
244
|
+
output << augmentation_string[[field[x][y], num_bytes].min]
|
245
|
+
end
|
246
|
+
output << "|"
|
247
|
+
output << "\n"
|
248
|
+
end
|
249
|
+
output << "+#{"-" * fieldsize_x}+"
|
250
|
+
output
|
251
|
+
end
|
252
|
+
|
196
253
|
private
|
197
254
|
|
198
255
|
# SSH Public Key Conversion
|
data/lib/sshkey/version.rb
CHANGED
data/test/sshkey_test.rb
CHANGED
@@ -87,6 +87,48 @@ EOF
|
|
87
87
|
KEY2_SHA1_FINGERPRINT = "9a:52:78:2b:6b:cb:39:b7:85:ed:90:8a:28:62:aa:b3:98:88:e6:07"
|
88
88
|
KEY3_SHA1_FINGERPRINT = "15:68:c6:72:ac:18:d1:fc:ab:a2:b7:b5:8c:d1:fe:8f:b9:ae:a9:47"
|
89
89
|
|
90
|
+
KEY1_RANDOMART = <<-EOF.rstrip
|
91
|
+
+--[ RSA 2048]----+
|
92
|
+
|o+ o.. |
|
93
|
+
|..+.o |
|
94
|
+
| ooo |
|
95
|
+
|.++. o |
|
96
|
+
|+o+ + S |
|
97
|
+
|.. + o . |
|
98
|
+
| . + . |
|
99
|
+
| . . |
|
100
|
+
| Eo. |
|
101
|
+
+-----------------+
|
102
|
+
EOF
|
103
|
+
|
104
|
+
KEY2_RANDOMART = <<-EOF.rstrip
|
105
|
+
+--[ RSA 2048]----+
|
106
|
+
| ..o.. |
|
107
|
+
| ..+ . |
|
108
|
+
| o . |
|
109
|
+
| . o |
|
110
|
+
| . o S . |
|
111
|
+
| + o O o |
|
112
|
+
| + + O . |
|
113
|
+
| = o . |
|
114
|
+
| .E |
|
115
|
+
+-----------------+
|
116
|
+
EOF
|
117
|
+
|
118
|
+
KEY3_RANDOMART = <<-EOF.rstrip
|
119
|
+
+--[ DSA 1024]----+
|
120
|
+
| .=o. |
|
121
|
+
| .+.o . |
|
122
|
+
| + =.o . . |
|
123
|
+
| + * + . . |
|
124
|
+
| + = S . E |
|
125
|
+
| + = . . |
|
126
|
+
| . |
|
127
|
+
| |
|
128
|
+
| |
|
129
|
+
+-----------------+
|
130
|
+
EOF
|
131
|
+
|
90
132
|
def setup
|
91
133
|
@key1 = SSHKey.new(SSH_PRIVATE_KEY1, :comment => "me@example.com")
|
92
134
|
@key2 = SSHKey.new(SSH_PRIVATE_KEY2, :comment => "me@example.com")
|
@@ -224,7 +266,13 @@ EOF
|
|
224
266
|
assert_equal 2048, @key1.bits
|
225
267
|
assert_equal 2048, @key2.bits
|
226
268
|
assert_equal 1024, @key3.bits
|
227
|
-
assert_equal 512, SSHKey.generate(bits
|
269
|
+
assert_equal 512, SSHKey.generate(:bits => 512).bits
|
270
|
+
end
|
271
|
+
|
272
|
+
def test_randomart
|
273
|
+
assert_equal KEY1_RANDOMART, @key1.randomart
|
274
|
+
assert_equal KEY2_RANDOMART, @key2.randomart
|
275
|
+
assert_equal KEY3_RANDOMART, @key3.randomart
|
228
276
|
end
|
229
277
|
|
230
278
|
def test_to_byte_array
|