- /// <summary>
- /// Diffie Hellmann's Key swap process.
- /// -ServerSide.
- /// </summary>
- public class ServerKeyExchange
- : IDataPacket, IDisposable
- {
- #region Variables
- //Writers.
- protected MemoryStream memStream = null;
- protected BinaryWriter binWriter = null;
- //Key exchange packet args.
- protected byte[] ServerIv1;
- protected byte[] ServerIv2;
- protected String P = null;
- protected String G = null;
- protected string serverPublicKey = null;
- //Const.
- protected const int pad = 11;
- protected const int junk = 12;
- protected const string tqSeal = "TQServer";
- #endregion
- #region Constructor
- /// <summary>
- /// Initializes construct.
- /// </summary>
- /// <param name="ServerIV1"></param>
- /// <param name="ServerIV2"></param>
- /// <param name="P"></param>
- /// <param name="G"></param>
- /// <param name="ServerPublicKey"></param>
- public ServerKeyExchange(byte[] ServerIV1, byte[] ServerIV2, string P, string G, string ServerPublicKey)
- {
- //Initialize values for variables.
- this.ServerIv1 = ServerIV1;
- this.ServerIv2 = ServerIV2;
- this.P = P;
- this.G = G;
- this.serverPublicKey = ServerPublicKey;
- //Initialize writers.
- memStream = new MemoryStream();
- binWriter = new BinaryWriter(memStream);
- ComputeExchangePacket();
- }
- #endregion
- #region Functions
- /// <summary>
- /// Generates the Exchange Packet; -ServerSide.
- /// </summary>
- protected internal void ComputeExchangePacket()
- {
- //Assign random junk data to the buffers.
- byte[] padBuff = new byte[pad];
- EntryPoint.rnd.NextBytes(padBuff);
- byte[] junkBuff = new byte[junk];
- EntryPoint.rnd.NextBytes(junkBuff);
- int pSize = 47 + this.P.Length + this.G.Length + this.serverPublicKey.Length + 12 + 8 + 8;
- //Write data.
- //-Junk data.
- binWriter.Write(padBuff);
- binWriter.Write(pSize - pad);
- binWriter.Write((UInt32)junk);
- binWriter.Write(junkBuff);
- //-Key data.
- binWriter.Write((UInt32)ServerIv2.Length);
- binWriter.Write(ServerIv2);
- binWriter.Write((UInt32)ServerIv1.Length);
- binWriter.Write(ServerIv1);
- binWriter.Write(this.P.ToCharArray().Length);
- foreach (char fP in this.P.ToCharArray())
- {
- binWriter.BaseStream.WriteByte((byte)fP);
- }
- binWriter.Write(this.G.ToCharArray().Length);
- foreach (char fG in this.G.ToCharArray())
- {
- binWriter.BaseStream.WriteByte((byte)fG);
- }
- binWriter.Write((UInt32)this.serverPublicKey.ToCharArray().Length);
- foreach (char SPK in this.serverPublicKey.ToCharArray())
- {
- binWriter.BaseStream.WriteByte((byte)SPK);
- }
- foreach (char tq in tqSeal.ToCharArray())
- {
- binWriter.BaseStream.WriteByte((byte)tq);
- }
- }
- /// <summary>
- /// Return byte buffer data.
- /// </summary>
- /// <returns></returns>
- public byte[] ToArray()
- {
- byte[] copyBuffer = new byte[memStream.Length];
- copyBuffer = memStream.ToArray();
- memStream.Close();
- return copyBuffer;
- }
- /// <summary>
- /// Disposes of all the garbage.
- /// </summary>
- public void Dispose()
- {
- memStream.Dispose();
- binWriter.Close();
- }
- #endregion
- }