private void SaveFile(PersistentPrivateKey ppk) { using (var ppkFile = File.Open(ppk.File, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite)) using (var ppkSR = new BinaryWriter(ppkFile)) { var ppkSerialized = this.serializer.Serialize(ppk); ppkSR.BaseStream.Write(ppkSerialized, 0, ppkSerialized.Length); } }
public void Connect(IPAddress ipAddress, int port) { this.textPlainTCPChannel.Connect(ipAddress, port); //Read a persistent private key or create a new //TODO: See for domain name server rather than ip. var ppk = this.IPersistentPrivateKeyProvider.Read(ipAddress.ToString(), port); PublicKey publicKeyToSend = null; if (ppk == null)//New key to generate in server. { this.asymetricForDecrypt.GenerateKeys(); this.thisPrivateKey = this.asymetricForDecrypt.GetPrivateKey();//To Decrypt Server Messages publicKeyToSend = asymetricForDecrypt.GetPublicKey(); } else //Using existing key. { publicKeyToSend = new PublicKey { yExponent = ppk.PrivateKey.yExponent, yModulus = ppk.PrivateKey.yModulus }; this.thisPrivateKey = ppk.PrivateKey; } bool IsKeyFound = ppk != null; SendPublicKey(publicKeyToSend, IsKeyFound, false); //Should receive the public key this.Receive(littleBuffer, 0, littleBuffer.Length); //if (ppk == null)//No save yet { PersistentPrivateKey ppkNew = new PersistentPrivateKey { Port = port, Server = ipAddress.ToString(), PrivateKey = this.thisPrivateKey, PublicKeyRemote = this.remotePublicKey, FromServer = false }; IPersistentPrivateKeyProvider.Save(ppkNew); } }
public void Save(PersistentPrivateKey persistentPrivateKey) { this.Init(); if (string.IsNullOrEmpty(persistentPrivateKey?.File)) { persistentPrivateKey.File = Path.Combine(ppkPath, $"ppk-{DateTime.Now:MMfffmmHHyyddss}"); } var clientPPK = this.Read(persistentPrivateKey.Server, persistentPrivateKey.Port); var serverPPK = this.Read(persistentPrivateKey.PublicKeyRemote); if (persistentPrivateKey == null) { throw new ArgumentNullException("persistentPrivateKey null"); } else if (!persistentPrivateKey.FromServer && clientPPK != null)//If client is trying to save ppk { clientPPK.ExpirationDate = customDateTime.UtcNow.AddMinutes(this.Minutes2IncrementExpirtationDate); SaveFile(clientPPK); } else if (persistentPrivateKey.FromServer && serverPPK != null) { serverPPK.ExpirationDate = customDateTime.UtcNow.AddMinutes(this.Minutes2IncrementExpirtationDate); SaveFile(serverPPK); } else if (clientPPK == null && serverPPK == null) { persistentPrivateKey.ExpirationDate = customDateTime.UtcNow.AddMinutes(this.Minutes2IncrementExpirtationDate); SaveFile(persistentPrivateKey); } #if DEBUG //byte[] ppkSerialized = null; //ppkSerialized = this.serializer.Serialize(persistentPrivateKey); //var aPPKHash = hash.Generate(new ByteArray(ppkSerialized)); //var aPKHash = hash.Generate(new ByteArray(serializer.Serialize(persistentPrivateKey.PublicKeyRemote))); //logger.Debug($"Saving PPK Hash:\"{BitConverter.ToString(aPPKHash)}\", PPK.PK:\"{BitConverter.ToString(aPKHash)}\""); #endif }
private int HandShakeStep(byte yMajor, byte yMinor, byte flags) { ///Using first Private Key (Application Level) this.firstAsymetricHandshakeToDecrypt .SetPrivateKey( secureProtocolHandshake.GetFirstPrivateKey() ); ReceivingEncryptedMessage(this.firstAsymetricHandshakeToDecrypt); this.remotePublicKey = serializeT.Deserialize <PublicKey>(aDecryptedMessage); ///[ServerHandshake turn]Receiving serialize public key if ( FLAGS_PPK_FOUND == (FLAGS_PPK_FOUND & flags) && FLAGS_SERVER_REQUEST != (FLAGS_SERVER_REQUEST & flags)) //Search for a ppk in disk { var ppk = this.IPersistentPrivateKeyProvider.Read(this.remotePublicKey); if (ppk == null) { throw new SLPException($"[{this.textPlainTCPChannel?.RemoteEndPoint?.ToString()}] Secure protocol, ppk not found, ppk file could have been deleted.", SLPException.SLPExceptionType.PPKNotFound); } PublicKey PubKey = new PublicKey { yExponent = ppk.PrivateKey.yExponent, yModulus = ppk.PrivateKey.yModulus }; SendPublicKey(PubKey, true, true); this.remotePublicKey = ppk.PublicKeyRemote; this.thisPrivateKey = ppk.PrivateKey; this.IPersistentPrivateKeyProvider.Save(ppk);//To prolong expiration date } ///[ServerHandshake turn] Client requests a new public key. else if ( FLAGS_PPK_FOUND != (FLAGS_PPK_FOUND & flags) && FLAGS_SERVER_REQUEST != (FLAGS_SERVER_REQUEST & flags)) { this.asymetricForDecrypt.GenerateKeys(); this.thisPrivateKey = this.asymetricForDecrypt.GetPrivateKey(); #if DEBUG //var aPUBKEYToDecrypt = this.hash.Generate(new ByteArray(this.serializeT.Serialize(this.asymetricForDecrypt.GetPublicKey()))); //this.logger.Debug($"Saving a New PrivateKey, PUBKEY (HASH) is = {BitConverter.ToString(aPUBKEYToDecrypt)}"); #endif var ppk = new PersistentPrivateKey { PrivateKey = this.thisPrivateKey, PublicKeyRemote = this.remotePublicKey, FromServer = true }; this.IPersistentPrivateKeyProvider.Save(ppk); PublicKey PubKey = new PublicKey { yExponent = ppk.PrivateKey.yExponent, yModulus = ppk.PrivateKey.yModulus, }; this.SendPublicKey(PubKey, false, true); } return(-1000);//Returning any negative integer }