throws TransportProtocolException {
try {
// Get the algorithm objects
algorithms.lock();
SshCipher cipher = algorithms.getCipher();
SshHmac hmac = algorithms.getHmac();
SshCompression compression = algorithms.getCompression();
// Write the data into a byte array
ByteArrayWriter message = new ByteArrayWriter();
// Get the message payload data
byte[] msgdata = msg.toByteArray();
//int payload = msgdata.length;
int padding = 4;
int cipherlen = 8;
// Determine the cipher length
if (cipher != null) {
cipherlen = cipher.getBlockSize();
}
// Compress the payload if necersary
if (compression != null) {
msgdata = compression.compress(msgdata, 0, msgdata.length);
}
//Determine the padding length
padding += ((cipherlen -
((msgdata.length + 5 + padding) % cipherlen)) % cipherlen);
// Write the packet length field
message.writeInt(msgdata.length + 1 + padding);
// Write the padding length
message.write(padding);
// Write the message payload
message.write(msgdata, 0, msgdata.length);
// Create some random data for the padding
byte[] pad = new byte[padding];
rnd.nextBytes(pad);
// Write the padding
message.write(pad);
// Get the unencrypted packet data
byte[] packet = message.toByteArray();
byte[] mac = null;
// Generate the MAC
if (hmac != null) {
mac = hmac.generate(sequenceNo, packet, 0, packet.length);
}
// Perfrom encrpytion
if (cipher != null) {
packet = cipher.transform(packet);
}
// Reset the message
message.reset();