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

1.13.3 by Colin Watson
Import upstream version 5.1p1
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 $