Пример #1
0
        private bool VerifySessionKeys(Stream netStream, EncryptionProvider encryptor, EncryptionProvider decryptor)
        {
            StreamReader reader = new StreamReader(netStream);
            StreamWriter writer = new StreamWriter(netStream);

            Packet rec = new Packet();

            rec.Data              = new byte[1];
            rec.TypeID            = (int)PacketType.Handshake;
            rec.ChannelID         = CryptoCommon.GetPrngInt(); // Adding an element of randomness to our sent data
            rec.DestinationUserID = CryptoCommon.GetPrngInt(); // Adding an element of randomness to our sent data

            WriteLine(writer, rec, encryptor);

            int size;

            rec = ReadLine(reader, decryptor, out size);

            if (rec == null)
            {
                throw new Exception(string.Format("Unable to complete handshake, expected to read an encrypted packet from the input stream, got " + rec ?? "[nothing]"));
            }
            if (rec.TypeID != (int)PacketType.Handshake)
            {
                throw new Exception(string.Format("Unable to complete handshake, Expected packet with TypeID {0}", PacketType.Handshake));
            }
            else
            {
                return(true);
            }
        }
Пример #2
0
        private static void SendPubkey(StreamWriter dst, RSAHelper helper)
        {
            Packet packet = new Packet((int)PacketType.Handshake);

            packet.TypeID            = (int)PacketType.Handshake;
            packet.DestinationUserID = CryptoCommon.GetPrngInt(); // Adding an element of randomness to our sent data
            packet.ChannelID         = CryptoCommon.GetPrngInt(); // Adding an element of randomness to our sent data
            packet.Data = handshakeEncoding.GetBytes(helper.PublicKey);

            ActualWriteLine(dst, packet);
        }
Пример #3
0
        /// <summary>
        /// Writes the Key and IV from the specified <see cref="EncryptionProvider"/>
        /// <para/>
        /// to a new <see cref="Packet"/> using the specified <see cref="RSAHelper"/> to encrypt the values
        /// <para/>
        /// this method is the counterpart to <see cref="HandshakeHelper.GetDecryptor(RSAHelper, Packet)"/>
        /// </summary>
        /// <param name="rsa">The <see cref="RSAHelper"/> to use for encrypting the Key and IV</param>
        /// <param name="encryptor">The actual Encryptor to take the Key and IV from</param>
        /// <returns></returns>
        public static Packet WriteEncryptor(RSAHelper rsa, EncryptionProvider encryptor)
        {
            Packet       pkt = new Packet();
            MemoryStream outputDataStream = new MemoryStream();
            StreamWriter outputWriter     = new StreamWriter(outputDataStream);

            outputWriter.WriteLine(rsa.EncryptToBase64String(encryptor.IV));
            outputWriter.WriteLine(rsa.EncryptToBase64String(encryptor.Key));
            outputWriter.Flush();

            pkt.TypeID            = (int)PacketType.Handshake;
            pkt.ChannelID         = CryptoCommon.GetPrngInt(); // Adding an element of randomness to our sent data
            pkt.DestinationUserID = CryptoCommon.GetPrngInt(); // Adding an element of randomness to our sent data
            pkt.Data = outputDataStream.GetBuffer();
            return(pkt);
        }