Пример #1
0
 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);
         }
 }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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
        }
Пример #4
0
        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
        }