#include <botan/pubkey.h>
#include <botan/rsa.h>
+#ifdef CREATOR_SSH_DEBUG
+#include <iostream>
+#endif
#include <string>
using namespace Botan;
Q_UNUSED(list);
#endif
}
+
+#ifdef CREATOR_SSH_DEBUG
+ void printData(const char *name, const QByteArray &data)
+ {
+ std::cerr << std::hex;
+ qDebug("The client thinks the %s has length %d and is:", name, data.count());
+ for (int i = 0; i < data.count(); ++i)
+ std::cerr << (static_cast<unsigned int>(data.at(i)) & 0xff) << ' ';
+ std::cerr << std::endl;
+ }
+#endif
+
} // anonymous namespace
SshKeyExchange::SshKeyExchange(SshSendFacility &sendFacility)
void SshKeyExchange::sendKexInitPacket(const QByteArray &serverId)
{
m_serverId = serverId;
- const AbstractSshPacket::Payload &payload
- = m_sendFacility.sendKeyExchangeInitPacket();
- m_clientKexInitPayload = QByteArray(payload.data, payload.size);
+ m_clientKexInitPayload = m_sendFacility.sendKeyExchangeInitPacket();
}
bool SshKeyExchange::sendDhInitPacket(const SshIncomingPacket &serverKexInit)
m_dhKey.reset(new DH_PrivateKey(rng,
DL_Group(botanKeyExchangeAlgoName(keyAlgo))));
- const AbstractSshPacket::Payload &payload = serverKexInit.payLoad();
- m_serverKexInitPayload = QByteArray(payload.data, payload.size);
+ m_serverKexInitPayload = serverKexInit.payLoad();
m_sendFacility.sendKeyDhInitPacket(m_dhKey->get_y());
return kexInitParams.firstKexPacketFollows;
}
concatenatedData.size());
m_h = convertByteArray(hashResult);
+#ifdef CREATOR_SSH_DEBUG
+ printData("Client Id", AbstractSshPacket::encodeString(clientId));
+ printData("Server Id", AbstractSshPacket::encodeString(m_serverId));
+ printData("Client Payload", AbstractSshPacket::encodeString(m_clientKexInitPayload));
+ printData("Server payload", AbstractSshPacket::encodeString(m_serverKexInitPayload));
+ printData("K_S", reply.k_s);
+ printData("y", AbstractSshPacket::encodeMpInt(m_dhKey->get_y()));
+ printData("f", AbstractSshPacket::encodeMpInt(reply.f));
+ printData("K", m_k);
+ printData("Concatenated data", concatenatedData);
+ printData("H", m_h);
+#endif // CREATOR_SSH_DEBUG
+
QScopedPointer<Public_Key> sigKey;
QScopedPointer<PK_Verifier> verifier;
if (m_serverHostKeyAlgo == SshCapabilities::PubKeyDss) {
return m_encrypter.macLength();
}
-void SshOutgoingPacket::generateKeyExchangeInitPacket()
+QByteArray SshOutgoingPacket::generateKeyExchangeInitPacket()
{
const QByteArray &supportedkeyExchangeMethods
= encodeNameList(SshCapabilities::KeyExchangeMethods);
m_data.append(supportedLanguages).append(supportedLanguages);
appendBool(false); // No guessed packet.
m_data.append(QByteArray(4, 0)); // Reserved.
+ QByteArray payload = m_data.mid(PayloadOffset);
finalize();
+ return payload;
}
void SshOutgoingPacket::generateKeyDhInitPacket(const Botan::BigInt &e)
return static_cast<SshPacketType>(m_data.at(TypeOffset));
}
-AbstractSshPacket::Payload AbstractSshPacket::payLoad() const
+QByteArray AbstractSshPacket::payLoad() const
{
- Payload p;
- p.data = m_data.constData() + PayloadOffset;
- p.size = length() - paddingLength() - 1;
- return p;
+ return QByteArray(m_data.constData() + PayloadOffset,
+ length() - paddingLength() - 1);
}
void AbstractSshPacket::printRawBytes() const