public Boolean CheckMD5(chave_aut chave) { if (_body == null) { _body = new Byte[0]; } header_aut tmp = (header_aut)this.Clone(); tmp.md5 = new Byte[0]; tmp.nop = 0; Byte[] header = tmp.ToBytes(); Byte[] md5calc = new Byte[header.Length + _body.Length]; Array.Copy(header, 0, md5calc, 0, header.Length); Array.Copy(_body, 0, md5calc, header.Length, _body.Length); Byte[] msgBuffer = new Byte[16 + 16 + md5calc.Length]; Array.Copy(chave.akey, 0, msgBuffer, 0, 16); Array.Copy(md5calc, 0, msgBuffer, 16, md5calc.Length); Array.Copy(chave.akey, 0, msgBuffer, 16 + md5calc.Length, 16); md5 md5 = new md5(msgBuffer); md5.calc(); return(BitConverter.ToString(md5.getHash()) == BitConverter.ToString(base.md5)); }
private Byte[] _enviapacote(Byte[] dados, Int32 size, ushort op, ushort status) { header_aut header = new header_aut(); if (type == AuthType.Server) { if (++ne == 0xFFFFFFFF) { ne = 1; } } header.n = ne; header.operacao = op; header.status = status; header.tam_pad = (ushort)(8 - (size % 8)); /* Calcula tamanho do padding */ if (header.tam_pad == 8) { header.tam_pad = 0; } header.tam_pad = 0; header.tam_pack = size + header.tam_pad + 32; //32 = tamanho do header_aut; Int32 bsend = header.tam_pack; header.nop = 0; Byte[] headerBytes = header.ToBytes(); if (OnPacketSent != null) { OnPacketSent(header, dados); } //Monta o buffer decriptado p/ calculo do md5 Byte[] md5CalcBuffer = new Byte[headerBytes.Length + size]; Array.Copy(headerBytes, 0, md5CalcBuffer, 0, headerBytes.Length); if (size > 0) { Array.Copy(dados, 0, md5CalcBuffer, headerBytes.Length, dados.Length); } //Cacula md5 Byte[] msgBuffer = new Byte[16 + 16 + md5CalcBuffer.Length]; Array.Copy(chave.akey, 0, msgBuffer, 0, 16); Array.Copy(md5CalcBuffer, 0, msgBuffer, 16, md5CalcBuffer.Length); Array.Copy(chave.akey, 0, msgBuffer, 16 + md5CalcBuffer.Length, 16); md5 md5 = new md5(msgBuffer); md5.calc(); header.md5 = md5.getHash(); header.nop = BitConverter.ToUInt16(header.md5, 0); //Resgata o header atualizado headerBytes = header.ToBytes(); //Encripta header Byte[] encHeader = aut_encripta_buffer(headerBytes, headerBytes.Length, 0, chave); Byte[] encBody = new Byte[0]; if (size > 0) { encBody = aut_encripta_buffer(dados, size, htonlInt32(ne), chave); } Byte[] buffer = new Byte[encHeader.Length + encBody.Length]; Array.Copy(encHeader, 0, buffer, 0, encHeader.Length); if (size > 0) { Array.Copy(encBody, 0, buffer, encHeader.Length, encBody.Length); } return(buffer); }