ソースを参照

* Store public/private keys as well as current timestamp when sending key-exchange response

Bryan Drewery 15 年 前
コミット
8f3933b480
3 ファイル変更19 行追加4 行削除
  1. 2 0
      src/mod/server.mod/server.c
  2. 10 0
      src/mod/server.mod/server.h
  3. 7 4
      src/mod/server.mod/servmsg.c

+ 2 - 0
src/mod/server.mod/server.c

@@ -112,6 +112,8 @@ bool in_callerid = 0;
 bool have_cprivmsg = 0;
 bool have_cnotice = 0;
 
+bd::HashTable<bd::String, fish_data_t*> FishKeys;
+
 static bool double_warned = 0;
 
 static void empty_msgq(void);

+ 10 - 0
src/mod/server.mod/server.h

@@ -9,6 +9,8 @@
 #include "src/binds.h"
 #include "src/dcc.h"
 #include "src/set.h"
+#include <bdlib/src/String.h>
+#include <bdlib/src/HashTable.h>
 
 #define DO_LOST 1
 #define NO_LOST 0
@@ -45,6 +47,13 @@ enum {
 	NETT_HYBRID_EFNET	= 4	/* new +e/+I Efnet hybrid.	  */
 };
 
+typedef struct {
+  bd::String sharedKey;
+  bd::String myPrivateKey;
+  bd::String myPublicKeyB64;
+  time_t timestamp;
+} fish_data_t;
+
 extern bind_table_t	*BT_ctcp, *BT_ctcr;
 extern size_t		nick_len;
 extern bool		trigger_on_ignore, floodless, keepnick, in_deaf, in_callerid, have_cprivmsg, have_cnotice;
@@ -58,6 +67,7 @@ extern char		cursrvname[], botrealname[121], botuserhost[], ctcp_reply[1024],
 extern struct server_list *serverlist;
 extern struct dcc_table SERVER_SOCKET;
 extern rate_t		flood_msg, flood_ctcp, flood_callerid;
+extern bd::HashTable<bd::String, fish_data_t*> FishKeys;
 
 int check_bind_ctcpr(char *, char *, struct userrec *, char *, char *, char *, bind_table_t *);
 void nicks_available(char* buf, char delim = 0, bool buf_contains_available = 1);

+ 7 - 4
src/mod/server.mod/servmsg.c

@@ -26,8 +26,6 @@
 
 #include <netinet/tcp.h>
 
-bd::HashTable<bd::String, bd::String> FishKeys;
-
 char cursrvname[120] = "";
 char curnetwork[120] = "";
 static time_t last_ctcp    = (time_t) 0L;
@@ -168,7 +166,7 @@ static int check_bind_raw(char *from, char *code, char *msg)
         bd::String ciphertext(colon), sharedKey, nick(from, p - from);
 
         if (FishKeys.contains(nick)) {
-          sharedKey = FishKeys[nick];
+          sharedKey = FishKeys[nick]->sharedKey;
         } else {
           struct userrec *u = get_user_by_host(from);
           if (u) {
@@ -781,7 +779,12 @@ void handle_DH1080_init(const char* nick, const char* uhost, const char* from, s
 
   putlog(LOG_MSGS, "*", "[FiSH] Received DH1080 public key from (%s!%s) - sending mine", nick, uhost);
   notice(nick, "DH1080_FINISH " + myPublicKeyB64, DP_HELP);
-  FishKeys[nick] = sharedKey;
+  fish_data_t* fishData = new fish_data_t;
+  fishData->myPublicKeyB64 = myPublicKeyB64;
+  fishData->myPrivateKey = myPrivateKey;
+  fishData->sharedKey = sharedKey;
+  fishData->timestamp = now;
+  FishKeys[nick] = fishData;
   sdprintf("Set key for %s: %s", nick, sharedKey.c_str());
   return;
 }