/** * Prepare data as a Secure PDU and pass down to the MCS layer * * @param sec_data Data to send * @param flags Encryption flags * @param channel Channel over which to send data * @throws RdesktopException * @throws IOException * @throws CryptoException */ public void send_to_channel(RdpPacket_Localised sec_data, int flags, int channel) throws RdesktopException, IOException, CryptoException { int datalength = 0; byte[] signature = null; byte[] data; byte[] buffer; sec_data.setPosition(sec_data.getHeader(RdpPacket.SECURE_HEADER)); if (this.licenceIssued == false || (flags & SEC_ENCRYPT) != 0) { sec_data.setLittleEndian32(flags); } if (Options.debug_hexdump) { int length = sec_data.getEnd() - sec_data.getPosition(); byte[] packet = new byte[length]; sec_data.copyToByteArray( packet, 0, sec_data.getPosition(), sec_data.getEnd() - sec_data.getPosition()); System.out.println("Sending packet:"); System.out.println(net.propero.rdp.tools.HexDump.dumpHexString(packet)); } if ((flags & SEC_ENCRYPT) != 0) { flags &= ~SEC_ENCRYPT; datalength = sec_data.getEnd() - sec_data.getPosition() - 8; data = new byte[datalength]; buffer = null; sec_data.copyToByteArray(data, 0, sec_data.getPosition() + 8, datalength); signature = this.sign(this.sec_sign_key, 8, this.keylength, data, datalength); buffer = this.encrypt(data, datalength); sec_data.copyFromByteArray(signature, 0, sec_data.getPosition(), 8); sec_data.copyFromByteArray(buffer, 0, sec_data.getPosition() + 8, datalength); } // McsLayer.send(sec_data); McsLayer.send_to_channel(sec_data, channel); }