Exemplo n.º 1
0
		/// <summary> 
		/// Decrypt using XTEA algo and verify CRC
		/// </summary>
		/// <returns>true for success, false for failure</returns>
		internal bool DecryptSymmetric(NetBuffer buffer)
		{
			int bufLen = buffer.LengthBytes;

			if (bufLen % 8 != 0)
			{
				if (NetBase.CurrentContext != null && NetBase.CurrentContext.Log != null)
					NetBase.CurrentContext.Log.Info("Bad buffer size in DecryptSymmetricInPlace()");
				return false;
			}

			//NetBase.CurrentContext.Log.Debug.Debug("Decrypting using key: " + Convert.ToBase64String(m_xtea.Key));

			// decrypt
			for (int i = 0; i < bufLen; i += 8)
				m_xtea.DecryptBlock(buffer.Data, i, buffer.Data, i);

			int numPadBits = buffer.Data[bufLen - 1];
			buffer.Data[bufLen - 1] = 0; // zap for correct crc calculation
			int dataBits = (bufLen * 8) - (24 + numPadBits); // include pad and crc

			buffer.ResetReadPointer(dataBits);
			ushort statedCrc = buffer.ReadUInt16();

			// zap crc to be able to compare
			buffer.ResetWritePointer(dataBits);
			buffer.Write((ushort)0);

			ushort dataCrc = Checksum.Adler16(buffer.Data, 0, bufLen);

			//NetBase.CurrentContext.Log.Debug("Plain (len " + bufLen + "): " + Convert.ToBase64String(buffer.Data, 0, bufLen) + " Stated CRC: " + statedCrc + " Calc: " + realCrc);
			if (statedCrc != dataCrc)
			{
				if (NetBase.CurrentContext != null && NetBase.CurrentContext.Log != null)
					NetBase.CurrentContext.Log.Warning("CRC failure; expected " + dataCrc + " found " + statedCrc + " dropping packet!");
				return false;
			}

			// clean up
			buffer.LengthBits = dataBits;
			buffer.ResetReadPointer();

			return true;
		}