private void ProcessKEXINIT(DataFragment packet) { SSH2DataReader re = null; do { _serverKEXINITPayload = packet.ToNewArray(); re = new SSH2DataReader(_serverKEXINITPayload); byte[] head = re.Read(17); //Type and cookie PacketType pt = (PacketType)head[0]; if(pt==PacketType.SSH_MSG_KEXINIT) break; //successfully exit else if(pt==PacketType.SSH_MSG_IGNORE || pt==PacketType.SSH_MSG_DEBUG) { //continue packet = _connection.ReceivePacket(); } else throw new SSHException(String.Format("Server response is not SSH_MSG_KEXINIT but {0}", head[0])); } while(true); Encoding enc = Encoding.ASCII; string kex = enc.GetString(re.ReadString()); _cInfo._supportedKEXAlgorithms = kex; CheckAlgorithmSupport("keyexchange", kex, "diffie-hellman-group1-sha1"); string host_key = enc.GetString(re.ReadString()); _cInfo._supportedHostKeyAlgorithms = host_key; _cInfo._algorithmForHostKeyVerification = DecideHostKeyAlgorithm(host_key); string enc_cs = enc.GetString(re.ReadString()); _cInfo._supportedCipherAlgorithms = enc_cs; _cInfo._algorithmForTransmittion = DecideCipherAlgorithm(enc_cs); string enc_sc = enc.GetString(re.ReadString()); _cInfo._algorithmForReception = DecideCipherAlgorithm(enc_sc); string mac_cs = enc.GetString(re.ReadString()); CheckAlgorithmSupport("mac", mac_cs, "hmac-sha1"); string mac_sc = enc.GetString(re.ReadString()); CheckAlgorithmSupport("mac", mac_sc, "hmac-sha1"); string comp_cs = enc.GetString(re.ReadString()); CheckAlgorithmSupport("compression", comp_cs, "none"); string comp_sc = enc.GetString(re.ReadString()); CheckAlgorithmSupport("compression", comp_sc, "none"); string lang_cs = enc.GetString(re.ReadString()); string lang_sc = enc.GetString(re.ReadString()); bool flag = re.ReadBool(); int reserved = re.ReadInt32(); Debug.Assert(re.Rest==0); if(_connection.IsEventTracerAvailable) { StringBuilder bld = new StringBuilder(); bld.Append("kex_algorithm="); bld.Append(kex); bld.Append("; server_host_key_algorithms="); bld.Append(host_key); bld.Append("; encryption_algorithms_client_to_server="); bld.Append(enc_cs); bld.Append("; encryption_algorithms_server_to_client="); bld.Append(enc_sc); bld.Append("; mac_algorithms_client_to_server="); bld.Append(mac_cs); bld.Append("; mac_algorithms_server_to_client="); bld.Append(mac_sc); bld.Append("; comression_algorithms_client_to_server="); bld.Append(comp_cs); bld.Append("; comression_algorithms_server_to_client="); bld.Append(comp_sc); TraceReceptionNegotiation(PacketType.SSH_MSG_KEXINIT, bld.ToString()); } if(flag) throw new SSHException("Algorithm negotiation failed"); }
/// <summary> /// Reads a multiple precision integer. /// </summary> /// <returns>a multiple precision integer</returns> private BigInteger ReadBigIntWithBits(SSH2DataReader reader) { int bits = reader.ReadInt32(); int bytes = (bits + 7) / 8; byte[] biData = reader.Read(bytes); return new BigInteger(biData); }
private void ProcessKEXINIT(DataFragment packet) { SSH2DataReader re = null; do { _serverKEXINITPayload = packet.GetBytes(); re = new SSH2DataReader(_serverKEXINITPayload); byte[] head = re.Read(17); //Type and cookie SSH2PacketType pt = (SSH2PacketType)head[0]; if (pt == SSH2PacketType.SSH_MSG_KEXINIT) break; //successfully exit if (pt == SSH2PacketType.SSH_MSG_IGNORE || pt == SSH2PacketType.SSH_MSG_DEBUG) { //continue packet = _connection.ReceivePacket(); } else { throw new SSHException(String.Format("Server response is not SSH_MSG_KEXINIT but {0}", head[0])); } } while (true); string kex = re.ReadString(); _cInfo.SupportedKEXAlgorithms = kex; _cInfo.KEXAlgorithm = DecideKexAlgorithm(kex); string host_key = re.ReadString(); _cInfo.SupportedHostKeyAlgorithms = host_key; _cInfo.HostKeyAlgorithm = DecideHostKeyAlgorithm(host_key); string enc_cs = re.ReadString(); _cInfo.SupportedEncryptionAlgorithmsClientToServer = enc_cs; _cInfo.OutgoingPacketCipher = DecideCipherAlgorithm(enc_cs); string enc_sc = re.ReadString(); _cInfo.SupportedEncryptionAlgorithmsServerToClient = enc_sc; _cInfo.IncomingPacketCipher = DecideCipherAlgorithm(enc_sc); string mac_cs = re.ReadString(); CheckAlgorithmSupport("mac", mac_cs, "hmac-sha1"); string mac_sc = re.ReadString(); CheckAlgorithmSupport("mac", mac_sc, "hmac-sha1"); string comp_cs = re.ReadString(); CheckAlgorithmSupport("compression", comp_cs, "none"); string comp_sc = re.ReadString(); CheckAlgorithmSupport("compression", comp_sc, "none"); string lang_cs = re.ReadString(); string lang_sc = re.ReadString(); bool flag = re.ReadBool(); int reserved = re.ReadInt32(); Debug.Assert(re.RemainingDataLength == 0); if (_connection.IsEventTracerAvailable) { StringBuilder bld = new StringBuilder(); bld.Append("kex_algorithm="); bld.Append(kex); bld.Append("; server_host_key_algorithms="); bld.Append(host_key); bld.Append("; encryption_algorithms_client_to_server="); bld.Append(enc_cs); bld.Append("; encryption_algorithms_server_to_client="); bld.Append(enc_sc); bld.Append("; mac_algorithms_client_to_server="); bld.Append(mac_cs); bld.Append("; mac_algorithms_server_to_client="); bld.Append(mac_sc); bld.Append("; comression_algorithms_client_to_server="); bld.Append(comp_cs); bld.Append("; comression_algorithms_server_to_client="); bld.Append(comp_sc); TraceReceptionNegotiation(SSH2PacketType.SSH_MSG_KEXINIT, bld.ToString()); } if (flag) throw new SSHException("Algorithm negotiation failed"); }