public static Packet DecryptPacket(this Packet pkt) { byte[] buf = new byte[pkt.DecSpace]; byte counter = 0; if (MU_DecodeC3C4(buf, 0, pkt, pkt.ToServer ? dec1_keys : dec2_keys, ref counter)) { Packet dec = new Packet(buf, 0, pkt.ToServer, counter); if (pkt.ToServer) dec.DecodeC1C2(); return dec; } return null; }
public static Packet EncryptPacket(this Packet pkt, Packet des_pkt = null) { if (pkt.ToServer) pkt.EncodeC1C2(); if (des_pkt == null) { byte[] buf = new byte[pkt.EncSpace]; if (MU_EncodeC3C4(buf, 0, pkt, pkt.ToServer ? enc1_keys : enc2_keys, pkt.Counter)) return new Packet(buf, 0, pkt.ToServer, pkt.Counter); } else if (MU_EncodeC3C4(des_pkt.Source, des_pkt.Index, pkt, pkt.ToServer ? enc1_keys : enc2_keys, pkt.Counter)) return des_pkt; return null; }
/// <summary> /// encrypt c3/c4 packet /// </summary> static bool MU_EncodeC3C4(byte[] outbuffer, int outbuf, Packet pkt, uint[] dec_dat, byte enc_key) { byte hdrSize = pkt.HeaderSize; byte hdr = pkt.Header; byte tmp = pkt.Source[hdrSize - 1]; ushort enc_len = 0; ushort size = pkt.Size; pkt.Source[hdrSize - 1] = enc_key; bool rs = MU_ForceEncodeC3C4(outbuffer, outbuf + hdrSize, ref enc_len, pkt.Source, pkt.Index + hdrSize - 1, (ushort)(size - hdrSize + 1), dec_dat); pkt.Source[hdrSize - 1] = tmp; if (rs == true) { outbuffer[outbuf] = (byte)(hdr + 2); enc_len += (ushort)hdrSize; if (hdrSize == 2) outbuffer[outbuf + 1] = (byte)enc_len; else { outbuffer[outbuf + 1] = (byte)((enc_len & ~0x00FF) >> 8); outbuffer[outbuf + 2] = (byte)(enc_len & ~0xFF00); } } return rs; }
/// <summary> /// encode c1/c2 packet /// </summary> static void MU_EncodeC1C2(Packet packet) { MU_ForceEncodeC1C2(packet.Source, packet.ContentIndex, packet.ContentSize, packet.HeaderSize); }
/// <summary> /// decrypt c3/c4 packet /// </summary> static bool MU_DecodeC3C4(byte[] outbuffer, int outbuf, Packet pkt, uint[] dec_dat, ref byte dec_key) { byte hdrSize = pkt.HeaderSize; byte hdr = pkt.Header; ushort dec_size = 0; if (MU_ForceDecodeC3C4(outbuffer, outbuf + hdrSize - 1, ref dec_size, pkt.Source, pkt.ContentIndex, pkt.ContentSize, dec_dat) == false) return false;// decryption fails dec_size += (ushort)(hdrSize - 1); dec_key = outbuffer[outbuf + hdrSize - 1]; outbuffer[outbuf] = (byte)(hdr - 2); if (hdrSize == 2) outbuffer[outbuf + 1] = (byte)dec_size; else { outbuffer[outbuf + 1] = (byte)((dec_size & ~0x00FF) >> 8); outbuffer[outbuf + 2] = (byte)(dec_size & ~0xFF00); } return true;// decrypt success }
static int MuPacketEncSpace(Packet pkt) { ushort x = (ushort)(pkt.ContentSize + 1); return (((x / 8) + (((x % 8) > 0) ? 1 : 0)) * 11) + pkt.HeaderSize; }
static int MuPacketDecSpace(Packet pkt) { return ((pkt.ContentSize / 11) * 8) + pkt.HeaderSize - 1; }