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, ECDSA and RSA keys for protocol 2. DSA 163 keys may 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 DSA certificates may be added with: 177 byte SSH2_AGENTC_ADD_IDENTITY or 178 SSH2_AGENTC_ADD_ID_CONSTRAINED 179 string "ssh-dss-cert-v00 (a] openssh.com" 180 string certificate 181 mpint dsa_private_key 182 string key_comment 183 constraint[] key_constraints 184 185 ECDSA keys may be added using the following request 186 187 byte SSH2_AGENTC_ADD_IDENTITY or 188 SSH2_AGENTC_ADD_ID_CONSTRAINED 189 string "ecdsa-sha2-nistp256" | 190 "ecdsa-sha2-nistp384" | 191 "ecdsa-sha2-nistp521" 192 string ecdsa_curve_name 193 string ecdsa_public_key 194 mpint ecdsa_private 195 string key_comment 196 constraint[] key_constraints 197 198 ECDSA certificates may be added with: 199 byte SSH2_AGENTC_ADD_IDENTITY or 200 SSH2_AGENTC_ADD_ID_CONSTRAINED 201 string "ecdsa-sha2-nistp256-cert-v01 (a] openssh.com" | 202 "ecdsa-sha2-nistp384-cert-v01 (a] openssh.com" | 203 "ecdsa-sha2-nistp521-cert-v01 (a] openssh.com" 204 string certificate 205 mpint ecdsa_private_key 206 string key_comment 207 constraint[] key_constraints 208 209 RSA keys may be added with this request: 210 211 byte SSH2_AGENTC_ADD_IDENTITY or 212 SSH2_AGENTC_ADD_ID_CONSTRAINED 213 string "ssh-rsa" 214 mpint rsa_n 215 mpint rsa_e 216 mpint rsa_d 217 mpint rsa_iqmp 218 mpint rsa_p 219 mpint rsa_q 220 string key_comment 221 constraint[] key_constraints 222 223 RSA certificates may be added with this request: 224 225 byte SSH2_AGENTC_ADD_IDENTITY or 226 SSH2_AGENTC_ADD_ID_CONSTRAINED 227 string "ssh-rsa-cert-v00 (a] openssh.com" 228 string certificate 229 mpint rsa_d 230 mpint rsa_iqmp 231 mpint rsa_p 232 mpint rsa_q 233 string key_comment 234 constraint[] key_constraints 235 236 Note that the 'rsa_p' and 'rsa_q' parameters are sent in the reverse 237 order to the protocol 1 add keys message. As with the corresponding 238 protocol 1 "add key" request, the private key is overspecified to avoid 239 redundant processing. 240 241 For DSA, ECDSA and RSA key add requests, "key_constraints" may only be 242 present if the request type is SSH2_AGENTC_ADD_ID_CONSTRAINED. 243 244 The agent will reply with a SSH_AGENT_SUCCESS if the key has been 245 successfully added or a SSH_AGENT_FAILURE if an error occurred. 246 247 2.2.4 Loading keys from a smartcard 248 249 The OpenSSH agent may have optional smartcard support built in to it. If 250 so, it supports an operation to load keys from a smartcard. Technically, 251 only the public components of the keys are loaded into the agent so 252 this operation really arranges for future private key operations to be 253 delegated to the smartcard. 254 255 byte SSH_AGENTC_ADD_SMARTCARD_KEY or 256 SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED 257 string reader_id 258 string pin 259 constraint[] key_constraints 260 261 "reader_id" is an identifier to a smartcard reader and "pin" 262 is a PIN or passphrase used to unlock the private key(s) on the 263 device. "key_constraints" may only be present if the request type is 264 SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED. 265 266 This operation may load all SSH keys that are unlocked using the 267 "pin" on the specified reader. The type of key loaded (protocol 1 268 or protocol 2) will be specified by the smartcard itself, it is not 269 client-specified. 270 271 The agent will reply with a SSH_AGENT_SUCCESS if one or more keys have 272 been successfully loaded or a SSH_AGENT_FAILURE if an error occurred. 273 The agent will also return SSH_AGENT_FAILURE if it does not support 274 smartcards. 275 276 2.3 Removing multiple keys 277 278 A client may request that an agent delete all protocol 1 keys using the 279 following request: 280 281 byte SSH_AGENTC_REMOVE_ALL_RSA_IDENTITIES 282 283 This message requests the deletion of all protocol 2 keys: 284 285 byte SSH2_AGENTC_REMOVE_ALL_IDENTITIES 286 287 On success, the agent will delete all keys of the requested type and 288 reply with a SSH_AGENT_SUCCESS message. If an error occurred, the agent 289 will reply with SSH_AGENT_FAILURE. 290 291 Note that, to delete all keys (both protocol 1 and 2), a client 292 must send both a SSH_AGENTC_REMOVE_ALL_RSA_IDENTITIES and a 293 SSH2_AGENTC_REMOVE_ALL_IDENTITIES request. 294 295 2.4 Removing specific keys 296 297 2.4.1 Removing a protocol 1 key 298 299 Removal of a protocol 1 key may be requested with the following message: 300 301 byte SSH_AGENTC_REMOVE_RSA_IDENTITY 302 uint32 key_bits 303 mpint1 rsa_e 304 mpint1 rsa_n 305 306 Note that key_bits is strictly redundant, as it may be inferred by the 307 length of rsa_n. 308 309 The agent will delete any private key matching the specified public key 310 and return SSH_AGENT_SUCCESS. If no such key was found, the agent will 311 return SSH_AGENT_FAILURE. 312 313 2.4.2 Removing a protocol 2 key 314 315 Protocol 2 keys may be removed with the following request: 316 317 byte SSH2_AGENTC_REMOVE_IDENTITY 318 string key_blob 319 320 Where "key_blob" is encoded as per RFC 4253 section 6.6 "Public Key 321 Algorithms" for any of the supported protocol 2 key types. 322 323 The agent will delete any private key matching the specified public key 324 and return SSH_AGENT_SUCCESS. If no such key was found, the agent will 325 return SSH_AGENT_FAILURE. 326 327 2.4.3 Removing keys loaded from a smartcard 328 329 A client may request that a server remove one or more smartcard-hosted 330 keys using this message: 331 332 byte SSH_AGENTC_REMOVE_SMARTCARD_KEY 333 string reader_id 334 string pin 335 336 "reader_id" the an identifier to a smartcard reader and "pin" is a PIN 337 or passphrase used to unlock the private key(s) on the device. 338 339 When this message is received, and if the agent supports 340 smartcard-hosted keys, it will delete all keys that are hosted on the 341 specified smartcard that may be accessed with the given "pin". 342 343 The agent will reply with a SSH_AGENT_SUCCESS if one or more keys have 344 been successfully removed or a SSH_AGENT_FAILURE if an error occurred. 345 The agent will also return SSH_AGENT_FAILURE if it does not support 346 smartcards. 347 348 2.5 Requesting a list of known keys 349 350 An agent may be requested to list which keys it holds. Different 351 requests exist for protocol 1 and protocol 2 keys. 352 353 2.5.1 Requesting a list of protocol 1 keys 354 355 To request a list of protocol 1 keys that are held in the agent, a 356 client may send the following message: 357 358 byte SSH_AGENTC_REQUEST_RSA_IDENTITIES 359 360 The agent will reply with the following message: 361 362 byte SSH_AGENT_RSA_IDENTITIES_ANSWER 363 uint32 num_keys 364 365 Followed by zero or more consecutive keys, encoded as: 366 367 uint32 bits 368 mpint1 rsa_e 369 mpint1 rsa_n 370 string key_comment 371 372 2.5.2 Requesting a list of protocol 2 keys 373 374 A client may send the following message to request a list of 375 protocol 2 keys that are stored in the agent: 376 377 byte SSH2_AGENTC_REQUEST_IDENTITIES 378 379 The agent will reply with the following message header: 380 381 byte SSH2_AGENT_IDENTITIES_ANSWER 382 uint32 num_keys 383 384 Followed by zero or more consecutive keys, encoded as: 385 386 string key_blob 387 string key_comment 388 389 Where "key_blob" is encoded as per RFC 4253 section 6.6 "Public Key 390 Algorithms" for any of the supported protocol 2 key types. 391 392 2.6 Private key operations 393 394 The purpose of the agent is to perform private key operations, such as 395 signing and encryption without requiring a passphrase to unlock the 396 key and without allowing the private key itself to be exposed. There 397 are separate requests for the protocol 1 and protocol 2 private key 398 operations. 399 400 2.6.1 Protocol 1 private key challenge 401 402 The private key operation used in version 1 of the SSH protocol is 403 decrypting a challenge that has been encrypted with a public key. 404 It may be requested using this message: 405 406 byte SSH_AGENTC_RSA_CHALLENGE 407 uint32 ignored 408 mpint1 rsa_e 409 mpint1 rsa_n 410 mpint1 encrypted_challenge 411 byte[16] session_id 412 uint32 response_type /* must be 1 */ 413 414 "rsa_e" and "rsa_n" are used to identify which private key to use. 415 "encrypted_challenge" is a challenge blob that has (presumably) 416 been encrypted with the public key and must be in the range 417 1 <= encrypted_challenge < 2^256. "session_id" is the SSH protocol 1 418 session ID (computed from the server host key, the server semi-ephemeral 419 key and the session cookie). 420 421 "ignored" and "response_type" exist for compatibility with legacy 422 implementations. "response_type" must be equal to 1; other response 423 types are not supported. 424 425 On receiving this request, the server decrypts the "encrypted_challenge" 426 using the private key matching the supplied (rsa_e, rsa_n) values. For 427 the response derivation, the decrypted challenge is represented as an 428 unsigned, big-endian integer encoded in a 32 byte buffer (i.e. values 429 smaller than 2^248 will have leading 0 bytes). 430 431 The response value is then calculated as: 432 433 response = MD5(decrypted_challenge || session_id) 434 435 and returned in the following message 436 437 byte SSH_AGENT_RSA_RESPONSE 438 byte[16] response 439 440 If the agent cannot find the key specified by the supplied (rsa_e, 441 rsa_n) then it will return SSH_AGENT_FAILURE. 442 443 2.6.2 Protocol 2 private key signature request 444 445 A client may use the following message to request signing of data using 446 a protocol 2 key: 447 448 byte SSH2_AGENTC_SIGN_REQUEST 449 string key_blob 450 string data 451 uint32 flags 452 453 Where "key_blob" is encoded as per RFC 4253 section 6.6 "Public Key 454 Algorithms" for any of the supported protocol 2 key types. "flags" is 455 a bit-mask, but at present only one possible value is defined (see below 456 for its meaning): 457 458 SSH_AGENT_OLD_SIGNATURE 1 459 460 Upon receiving this request, the agent will look up the private key that 461 corresponds to the public key contained in key_blob. It will use this 462 private key to sign the "data" and produce a signature blob using the 463 key type-specific method described in RFC 4253 section 6.6 "Public Key 464 Algorithms". 465 466 An exception to this is for "ssh-dss" keys where the "flags" word 467 contains the value SSH_AGENT_OLD_SIGNATURE. In this case, a legacy 468 signature encoding is used in lieu of the standard one. In this case, 469 the DSA signature blob is encoded as: 470 471 byte[40] signature 472 473 The signature will be returned in the response message: 474 475 byte SSH2_AGENT_SIGN_RESPONSE 476 string signature_blob 477 478 If the agent cannot find the key specified by the supplied key_blob then 479 it will return SSH_AGENT_FAILURE. 480 481 2.7 Locking or unlocking an agent 482 483 The agent supports temporary locking with a passphrase to suspend 484 processing of sensitive operations until it has been unlocked with the 485 same passphrase. To lock an agent, a client send the following request: 486 487 byte SSH_AGENTC_LOCK 488 string passphrase 489 490 Upon receipt of this message and if the agent is not already locked, 491 it will suspend processing requests and return a SSH_AGENT_SUCCESS 492 reply. If the agent is already locked, it will return SSH_AGENT_FAILURE. 493 494 While locked, the agent will refuse all requests except 495 SSH_AGENTC_UNLOCK, SSH_AGENTC_REQUEST_RSA_IDENTITIES and 496 SSH2_AGENTC_REQUEST_IDENTITIES. The "request identities" requests are 497 treated specially by a locked agent: it will always return an empty list 498 of keys. 499 500 To unlock an agent, a client may request: 501 502 byte SSH_AGENTC_UNLOCK 503 string passphrase 504 505 If the passphrase matches and the agent is locked, then it will resume 506 processing all requests and return SSH_AGENT_SUCCESS. If the agent 507 is not locked or the passphrase does not match then it will return 508 SSH_AGENT_FAILURE. 509 510 Locking and unlocking affects both protocol 1 and protocol 2 keys. 511 512 3. Protocol message numbers 513 514 3.1 Requests from client to agent for protocol 1 key operations 515 516 SSH_AGENTC_REQUEST_RSA_IDENTITIES 1 517 SSH_AGENTC_RSA_CHALLENGE 3 518 SSH_AGENTC_ADD_RSA_IDENTITY 7 519 SSH_AGENTC_REMOVE_RSA_IDENTITY 8 520 SSH_AGENTC_REMOVE_ALL_RSA_IDENTITIES 9 521 SSH_AGENTC_ADD_RSA_ID_CONSTRAINED 24 522 523 3.2 Requests from client to agent for protocol 2 key operations 524 525 SSH2_AGENTC_REQUEST_IDENTITIES 11 526 SSH2_AGENTC_SIGN_REQUEST 13 527 SSH2_AGENTC_ADD_IDENTITY 17 528 SSH2_AGENTC_REMOVE_IDENTITY 18 529 SSH2_AGENTC_REMOVE_ALL_IDENTITIES 19 530 SSH2_AGENTC_ADD_ID_CONSTRAINED 25 531 532 3.3 Key-type independent requests from client to agent 533 534 SSH_AGENTC_ADD_SMARTCARD_KEY 20 535 SSH_AGENTC_REMOVE_SMARTCARD_KEY 21 536 SSH_AGENTC_LOCK 22 537 SSH_AGENTC_UNLOCK 23 538 SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED 26 539 540 3.4 Generic replies from agent to client 541 542 SSH_AGENT_FAILURE 5 543 SSH_AGENT_SUCCESS 6 544 545 3.5 Replies from agent to client for protocol 1 key operations 546 547 SSH_AGENT_RSA_IDENTITIES_ANSWER 2 548 SSH_AGENT_RSA_RESPONSE 4 549 550 3.6 Replies from agent to client for protocol 2 key operations 551 552 SSH2_AGENT_IDENTITIES_ANSWER 12 553 SSH2_AGENT_SIGN_RESPONSE 14 554 555 3.7 Key constraint identifiers 556 557 SSH_AGENT_CONSTRAIN_LIFETIME 1 558 SSH_AGENT_CONSTRAIN_CONFIRM 2 559 560 $OpenBSD: PROTOCOL.agent,v 1.6 2010/08/31 11:54:45 djm Exp $ 561