handshake.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. // Copyright 2013 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package ssh
  5. import (
  6. "crypto/rand"
  7. "errors"
  8. "fmt"
  9. "io"
  10. "log"
  11. "net"
  12. "sync"
  13. // [Psiphon]
  14. "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/prng"
  15. )
  16. // debugHandshake, if set, prints messages sent and received. Key
  17. // exchange messages are printed as if DH were used, so the debug
  18. // messages are wrong when using ECDH.
  19. const debugHandshake = false
  20. // chanSize sets the amount of buffering SSH connections. This is
  21. // primarily for testing: setting chanSize=0 uncovers deadlocks more
  22. // quickly.
  23. const chanSize = 16
  24. // keyingTransport is a packet based transport that supports key
  25. // changes. It need not be thread-safe. It should pass through
  26. // msgNewKeys in both directions.
  27. type keyingTransport interface {
  28. packetConn
  29. // prepareKeyChange sets up a key change. The key change for a
  30. // direction will be effected if a msgNewKeys message is sent
  31. // or received.
  32. prepareKeyChange(*algorithms, *kexResult) error
  33. }
  34. // handshakeTransport implements rekeying on top of a keyingTransport
  35. // and offers a thread-safe writePacket() interface.
  36. type handshakeTransport struct {
  37. conn keyingTransport
  38. config *Config
  39. serverVersion []byte
  40. clientVersion []byte
  41. // hostKeys is non-empty if we are the server. In that case,
  42. // it contains all host keys that can be used to sign the
  43. // connection.
  44. hostKeys []Signer
  45. // hostKeyAlgorithms is non-empty if we are the client. In that case,
  46. // we accept these key types from the server as host key.
  47. hostKeyAlgorithms []string
  48. // On read error, incoming is closed, and readError is set.
  49. incoming chan []byte
  50. readError error
  51. mu sync.Mutex
  52. writeError error
  53. sentInitPacket []byte
  54. sentInitMsg *kexInitMsg
  55. pendingPackets [][]byte // Used when a key exchange is in progress.
  56. // If the read loop wants to schedule a kex, it pings this
  57. // channel, and the write loop will send out a kex
  58. // message.
  59. requestKex chan struct{}
  60. // If the other side requests or confirms a kex, its kexInit
  61. // packet is sent here for the write loop to find it.
  62. startKex chan *pendingKex
  63. // data for host key checking
  64. hostKeyCallback HostKeyCallback
  65. dialAddress string
  66. remoteAddr net.Addr
  67. // bannerCallback is non-empty if we are the client and it has been set in
  68. // ClientConfig. In that case it is called during the user authentication
  69. // dance to handle a custom server's message.
  70. bannerCallback BannerCallback
  71. // Algorithms agreed in the last key exchange.
  72. algorithms *algorithms
  73. readPacketsLeft uint32
  74. readBytesLeft int64
  75. writePacketsLeft uint32
  76. writeBytesLeft int64
  77. // The session ID or nil if first kex did not complete yet.
  78. sessionID []byte
  79. }
  80. type pendingKex struct {
  81. otherInit []byte
  82. done chan error
  83. }
  84. func newHandshakeTransport(conn keyingTransport, config *Config, clientVersion, serverVersion []byte) *handshakeTransport {
  85. t := &handshakeTransport{
  86. conn: conn,
  87. serverVersion: serverVersion,
  88. clientVersion: clientVersion,
  89. incoming: make(chan []byte, chanSize),
  90. requestKex: make(chan struct{}, 1),
  91. startKex: make(chan *pendingKex, 1),
  92. config: config,
  93. }
  94. t.resetReadThresholds()
  95. t.resetWriteThresholds()
  96. // We always start with a mandatory key exchange.
  97. t.requestKex <- struct{}{}
  98. return t
  99. }
  100. func newClientTransport(conn keyingTransport, clientVersion, serverVersion []byte, config *ClientConfig, dialAddr string, addr net.Addr) *handshakeTransport {
  101. t := newHandshakeTransport(conn, &config.Config, clientVersion, serverVersion)
  102. t.dialAddress = dialAddr
  103. t.remoteAddr = addr
  104. t.hostKeyCallback = config.HostKeyCallback
  105. t.bannerCallback = config.BannerCallback
  106. if config.HostKeyAlgorithms != nil {
  107. t.hostKeyAlgorithms = config.HostKeyAlgorithms
  108. } else {
  109. t.hostKeyAlgorithms = supportedHostKeyAlgos
  110. }
  111. go t.readLoop()
  112. go t.kexLoop()
  113. return t
  114. }
  115. func newServerTransport(conn keyingTransport, clientVersion, serverVersion []byte, config *ServerConfig) *handshakeTransport {
  116. t := newHandshakeTransport(conn, &config.Config, clientVersion, serverVersion)
  117. t.hostKeys = config.hostKeys
  118. go t.readLoop()
  119. go t.kexLoop()
  120. return t
  121. }
  122. func (t *handshakeTransport) getSessionID() []byte {
  123. return t.sessionID
  124. }
  125. // waitSession waits for the session to be established. This should be
  126. // the first thing to call after instantiating handshakeTransport.
  127. func (t *handshakeTransport) waitSession() error {
  128. p, err := t.readPacket()
  129. if err != nil {
  130. return err
  131. }
  132. if p[0] != msgNewKeys {
  133. return fmt.Errorf("ssh: first packet should be msgNewKeys")
  134. }
  135. return nil
  136. }
  137. func (t *handshakeTransport) id() string {
  138. if len(t.hostKeys) > 0 {
  139. return "server"
  140. }
  141. return "client"
  142. }
  143. func (t *handshakeTransport) printPacket(p []byte, write bool) {
  144. action := "got"
  145. if write {
  146. action = "sent"
  147. }
  148. if p[0] == msgChannelData || p[0] == msgChannelExtendedData {
  149. log.Printf("%s %s data (packet %d bytes)", t.id(), action, len(p))
  150. } else {
  151. msg, err := decode(p)
  152. log.Printf("%s %s %T %v (%v)", t.id(), action, msg, msg, err)
  153. }
  154. }
  155. func (t *handshakeTransport) readPacket() ([]byte, error) {
  156. p, ok := <-t.incoming
  157. if !ok {
  158. return nil, t.readError
  159. }
  160. return p, nil
  161. }
  162. func (t *handshakeTransport) readLoop() {
  163. first := true
  164. for {
  165. p, err := t.readOnePacket(first)
  166. first = false
  167. if err != nil {
  168. t.readError = err
  169. close(t.incoming)
  170. break
  171. }
  172. if p[0] == msgIgnore || p[0] == msgDebug {
  173. continue
  174. }
  175. t.incoming <- p
  176. }
  177. // Stop writers too.
  178. t.recordWriteError(t.readError)
  179. // Unblock the writer should it wait for this.
  180. close(t.startKex)
  181. // Don't close t.requestKex; it's also written to from writePacket.
  182. }
  183. func (t *handshakeTransport) pushPacket(p []byte) error {
  184. if debugHandshake {
  185. t.printPacket(p, true)
  186. }
  187. return t.conn.writePacket(p)
  188. }
  189. func (t *handshakeTransport) getWriteError() error {
  190. t.mu.Lock()
  191. defer t.mu.Unlock()
  192. return t.writeError
  193. }
  194. func (t *handshakeTransport) recordWriteError(err error) {
  195. t.mu.Lock()
  196. defer t.mu.Unlock()
  197. if t.writeError == nil && err != nil {
  198. t.writeError = err
  199. }
  200. }
  201. func (t *handshakeTransport) requestKeyExchange() {
  202. select {
  203. case t.requestKex <- struct{}{}:
  204. default:
  205. // something already requested a kex, so do nothing.
  206. }
  207. }
  208. func (t *handshakeTransport) resetWriteThresholds() {
  209. t.writePacketsLeft = packetRekeyThreshold
  210. if t.config.RekeyThreshold > 0 {
  211. t.writeBytesLeft = int64(t.config.RekeyThreshold)
  212. } else if t.algorithms != nil {
  213. t.writeBytesLeft = t.algorithms.w.rekeyBytes()
  214. } else {
  215. t.writeBytesLeft = 1 << 30
  216. }
  217. }
  218. func (t *handshakeTransport) kexLoop() {
  219. write:
  220. for t.getWriteError() == nil {
  221. var request *pendingKex
  222. var sent bool
  223. for request == nil || !sent {
  224. var ok bool
  225. select {
  226. case request, ok = <-t.startKex:
  227. if !ok {
  228. break write
  229. }
  230. case <-t.requestKex:
  231. break
  232. }
  233. if !sent {
  234. if err := t.sendKexInit(); err != nil {
  235. t.recordWriteError(err)
  236. break
  237. }
  238. sent = true
  239. }
  240. }
  241. if err := t.getWriteError(); err != nil {
  242. if request != nil {
  243. request.done <- err
  244. }
  245. break
  246. }
  247. // We're not servicing t.requestKex, but that is OK:
  248. // we never block on sending to t.requestKex.
  249. // We're not servicing t.startKex, but the remote end
  250. // has just sent us a kexInitMsg, so it can't send
  251. // another key change request, until we close the done
  252. // channel on the pendingKex request.
  253. err := t.enterKeyExchange(request.otherInit)
  254. t.mu.Lock()
  255. t.writeError = err
  256. t.sentInitPacket = nil
  257. t.sentInitMsg = nil
  258. t.resetWriteThresholds()
  259. // we have completed the key exchange. Since the
  260. // reader is still blocked, it is safe to clear out
  261. // the requestKex channel. This avoids the situation
  262. // where: 1) we consumed our own request for the
  263. // initial kex, and 2) the kex from the remote side
  264. // caused another send on the requestKex channel,
  265. clear:
  266. for {
  267. select {
  268. case <-t.requestKex:
  269. //
  270. default:
  271. break clear
  272. }
  273. }
  274. request.done <- t.writeError
  275. // kex finished. Push packets that we received while
  276. // the kex was in progress. Don't look at t.startKex
  277. // and don't increment writtenSinceKex: if we trigger
  278. // another kex while we are still busy with the last
  279. // one, things will become very confusing.
  280. for _, p := range t.pendingPackets {
  281. t.writeError = t.pushPacket(p)
  282. if t.writeError != nil {
  283. break
  284. }
  285. }
  286. t.pendingPackets = t.pendingPackets[:0]
  287. t.mu.Unlock()
  288. }
  289. // drain startKex channel. We don't service t.requestKex
  290. // because nobody does blocking sends there.
  291. go func() {
  292. for init := range t.startKex {
  293. init.done <- t.writeError
  294. }
  295. }()
  296. // Unblock reader.
  297. t.conn.Close()
  298. }
  299. // The protocol uses uint32 for packet counters, so we can't let them
  300. // reach 1<<32. We will actually read and write more packets than
  301. // this, though: the other side may send more packets, and after we
  302. // hit this limit on writing we will send a few more packets for the
  303. // key exchange itself.
  304. const packetRekeyThreshold = (1 << 31)
  305. func (t *handshakeTransport) resetReadThresholds() {
  306. t.readPacketsLeft = packetRekeyThreshold
  307. if t.config.RekeyThreshold > 0 {
  308. t.readBytesLeft = int64(t.config.RekeyThreshold)
  309. } else if t.algorithms != nil {
  310. t.readBytesLeft = t.algorithms.r.rekeyBytes()
  311. } else {
  312. t.readBytesLeft = 1 << 30
  313. }
  314. }
  315. func (t *handshakeTransport) readOnePacket(first bool) ([]byte, error) {
  316. p, err := t.conn.readPacket()
  317. if err != nil {
  318. return nil, err
  319. }
  320. if t.readPacketsLeft > 0 {
  321. t.readPacketsLeft--
  322. } else {
  323. t.requestKeyExchange()
  324. }
  325. if t.readBytesLeft > 0 {
  326. t.readBytesLeft -= int64(len(p))
  327. } else {
  328. t.requestKeyExchange()
  329. }
  330. if debugHandshake {
  331. t.printPacket(p, false)
  332. }
  333. if first && p[0] != msgKexInit {
  334. return nil, fmt.Errorf("ssh: first packet should be msgKexInit")
  335. }
  336. if p[0] != msgKexInit {
  337. return p, nil
  338. }
  339. firstKex := t.sessionID == nil
  340. kex := pendingKex{
  341. done: make(chan error, 1),
  342. otherInit: p,
  343. }
  344. t.startKex <- &kex
  345. err = <-kex.done
  346. if debugHandshake {
  347. log.Printf("%s exited key exchange (first %v), err %v", t.id(), firstKex, err)
  348. }
  349. if err != nil {
  350. return nil, err
  351. }
  352. t.resetReadThresholds()
  353. // By default, a key exchange is hidden from higher layers by
  354. // translating it into msgIgnore.
  355. successPacket := []byte{msgIgnore}
  356. if firstKex {
  357. // sendKexInit() for the first kex waits for
  358. // msgNewKeys so the authentication process is
  359. // guaranteed to happen over an encrypted transport.
  360. successPacket = []byte{msgNewKeys}
  361. }
  362. return successPacket, nil
  363. }
  364. // sendKexInit sends a key change message.
  365. func (t *handshakeTransport) sendKexInit() error {
  366. t.mu.Lock()
  367. defer t.mu.Unlock()
  368. if t.sentInitMsg != nil {
  369. // kexInits may be sent either in response to the other side,
  370. // or because our side wants to initiate a key change, so we
  371. // may have already sent a kexInit. In that case, don't send a
  372. // second kexInit.
  373. return nil
  374. }
  375. msg := &kexInitMsg{
  376. KexAlgos: t.config.KeyExchanges,
  377. CiphersClientServer: t.config.Ciphers,
  378. CiphersServerClient: t.config.Ciphers,
  379. MACsClientServer: t.config.MACs,
  380. MACsServerClient: t.config.MACs,
  381. CompressionClientServer: supportedCompressions,
  382. CompressionServerClient: supportedCompressions,
  383. }
  384. io.ReadFull(rand.Reader, msg.Cookie[:])
  385. if len(t.hostKeys) > 0 {
  386. for _, k := range t.hostKeys {
  387. algo := k.PublicKey().Type()
  388. switch algo {
  389. case KeyAlgoRSA:
  390. msg.ServerHostKeyAlgos = append(msg.ServerHostKeyAlgos, []string{SigAlgoRSASHA2512, SigAlgoRSASHA2256, SigAlgoRSA}...)
  391. case CertAlgoRSAv01:
  392. msg.ServerHostKeyAlgos = append(msg.ServerHostKeyAlgos, []string{CertSigAlgoRSASHA2512v01, CertSigAlgoRSASHA2256v01, CertSigAlgoRSAv01}...)
  393. default:
  394. msg.ServerHostKeyAlgos = append(msg.ServerHostKeyAlgos, algo)
  395. }
  396. }
  397. } else {
  398. msg.ServerHostKeyAlgos = t.hostKeyAlgorithms
  399. }
  400. // [Psiphon]
  401. //
  402. // When KEXPRNGSeed is specified, randomize the KEX. The offered
  403. // algorithms are shuffled and truncated. Longer lists are selected with
  404. // higher probability.
  405. //
  406. // When PeerKEXPRNGSeed is specified, the peer is expected to randomize
  407. // its KEX using the specified seed; deterministically adjust own
  408. // randomized KEX to ensure negotiation succeeds.
  409. //
  410. // When NoEncryptThenMACHash is specified, do not use Encrypt-then-MAC has
  411. // algorithms.
  412. equal := func(list1, list2 []string) bool {
  413. if len(list1) != len(list2) {
  414. return false
  415. }
  416. for i, entry := range list1 {
  417. if list2[i] != entry {
  418. return false
  419. }
  420. }
  421. return true
  422. }
  423. // Psiphon transforms assume that default algorithms are configured.
  424. if (t.config.NoEncryptThenMACHash || t.config.KEXPRNGSeed != nil) &&
  425. (!equal(t.config.KeyExchanges, supportedKexAlgos) ||
  426. !equal(t.config.Ciphers, preferredCiphers) ||
  427. !equal(t.config.MACs, supportedMACs)) {
  428. return errors.New("ssh: custom algorithm preferences not supported")
  429. }
  430. // This is the list of supported non-Encrypt-then-MAC algorithms from
  431. // https://github.com/Psiphon-Labs/psiphon-tunnel-core/blob/3ef11effe6acd9
  432. // 2c3aefd140ee09c42a1f15630b/psiphon/common/crypto/ssh/common.go#L60
  433. //
  434. // With Encrypt-then-MAC hash algorithms, packet length is transmitted in
  435. // plaintext, which aids in traffic analysis.
  436. //
  437. // When using obfuscated SSH, where only the initial, unencrypted
  438. // packets are obfuscated, NoEncryptThenMACHash should be set.
  439. noEncryptThenMACs := []string{"hmac-sha2-256", "hmac-sha1", "hmac-sha1-96"}
  440. if t.config.NoEncryptThenMACHash {
  441. msg.MACsClientServer = noEncryptThenMACs
  442. msg.MACsServerClient = noEncryptThenMACs
  443. }
  444. if t.config.KEXPRNGSeed != nil {
  445. PRNG := prng.NewPRNGWithSeed(t.config.KEXPRNGSeed)
  446. permute := func(PRNG *prng.PRNG, list []string) []string {
  447. newList := make([]string, len(list))
  448. perm := PRNG.Perm(len(list))
  449. for i, j := range perm {
  450. newList[j] = list[i]
  451. }
  452. return newList
  453. }
  454. truncate := func(PRNG *prng.PRNG, list []string) []string {
  455. cut := len(list)
  456. for ; cut > 1; cut-- {
  457. if !PRNG.FlipCoin() {
  458. break
  459. }
  460. }
  461. return list[:cut]
  462. }
  463. retain := func(PRNG *prng.PRNG, list []string, item string) []string {
  464. for _, entry := range list {
  465. if entry == item {
  466. return list
  467. }
  468. }
  469. replace := PRNG.Intn(len(list))
  470. list[replace] = item
  471. return list
  472. }
  473. msg.KexAlgos = truncate(PRNG, permute(PRNG, msg.KexAlgos))
  474. ciphers := truncate(PRNG, permute(PRNG, msg.CiphersClientServer))
  475. msg.CiphersClientServer = ciphers
  476. msg.CiphersServerClient = ciphers
  477. MACs := truncate(PRNG, permute(PRNG, msg.MACsClientServer))
  478. msg.MACsClientServer = MACs
  479. msg.MACsServerClient = MACs
  480. if len(t.hostKeys) > 0 {
  481. msg.ServerHostKeyAlgos = permute(PRNG, msg.ServerHostKeyAlgos)
  482. } else {
  483. // Must offer KeyAlgoRSA to Psiphon server.
  484. msg.ServerHostKeyAlgos = retain(
  485. PRNG,
  486. truncate(PRNG, permute(PRNG, msg.ServerHostKeyAlgos)),
  487. KeyAlgoRSA)
  488. }
  489. if t.config.PeerKEXPRNGSeed != nil {
  490. // Generate the peer KEX and make adjustments if negotiation would
  491. // fail. This assumes that PeerKEXPRNGSeed remains static (in
  492. // Psiphon, the peer is the server and PeerKEXPRNGSeed is derived
  493. // from the server entry); and that the PRNG is invoked in the
  494. // exact same order on the peer (i.e., the code block immediately
  495. // above is what the peer runs); and that the peer sets
  496. // NoEncryptThenMACHash in the same cases.
  497. PeerPRNG := prng.NewPRNGWithSeed(t.config.PeerKEXPRNGSeed)
  498. peerKexAlgos := truncate(PeerPRNG, permute(PeerPRNG, supportedKexAlgos))
  499. if _, err := findCommon("", msg.KexAlgos, peerKexAlgos); err != nil {
  500. msg.KexAlgos = retain(PRNG, msg.KexAlgos, peerKexAlgos[0])
  501. }
  502. peerCiphers := truncate(PeerPRNG, permute(PeerPRNG, preferredCiphers))
  503. if _, err := findCommon("", ciphers, peerCiphers); err != nil {
  504. ciphers = retain(PRNG, ciphers, peerCiphers[0])
  505. msg.CiphersClientServer = ciphers
  506. msg.CiphersServerClient = ciphers
  507. }
  508. peerMACs := supportedMACs
  509. if t.config.NoEncryptThenMACHash {
  510. peerMACs = noEncryptThenMACs
  511. }
  512. peerMACs = truncate(PeerPRNG, permute(PeerPRNG, peerMACs))
  513. if _, err := findCommon("", MACs, peerMACs); err != nil {
  514. MACs = retain(PRNG, MACs, peerMACs[0])
  515. msg.MACsClientServer = MACs
  516. msg.MACsServerClient = MACs
  517. }
  518. }
  519. // Offer "zlib@openssh.com", which is offered by OpenSSH. Compression
  520. // is not actually implemented, but since "zlib@openssh.com"
  521. // compression is delayed until after authentication
  522. // (https://www.openssh.com/txt/draft-miller-secsh-compression-
  523. // delayed-00.txt), an unauthenticated probe of the SSH server will
  524. // not detect this. "none" is always included to ensure negotiation
  525. // succeeds.
  526. if PRNG.FlipCoin() {
  527. compressions := permute(PRNG, []string{"none", "zlib@openssh.com"})
  528. msg.CompressionClientServer = compressions
  529. msg.CompressionServerClient = compressions
  530. }
  531. }
  532. packet := Marshal(msg)
  533. // writePacket destroys the contents, so save a copy.
  534. packetCopy := make([]byte, len(packet))
  535. copy(packetCopy, packet)
  536. if err := t.pushPacket(packetCopy); err != nil {
  537. return err
  538. }
  539. t.sentInitMsg = msg
  540. t.sentInitPacket = packet
  541. return nil
  542. }
  543. func (t *handshakeTransport) writePacket(p []byte) error {
  544. switch p[0] {
  545. case msgKexInit:
  546. return errors.New("ssh: only handshakeTransport can send kexInit")
  547. case msgNewKeys:
  548. return errors.New("ssh: only handshakeTransport can send newKeys")
  549. }
  550. t.mu.Lock()
  551. defer t.mu.Unlock()
  552. if t.writeError != nil {
  553. return t.writeError
  554. }
  555. if t.sentInitMsg != nil {
  556. // Copy the packet so the writer can reuse the buffer.
  557. cp := make([]byte, len(p))
  558. copy(cp, p)
  559. t.pendingPackets = append(t.pendingPackets, cp)
  560. return nil
  561. }
  562. if t.writeBytesLeft > 0 {
  563. t.writeBytesLeft -= int64(len(p))
  564. } else {
  565. t.requestKeyExchange()
  566. }
  567. if t.writePacketsLeft > 0 {
  568. t.writePacketsLeft--
  569. } else {
  570. t.requestKeyExchange()
  571. }
  572. if err := t.pushPacket(p); err != nil {
  573. t.writeError = err
  574. }
  575. return nil
  576. }
  577. func (t *handshakeTransport) Close() error {
  578. return t.conn.Close()
  579. }
  580. func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error {
  581. if debugHandshake {
  582. log.Printf("%s entered key exchange", t.id())
  583. }
  584. otherInit := &kexInitMsg{}
  585. if err := Unmarshal(otherInitPacket, otherInit); err != nil {
  586. return err
  587. }
  588. magics := handshakeMagics{
  589. clientVersion: t.clientVersion,
  590. serverVersion: t.serverVersion,
  591. clientKexInit: otherInitPacket,
  592. serverKexInit: t.sentInitPacket,
  593. }
  594. clientInit := otherInit
  595. serverInit := t.sentInitMsg
  596. isClient := len(t.hostKeys) == 0
  597. if isClient {
  598. clientInit, serverInit = serverInit, clientInit
  599. magics.clientKexInit = t.sentInitPacket
  600. magics.serverKexInit = otherInitPacket
  601. }
  602. var err error
  603. t.algorithms, err = findAgreedAlgorithms(isClient, clientInit, serverInit)
  604. if err != nil {
  605. return err
  606. }
  607. // We don't send FirstKexFollows, but we handle receiving it.
  608. //
  609. // RFC 4253 section 7 defines the kex and the agreement method for
  610. // first_kex_packet_follows. It states that the guessed packet
  611. // should be ignored if the "kex algorithm and/or the host
  612. // key algorithm is guessed wrong (server and client have
  613. // different preferred algorithm), or if any of the other
  614. // algorithms cannot be agreed upon". The other algorithms have
  615. // already been checked above so the kex algorithm and host key
  616. // algorithm are checked here.
  617. if otherInit.FirstKexFollows && (clientInit.KexAlgos[0] != serverInit.KexAlgos[0] || clientInit.ServerHostKeyAlgos[0] != serverInit.ServerHostKeyAlgos[0]) {
  618. // other side sent a kex message for the wrong algorithm,
  619. // which we have to ignore.
  620. if _, err := t.conn.readPacket(); err != nil {
  621. return err
  622. }
  623. }
  624. kex, ok := kexAlgoMap[t.algorithms.kex]
  625. if !ok {
  626. return fmt.Errorf("ssh: unexpected key exchange algorithm %v", t.algorithms.kex)
  627. }
  628. var result *kexResult
  629. if len(t.hostKeys) > 0 {
  630. result, err = t.server(kex, t.algorithms, &magics)
  631. } else {
  632. result, err = t.client(kex, t.algorithms, &magics)
  633. }
  634. if err != nil {
  635. return err
  636. }
  637. if t.sessionID == nil {
  638. t.sessionID = result.H
  639. }
  640. result.SessionID = t.sessionID
  641. if err := t.conn.prepareKeyChange(t.algorithms, result); err != nil {
  642. return err
  643. }
  644. if err = t.conn.writePacket([]byte{msgNewKeys}); err != nil {
  645. return err
  646. }
  647. if packet, err := t.conn.readPacket(); err != nil {
  648. return err
  649. } else if packet[0] != msgNewKeys {
  650. return unexpectedMessageError(msgNewKeys, packet[0])
  651. }
  652. return nil
  653. }
  654. func (t *handshakeTransport) server(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) {
  655. var hostKey Signer
  656. for _, k := range t.hostKeys {
  657. kt := k.PublicKey().Type()
  658. if kt == algs.hostKey {
  659. hostKey = k
  660. } else if signer, ok := k.(AlgorithmSigner); ok {
  661. // Some signature algorithms don't show up as key types
  662. // so we have to manually check for a compatible host key.
  663. switch kt {
  664. case KeyAlgoRSA:
  665. if algs.hostKey == SigAlgoRSASHA2256 || algs.hostKey == SigAlgoRSASHA2512 {
  666. hostKey = &rsaSigner{signer, algs.hostKey}
  667. }
  668. case CertAlgoRSAv01:
  669. if algs.hostKey == CertSigAlgoRSASHA2256v01 || algs.hostKey == CertSigAlgoRSASHA2512v01 {
  670. hostKey = &rsaSigner{signer, certToPrivAlgo(algs.hostKey)}
  671. }
  672. }
  673. }
  674. }
  675. r, err := kex.Server(t.conn, t.config.Rand, magics, hostKey)
  676. return r, err
  677. }
  678. func (t *handshakeTransport) client(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) {
  679. result, err := kex.Client(t.conn, t.config.Rand, magics)
  680. if err != nil {
  681. return nil, err
  682. }
  683. hostKey, err := ParsePublicKey(result.HostKey)
  684. if err != nil {
  685. return nil, err
  686. }
  687. if err := verifyHostKeySignature(hostKey, algs.hostKey, result); err != nil {
  688. return nil, err
  689. }
  690. err = t.hostKeyCallback(t.dialAddress, t.remoteAddr, hostKey)
  691. if err != nil {
  692. return nil, err
  693. }
  694. return result, nil
  695. }