public void PackData(byte[] data, int datalength, byte[] outdata, out int outlength) { var comdata = FileManager.DeflateCompress(data, 0, datalength, out var outlen); outlength = outlen + 2 + 4; outdata[0] = (byte)(outlength >> 8); outdata[1] = (byte)outlength; Array.Copy(comdata, 0, outdata, 2, outlen); var adler = Adler32.CalcAdler32(data, datalength); outdata[outlength - 4] = (byte)(adler >> 24); outdata[outlength - 3] = (byte)(adler >> 16); outdata[outlength - 2] = (byte)(adler >> 8); outdata[outlength - 1] = (byte)adler; }
public override byte[] ClientPostDecrypt(byte[] plaindata, int datalength, out int outlength) { byte[] outdata = new byte[recv_buf_len + datalength * 2 + 16]; Array.Copy(plaindata, 0, recv_buf, recv_buf_len, datalength); recv_buf_len += datalength; outlength = 0; while (recv_buf_len > 2) { int len = (recv_buf[0] << 8) + recv_buf[1]; if (len >= 32768 || len < 6) { throw new ObfsException("ClientPostDecrypt data error"); } if (len > recv_buf_len) { break; } int outlen; byte[] buf = FileManager.DeflateDecompress(recv_buf, 2, len - 6, out outlen); if (buf != null) { ulong alder = Adler32.CalcAdler32(buf, outlen); if (recv_buf[len - 4] == (byte)(alder >> 24) && recv_buf[len - 3] == (byte)(alder >> 16) && recv_buf[len - 2] == (byte)(alder >> 8) && recv_buf[len - 1] == (byte)(alder)) { //pass } else { throw new ObfsException("ClientPostDecrypt data decompress ERROR"); } Utils.SetArrayMinSize2(ref outdata, outlength + outlen); Array.Copy(buf, 0, outdata, outlength, outlen); outlength += outlen; recv_buf_len -= len; Array.Copy(recv_buf, len, recv_buf, 0, recv_buf_len); len = (recv_buf[0] << 8) + recv_buf[1]; } else { throw new ObfsException("ClientPostDecrypt data decompress ERROR"); } } return(outdata); }