void SshIncomingPacket::decrypt() { Q_ASSERT(isComplete()); const quint32 netDataLength = length() + 4; m_decrypter.decrypt(m_data, cipherBlockSize(), netDataLength - cipherBlockSize()); const QByteArray &mac = m_data.mid(netDataLength, macLength()); if (mac != generateMac(m_decrypter, m_serverSeqNr)) { throw SSH_SERVER_EXCEPTION(SSH_DISCONNECT_MAC_ERROR, "Message authentication failed."); } }
void SshIncomingPacket::calculateLength() const { Q_ASSERT(currentDataSize() >= minPacketSize()); #ifdef CREATOR_SSH_DEBUG qDebug("Length field before decryption: %d-%d-%d-%d", m_data.at(0) & 0xff, m_data.at(1) & 0xff, m_data.at(2) & 0xff, m_data.at(3) & 0xff); #endif m_decrypter.decrypt(m_data, 0, cipherBlockSize()); #ifdef CREATOR_SSH_DEBUG qDebug("Length field after decryption: %d-%d-%d-%d", m_data.at(0) & 0xff, m_data.at(1) & 0xff, m_data.at(2) & 0xff, m_data.at(3) & 0xff); qDebug("message type = %d", m_data.at(TypeOffset)); #endif m_length = SshPacketParser::asUint32(m_data, static_cast<quint32>(0)); #ifdef CREATOR_SSH_DEBUG qDebug("decrypted length is %u", m_length); #endif }
quint32 AbstractSshPacket::minPacketSize() const { return qMax<quint32>(cipherBlockSize(), 16) + macLength(); }
int SshOutgoingPacket::sizeDivisor() const { return qMax(cipherBlockSize(), 8U); }