~ubuntu-branches/ubuntu/lucid/openssh/lucid

« back to all changes in this revision

Viewing changes to PROTOCOL.agent

  • Committer: Bazaar Package Importer
  • Author(s): Colin Watson
  • Date: 2008-09-30 23:09:58 UTC
  • mfrom: (1.13.3 upstream) (29 hardy)
  • mto: This revision was merged to the branch mainline in revision 43.
  • Revision ID: james.westby@ubuntu.com-20080930230958-o6vsgn8c4mm959s0
Tags: 1:5.1p1-3
* Remove unnecessary ssh-vulnkey output in non-verbose mode when no
  compromised or unknown keys were found (closes: #496495).
* Configure with --disable-strip; dh_strip will deal with stripping
  binaries and will honour DEB_BUILD_OPTIONS (thanks, Bernhard R. Link;
  closes: #498681).
* Fix handling of zero-length server banners (thanks, Tomas Mraz; closes:
  #497026).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
This describes the protocol used by OpenSSH's ssh-agent.
 
2
 
 
3
OpenSSH's agent supports managing keys for the standard SSH protocol
 
4
2 as well as the legacy SSH protocol 1. Support for these key types
 
5
is almost completely disjoint - in all but a few cases, operations on
 
6
protocol 2 keys cannot see or affect protocol 1 keys and vice-versa.
 
7
 
 
8
Protocol 1 and protocol 2 keys are separated because of the differing
 
9
cryptographic usage: protocol 1 private RSA keys are used to decrypt
 
10
challenges that were encrypted with the corresponding public key,
 
11
whereas protocol 2 RSA private keys are used to sign challenges with
 
12
a private key for verification with the corresponding public key. It
 
13
is considered unsound practice to use the same key for signing and
 
14
encryption.
 
15
 
 
16
With a couple of exceptions, the protocol message names used in this
 
17
document indicate which type of key the message relates to. SSH_*
 
18
messages refer to protocol 1 keys only. SSH2_* messages refer to
 
19
protocol 2 keys. Furthermore, the names also indicate whether the
 
20
message is a request to the agent (*_AGENTC_*) or a reply from the
 
21
agent (*_AGENT_*). Section 3 below contains the mapping of the
 
22
protocol message names to their integer values.
 
23
 
 
24
1. Data types
 
25
 
 
26
Because of support for legacy SSH protocol 1 keys, OpenSSH's agent
 
27
protocol makes use of some data types not defined in RFC 4251.
 
28
 
 
29
1.1 uint16
 
30
 
 
31
The "uint16" data type is a simple MSB-first 16 bit unsigned integer
 
32
encoded in two bytes.
 
33
 
 
34
1.2 mpint1
 
35
 
 
36
The "mpint1" type represents an arbitrary precision integer (bignum).
 
37
Its format is as follows:
 
38
 
 
39
        uint16                  bits
 
40
        byte[(bits + 7) / 8]    bignum
 
41
 
 
42
"bignum" contains an unsigned arbitrary precision integer encoded as
 
43
eight bits per byte in big-endian (MSB first) format.
 
44
 
 
45
Note the difference between the "mpint1" encoding and the "mpint"
 
46
encoding defined in RFC 4251. Also note that the length of the encoded
 
47
integer is specified in bits, not bytes and that the byte length of
 
48
the integer must be calculated by rounding up the number of bits to the
 
49
nearest eight.
 
50
 
 
51
2. Protocol Messages
 
52
 
 
53
All protocol messages are prefixed with their length in bytes, encoded
 
54
as a 32 bit unsigned integer. Specifically:
 
55
 
 
56
        uint32                  message_length
 
57
        byte[message_length]    message
 
58
 
 
59
The following message descriptions refer only to the content the
 
60
"message" field.
 
61
 
 
62
2.1 Generic server responses
 
63
 
 
64
The following generic messages may be sent by the server in response to
 
65
requests from the client. On success the agent may reply either with:
 
66
 
 
67
        byte                    SSH_AGENT_SUCCESS
 
68
 
 
69
or a request-specific success message.
 
70
 
 
71
On failure, the agent may reply with:
 
72
 
 
73
        byte                    SSH_AGENT_FAILURE
 
74
 
 
75
SSH_AGENT_FAILURE messages are also sent in reply to unknown request
 
76
types.
 
77
 
 
78
2.2 Adding keys to the agent
 
79
 
 
80
Keys are added to the agent using the SSH_AGENTC_ADD_RSA_IDENTITY and
 
81
SSH2_AGENTC_ADD_IDENTITY requests for protocol 1 and protocol 2 keys
 
82
respectively.
 
83
 
 
84
Two variants of these requests are SSH_AGENTC_ADD_RSA_ID_CONSTRAINED
 
85
and SSH2_AGENTC_ADD_ID_CONSTRAINED - these add keys with optional
 
86
"constraints" on their usage.
 
87
 
 
88
OpenSSH may be built with support for keys hosted on a smartcard
 
89
or other hardware security module. These keys may be added
 
90
to the agent using the SSH_AGENTC_ADD_SMARTCARD_KEY and
 
91
SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED requests.
 
92
 
 
93
2.2.1 Key constraints
 
94
 
 
95
The OpenSSH agent supports some basic optional constraints on key usage.
 
96
At present there are two constraints defined.
 
97
 
 
98
The first constraint limits the validity duration of a key. It is
 
99
encoded as:
 
100
 
 
101
        byte                    SSH_AGENT_CONSTRAIN_LIFETIME
 
102
        uint32                  seconds
 
103
 
 
104
Where "seconds" contains the number of seconds that the key shall remain
 
105
valid measured from the moment that the agent receives it. After the
 
106
validity period has expired, OpenSSH's agent will erase these keys from
 
107
memory.
 
108
 
 
109
The second constraint requires the agent to seek explicit user
 
110
confirmation before performing private key operations with the loaded
 
111
key. This constraint is encoded as:
 
112
 
 
113
        byte                    SSH_AGENT_CONSTRAIN_CONFIRM
 
114
 
 
115
Zero or more constraints may be specified when adding a key with one
 
116
of the *_CONSTRAINED requests. Multiple constraints are appended
 
117
consecutively to the end of the request:
 
118
 
 
119
        byte                    constraint1_type
 
120
        ....                    constraint1_data
 
121
        byte                    constraint2_type
 
122
        ....                    constraint2_data
 
123
        ....
 
124
        byte                    constraintN_type
 
125
        ....                    constraintN_data
 
126
 
 
127
Such a sequence of zero or more constraints will be referred to below
 
128
as "constraint[]". Agents may determine whether there are constraints
 
129
by checking whether additional data exists in the "add key" request
 
130
after the key data itself. OpenSSH will refuse to add a key if it
 
131
contains unknown constraints.
 
132
 
 
133
2.2.2 Add protocol 1 key
 
134
 
 
135
A client may add a protocol 1 key to an agent with the following
 
136
request:
 
137
 
 
138
        byte                    SSH_AGENTC_ADD_RSA_IDENTITY or
 
139
                                SSH_AGENTC_ADD_RSA_ID_CONSTRAINED
 
140
        uint32                  ignored
 
141
        mpint1                  rsa_n
 
142
        mpint1                  rsa_e
 
143
        mpint1                  rsa_d
 
144
        mpint1                  rsa_iqmp
 
145
        mpint1                  rsa_q
 
146
        mpint1                  rsa_p
 
147
        string                  key_comment
 
148
        constraint[]            key_constraints
 
149
 
 
150
Note that there is some redundancy in the key parameters; a key could be
 
151
fully specified using just rsa_q, rsa_p and rsa_e at the cost of extra
 
152
computation.
 
153
 
 
154
"key_constraints" may only be present if the request type is
 
155
SSH_AGENTC_ADD_RSA_IDENTITY.
 
156
 
 
157
The agent will reply with a SSH_AGENT_SUCCESS if the key has been
 
158
successfully added or a SSH_AGENT_FAILURE if an error occurred.
 
159
 
 
160
2.2.3 Add protocol 2 key
 
161
 
 
162
The OpenSSH agent supports DSA and RSA keys for protocol 2. DSA keys may
 
163
be added using the following request
 
164
 
 
165
        byte                    SSH2_AGENTC_ADD_IDENTITY or
 
166
                                SSH2_AGENTC_ADD_ID_CONSTRAINED
 
167
        string                  "ssh-dss"
 
168
        mpint                   dsa_p
 
169
        mpint                   dsa_q
 
170
        mpint                   dsa_g
 
171
        mpint                   dsa_public_key
 
172
        mpint                   dsa_private_key
 
173
        string                  key_comment
 
174
        constraint[]            key_constraints
 
175
 
 
176
RSA keys may be added with this request:
 
177
 
 
178
        byte                    SSH2_AGENTC_ADD_IDENTITY or
 
179
                                SSH2_AGENTC_ADD_ID_CONSTRAINED
 
180
        string                  "ssh-rsa"
 
181
        mpint                   rsa_n
 
182
        mpint                   rsa_e
 
183
        mpint                   rsa_d
 
184
        mpint                   rsa_iqmp
 
185
        mpint                   rsa_p
 
186
        mpint                   rsa_q
 
187
        string                  key_comment
 
188
        constraint[]            key_constraints
 
189
 
 
190
Note that the 'rsa_p' and 'rsa_q' parameters are sent in the reverse
 
191
order to the protocol 1 add keys message. As with the corresponding
 
192
protocol 1 "add key" request, the private key is overspecified to avoid
 
193
redundant processing.
 
194
 
 
195
For both DSA and RSA key add requests, "key_constraints" may only be
 
196
present if the request type is SSH2_AGENTC_ADD_ID_CONSTRAINED.
 
197
 
 
198
The agent will reply with a SSH_AGENT_SUCCESS if the key has been
 
199
successfully added or a SSH_AGENT_FAILURE if an error occurred.
 
200
 
 
201
2.2.4 Loading keys from a smartcard
 
202
 
 
203
The OpenSSH agent may have optional smartcard support built in to it. If
 
204
so, it supports an operation to load keys from a smartcard. Technically,
 
205
only the public components of the keys are loaded into the agent so
 
206
this operation really arranges for future private key operations to be
 
207
delegated to the smartcard.
 
208
 
 
209
        byte                    SSH_AGENTC_ADD_SMARTCARD_KEY or
 
210
                                SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED
 
211
        string                  reader_id
 
212
        string                  pin
 
213
        constraint[]            key_constraints
 
214
 
 
215
"reader_id" is an identifier to a smartcard reader and "pin"
 
216
is a PIN or passphrase used to unlock the private key(s) on the
 
217
device. "key_constraints" may only be present if the request type is
 
218
SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED.
 
219
 
 
220
This operation may load all SSH keys that are unlocked using the
 
221
"pin" on the specified reader. The type of key loaded (protocol 1
 
222
or protocol 2) will be specified by the smartcard itself, it is not
 
223
client-specified.
 
224
 
 
225
The agent will reply with a SSH_AGENT_SUCCESS if one or more keys have
 
226
been successfully loaded or a SSH_AGENT_FAILURE if an error occurred.
 
227
The agent will also return SSH_AGENT_FAILURE if it does not support
 
228
smartcards.
 
229
 
 
230
2.3 Removing multiple keys
 
231
 
 
232
A client may request that an agent delete all protocol 1 keys using the
 
233
following request:
 
234
 
 
235
        byte                    SSH_AGENTC_REMOVE_ALL_RSA_IDENTITIES
 
236
 
 
237
This message requests the deletion of all protocol 2 keys:
 
238
 
 
239
        byte                    SSH2_AGENTC_REMOVE_ALL_IDENTITIES
 
240
 
 
241
On success, the agent will delete all keys of the requested type and
 
242
reply with a SSH_AGENT_SUCCESS message. If an error occurred, the agent
 
243
will reply with SSH_AGENT_FAILURE.
 
244
 
 
245
Note that, to delete all keys (both protocol 1 and 2), a client
 
246
must send both a SSH_AGENTC_REMOVE_ALL_RSA_IDENTITIES and a
 
247
SSH2_AGENTC_REMOVE_ALL_IDENTITIES request.
 
248
 
 
249
2.4 Removing specific keys
 
250
 
 
251
2.4.1 Removing a protocol 1 key
 
252
 
 
253
Removal of a protocol 1 key may be requested with the following message:
 
254
 
 
255
        byte                    SSH_AGENTC_REMOVE_RSA_IDENTITY
 
256
        uint32                  key_bits
 
257
        mpint1                  rsa_e
 
258
        mpint1                  rsa_n
 
259
 
 
260
Note that key_bits is strictly redundant, as it may be inferred by the
 
261
length of rsa_n.
 
262
 
 
263
The agent will delete any private key matching the specified public key
 
264
and return SSH_AGENT_SUCCESS. If no such key was found, the agent will
 
265
return SSH_AGENT_FAILURE.
 
266
 
 
267
2.4.2 Removing a protocol 2 key
 
268
 
 
269
Protocol 2 keys may be removed with the following request:
 
270
 
 
271
        byte                    SSH2_AGENTC_REMOVE_IDENTITY
 
272
        string                  key_blob
 
273
 
 
274
Where "key_blob" is encoded as per RFC 4253 section 6.6 "Public Key
 
275
Algorithms" for either of the supported key types: "ssh-dss" or
 
276
"ssh-rsa".
 
277
 
 
278
The agent will delete any private key matching the specified public key
 
279
and return SSH_AGENT_SUCCESS. If no such key was found, the agent will
 
280
return SSH_AGENT_FAILURE.
 
281
 
 
282
2.4.3 Removing keys loaded from a smartcard
 
283
 
 
284
A client may request that a server remove one or more smartcard-hosted
 
285
keys using this message:
 
286
 
 
287
        byte                    SSH_AGENTC_REMOVE_SMARTCARD_KEY
 
288
        string                  reader_id
 
289
        string                  pin
 
290
 
 
291
"reader_id" the an identifier to a smartcard reader and "pin" is a PIN
 
292
or passphrase used to unlock the private key(s) on the device.
 
293
 
 
294
When this message is received, and if the agent supports
 
295
smartcard-hosted keys, it will delete all keys that are hosted on the
 
296
specified smartcard that may be accessed with the given "pin".
 
297
 
 
298
The agent will reply with a SSH_AGENT_SUCCESS if one or more keys have
 
299
been successfully removed or a SSH_AGENT_FAILURE if an error occurred.
 
300
The agent will also return SSH_AGENT_FAILURE if it does not support
 
301
smartcards.
 
302
 
 
303
2.5 Requesting a list of known keys
 
304
 
 
305
An agent may be requested to list which keys it holds. Different
 
306
requests exist for protocol 1 and protocol 2 keys.
 
307
 
 
308
2.5.1 Requesting a list of protocol 1 keys
 
309
 
 
310
To request a list of protocol 1 keys that are held in the agent, a
 
311
client may send the following message:
 
312
 
 
313
        byte                    SSH_AGENTC_REQUEST_RSA_IDENTITIES
 
314
 
 
315
The agent will reply with the following message:
 
316
 
 
317
        byte                    SSH_AGENT_RSA_IDENTITIES_ANSWER
 
318
        uint32                  num_keys
 
319
 
 
320
Followed by zero or more consecutive keys, encoded as:
 
321
 
 
322
        uint32                  bits
 
323
        mpint1                  rsa_e
 
324
        mpint1                  rsa_n
 
325
        string                  key_comment
 
326
 
 
327
2.5.2 Requesting a list of protocol 2 keys
 
328
 
 
329
A client may send the following message to request a list of
 
330
protocol 2 keys that are stored in the agent:
 
331
 
 
332
        byte                    SSH2_AGENTC_REQUEST_IDENTITIES
 
333
 
 
334
The agent will reply with the following message header:
 
335
 
 
336
        byte                    SSH2_AGENT_IDENTITIES_ANSWER
 
337
        uint32                  num_keys
 
338
 
 
339
Followed by zero or more consecutive keys, encoded as:
 
340
 
 
341
        string                  key_blob
 
342
        string                  key_comment
 
343
 
 
344
Where "key_blob" is encoded as per RFC 4253 section 6.6 "Public Key
 
345
Algorithms" for either of the supported key types: "ssh-dss" or
 
346
"ssh-rsa".
 
347
 
 
348
2.6 Private key operations
 
349
 
 
350
The purpose of the agent is to perform private key operations, such as
 
351
signing and encryption without requiring a passphrase to unlock the
 
352
key and without allowing the private key itself to be exposed. There
 
353
are separate requests for the protocol 1 and protocol 2 private key
 
354
operations.
 
355
 
 
356
2.6.1 Protocol 1 private key challenge
 
357
 
 
358
The private key operation used in version 1 of the SSH protocol is
 
359
decrypting a challenge that has been encrypted with a public key.
 
360
It may be requested using this message:
 
361
 
 
362
        byte                    SSH_AGENTC_RSA_CHALLENGE
 
363
        uint32                  ignored
 
364
        mpint1                  rsa_e
 
365
        mpint1                  rsa_n
 
366
        mpint1                  encrypted_challenge
 
367
        byte[16]                session_id
 
368
        uint32                  response_type /* must be 1 */
 
369
 
 
370
"rsa_e" and "rsa_n" are used to identify which private key to use.
 
371
"encrypted_challenge" is a challenge blob that has (presumably)
 
372
been encrypted with the public key and must be in the range 
 
373
1 <= encrypted_challenge < 2^256. "session_id" is the SSH protocol 1
 
374
session ID (computed from the server host key, the server semi-ephemeral
 
375
key and the session cookie).
 
376
 
 
377
"ignored" and "response_type" exist for compatibility with legacy
 
378
implementations. "response_type" must be equal to 1; other response
 
379
types are not supported.
 
380
 
 
381
On receiving this request, the server decrypts the "encrypted_challenge"
 
382
using the private key matching the supplied (rsa_e, rsa_n) values. For
 
383
the response derivation, the decrypted challenge is represented as an
 
384
unsigned, big-endian integer encoded in a 32 byte buffer (i.e. values
 
385
smaller than 2^248 will have leading 0 bytes).
 
386
 
 
387
The response value is then calculated as:
 
388
 
 
389
        response = MD5(decrypted_challenge || session_id)
 
390
 
 
391
and returned in the following message
 
392
 
 
393
        byte                    SSH_AGENT_RSA_RESPONSE
 
394
        byte[16]                response
 
395
 
 
396
If the agent cannot find the key specified by the supplied (rsa_e,
 
397
rsa_n) then it will return SSH_AGENT_FAILURE.
 
398
 
 
399
2.6.2 Protocol 2 private key signature request
 
400
 
 
401
A client may use the following message to request signing of data using
 
402
a protocol 2 key:
 
403
 
 
404
        byte                    SSH2_AGENTC_SIGN_REQUEST
 
405
        string                  key_blob
 
406
        string                  data
 
407
        uint32                  flags
 
408
 
 
409
Where "key_blob" is encoded as per RFC 4253 section 6.6 "Public Key
 
410
Algorithms" for either of the supported key types: "ssh-dss" or
 
411
"ssh-rsa". "flags" is a bit-mask, but at present only one possible value
 
412
is defined (see below for its meaning):
 
413
 
 
414
        SSH_AGENT_OLD_SIGNATURE         1
 
415
 
 
416
Upon receiving this request, the agent will look up the private key that
 
417
corresponds to the public key contained in key_blob. It will use this
 
418
private key to sign the "data" and produce a signature blob using the
 
419
key type-specific method described in RFC 4253 section 6.6 "Public Key
 
420
Algorithms".
 
421
 
 
422
An exception to this is for "ssh-dss" keys where the "flags" word
 
423
contains the value SSH_AGENT_OLD_SIGNATURE. In this case, a legacy
 
424
signature encoding is used in lieu of the standard one. In this case,
 
425
the DSA signature blob is encoded as:
 
426
 
 
427
        byte[40]                signature
 
428
 
 
429
The signature will be returned in the response message:
 
430
 
 
431
        byte                    SSH2_AGENT_SIGN_RESPONSE
 
432
        string                  signature_blob
 
433
 
 
434
If the agent cannot find the key specified by the supplied key_blob then
 
435
it will return SSH_AGENT_FAILURE.
 
436
 
 
437
2.7 Locking or unlocking an agent
 
438
 
 
439
The agent supports temporary locking with a passphrase to suspend
 
440
processing of sensitive operations until it has been unlocked with the
 
441
same passphrase. To lock an agent, a client send the following request:
 
442
 
 
443
        byte                    SSH_AGENTC_LOCK
 
444
        string                  passphrase
 
445
 
 
446
Upon receipt of this message and if the agent is not already locked,
 
447
it will suspend processing requests and return a SSH_AGENT_SUCCESS
 
448
reply. If the agent is already locked, it will return SSH_AGENT_FAILURE.
 
449
 
 
450
While locked, the agent will refuse all requests except
 
451
SSH_AGENTC_UNLOCK, SSH_AGENTC_REQUEST_RSA_IDENTITIES and
 
452
SSH2_AGENTC_REQUEST_IDENTITIES. The "request identities" requests are
 
453
treated specially by a locked agent: it will always return an empty list
 
454
of keys.
 
455
 
 
456
To unlock an agent, a client may request:
 
457
 
 
458
        byte                    SSH_AGENTC_UNLOCK
 
459
        string                  passphrase
 
460
 
 
461
If the passphrase matches and the agent is locked, then it will resume
 
462
processing all requests and return SSH_AGENT_SUCCESS. If the agent
 
463
is not locked or the passphrase does not match then it will return
 
464
SSH_AGENT_FAILURE.
 
465
 
 
466
Locking and unlocking affects both protocol 1 and protocol 2 keys.
 
467
 
 
468
3. Protocol message numbers
 
469
 
 
470
3.1 Requests from client to agent for protocol 1 key operations
 
471
 
 
472
        SSH_AGENTC_REQUEST_RSA_IDENTITIES               1
 
473
        SSH_AGENTC_RSA_CHALLENGE                        3
 
474
        SSH_AGENTC_ADD_RSA_IDENTITY                     7
 
475
        SSH_AGENTC_REMOVE_RSA_IDENTITY                  8
 
476
        SSH_AGENTC_REMOVE_ALL_RSA_IDENTITIES            9
 
477
        SSH_AGENTC_ADD_RSA_ID_CONSTRAINED               24
 
478
 
 
479
3.2 Requests from client to agent for protocol 2 key operations
 
480
 
 
481
        SSH2_AGENTC_REQUEST_IDENTITIES                  11
 
482
        SSH2_AGENTC_SIGN_REQUEST                        13
 
483
        SSH2_AGENTC_ADD_IDENTITY                        17
 
484
        SSH2_AGENTC_REMOVE_IDENTITY                     18
 
485
        SSH2_AGENTC_REMOVE_ALL_IDENTITIES               19
 
486
        SSH2_AGENTC_ADD_ID_CONSTRAINED                  25
 
487
 
 
488
3.3 Key-type independent requests from client to agent
 
489
 
 
490
        SSH_AGENTC_ADD_SMARTCARD_KEY                    20
 
491
        SSH_AGENTC_REMOVE_SMARTCARD_KEY                 21
 
492
        SSH_AGENTC_LOCK                                 22
 
493
        SSH_AGENTC_UNLOCK                               23
 
494
        SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED        26
 
495
 
 
496
3.4 Generic replies from agent to client
 
497
 
 
498
        SSH_AGENT_FAILURE                               5
 
499
        SSH_AGENT_SUCCESS                               6
 
500
 
 
501
3.5 Replies from agent to client for protocol 1 key operations
 
502
 
 
503
        SSH_AGENT_RSA_IDENTITIES_ANSWER                 2
 
504
        SSH_AGENT_RSA_RESPONSE                          4
 
505
 
 
506
3.6 Replies from agent to client for protocol 2 key operations
 
507
 
 
508
        SSH2_AGENT_IDENTITIES_ANSWER                    12
 
509
        SSH2_AGENT_SIGN_RESPONSE                        14
 
510
 
 
511
3.7 Key constraint identifiers
 
512
 
 
513
        SSH_AGENT_CONSTRAIN_LIFETIME                    1
 
514
        SSH_AGENT_CONSTRAIN_CONFIRM                     2
 
515
 
 
516
$OpenBSD: PROTOCOL.agent,v 1.4 2008/07/01 23:12:47 stevesk Exp $