diff options
Diffstat (limited to 'src/ext_packet.cpp')
| -rw-r--r-- | src/ext_packet.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/ext_packet.cpp b/src/ext_packet.cpp new file mode 100644 index 0000000..76ac492 --- /dev/null +++ b/src/ext_packet.cpp @@ -0,0 +1,53 @@ +#include "ext_packet.h" + +extern "C" +{ +#include "vli.h" +} + +QByteArray serializeIdent(const Ident &m) +{ + QByteArray msg; + msg.reserve(3); + msg.append((char)ExMsgType::ident); + msg.append('\0'); + msg.append(m.version); + return msg; +} + +QByteArray serializeAuthRequest(const AuthRequest &m) +{ + QByteArray msg; + const QByteArray username = m.username.toUtf8(); + uint8_t method[sizeof(quint32) + 1]; + uint8_t ulen[sizeof(quint32) + 1]; + size_t method_n = vli32_encode(method, (quint32)m.method); + size_t ulen_n = vli32_encode(ulen, username.size()); + msg.reserve(2 + ulen_n + username.size() + method_n); + msg.append((char)ExMsgType::auth_request); + msg.append('\0'); + msg.append((const char *)ulen, ulen_n); + msg.append(username, username.size()); + msg.append((const char *)method, method_n); + return msg; +} + +QByteArray serializeAuthResponse(const AuthResponse &m) +{ + QByteArray msg; + msg.reserve(2 + m.response.size()); + msg.append((char)ExMsgType::auth_response); + msg.append('\0'); + msg.append(m.response); + return msg; +} + +bool parseAuthChallenge(QByteArrayView in, AuthChallenge &out) +{ + if (in.size() < 1 + 32) + { + return false; + } + out.challenge = QByteArray(in.constData() + 1, 32); + return true; +} |
