in Sources/NIOSSH/Key Exchange/SSHKeyExchangeStateMachine.swift [181:203]
mutating func send(keyExchange message: SSHMessage.KeyExchangeMessage) {
switch self.state {
case .idle:
self.state = .keyExchangeSent(message: message)
case .keyExchangeReceived(let exchanger, let negotiated, let expectingGuess):
switch self.role {
case .server:
// Ok, we're waiting for a key exchange init message.
if expectingGuess {
self.state = .awaitingKeyExchangeInitInvalidGuess(exchange: exchanger, negotiated: negotiated)
} else {
self.state = .awaitingKeyExchangeInit(exchange: exchanger, negotiated: negotiated)
}
case .client:
// We're going to send a key exchange init message.
self.state = .awaitingKeyExchangeInit(exchange: exchanger, negotiated: negotiated)
}
case .keyExchangeSent, .awaitingKeyExchangeInit, .awaitingKeyExchangeInitInvalidGuess, .keyExchangeInitReceived, .keyExchangeInitSent, .keysExchanged, .newKeysSent, .newKeysReceived, .complete:
// This is a precondition not a throw because we control the sending of this message.
preconditionFailure("Cannot send key exchange message after idle")
}
}