'Called when we receive a MSG_KEXINIT message.  Payload::
bytes[16] cookie
string keyExchangeAlgorithms
string keyAlgorithms
string incomingEncryptions
string outgoingEncryptions
string incomingAuthentications
string outgoingAuthentications
string incomingCompressions
string outgoingCompressions
string incomingLanguages
string outgoingLanguages
bool firstPacketFollows
unit32 0 (reserved)
Starts setting up the key exchange, keys, encryptions, and
authentications.  Extended by ssh_KEXINIT in SSHServerTransport and
SSHClientTransport.
@type packet: L{bytes}
@param packet: The message data.
@return: A L{tuple} of negotiated key exchange algorithms, key
algorithms, and unhandled data, or L{None} if something went wrong.'

def ssh_KEXINIT(self, packet):

    self.otherKexInitPayload = (chr(MSG_KEXINIT) + packet)
    k = getNS(packet[16:], 10)
    (strings, rest) = (k[:(-1)], k[(-1)])
    (kexAlgs, keyAlgs, encCS, encSC, macCS, macSC, compCS, compSC, langCS, langSC) = [s.split(',') for s in strings]
    outs = [encSC, macSC, compSC]
    ins = [encCS, macSC, compCS]
    if self.isClient:
        (outs, ins) = (ins, outs)
    server = (self.supportedKeyExchanges, self.supportedPublicKeys, self.supportedCiphers, self.supportedCiphers, self.supportedMACs, self.supportedMACs, self.supportedCompressions, self.supportedCompressions)
    client = (kexAlgs, keyAlgs, outs[0], ins[0], outs[1], ins[1], outs[2], ins[2])
    if self.isClient:
        (server, client) = (client, server)
    self.kexAlg = ffs(client[0], server[0])
    self.keyAlg = ffs(client[1], server[1])
    self.nextEncryptions = SSHCiphers(ffs(client[2], server[2]), ffs(client[3], server[3]), ffs(client[4], server[4]), ffs(client[5], server[5]))
    self.outgoingCompressionType = ffs(client[6], server[6])
    self.incomingCompressionType = ffs(client[7], server[7])
    if (None in (self.kexAlg, self.keyAlg, self.outgoingCompressionType, self.incomingCompressionType)):
        self.sendDisconnect(DISCONNECT_KEY_EXCHANGE_FAILED, "couldn't    match    all    kex    parts")
        return
    if (None in self.nextEncryptions.__dict__.values()):
        self.sendDisconnect(DISCONNECT_KEY_EXCHANGE_FAILED, "couldn't    match    all    kex    parts")
        return
    log.msg(('kex    alg,    key    alg:    %r    %r' % (self.kexAlg, self.keyAlg)))
    log.msg(('outgoing:    %r    %r    %r' % (self.nextEncryptions.outCipType, self.nextEncryptions.outMACType, self.outgoingCompressionType)))
    log.msg(('incoming:    %r    %r    %r' % (self.nextEncryptions.inCipType, self.nextEncryptions.inMACType, self.incomingCompressionType)))
    if (self._keyExchangeState == self._KEY_EXCHANGE_REQUESTED):
        self._keyExchangeState = self._KEY_EXCHANGE_PROGRESSING
    else:
        self.sendKexInit()
    return (kexAlgs, keyAlgs, rest)
