1This documents OpenSSH's deviations and extensions to the published SSH 2protocol. 3 4Note that OpenSSH's sftp and sftp-server implement revision 3 of the SSH 5filexfer protocol described in: 6 7http://www.openssh.com/txt/draft-ietf-secsh-filexfer-02.txt 8 9Newer versions of the draft will not be supported, though some features 10are individually implemented as extensions described below. 11 12The protocol used by OpenSSH's ssh-agent is described in the file 13PROTOCOL.agent 14 151. Transport protocol changes 16 171.1. transport: Protocol 2 MAC algorithm "umac-64@openssh.com" 18 19This is a new transport-layer MAC method using the UMAC algorithm 20(rfc4418). This method is identical to the "umac-64" method documented 21in: 22 23http://www.openssh.com/txt/draft-miller-secsh-umac-01.txt 24 251.2. transport: Protocol 2 compression algorithm "zlib@openssh.com" 26 27This transport-layer compression method uses the zlib compression 28algorithm (identical to the "zlib" method in rfc4253), but delays the 29start of compression until after authentication has completed. This 30avoids exposing compression code to attacks from unauthenticated users. 31 32The method is documented in: 33 34http://www.openssh.com/txt/draft-miller-secsh-compression-delayed-00.txt 35 361.3. transport: New public key algorithms "ssh-rsa-cert-v01@openssh.com", 37 "ssh-dsa-cert-v01@openssh.com", 38 "ecdsa-sha2-nistp256-cert-v01@openssh.com", 39 "ecdsa-sha2-nistp384-cert-v01@openssh.com" and 40 "ecdsa-sha2-nistp521-cert-v01@openssh.com" 41 42OpenSSH introduces new public key algorithms to support certificate 43authentication for users and host keys. These methods are documented 44in the file PROTOCOL.certkeys 45 461.4. transport: Elliptic Curve cryptography 47 48OpenSSH supports ECC key exchange and public key authentication as 49specified in RFC5656. Only the ecdsa-sha2-nistp256, ecdsa-sha2-nistp384 50and ecdsa-sha2-nistp521 curves over GF(p) are supported. Elliptic 51curve points encoded using point compression are NOT accepted or 52generated. 53 541.5 transport: Protocol 2 Encrypt-then-MAC MAC algorithms 55 56OpenSSH supports MAC algorithms, whose names contain "-etm", that 57perform the calculations in a different order to that defined in RFC 584253. These variants use the so-called "encrypt then MAC" ordering, 59calculating the MAC over the packet ciphertext rather than the 60plaintext. This ordering closes a security flaw in the SSH transport 61protocol, where decryption of unauthenticated ciphertext provided a 62"decryption oracle" that could, in conjunction with cipher flaws, reveal 63session plaintext. 64 65Specifically, the "-etm" MAC algorithms modify the transport protocol 66to calculate the MAC over the packet ciphertext and to send the packet 67length unencrypted. This is necessary for the transport to obtain the 68length of the packet and location of the MAC tag so that it may be 69verified without decrypting unauthenticated data. 70 71As such, the MAC covers: 72 73 mac = MAC(key, sequence_number || packet_length || encrypted_packet) 74 75where "packet_length" is encoded as a uint32 and "encrypted_packet" 76contains: 77 78 byte padding_length 79 byte[n1] payload; n1 = packet_length - padding_length - 1 80 byte[n2] random padding; n2 = padding_length 81 821.6 transport: AES-GCM 83 84OpenSSH supports the AES-GCM algorithm as specified in RFC 5647. 85Because of problems with the specification of the key exchange 86the behaviour of OpenSSH differs from the RFC as follows: 87 88AES-GCM is only negotiated as the cipher algorithms 89"aes128-gcm@openssh.com" or "aes256-gcm@openssh.com" and never as 90an MAC algorithm. Additionally, if AES-GCM is selected as the cipher 91the exchanged MAC algorithms are ignored and there doesn't have to be 92a matching MAC. 93 941.7 transport: chacha20-poly1305@openssh.com authenticated encryption 95 96OpenSSH supports authenticated encryption using ChaCha20 and Poly1305 97as described in PROTOCOL.chacha20poly1305. 98 991.8 transport: curve25519-sha256@libssh.org key exchange algorithm 100 101OpenSSH supports the use of ECDH in Curve25519 for key exchange as 102described at: 103http://git.libssh.org/users/aris/libssh.git/plain/doc/curve25519-sha256@libssh.org.txt?h=curve25519 104 105This is identical to curve25519-sha256 as later published in RFC8731. 106 1071.9 transport: ping facility 108 109OpenSSH implements a transport level ping message SSH2_MSG_PING 110and a corresponding SSH2_MSG_PONG reply. 111 112#define SSH2_MSG_PING 192 113#define SSH2_MSG_PONG 193 114 115The ping message is simply: 116 117 byte SSH_MSG_PING 118 string data 119 120The reply copies the data (which may be the empty string) from the 121ping: 122 123 byte SSH_MSG_PONG 124 string data 125 126Replies are sent in order. They are sent immediately except when rekeying 127is in progress, in which case they are queued until rekeying completes. 128 129The server advertises support for these messages using the 130SSH2_MSG_EXT_INFO mechanism (RFC8308), with the following message: 131 132 string "ping@openssh.com" 133 string "0" (version) 134 135The ping/reply message is implemented at the transport layer rather 136than as a named global or channel request to allow pings with very 137short packet lengths, which would not be possible with other 138approaches. 139 1401.10 transport: strict key exchange extension 141 142OpenSSH supports a number of transport-layer hardening measures under 143a "strict KEX" feature. This feature is signalled similarly to the 144RFC8308 ext-info feature: by including a additional algorithm in the 145initial SSH2_MSG_KEXINIT kex_algorithms field. The client may append 146"kex-strict-c-v00@openssh.com" to its kex_algorithms and the server 147may append "kex-strict-s-v00@openssh.com". These pseudo-algorithms 148are only valid in the initial SSH2_MSG_KEXINIT and MUST be ignored 149if they are present in subsequent SSH2_MSG_KEXINIT packets. 150 151When an endpoint that supports this extension observes this algorithm 152name in a peer's KEXINIT packet, it MUST make the following changes to 153the protocol: 154 155a) During initial KEX, terminate the connection if out-of-sequence 156 packet or any message that is not strictly required by KEX is 157 received. This includes terminating the connection if the first 158 packet received is not SSH2_MSG_KEXINIT. Unexpected packets for 159 the purpose of strict KEX include messages that are otherwise 160 valid at any time during the connection such as SSH2_MSG_DEBUG, 161 SSH2_MSG_IGNORE or SSH2_MSG_UNIMPLEMENTED. 162b) After sending or receiving a SSH2_MSG_NEWKEYS message, reset the 163 packet sequence number to zero. This behaviour persists for the 164 duration of the connection (i.e. not just the first 165 SSH2_MSG_NEWKEYS). 166 1671.11 transport: SSH2_MSG_EXT_INFO during user authentication 168 169This protocol extension allows the SSH2_MSG_EXT_INFO to be sent 170during user authentication. RFC8308 does allow a second 171SSH2_MSG_EXT_INFO notification, but it may only be sent at the end 172of user authentication and this is too late to signal per-user 173server signature algorithms. 174 175Support for receiving the SSH2_MSG_EXT_INFO message during user 176authentication is signalled by the client including a 177"ext-info-in-auth@openssh.com" key via its initial SSH2_MSG_EXT_INFO 178set after the SSH2_MSG_NEWKEYS message. 179 180A server that supports this extension MAY send a second 181SSH2_MSG_EXT_INFO message any time after the client's first 182SSH2_MSG_USERAUTH_REQUEST, regardless of whether it succeed or fails. 183The client SHOULD be prepared to update the server-sig-algs that 184it received during an earlier SSH2_MSG_EXT_INFO with the later one. 185 1862. Connection protocol changes 187 1882.1. connection: Channel write close extension "eow@openssh.com" 189 190The SSH connection protocol (rfc4254) provides the SSH_MSG_CHANNEL_EOF 191message to allow an endpoint to signal its peer that it will send no 192more data over a channel. Unfortunately, there is no symmetric way for 193an endpoint to request that its peer should cease sending data to it 194while still keeping the channel open for the endpoint to send data to 195the peer. 196 197This is desirable, since it saves the transmission of data that would 198otherwise need to be discarded and it allows an endpoint to signal local 199processes of the condition, e.g. by closing the corresponding file 200descriptor. 201 202OpenSSH implements a channel extension message to perform this 203signalling: "eow@openssh.com" (End Of Write). This message is sent by 204an endpoint when the local output of a session channel is closed or 205experiences a write error. The message is formatted as follows: 206 207 byte SSH_MSG_CHANNEL_REQUEST 208 uint32 recipient channel 209 string "eow@openssh.com" 210 boolean FALSE 211 212On receiving this message, the peer SHOULD cease sending data of 213the channel and MAY signal the process from which the channel data 214originates (e.g. by closing its read file descriptor). 215 216As with the symmetric SSH_MSG_CHANNEL_EOF message, the channel does 217remain open after a "eow@openssh.com" has been sent and more data may 218still be sent in the other direction. This message does not consume 219window space and may be sent even if no window space is available. 220 221NB. due to certain broken SSH implementations aborting upon receipt 222of this message (in contravention of RFC4254 section 5.4), this 223message is only sent to OpenSSH peers (identified by banner). 224Other SSH implementations may be listed to receive this message 225upon request. 226 2272.2. connection: disallow additional sessions extension 228 "no-more-sessions@openssh.com" 229 230Most SSH connections will only ever request a single session, but a 231attacker may abuse a running ssh client to surreptitiously open 232additional sessions under their control. OpenSSH provides a global 233request "no-more-sessions@openssh.com" to mitigate this attack. 234 235When an OpenSSH client expects that it will never open another session 236(i.e. it has been started with connection multiplexing disabled), it 237will send the following global request: 238 239 byte SSH_MSG_GLOBAL_REQUEST 240 string "no-more-sessions@openssh.com" 241 char want-reply 242 243On receipt of such a message, an OpenSSH server will refuse to open 244future channels of type "session" and instead immediately abort the 245connection. 246 247Note that this is not a general defence against compromised clients 248(that is impossible), but it thwarts a simple attack. 249 250NB. due to certain broken SSH implementations aborting upon receipt 251of this message, the no-more-sessions request is only sent to OpenSSH 252servers (identified by banner). Other SSH implementations may be 253listed to receive this message upon request. 254 2552.3. connection: Tunnel forward extension "tun@openssh.com" 256 257OpenSSH supports layer 2 and layer 3 tunnelling via the "tun@openssh.com" 258channel type. This channel type supports forwarding of network packets 259with datagram boundaries intact between endpoints equipped with 260interfaces like the BSD tun(4) device. Tunnel forwarding channels are 261requested by the client with the following packet: 262 263 byte SSH_MSG_CHANNEL_OPEN 264 string "tun@openssh.com" 265 uint32 sender channel 266 uint32 initial window size 267 uint32 maximum packet size 268 uint32 tunnel mode 269 uint32 remote unit number 270 271The "tunnel mode" parameter specifies whether the tunnel should forward 272layer 2 frames or layer 3 packets. It may take one of the following values: 273 274 SSH_TUNMODE_POINTOPOINT 1 /* layer 3 packets */ 275 SSH_TUNMODE_ETHERNET 2 /* layer 2 frames */ 276 277The "tunnel unit number" specifies the remote interface number, or may 278be 0x7fffffff to allow the server to automatically choose an interface. A 279server that is not willing to open a client-specified unit should refuse 280the request with a SSH_MSG_CHANNEL_OPEN_FAILURE error. On successful 281open, the server should reply with SSH_MSG_CHANNEL_OPEN_SUCCESS. 282 283Once established the client and server may exchange packet or frames 284over the tunnel channel by encapsulating them in SSH protocol strings 285and sending them as channel data. This ensures that packet boundaries 286are kept intact. Specifically, packets are transmitted using normal 287SSH_MSG_CHANNEL_DATA packets: 288 289 byte SSH_MSG_CHANNEL_DATA 290 uint32 recipient channel 291 string data 292 293The contents of the "data" field for layer 3 packets is: 294 295 uint32 packet length 296 uint32 address family 297 byte[packet length - 4] packet data 298 299The "address family" field identifies the type of packet in the message. 300It may be one of: 301 302 SSH_TUN_AF_INET 2 /* IPv4 */ 303 SSH_TUN_AF_INET6 24 /* IPv6 */ 304 305The "packet data" field consists of the IPv4/IPv6 datagram itself 306without any link layer header. 307 308The contents of the "data" field for layer 2 packets is: 309 310 uint32 packet length 311 byte[packet length] frame 312 313The "frame" field contains an IEEE 802.3 Ethernet frame, including 314header. 315 3162.4. connection: Unix domain socket forwarding 317 318OpenSSH supports local and remote Unix domain socket forwarding 319using the "streamlocal" extension. Forwarding is initiated as per 320TCP sockets but with a single path instead of a host and port. 321 322Similar to direct-tcpip, direct-streamlocal is sent by the client 323to request that the server make a connection to a Unix domain socket. 324 325 byte SSH_MSG_CHANNEL_OPEN 326 string "direct-streamlocal@openssh.com" 327 uint32 sender channel 328 uint32 initial window size 329 uint32 maximum packet size 330 string socket path 331 string reserved 332 uint32 reserved 333 334Similar to forwarded-tcpip, forwarded-streamlocal is sent by the 335server when the client has previously send the server a streamlocal-forward 336GLOBAL_REQUEST. 337 338 byte SSH_MSG_CHANNEL_OPEN 339 string "forwarded-streamlocal@openssh.com" 340 uint32 sender channel 341 uint32 initial window size 342 uint32 maximum packet size 343 string socket path 344 string reserved for future use 345 346The reserved field is not currently defined and is ignored on the 347remote end. It is intended to be used in the future to pass 348information about the socket file, such as ownership and mode. 349The client currently sends the empty string for this field. 350 351Similar to tcpip-forward, streamlocal-forward is sent by the client 352to request remote forwarding of a Unix domain socket. 353 354 byte SSH2_MSG_GLOBAL_REQUEST 355 string "streamlocal-forward@openssh.com" 356 boolean TRUE 357 string socket path 358 359Similar to cancel-tcpip-forward, cancel-streamlocal-forward is sent 360by the client cancel the forwarding of a Unix domain socket. 361 362 byte SSH2_MSG_GLOBAL_REQUEST 363 string "cancel-streamlocal-forward@openssh.com" 364 boolean FALSE 365 string socket path 366 3672.5. connection: hostkey update and rotation "hostkeys-00@openssh.com" 368and "hostkeys-prove-00@openssh.com" 369 370OpenSSH supports a protocol extension allowing a server to inform 371a client of all its protocol v.2 host keys after user-authentication 372has completed. 373 374 byte SSH_MSG_GLOBAL_REQUEST 375 string "hostkeys-00@openssh.com" 376 char 0 /* want-reply */ 377 string[] hostkeys 378 379Upon receiving this message, a client should check which of the 380supplied host keys are present in known_hosts. 381 382Note that the server may send key types that the client does not 383support. The client should disregard such keys if they are received. 384 385If the client identifies any keys that are not present for the host, 386it should send a "hostkeys-prove@openssh.com" message to request the 387server prove ownership of the private half of the key. 388 389 byte SSH_MSG_GLOBAL_REQUEST 390 string "hostkeys-prove-00@openssh.com" 391 char 1 /* want-reply */ 392 string[] hostkeys 393 394When a server receives this message, it should generate a signature 395using each requested key over the following: 396 397 string "hostkeys-prove-00@openssh.com" 398 string session identifier 399 string hostkey 400 401These signatures should be included in the reply, in the order matching 402the hostkeys in the request: 403 404 byte SSH_MSG_REQUEST_SUCCESS 405 string[] signatures 406 407When the client receives this reply (and not a failure), it should 408validate the signatures and may update its known_hosts file, adding keys 409that it has not seen before and deleting keys for the server host that 410are no longer offered. 411 412These extensions let a client learn key types that it had not previously 413encountered, thereby allowing it to potentially upgrade from weaker 414key algorithms to better ones. It also supports graceful key rotation: 415a server may offer multiple keys of the same type for a period (to 416give clients an opportunity to learn them using this extension) before 417removing the deprecated key from those offered. 418 4192.6. connection: SIGINFO support for "signal" channel request 420 421The SSH channels protocol (RFC4254 section 6.9) supports sending a 422signal to a session attached to a channel. OpenSSH supports one 423extension signal "INFO@openssh.com" that allows sending SIGINFO on 424BSD-derived systems. 425 4263. Authentication protocol changes 427 4283.1. Host-bound public key authentication 429 430This is trivial change to the traditional "publickey" authentication 431method. The authentication request is identical to the original method 432but for the name and one additional field: 433 434 byte SSH2_MSG_USERAUTH_REQUEST 435 string username 436 string "ssh-connection" 437 string "publickey-hostbound-v00@openssh.com" 438 bool has_signature 439 string pkalg 440 string public key 441 string server host key 442 443Because the entire SSH2_MSG_USERAUTH_REQUEST message is included in 444the signed data, this ensures that a binding between the destination 445user, the server identity and the session identifier is visible to the 446signer. OpenSSH uses this binding via signed data to implement per-key 447restrictions in ssh-agent. 448 449A server may advertise this method using the SSH2_MSG_EXT_INFO 450mechanism (RFC8308), with the following message: 451 452 string "publickey-hostbound@openssh.com" 453 string "0" (version) 454 455Clients should prefer host-bound authentication when advertised by 456server. 457 4584. SFTP protocol changes 459 4604.1. sftp: Reversal of arguments to SSH_FXP_SYMLINK 461 462When OpenSSH's sftp-server was implemented, the order of the arguments 463to the SSH_FXP_SYMLINK method was inadvertently reversed. Unfortunately, 464the reversal was not noticed until the server was widely deployed. Since 465fixing this to follow the specification would cause incompatibility, the 466current order was retained. For correct operation, clients should send 467SSH_FXP_SYMLINK as follows: 468 469 uint32 id 470 string targetpath 471 string linkpath 472 4734.2. sftp: Server extension announcement in SSH_FXP_VERSION 474 475OpenSSH's sftp-server lists the extensions it supports using the 476standard extension announcement mechanism in the SSH_FXP_VERSION server 477hello packet: 478 479 uint32 3 /* protocol version */ 480 string ext1-name 481 string ext1-version 482 string ext2-name 483 string ext2-version 484 ... 485 string extN-name 486 string extN-version 487 488Each extension reports its integer version number as an ASCII encoded 489string, e.g. "1". The version will be incremented if the extension is 490ever changed in an incompatible way. The server MAY advertise the same 491extension with multiple versions (though this is unlikely). Clients MUST 492check the version number before attempting to use the extension. 493 4944.3. sftp: Extension request "posix-rename@openssh.com" 495 496This operation provides a rename operation with POSIX semantics, which 497are different to those provided by the standard SSH_FXP_RENAME in 498draft-ietf-secsh-filexfer-02.txt. This request is implemented as a 499SSH_FXP_EXTENDED request with the following format: 500 501 uint32 id 502 string "posix-rename@openssh.com" 503 string oldpath 504 string newpath 505 506On receiving this request the server will perform the POSIX operation 507rename(oldpath, newpath) and will respond with a SSH_FXP_STATUS message. 508This extension is advertised in the SSH_FXP_VERSION hello with version 509"1". 510 5114.4. sftp: Extension requests "statvfs@openssh.com" and 512 "fstatvfs@openssh.com" 513 514These requests correspond to the statvfs and fstatvfs POSIX system 515interfaces. The "statvfs@openssh.com" request operates on an explicit 516pathname, and is formatted as follows: 517 518 uint32 id 519 string "statvfs@openssh.com" 520 string path 521 522The "fstatvfs@openssh.com" operates on an open file handle: 523 524 uint32 id 525 string "fstatvfs@openssh.com" 526 string handle 527 528These requests return a SSH_FXP_STATUS reply on failure. On success they 529return the following SSH_FXP_EXTENDED_REPLY reply: 530 531 uint32 id 532 uint64 f_bsize /* file system block size */ 533 uint64 f_frsize /* fundamental fs block size */ 534 uint64 f_blocks /* number of blocks (unit f_frsize) */ 535 uint64 f_bfree /* free blocks in file system */ 536 uint64 f_bavail /* free blocks for non-root */ 537 uint64 f_files /* total file inodes */ 538 uint64 f_ffree /* free file inodes */ 539 uint64 f_favail /* free file inodes for to non-root */ 540 uint64 f_fsid /* file system id */ 541 uint64 f_flag /* bit mask of f_flag values */ 542 uint64 f_namemax /* maximum filename length */ 543 544The values of the f_flag bitmask are as follows: 545 546 #define SSH_FXE_STATVFS_ST_RDONLY 0x1 /* read-only */ 547 #define SSH_FXE_STATVFS_ST_NOSUID 0x2 /* no setuid */ 548 549Both the "statvfs@openssh.com" and "fstatvfs@openssh.com" extensions are 550advertised in the SSH_FXP_VERSION hello with version "2". 551 5524.5. sftp: Extension request "hardlink@openssh.com" 553 554This request is for creating a hard link to a regular file. This 555request is implemented as a SSH_FXP_EXTENDED request with the 556following format: 557 558 uint32 id 559 string "hardlink@openssh.com" 560 string oldpath 561 string newpath 562 563On receiving this request the server will perform the operation 564link(oldpath, newpath) and will respond with a SSH_FXP_STATUS message. 565This extension is advertised in the SSH_FXP_VERSION hello with version 566"1". 567 5684.6. sftp: Extension request "fsync@openssh.com" 569 570This request asks the server to call fsync(2) on an open file handle. 571 572 uint32 id 573 string "fsync@openssh.com" 574 string handle 575 576On receiving this request, a server will call fsync(handle_fd) and will 577respond with a SSH_FXP_STATUS message. 578 579This extension is advertised in the SSH_FXP_VERSION hello with version 580"1". 581 5824.7. sftp: Extension request "lsetstat@openssh.com" 583 584This request is like the "setstat" command, but sets file attributes on 585symlinks. It is implemented as a SSH_FXP_EXTENDED request with the 586following format: 587 588 uint32 id 589 string "lsetstat@openssh.com" 590 string path 591 ATTRS attrs 592 593See the "setstat" command for more details. 594 595This extension is advertised in the SSH_FXP_VERSION hello with version 596"1". 597 5984.8. sftp: Extension request "limits@openssh.com" 599 600This request is used to determine various limits the server might impose. 601Clients should not attempt to exceed these limits as the server might sever 602the connection immediately. 603 604 uint32 id 605 string "limits@openssh.com" 606 607The server will respond with a SSH_FXP_EXTENDED_REPLY reply: 608 609 uint32 id 610 uint64 max-packet-length 611 uint64 max-read-length 612 uint64 max-write-length 613 uint64 max-open-handles 614 615The 'max-packet-length' applies to the total number of bytes in a 616single SFTP packet. Servers SHOULD set this at least to 34000. 617 618The 'max-read-length' is the largest length in a SSH_FXP_READ packet. 619Even if the client requests a larger size, servers will usually respond 620with a shorter SSH_FXP_DATA packet. Servers SHOULD set this at least to 62132768. 622 623The 'max-write-length' is the largest length in a SSH_FXP_WRITE packet 624the server will accept. Servers SHOULD set this at least to 32768. 625 626The 'max-open-handles' is the maximum number of active handles that the 627server allows (e.g. handles created by SSH_FXP_OPEN and SSH_FXP_OPENDIR 628packets). Servers MAY count internal file handles against this limit 629(e.g. system logging or stdout/stderr), so clients SHOULD NOT expect to 630open this many handles in practice. 631 632If the server doesn't enforce a specific limit, then the field may be 633set to 0. This implies the server relies on the OS to enforce limits 634(e.g. available memory or file handles), and such limits might be 635dynamic. The client SHOULD take care to not try to exceed reasonable 636limits. 637 638This extension is advertised in the SSH_FXP_VERSION hello with version 639"1". 640 6414.9. sftp: Extension request "expand-path@openssh.com" 642 643This request supports canonicalisation of relative paths and 644those that need tilde-expansion, i.e. "~", "~/..." and "~user/..." 645These paths are expanded using shell-like rules and the resultant 646path is canonicalised similarly to SSH2_FXP_REALPATH. 647 648It is implemented as a SSH_FXP_EXTENDED request with the following 649format: 650 651 uint32 id 652 string "expand-path@openssh.com" 653 string path 654 655Its reply is the same format as that of SSH2_FXP_REALPATH. 656 657This extension is advertised in the SSH_FXP_VERSION hello with version 658"1". 659 6604.10. sftp: Extension request "copy-data" 661 662This request asks the server to copy data from one open file handle and 663write it to a different open file handle. This avoids needing to transfer 664the data across the network twice (a download followed by an upload). 665 666 byte SSH_FXP_EXTENDED 667 uint32 id 668 string "copy-data" 669 string read-from-handle 670 uint64 read-from-offset 671 uint64 read-data-length 672 string write-to-handle 673 uint64 write-to-offset 674 675The server will copy read-data-length bytes starting from 676read-from-offset from the read-from-handle and write them to 677write-to-handle starting from write-to-offset, and then respond with a 678SSH_FXP_STATUS message. 679 680It's equivalent to issuing a series of SSH_FXP_READ requests on 681read-from-handle and a series of requests of SSH_FXP_WRITE on 682write-to-handle. 683 684If read-from-handle and write-to-handle are the same, the server will 685fail the request and respond with a SSH_FX_INVALID_PARAMETER message. 686 687If read-data-length is 0, then the server will read data from the 688read-from-handle until EOF is reached. 689 690This extension is advertised in the SSH_FXP_VERSION hello with version 691"1". 692 693This request is identical to the "copy-data" request documented in: 694 695https://tools.ietf.org/html/draft-ietf-secsh-filexfer-extensions-00#section-7 696 6974.11. sftp: Extension request "home-directory" 698 699This request asks the server to expand the specified user's home directory. 700An empty username implies the current user. This can be used by the client 701to expand ~/ type paths locally. 702 703 byte SSH_FXP_EXTENDED 704 uint32 id 705 string "home-directory" 706 string username 707 708This extension is advertised in the SSH_FXP_VERSION hello with version 709"1". 710 711This provides similar information as the "expand-path@openssh.com" extension. 712 713This request is identical to the "home-directory" request documented in: 714 715https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-extensions-00#section-5 716 7174.12. sftp: Extension request "users-groups-by-id@openssh.com" 718 719This request asks the server to return user and/or group names that 720correspond to one or more IDs (e.g. as returned from a SSH_FXP_STAT 721request). This may be used by the client to provide usernames in 722directory listings. 723 724 byte SSH_FXP_EXTENDED 725 uint32 id 726 string "users-groups-by-id@openssh.com" 727 string uids 728 string gids 729 730Where "uids" and "gids" consists of one or more integer user or group 731identifiers: 732 733 uint32 id-0 734 ... 735 736The server will reply with a SSH_FXP_EXTENDED_REPLY: 737 738 byte SSH_FXP_EXTENDED_REPLY 739 uint32 id 740 string usernames 741 string groupnames 742 743Where "username" and "groupnames" consists of names in identical request 744order to "uids" and "gids" respectively: 745 746 string name-0 747 ... 748 749If a name cannot be identified for a given user or group ID, an empty 750string will be returned in its place. 751 752It is acceptable for either "uids" or "gids" to be an empty set, in 753which case the respective "usernames" or "groupnames" list will also 754be empty. 755 756This extension is advertised in the SSH_FXP_VERSION hello with version 757"1". 758 7595. Miscellaneous changes 760 7615.1 Public key format 762 763OpenSSH public keys, as generated by ssh-keygen(1) and appearing in 764authorized_keys files, are formatted as a single line of text consisting 765of the public key algorithm name followed by a base64-encoded key blob. 766The public key blob (before base64 encoding) is the same format used for 767the encoding of public keys sent on the wire: as described in RFC4253 768section 6.6 for RSA and DSA keys, RFC5656 section 3.1 for ECDSA keys 769and the "New public key formats" section of PROTOCOL.certkeys for the 770OpenSSH certificate formats. 771 7725.2 Private key format 773 774OpenSSH private keys, as generated by ssh-keygen(1) use the format 775described in PROTOCOL.key by default. As a legacy option, PEM format 776(RFC7468) private keys are also supported for RSA, DSA and ECDSA keys 777and were the default format before OpenSSH 7.8. 778 7795.3 KRL format 780 781OpenSSH supports a compact format for Key Revocation Lists (KRLs). This 782format is described in the PROTOCOL.krl file. 783 7845.4 Connection multiplexing 785 786OpenSSH's connection multiplexing uses messages as described in 787PROTOCOL.mux over a Unix domain socket for communications between a 788master instance and later clients. 789 7905.5. Agent protocol extensions 791 792OpenSSH extends the usual agent protocol. These changes are documented 793in the PROTOCOL.agent file. 794 795$OpenBSD: PROTOCOL,v 1.55 2024/01/08 05:05:15 djm Exp $ 796