public Connection() { salsa = new Salsa20(); salsa.KeySize = 128; salsa.GenerateKey(); salsa.GenerateIV(); salsaEncryptor = salsa.CreateEncryptor(); }
public void Engage() { try { if (Server) { // Send my salsa key byte[] my_salsa = new byte[24]; Array.Copy(salsa.Key, 0, my_salsa, 0, 16); Array.Copy(salsa.IV, 0, my_salsa, 16, 8); Client.Send(my_salsa); log("Sent MySalsa."); // Wait for client key byte[] remote_salsa = ReadNextBlock(); Salsa20 salsa2 = new Salsa20(); salsa2.Key = new byte[16]; salsa2.IV = new byte[8]; Array.Copy(remote_salsa, 0, salsa2.Key, 0, 16); Array.Copy(remote_salsa, 16, salsa2.IV, 0, 8); salsaDecryptor = salsa2.CreateDecryptor(); log("Received RemoteSalsa."); onConnect(); } else { // Wait for server salsa byte[] remote_salsa = ReadNextBlock(); Salsa20 salsa2 = new Salsa20(); salsa2.Key = new byte[16]; salsa2.IV = new byte[8]; Array.Copy(remote_salsa, 0, salsa2.Key, 0, 16); Array.Copy(remote_salsa, 16, salsa2.IV, 0, 8); salsaDecryptor = salsa2.CreateDecryptor(); log("Received RemoteSalsa."); // Send my salsa encrypted byte[] my_salsa = new byte[24]; Array.Copy(salsa.Key, 0, my_salsa, 0, 16); Array.Copy(salsa.IV, 0, my_salsa, 16, 8); Client.Send(my_salsa); log("Sent MySalsa."); onConnect(); } } catch (Exception e) { Console.WriteLine("ERROR during handshake: " + e.Message + "\n" + e.StackTrace); } }