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