aboutsummaryrefslogtreecommitdiff
path: root/src/ext_packet.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ext_packet.cpp')
-rw-r--r--src/ext_packet.cpp53
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;
+}