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); } }
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); }
/// <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); }