public void CreateNewSessionKey()
{
if (this.FinishedKeyExchange == false) {
// The logic elsewhere is to call this method unless RemoteHasKey == true.
// That needs to be cleaned up, because this is pointless.
if (sentKeyExchange == true) {
//LogManager.Current.WriteToLog("CreateNewSessionKey() AGAIN for " + this.ToString() + "\n" + Environment.StackTrace);
return;
}
try {
LoggingService.LogInfo("Creating secure communication channel to {0}...", this.ToString());
sentKeyExchange = true;
byte[] keyExchange = diffieHellman.CreateKeyExchange();
Message m = network.MessageBuilder.CreateNewSessionKeyMessage(this, keyExchange);
AckMethod c = new AckMethod();
c.args = new object[]{ this };
c.Method += new AckMethod.MethodEventHandler(network.NewSessionKeyReady);
network.AckMethods.Add(m.MessageID, c);
network.SendRoutedMessage(m);
} catch (Exception ex) {
LoggingService.LogError("Failed to create key exchange! Hopefully we will retry...");
sentKeyExchange = false;
throw ex;
}
} else {
LoggingService.LogWarning("Why are we trying to CreateNewSessionKey for {0} when FinishedKeyExchange=True?", this.ToString());
}
}
internal void ProcessNewSessionKeyMessage(Node messageFrom, byte[] key) { string keyHash = FileFind.Common.SHA512Str(key); // This lets us create a brand new session key // if someone wants that for whatever reason. if (messageFrom.SessionKeyDataHash != String.Empty && keyHash != messageFrom.SessionKeyDataHash) { Core.LoggingService.LogInfo("MessageProcessor: Re-keying with: {0}.", messageFrom.ToString()); messageFrom.ClearSessionKey(); } if (messageFrom.FinishedKeyExchange == false) { Core.LoggingService.LogInfo("Received secure channel key from: {0}.", messageFrom.ToString()); messageFrom.SessionKeyDataHash = keyHash; messageFrom.DecryptKeyExchange(key); if (messageFrom.RemoteHasKey == true) { Core.LoggingService.LogInfo("Secure communication channel to {0} now avaliable.", messageFrom.ToString()); network.SendInfoToTrustedNode(messageFrom); } else { messageFrom.CreateNewSessionKey(); } } else { Core.LoggingService.LogWarning("Received secure communication key from: {0}, but key exchange was already finished!", messageFrom.ToString()); } }