sshkey 1.4.0 → 1.5.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/.travis.yml CHANGED
@@ -7,6 +7,7 @@ rvm:
7
7
  - ruby-head
8
8
  - jruby-18mode
9
9
  - jruby-19mode
10
+ - jruby-20mode
10
11
  - jruby-head
11
12
  - rbx-18mode
12
13
  - rbx-19mode
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
- SSHKey
2
- ======
1
+ # SSHKey
3
2
 
4
3
  Generate private and public SSH keys (RSA and DSA supported) using pure Ruby.
5
4
 
@@ -9,67 +8,159 @@ Tested on the following Rubies: MRI 1.8.7, 1.9.2, 1.9.3, 2.0.0, REE, JRuby (1.7.
9
8
 
10
9
  [![Build Status](https://secure.travis-ci.org/bensie/sshkey.png)](http://travis-ci.org/bensie/sshkey)
11
10
 
12
- Usage
13
- -----
11
+ ## Usage
12
+
13
+ ### Generate a new key
14
14
 
15
15
  When generating a new keypair the default key type is 2048-bit RSA, but you can supply the `type` (RSA or DSA) and `bits` in the options.
16
16
  You can also (optionally) supply a `comment` or `passphrase`:
17
17
 
18
- ``` ruby
18
+ ```ruby
19
19
  k = SSHKey.generate
20
20
 
21
21
  k = SSHKey.generate(:type => "DSA", :bits => 1024, :comment => "foo@bar.com", :passphrase => "foobar")
22
22
  ```
23
23
 
24
+ ### Use your existing key
25
+
24
26
  Return an SSHKey object from an existing RSA or DSA private key (provided as a string)
25
27
 
26
- ``` ruby
28
+ ```ruby
27
29
  k = SSHKey.new(File.read("~/.ssh/id_rsa"), :comment => "foo@bar.com")
28
30
  ```
29
31
 
30
- Both of these will return an SSHKey object with the following methods:
32
+ ### The SSHKey object
31
33
 
32
- ``` ruby
33
- # Returns an OpenSSL::PKey::RSA or OpenSSL::PKey::DSA key object
34
- # http://www.ruby-doc.org/stdlib/libdoc/openssl/rdoc/classes/OpenSSL/PKey/RSA.html
35
- # http://www.ruby-doc.org/stdlib/libdoc/openssl/rdoc/classes/OpenSSL/PKey/DSA.html
36
- k.key_object
37
- # => -----BEGIN RSA PRIVATE KEY-----\nMIIEowI...
34
+ #### Private and public keys
38
35
 
39
- # Returns the Private Key as a string
40
- k.private_key
41
- # => "-----BEGIN RSA PRIVATE KEY-----\nMIIEowI..."
36
+ Fetch the private and public keys as strings. Note that the `public_key` is the RSA or DSA public key, not an SSH public key.
42
37
 
43
- # Return the Private Key in encrypted form if a passphrase was provided
44
- k.encrypted_private_key
45
- # => "-----BEGIN RSA PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED..."
38
+ ```ruby
39
+ k.private_key
40
+ # => "-----BEGIN RSA PRIVATE KEY-----\nMIIEoAIBAAKCAQEAvR7l72CT7UBP6P+02Iut8gKKbKyekz/pQxnckPp1VafuaIwC\nMvYfP4ffVJTcY5IhU9mISNxZf6YDQ0TuD1aOrZYG9wsIgGY0nXhOUZxe/Q5I+V7D\nOI/hSzKF7W0cNCvaJPUSo8+soCLNSQ5mjnV3sRZ6uJwGFN30i1GulqHHKkx3vGxb\niaAL9YG58dPSbPGHFTA/epqUyd1fzCuWHyL9dHW7aw4RroNyEtVdiftAQfaK20I2\nueeDfuEtCPaxQYFQqbz5kKnXQx3fwHRpC7/84xHxsrY576evGxHw4p5EJD37scNN\ncneTG3Ly79/VVSAlrSm6ltutx0+S70scCqK0ewIDAQABAoH/MjwC15LPuDVdBIbn\ngp2XlrEWE8fGV1ainzA/ZkMg55+ztBF8hAzcQAPXTqA76jbmo18k1DWzkDSIqVWl\n5m0XeQRg1T4ZBAIh97H9G7BtispAl/yT3nJZZaAF8wsIctMzHp36VYjUUbTs0nsA\nwtZw9JkEAAVxmBlc26TWuyw9uv4fYXuR+uOsWH8jTTVPvxM9FaCCdK+dOMnswm7Y\nlOAlJj5dANkB2KPwIeE461ThyMo9GHEjpsvciMhKLuBoTSucNkhdgapAmYTSI+/1\nf1cA/KEdCMs9ANr1HFujeS01+N1Xrw/yW6EazaDN1oFHCVORtlB295Eac0Wq6y/P\npf1BAoGBAPIw4HQWsolU3f4FdIvc2POAcSJDRgt++I9Qt/QXq1SJ2dGKIveFiJgo\nZjCfHQFVZ8xl64cLzQ1WagZA1JBbbk9g5RxHDxRv7q+Kn3ogugDo9GUoQvpuuAU6\nXHoR/mLinDorJUnttL3U49xTMfrrut4qkUg+daBVptPtylpio6EDAoGBAMfnYq08\nfd/cPEQ2XPeswgtzXsKNLqA6UXBM7ZauKaFLByjy8peMMF6JPOYlBKQif5k+Egmu\nWIe8oTm8Nn5Ymt32bEd+MkHUC7kFzQeiXnM3u0oKzJMXLAvjSTs296g50YM5zJTC\nl64ACQmQOLZ9tdKorl52ZcmdbBEcZ2uwRvkpAoGAKhs5SrWPgLTSi5FjO9W/mkYg\nZTaQ/PqsOC5ubO+Yh/AXgIiln6cFon6Tlax0HIE+tJibpDT3B3SYplGrIxXiTcao\nzovEIWd8deSB6Xe7HuFhbBzd2DBbqf0FiuuJ8KM5ShuqNfovzDkxDGMic198c5eu\n/oJtbNy3Tm0vGxu/GwUCgYAgmRPXShkAq0pMmUzZups+AMdAFIO47ymelXzc6HOz\ncKevPsbefabZk6mRohG6rkF+fMe2Om8HW3QzFQUR32MJtQh9NA//+hMbTd3cU9bx\nFPJ+pXostkehfKPReyoxjZQjwQYicAUKA8l1fMYyxBclTgp5Lvd0RC5+L9KRlgJM\n2QKBgGVIWRNVpGg38dDqdq/4ue1BoTFhqoMGi6WQm3xa+NH+lyJGacdUhGRz8PxN\nhVKpIj8ljg2Rq/CA9qSgL/Z9rhn8QUMWULuAroCp0S2pMBtZ2RB+Mg2FdVFR9/Ft\nfG7co6mKUGkFPtr48EMfeKY88BRsp3yGOsROGdDsCHItjOVH\n-----END RSA PRIVATE KEY-----\n"
46
41
 
47
- # Returns the Public Key as a string
48
42
  k.public_key
49
- # => "-----BEGIN RSA PUBLIC KEY-----\nMIIBCg..."
43
+ # => "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvR7l72CT7UBP6P+02Iut\n8gKKbKyekz/pQxnckPp1VafuaIwCMvYfP4ffVJTcY5IhU9mISNxZf6YDQ0TuD1aO\nrZYG9wsIgGY0nXhOUZxe/Q5I+V7DOI/hSzKF7W0cNCvaJPUSo8+soCLNSQ5mjnV3\nsRZ6uJwGFN30i1GulqHHKkx3vGxbiaAL9YG58dPSbPGHFTA/epqUyd1fzCuWHyL9\ndHW7aw4RroNyEtVdiftAQfaK20I2ueeDfuEtCPaxQYFQqbz5kKnXQx3fwHRpC7/8\n4xHxsrY576evGxHw4p5EJD37scNNcneTG3Ly79/VVSAlrSm6ltutx0+S70scCqK0\newIDAQAB\n-----END PUBLIC KEY-----\n"
44
+ ```
45
+
46
+ Fetch the SSH public key as a string.
50
47
 
51
- # Returns the SSH Public Key as a string
48
+ ```ruby
52
49
  k.ssh_public_key
53
- # => "ssh-rsa AAAAB3NzaC1yc2EA...."
50
+ # => "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9HuXvYJPtQE/o/7TYi63yAopsrJ6TP+lDGdyQ+nVVp+5ojAIy9h8/h99UlNxjkiFT2YhI3Fl/pgNDRO4PVo6tlgb3CwiAZjSdeE5RnF79Dkj5XsM4j+FLMoXtbRw0K9ok9RKjz6ygIs1JDmaOdXexFnq4nAYU3fSLUa6WoccqTHe8bFuJoAv1gbnx09Js8YcVMD96mpTJ3V/MK5YfIv10dbtrDhGug3IS1V2J+0BB9orbQja554N+4S0I9rFBgVCpvPmQqddDHd/AdGkLv/zjEfGytjnvp68bEfDinkQkPfuxw01yd5MbcvLv39VVICWtKbqW263HT5LvSxwKorR7"
51
+ ```
52
+
53
+ #### Encryption
54
+
55
+ If a passcode is set when a key is generated or by setting the `passcode` accessor, you can
56
+ fetch the encrypted version of the private key.
54
57
 
55
- # Returns the comment as a string
58
+ ```ruby
59
+ k.passcode = "foo"
60
+ # => "foo"
61
+
62
+ k.encrypted_private_key
63
+ # => "-----BEGIN RSA PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: AES-128-CBC,748B766CFB185C3BD1D7E4D31113EBDA\n\ntWbfOuAjBlSZdq3kdJTLZJ7prjNWOKuGpeesNfVZDziIaZNCUakvgnUFdX3IZZnj\nEYITfjZ1TEUY3EkemL/57txiP3A4iOMDK2JGg8lp3G45x6c9XucJ2YxgvMye/ugP\n014MzLvBNunWq8TolkFj4gbc+WCqsyFqGdpRsf/hx7PcLDd2nvS5zxjBAPno87KN\nYgEnZYrpyl01ePucwFVWlrlGJdc0+F+0Ms5gpjMds56YL3Rwv9BlWzapVtrqN29r\nZg0otylPAyuGJOQ8srDOa+pbSySXvcdoKfR6xQ9fIB0tUfGgrH3c5O0/rEW7FSiO\n6ng4ntXXOKKkQfCezXQVvqMjKtKAbcKaPYAvrB2Gp2VIPUN5tN52nKuWvQWPA0P/\nm/uKiFkvzDWj8xMEOdzDAG9/7ysX+T5angvhfT23+NEdGIlPZLDRHI3f+2Itn99f\nvVoDYUXiyd5h7VwOTn6scebbvyPY8DiWpB/5iaU8WBPr7TVTl9n2z+Gmy4eg3wS0\nTU4hGlKv7MiITO2+dOCZTVrKn9/gTgmtyiLucb4huBH88Nsj4zWnTrVjMMBWsTUD\nkzvo9081zgDKKeawcbZYdI1Tc4epV7SMTHpx1ztzIlPdQ6kRaWomwMSarQeSlhJe\naFx67cde6M3Kc3LOgE0VT+3NvVLnkDwkytwnQKLd6oT3d1kFxWXjMwqiPbSzz3bf\nkOhG01gsJDXIzAgDlOlhE+Qlsd3yc734UIH98rTFMVB00HS36WLuz3hh+Ew4rsrf\nDIuRIdxL/4GVdQ8J5WpSoN0tF5iQD1wpEMU2vUjYjj9TZkhpOpnK3UVvbKd4WPsV\n956XJT7ZDvX4+pvHc5GJq/UX5h42kycY0hftUoLapXt5Nhb/fL8mUT8Eix184uiO\n5mA3fgRP3oGJ28N653X/+kL2YhXCeTd2VjkVhKruuoex96Igyt8W7wW5y7MOPezf\nwfo8IzidcJcDR1W4OEOXr+oDlCE1CLGCzmenR+AUIisqz45yb5G076l8PQkI3NWC\nBhT1YbTds4QzrndIDZgMm65ZCaklm+FVHWV61rXd9rlugcq+flQuXAE/EnFtySMc\n3lztrzXulLXzgLrYG355JbQFddwehO7LdxKZA9LHC9/odcoVI9RBj1CzshYtlftR\nn56nxPTIxRTVjQdgCZ6VcjZhwv1I904NtGm4SZupiShXsbHzAfaeJ54GMq4PRlgN\nmH7JrI9/puBb1dLD0XNgPtmYIo18v9e7g9o+un/wDtxCTxhQtD0npPo1IuW4cW7q\n07lZPwGkN2FD2PNTBGXeQ6/EXTHxlyFn62GSr+DmXu0O8MJS827Vd4b8QmKzRTxf\nFEmtVhiD15KlrQxwajmhqfY6KHRxbBuG/w7ioRr2Vl0G9NmKwmJkQO8dM+mJ8rVE\nsWvm8xVm1bowahzDVPnyFUUjuGNi6jFElkv8zvlQUoTcjSZHPrQSHuX742f5Spph\nLLCHdGZ2Ry8UGPlqKtvd6V/z25NsBgbuit+hNkBsdIztH7MVGAhKSMgk1FgXmKzV\nmZnPigq5WAHtIvojzI9NfZxU2Avif0yymXNtOnipw0sCJ0notN8NuGdQEmyxThqW\n-----END RSA PRIVATE KEY-----\n"
64
+ ```
65
+
66
+ #### Comments
67
+
68
+ Keys can optionally have a comment that is shown as part of the public SSH key. Get or
69
+ set the key's comment with the `comment` accessor.
70
+
71
+ ```ruby
56
72
  k.comment
57
- # => "foo@bar.com"
73
+ # => nil
74
+
75
+ k.comment = "me@me.com"
76
+ # => "me@me.com"
77
+
78
+ k.ssh_public_key
79
+ # => "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9HuXvYJPtQE/o/7TYi63yAopsrJ6TP+lDGdyQ+nVVp+5ojAIy9h8/h99UlNxjkiFT2YhI3Fl/pgNDRO4PVo6tlgb3CwiAZjSdeE5RnF79Dkj5XsM4j+FLMoXtbRw0K9ok9RKjz6ygIs1JDmaOdXexFnq4nAYU3fSLUa6WoccqTHe8bFuJoAv1gbnx09Js8YcVMD96mpTJ3V/MK5YfIv10dbtrDhGug3IS1V2J+0BB9orbQja554N+4S0I9rFBgVCpvPmQqddDHd/AdGkLv/zjEfGytjnvp68bEfDinkQkPfuxw01yd5MbcvLv39VVICWtKbqW263HT5LvSxwKorR7 me@me.com"
80
+ ```
81
+
82
+ #### Bit length
83
+
84
+ Determine the strength of the key in bits as an integer.
58
85
 
59
- # Returns the MD5 fingerprint as a string
86
+ ```ruby
87
+ k.bits
88
+ # => 2048
89
+ ```
90
+
91
+ #### Fingerprints
92
+
93
+ It is often helpful to use a fingerprint to visually or programmatically check if one key
94
+ matches another. Fetch either an MD5 (OpenSSH default) or SHA1 fingerprint of the SSH public key.
95
+
96
+ ```ruby
60
97
  k.md5_fingerprint
61
98
  # => "2a:89:84:c9:29:05:d1:f8:49:79:1c:ba:73:99:eb:af"
62
99
 
63
- # Returns the SHA1 fingerprint as a string
64
100
  k.sha1_fingerprint
65
101
  # => "e4:f9:79:f2:fe:d6:be:2d:ef:2e:c2:fa:aa:f8:b0:17:34:fe:0d:c0"
102
+ ```
103
+
104
+ #### Public Key Directives
105
+
106
+ Add optional directives prefixed to the public key that will be enforced when a key is authenticated.
107
+
108
+ Accepts a string or an array of strings.
109
+
110
+ ```ruby
111
+ k.directives = "no-pty"
112
+ # => ["no-pty"]
113
+
114
+ k.directives = [
115
+ "no-port-forwarding",
116
+ "no-X11-forwarding",
117
+ "no-agent-forwarding",
118
+ "no-pty",
119
+ "command='/home/user/bin/authprogs'"
120
+ ]
121
+ # => ["no-port-forwarding", "no-X11-forwarding", "no-agent-forwarding", "no-pty", "command='/home/user/bin/authprogs'"]
122
+
123
+ k.ssh_public_key
124
+ # => "no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command='/home/user/bin/authprogs' ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9HuXvYJPtQE/o/7TYi63yAopsrJ6TP+lDGdyQ+nVVp+5ojAIy9h8/h99UlNxjkiFT2YhI3Fl/pgNDRO4PVo6tlgb3CwiAZjSdeE5RnF79Dkj5XsM4j+FLMoXtbRw0K9ok9RKjz6ygIs1JDmaOdXexFnq4nAYU3fSLUa6WoccqTHe8bFuJoAv1gbnx09Js8YcVMD96mpTJ3V/MK5YfIv10dbtrDhGug3IS1V2J+0BB9orbQja554N+4S0I9rFBgVCpvPmQqddDHd/AdGkLv/zjEfGytjnvp68bEfDinkQkPfuxw01yd5MbcvLv39VVICWtKbqW263HT5LvSxwKorR7"
125
+ ```
126
+
127
+ #### Randomart
128
+
129
+ Generate [OpenSSH compatible](http://www.opensource.apple.com/source/OpenSSH/OpenSSH-175/openssh/key.c) ASCII art fingerprints
130
+
131
+ ```ruby
132
+ puts k.randomart
133
+ +--[ RSA 2048]----+
134
+ |o+ o.. |
135
+ |..+.o |
136
+ | ooo |
137
+ |.++. o |
138
+ |+o+ + S |
139
+ |.. + o . |
140
+ | . + . |
141
+ | . . |
142
+ | Eo. |
143
+ +-----------------+
144
+ ```
145
+
146
+ #### Original OpenSSL key object
147
+
148
+ Return the original [OpenSSL::PKey::RSA](http://www.ruby-doc.org/stdlib/libdoc/openssl/rdoc/classes/OpenSSL/PKey/RSA.html) or [OpenSSL::PKey::DSA](http://www.ruby-doc.org/stdlib/libdoc/openssl/rdoc/classes/OpenSSL/PKey/DSA.html) object.
149
+
150
+ ```ruby
151
+ k.key_object
152
+ # => -----BEGIN RSA PRIVATE KEY-----\nMIIEowI...
153
+ ```
154
+
155
+ ### Validate existing SSH public keys
156
+
157
+ Determine if a given SSH public key is valid. Very useful to test user input of public keys to make sure they accurately copy/pasted the key. Just pass the SSH public key as a string.
66
158
 
67
- # Validates SSH Public Key
68
- SSHKey.valid_ssh_public_key? "ssh-rsa AAAAB3NzaC1yc2EA...."
159
+ ```ruby
160
+ SSHKey.valid_ssh_public_key? "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9HuXvYJPtQE/o/7TYi63yAopsrJ6TP+lDGdyQ+nVVp+5ojAIy9h8/h99UlNxjkiFT2YhI3Fl/pgNDRO4PVo6tlgb3CwiAZjSdeE5RnF79Dkj5XsM4j+FLMoXtbRw0K9ok9RKjz6ygIs1JDmaOdXexFnq4nAYU3fSLUa6WoccqTHe8bFuJoAv1gbnx09Js8YcVMD96mpTJ3V/MK5YfIv10dbtrDhGug3IS1V2J+0BB9orbQja554N+4S0I9rFBgVCpvPmQqddDHd/AdGkLv/zjEfGytjnvp68bEfDinkQkPfuxw01yd5MbcvLv39VVICWtKbqW263HT5LvSxwKorR7"
69
161
  # => true
70
162
  ```
71
163
 
72
- Copyright
73
- ---------
164
+ ## Copyright
74
165
 
75
166
  Copyright (c) 2011-2013 James Miller
data/lib/sshkey.rb CHANGED
@@ -7,9 +7,6 @@ class SSHKey
7
7
  SSH_TYPES = {"rsa" => "ssh-rsa", "dsa" => "ssh-dss"}
8
8
  SSH_CONVERSION = {"rsa" => ["e", "n"], "dsa" => ["p", "q", "g", "pub_key"]}
9
9
 
10
- attr_reader :key_object, :type
11
- attr_accessor :passphrase, :comment
12
-
13
10
  class << self
14
11
  # Generate a new keypair and return an SSHKey object
15
12
  #
@@ -124,6 +121,9 @@ class SSHKey
124
121
  end
125
122
  end
126
123
 
124
+ attr_reader :key_object, :type
125
+ attr_accessor :passphrase, :comment
126
+
127
127
  # Create a new SSHKey object
128
128
  #
129
129
  # ==== Parameters
@@ -131,10 +131,12 @@ class SSHKey
131
131
  # * options<~Hash>
132
132
  # * :comment<~String> - Comment to use for the public key, defaults to ""
133
133
  # * :passphrase<~String> - If the key is encrypted, supply the passphrase
134
+ # * :directives<~Array> - Options prefixed to the public key
134
135
  #
135
136
  def initialize(private_key, options = {})
136
137
  @passphrase = options[:passphrase]
137
138
  @comment = options[:comment] || ""
139
+ self.directives = options[:directives]
138
140
  begin
139
141
  @key_object = OpenSSL::PKey::RSA.new(private_key, passphrase)
140
142
  @type = "rsa"
@@ -172,7 +174,7 @@ class SSHKey
172
174
 
173
175
  # SSH public key
174
176
  def ssh_public_key
175
- [SSH_TYPES[type], Base64.encode64(ssh_public_key_conversion).gsub("\n", ""), comment].join(" ").strip
177
+ [directives.join(",").strip, SSH_TYPES[type], Base64.encode64(ssh_public_key_conversion).gsub("\n", ""), comment].join(" ").strip
176
178
  end
177
179
 
178
180
  # Fingerprints
@@ -250,6 +252,11 @@ class SSHKey
250
252
  output
251
253
  end
252
254
 
255
+ def directives=(directives)
256
+ @directives = Array[directives].flatten
257
+ end
258
+ attr_reader :directives
259
+
253
260
  private
254
261
 
255
262
  # SSH Public Key Conversion
@@ -1,3 +1,3 @@
1
1
  class SSHKey
2
- VERSION = "1.4.0"
2
+ VERSION = "1.5.0"
3
3
  end
data/test/sshkey_test.rb CHANGED
@@ -202,12 +202,36 @@ EOF
202
202
  assert_equal expected4, @key_without_comment.ssh_public_key
203
203
  end
204
204
 
205
+ def test_public_key_directives
206
+ @key1.directives = "no-pty"
207
+ assert_equal ["no-pty"], @key1.directives
208
+
209
+ @key1.directives = ["no-pty"]
210
+ assert_equal ["no-pty"], @key1.directives
211
+
212
+ @key1.directives = [
213
+ "no-port-forwarding",
214
+ "no-X11-forwarding",
215
+ "no-agent-forwarding",
216
+ "no-pty",
217
+ "command='/home/user/bin/authprogs'"
218
+ ]
219
+ expected1 = "no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command='/home/user/bin/authprogs' ssh-rsa #{SSH_PUBLIC_KEY1} me@example.com"
220
+ assert_equal expected1, @key1.ssh_public_key
221
+ assert SSHKey.valid_ssh_public_key?(expected1)
222
+
223
+ @key2.directives = "no-pty"
224
+ expected2 = "no-pty ssh-rsa #{SSH_PUBLIC_KEY2} me@example.com"
225
+ assert_equal expected2, @key2.ssh_public_key
226
+ assert SSHKey.valid_ssh_public_key?(expected2)
227
+ end
228
+
205
229
  def test_ssh_public_key_validation
206
230
  expected1 = "ssh-rsa #{SSH_PUBLIC_KEY1} me@example.com"
207
231
  expected2 = "ssh-rsa #{SSH_PUBLIC_KEY2} me@example.com"
208
232
  expected3 = "ssh-dss #{SSH_PUBLIC_KEY3} me@example.com"
209
233
  expected4 = "ssh-rsa #{SSH_PUBLIC_KEY1}"
210
- expected5 = %Q{from="trusted.eng.cam.ac.uk",no-port-forwarding,no-pty" ssh-rsa #{SSH_PUBLIC_KEY1}}
234
+ expected5 = %Q{from="trusted.eng.cam.ac.uk",no-port-forwarding,no-pty ssh-rsa #{SSH_PUBLIC_KEY1}}
211
235
  invalid1 = "ssh-rsa #{SSH_PUBLIC_KEY1}= me@example.com"
212
236
  invalid2 = "ssh-rsa #{SSH_PUBLIC_KEY2}= me@example.com"
213
237
  invalid3 = "ssh-dss #{SSH_PUBLIC_KEY3}= me@example.com"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sshkey
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-23 00:00:00.000000000 Z
12
+ date: 2013-04-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -70,3 +70,4 @@ specification_version: 3
70
70
  summary: SSH private/public key generator in Ruby
71
71
  test_files:
72
72
  - test/sshkey_test.rb
73
+ has_rdoc: