summaryrefslogtreecommitdiff
path: root/src/protocol/internal/fqterm_ssh_packet.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/protocol/internal/fqterm_ssh_packet.h')
-rw-r--r--src/protocol/internal/fqterm_ssh_packet.h148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/protocol/internal/fqterm_ssh_packet.h b/src/protocol/internal/fqterm_ssh_packet.h
new file mode 100644
index 0000000..ed5a488
--- /dev/null
+++ b/src/protocol/internal/fqterm_ssh_packet.h
@@ -0,0 +1,148 @@
+/***************************************************************************
+ * fqterm, a terminal emulator for both BBS and *nix. *
+ * Copyright (C) 2008 fqterm development group. *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. *
+ ***************************************************************************/
+
+#ifndef FQTERM_SSH_PACKET_H
+#define FQTERM_SSH_PACKET_H
+
+#include <openssl/bn.h>
+
+#include <QObject>
+
+#include "fqterm_ssh_types.h"
+#include "fqterm_ssh_buffer.h"
+#include "fqterm_ssh_mac.h"
+#include "fqterm_ssh_cipher.h"
+#include "fqterm_serialization.h"
+
+namespace FQTerm {
+
+class FQTermSSHPacketSender: public QObject {
+ Q_OBJECT;
+ public:
+ FQTermSSHBuffer *output_buffer_;
+ FQTermSSHBuffer *buffer_;
+
+ FQTermSSHPacketSender();
+ virtual ~FQTermSSHPacketSender();
+
+ void startPacket(int pkt_type);
+ void putByte(int data);
+ void putInt(u_int data);
+ void putString(const char *string, int len = -1);
+ void putRawData(const char *data, int length);
+ void putBN(BIGNUM *bignum);
+ void putBN2(BIGNUM *bignum);
+ void write();
+
+ int getIVSize() const { return cipher_->getIVSize();}
+ int getKeySize() const { return cipher_->getKeySize();}
+ int getMacKeySize() const { return mac_->keySize();}
+
+ public slots:
+ virtual void setEncryptionType(int cipherType);
+ void startEncryption(const u_char *key, const u_char *IV = NULL);
+ void resetEncryption();
+
+ void setMacType(int macType);
+ void startMac(const u_char *sessionkey);
+ void resetMac();
+
+ void enableCompress(int enable) {is_compressed_ = enable;};
+
+ signals:
+ void dataToWrite();
+
+ protected:
+ bool is_encrypt_;
+ int cipher_type_;
+ FQTermSSHCipher *cipher_;
+
+ bool is_mac_;
+ int mac_type_;
+ FQTermSSHMac *mac_;
+
+ bool is_compressed_;
+
+ u_int32_t sequence_no_;
+
+ virtual void makePacket() = 0;
+};
+
+class FQTermSSHPacketReceiver: public QObject {
+ Q_OBJECT;
+ public:
+ FQTermSSHBuffer *buffer_;
+
+ FQTermSSHPacketReceiver();
+ virtual ~FQTermSSHPacketReceiver();
+
+ int packetType()const {
+ return packet_type_;
+ }
+
+ u_char getByte();
+ u_int getInt();
+ void *getString(int *length = NULL);
+ void getRawData(char *data, int length);
+ void getBN(BIGNUM *bignum);
+ void getBN2(BIGNUM *bignum);
+ void consume(int len);
+
+ virtual int packetDataLen() const { return real_data_len_;}
+ int getIVSize() const { return cipher_->getIVSize();}
+ int getKeySize() const { return cipher_->getKeySize();}
+ int getMacKeySize() const { return mac_->keySize();}
+
+ virtual void parseData(FQTermSSHBuffer *input) = 0;
+ public slots:
+ virtual void setEncryptionType(int cipherType);
+ void startEncryption(const u_char *key, const u_char *IV = NULL);
+ void resetEncryption();
+
+ void setMacType(int macType);
+ void startMac(const u_char *sessionkey);
+ void resetMac();
+
+ void enableCompress(int enable) {is_compressed_ = enable;};
+
+ signals:
+ void packetAvaliable(int type);
+ void packetError(QString);
+
+ protected:
+ bool is_decrypt_;
+ int cipher_type_;
+ FQTermSSHCipher *cipher_;
+
+ bool is_mac_;
+ int mac_type_;
+ FQTermSSHMac *mac_;
+
+ bool is_compressed_;
+
+ int packet_type_;
+ int real_data_len_;
+
+ u_int32_t sequence_no_;
+};
+
+} // namespace FQTerm
+
+#endif // FQTERM_SSH_PACKET