Explorar el Código

* Added cmds: encrypt, decrypt, md5, sha1.
* Added AUTH cmds: md5, sha1.
* Added SHA1()
* changed md5() to MD5()


svn: 791

Bryan Drewery hace 22 años
padre
commit
8c834e18ed
Se han modificado 14 ficheros con 165 adiciones y 48 borrados
  1. 1 1
      doc/CREDITS
  2. 2 0
      doc/UPDATES
  3. 23 0
      misc/help.txt
  4. 1 1
      pack/pack.cfg.sample
  5. 4 4
      scripts/mIRC/wraith.mrc
  6. 1 1
      src/auth.c
  7. 76 0
      src/cmds.c
  8. 16 1
      src/crypt.c
  9. 3 2
      src/crypt.h
  10. 0 13
      src/crypto/sha.c
  11. 0 1
      src/crypto/sha.h
  12. 3 8
      src/dcc.c
  13. 34 15
      src/mod/irc.mod/msgcmds.c
  14. 1 1
      src/modules.c

+ 1 - 1
doc/CREDITS

@@ -9,7 +9,7 @@ Wraith botpack by bryan, with credits and thanks to the following:
 * passwd for beta testing, and his dedication to finding bugs.
 * extort for finding misc bugs.
 * pgpkeys for finding bugs, and providing input.
-* qFox for providing an mIRC $md5() alias, not requiring a dll or >6.03
+* qFox for providing an mIRC $MD5() alias, not requiring a dll or >6.03
 * Sith_Lord helping test ipv6 on the bot (admin@elitepackets.com)
 * Excelsior for finding a bug on BSD with the ipv6, and for celdrop which inspired many features.
 * syt for giving me inspiration to code a more secure bot.

+ 2 - 0
doc/UPDATES

@@ -5,6 +5,8 @@ This is a summary of ChangeLog basically.
 2.Auth system was broken similar to the channel ctcp bug.
 3.Added config option 'cmdprefix' back.
 4.Fixed two bugs in the auto-email code for bad uname.
+5.Added cmds: encrypt, decrypt, md5, sha1.
+6.Added AUTH cmds: md5, sha1.
 
 1.1.3
 1.Fixed a very fatal bug with channel ctcps.

+ 23 - 0
misc/help.txt

@@ -1,3 +1,4 @@
+
 ::+ban
 ###  %b+ban%b <hostmask> [channel] [%%<XdXhXm>] [comment]
    Adds a ban to the list of bans stored on the bot, with optional comment and
@@ -1108,6 +1109,26 @@ See also: unlink, newleaf%{+a}, -bot%{-}
      .match *.edu 16 25
    This would show results 16 through 25 matching any users with a hostmask
    that ends with ".edu".
+::encrypt
+###  %bencrypt%b <key> <string>
+   Encrypts the string using the specified key.
+
+See also: decrypt, randstring, md5, sha1
+::decrypt
+###  %decrypt%b <key> <string>
+   Decrypts the string using the specified key.
+
+See also: encrypt, randstring, md5, sha1
+::sha1
+###  %bsha1%b <string>
+   Returns the SHA1 hash of the specified string.
+
+See also: randstring, md5, encrypt, decrypt
+::md5
+###  %bmd5%b <string>
+   Returns the MD5 hash of the specified string.
+ 
+See also: randstring, sha1, encrypt, decrypt
 :leaf:mdop:
 ###  %bmdop%b <#channel> [bots=n] [alines=n] [slines=n] [overlap=n] [bitch] [simul]
    For those of us who do not wish to be rocket scientists in the mdop department, 
@@ -1279,6 +1300,8 @@ See also: echo, color
 ::randstring
 ###  %brandstring%b <len>
    Displays a random string of length 'len' up to 300 chars.
+
+See also: md5, sha1, encrypt, decrypt
 ::relay
 ###  %brelay%b <bot>
    Relays you via telnet to another bot, whether or not it is currently linked.

+ 1 - 1
pack/pack.cfg.sample

@@ -11,7 +11,7 @@ PACKNAME <name>
  */
 
 /* SHELLHASH: 32 char md5 hash used for binary password 
- * in mIRC: //echo -a $md5(SOMEWORD)
+ * in mIRC: //echo -a $MD5(SOMEWORD)
  * URL: http://edge.codebin.dk/md5.php
  */
 SHELLHASH <md5hash>

+ 4 - 4
scripts/mIRC/wraith.mrc

@@ -55,7 +55,7 @@ ALIAS -l psy {
 ON *:CHAT:*:{
   var %c = %auth. [ $+ [ $nick ] ]
   if (($1 === -Auth || $1 === ÿû-Auth) && $len($2) == 50) {
-    msg =$nick +Auth $wmd5($2 $+ $wsecpass($3) $+ $wauthkey($3))
+    msg =$nick +Auth $wMD5($2 $+ $wsecpass($3) $+ $wauthkey($3))
   }
 }
 
@@ -79,7 +79,7 @@ ON *:TEXT:*:?:{
   var %c = %auth. [ $+ [ $nick ] ]
   if (!$psy($left($nick, 1)) && !%c) { return }
   if (($1 === -Auth || $1 === ÿû-Auth) && $len($2) == 50) {
-    msg $nick +Auth $wmd5($2 $+ $wsecpass($3) $+ $wauthkey($3))
+    msg $nick +Auth $wMD5($2 $+ $wsecpass($3) $+ $wauthkey($3))
   }
 }
 
@@ -101,7 +101,7 @@ alias -l wmd5 {
     echo 8 -a This script will only work for mIRC 5.8 and up.
   }
   if ($version >= 6.03) {
-    return $md5($1)
+    return $MD5($1)
   } 
   else {
     if (!$exists($nofile($script) $+ /md5.dll)) { 
@@ -118,7 +118,7 @@ ALIAS auth {
     echo 8 -a botname is optional. 
   }
   else {
-    echo +Auth $wmd5($2 $+ $wsecpass($3) $+ $wauthkey($3))
+    echo +Auth $wMD5($2 $+ $wsecpass($3) $+ $wauthkey($3))
   }
 }
 ALIAS msg { 

+ 1 - 1
src/auth.c

@@ -89,7 +89,7 @@ char *makehash(struct userrec *u, char *randstring)
   if (secpass)
     free(secpass);
 
-  return md5(hash);
+  return MD5(hash);
 }
 #endif /* S_AUTHHASH || S_DCCAUTH */
 

+ 76 - 0
src/cmds.c

@@ -8,6 +8,7 @@
 #include "common.h"
 #include "cmds.h"
 #include "settings.h"
+#include "salt.h"
 #include "debug.h"
 #include "dcc.h"
 #include "shell.h"
@@ -1282,6 +1283,7 @@ static void cmd_console(struct userrec *u, int idx, char *par)
   }
   console_dostore(dest);
 }
+
 static void cmd_date(struct userrec *u, int idx, char *par)
 {
   char date[50] = "", utctime[50] = "", ltime[50] = "";
@@ -1758,6 +1760,76 @@ static void cmd_randstring(struct userrec *u, int idx, char *par)
     dprintf(idx, "Too long, must be <= 300\n");
 }
 
+static void cmd_md5(struct userrec *u, int idx, char *par)
+{
+  if (!par[0]) {
+    dprintf(idx, "Usage: md5 <string>\n");
+    return;
+  }
+
+  putlog(LOG_CMDS, "*", STR("#%s# md5 ..."), dcc[idx].nick);
+  dprintf(idx, "MD5(%s) = %s\n", par, MD5(par));
+}
+
+static void cmd_sha1(struct userrec *u, int idx, char *par)
+{
+  if (!par[0]) {
+    dprintf(idx, "Usage: sha1 <string>\n");
+    return;
+  }
+
+  putlog(LOG_CMDS, "*", STR("#%s# sha1 ..."), dcc[idx].nick);
+  dprintf(idx, "SHA1(%s) = %s\n", par, SHA1(par));
+}
+
+static void cmd_encrypt(struct userrec *u, int idx, char *par)
+{
+  char *key = NULL, *buf = NULL;
+
+  if (!par[0]) {
+    dprintf(idx, "Usage: encrypt <key> <string>\n");
+    return;
+  }
+
+  putlog(LOG_CMDS, "*", STR("#%s# encrypt ..."), dcc[idx].nick);
+  
+  key = newsplit(&par);
+  if (!par[0]) {
+    dprintf(idx, "Usage: encrypt <key> <string>\n");
+    return;
+
+  }
+
+  buf = encrypt_string(key ? key : SALT2, par);
+
+  dprintf(idx, "encrypt(%s) = %s\n", par, buf);
+  free(buf);
+}
+
+static void cmd_decrypt(struct userrec *u, int idx, char *par)
+{
+  char *key = NULL, *buf = NULL;
+
+  if (!par[0]) {
+    dprintf(idx, "Usage: decrypt <key> <string>\n");
+    return;
+  }
+
+  putlog(LOG_CMDS, "*", STR("#%s# decrypt ..."), dcc[idx].nick);
+  
+  key = newsplit(&par);
+  if (!par[0]) {
+    dprintf(idx, "Usage: decrypt <key> <string>\n");
+    return;
+
+  }
+
+  buf = decrypt_string(key ? key : SALT2, par);
+
+  dprintf(idx, "decrypt(%s) = %s\n", par, buf);
+  free(buf);
+}
+
 static void cmd_restart(struct userrec *u, int idx, char *par)
 {
   putlog(LOG_CMDS, "*", STR("#%s# restart"), dcc[idx].nick);
@@ -4073,6 +4145,10 @@ cmd_t C_dcc[] =
   {"w", 		"n", 	(Function) cmd_w, 		NULL},
   {"channels", 		"", 	(Function) cmd_channels, 	NULL},
   {"randstring", 	"", 	(Function) cmd_randstring, 	NULL},
+  {"md5",		"",	(Function) cmd_md5,		NULL},
+  {"sha1",		"",	(Function) cmd_sha1,		NULL},
+  {"encrypt",		"",	(Function) cmd_encrypt,		NULL},
+  {"decrypt",		"",	(Function) cmd_decrypt,		NULL},
 #ifdef HUB
   {"botcmd",		"i",	(Function) cmd_botcmd, 		NULL},
   {"bc",		"i",	(Function) cmd_botcmd, 		NULL},

+ 16 - 1
src/crypt.c

@@ -265,7 +265,7 @@ void DecryptFile(char *infile, char *outfile)
 }
 
 
-char *md5(const char *string) 
+char *MD5(const char *string) 
 {
   static char	  md5string[MD5_HASH_LENGTH + 1] = "";
   unsigned char   md5out[MD5_HASH_LENGTH + 1] = "";
@@ -275,5 +275,20 @@ char *md5(const char *string)
   MD5_Update(&ctx, string, strlen(string));
   MD5_Final(md5out, &ctx);
   strncpyz(md5string, btoh(md5out, MD5_DIGEST_LENGTH), sizeof(md5string));
+  OPENSSL_cleanse(&ctx, sizeof(ctx));
   return md5string;
 }
+
+char *SHA1(const char *string)
+{
+  static char	  sha1string[SHA_HASH_LENGTH + 1] = "";
+  unsigned char   sha1out[SHA_HASH_LENGTH + 1] = "";
+  SHA_CTX ctx;
+
+  SHA1_Init(&ctx);
+  SHA1_Update(&ctx, string, strlen(string));
+  SHA1_Final(sha1out, &ctx);
+  strncpyz(sha1string, btoh(sha1out, SHA_DIGEST_LENGTH), sizeof(sha1string));
+  OPENSSL_cleanse(&ctx, sizeof(ctx));
+  return sha1string;
+}

+ 3 - 2
src/crypt.h

@@ -18,11 +18,12 @@
 
 #define SHA_HASH_LENGTH (SHA_DIGEST_LENGTH * 2)
 #define MD5_HASH_LENGTH (MD5_DIGEST_LENGTH * 2)
-#define md5cmp(hash, string)            strcmp(hash, md5(string))
+#define md5cmp(hash, string)            strcmp(hash, MD5(string))
 
 
 #ifndef MAKING_MODS
-char *md5(const char *);
+char *MD5(const char *);
+char *SHA1(const char *);
 char *encrypt_string(const char *, char *);
 char *decrypt_string(const char *, char *);
 void encrypt_pass(char *, char *);

+ 0 - 13
src/crypto/sha.c

@@ -485,16 +485,3 @@ void SHA1_Transform (SHA_CTX *c, const unsigned char *data)
         sha1_block_data_order (c,data,1);
         }
 
-unsigned char *SHA(const unsigned char *d, unsigned long n, unsigned char *md)
-        {
-        SHA_CTX c;
-        static unsigned char m[SHA_DIGEST_LENGTH];
-
-        if (md == NULL) md=m;
-        SHA1_Init(&c);
-        SHA1_Update(&c,d,n);
-        SHA1_Final(md,&c);
-        OPENSSL_cleanse(&c, sizeof(c));
-        return(md);
-        }
-

+ 0 - 1
src/crypto/sha.h

@@ -66,7 +66,6 @@ typedef struct SHAstate_st
 int SHA1_Init(SHA_CTX *);
 int SHA1_Update(SHA_CTX *, const void *, unsigned long);
 int SHA1_Final(unsigned char *, SHA_CTX *);
-unsigned char *SHA1(const unsigned char *, unsigned long, unsigned char *);
 void SHA1_Transform(SHA_CTX *, const unsigned char *);
 
 #endif /* !_SHA_H */

+ 3 - 8
src/dcc.c

@@ -329,10 +329,8 @@ static void cont_link(int idx, char *buf, int ii)
 {
   /* Now set the initial link key (incoming only, we're not sending more until we get an OK)... */
   struct sockaddr_in sa;
-  char tmp[256] = "", bufout[SHA_HASH_LENGTH + 1] = "";
-  SHA_CTX ctx;
-  int i;
-  int snum = -1;
+  char tmp[301] = "";
+  int i, snum = -1;
 
   for (i = 0; i < MAXSOCKS; i++) {
     if ((socklist[i].sock == dcc[idx].sock) && !(socklist[i].flags & SOCK_UNUSED)) {
@@ -363,10 +361,7 @@ static void cont_link(int idx, char *buf, int ii)
     /* bdhash myport hubnick mynick */
     getsockname(socklist[snum].sock, (struct sockaddr *) &sa, &i);
     egg_snprintf(tmp, sizeof tmp, "%s@%4x@%s@%s", bdhash, sa.sin_port, dcc[idx].nick, conf.bot->nick);
-    SHA1_Init(&ctx);
-    SHA1_Update(&ctx, tmp, strlen(tmp));
-    SHA1_Final(bufout, &ctx);
-    strncpyz(socklist[snum].ikey, btoh(bufout, SHA_DIGEST_LENGTH), sizeof(socklist[snum].ikey));
+    strncpyz(socklist[snum].ikey, SHA1(tmp), sizeof(socklist[snum].ikey));
     putlog(LOG_DEBUG, "@", "Link hash for %s: %s", dcc[idx].nick, tmp);
     putlog(LOG_DEBUG, "@", "initkey (%d): %s", strlen(socklist[snum].ikey), socklist[snum].ikey);
     /* We've send our conf.bot->nick and set the key for the link on the sock, wait for 'elink' back to verify key */

+ 34 - 15
src/mod/irc.mod/msgcmds.c

@@ -451,9 +451,6 @@ static int msgc_op(char *nick, char *host, struct userrec *u, char *par, char *c
   int force = 0;
   memberlist *m = NULL;
 
-  if (match_my_nick(nick))
-    return BIND_RET_BREAK;
-
   if (chname && chname[0]) {
     chan = findchan_by_dname(chname);
     if (chan) 
@@ -504,9 +501,6 @@ static int msgc_voice(char *nick, char *host, struct userrec *u, char *par, char
   int force = 0;
   memberlist *m = NULL;
 
-  if (match_my_nick(nick))
-    return BIND_RET_BREAK;
-
   if (chname && chname[0]) {
     chan = findchan_by_dname(chname);
     if (chan) 
@@ -554,9 +548,6 @@ static int msgc_channels(char *nick, char *host, struct userrec *u, char *par, c
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
   char list[1024] = "";
 
-  if (match_my_nick(nick))
-    return BIND_RET_BREAK;
-
   putlog(LOG_CMDS, "*", "(%s!%s) !%s! %s %sCHANNELS %s", nick, host, u->handle, chname ? chname : "", cmdprefix, par ? par : "");
   for (chan = chanset; chan; chan = chan->next) {
     get_user_flagrec(u, &fr, chan->dname);
@@ -581,9 +572,6 @@ static int msgc_getkey(char *nick, char *host, struct userrec *u, char *par, cha
   struct chanset_t *chan = NULL;
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
 
-  if (match_my_nick(nick))
-    return BIND_RET_BREAK;
-
   if (chname && chname[0]) 
     return 0;
 
@@ -613,15 +601,44 @@ static int msgc_help(char *nick, char *host, struct userrec *u, char *par, char
   return BIND_RET_BREAK;
 }
 
+static int msgc_md5(char *nick, char *host, struct userrec *u, char *par, char *chname)
+{
+  struct chanset_t *chan = NULL;
+
+  putlog(LOG_CMDS, "*", "(%s!%s) !%s! %s %sMD5 %s", nick, host, u->handle, chname ? chname : "", cmdprefix, par ? par : "");
+  
+  if (chname && chname[0])
+    chan = findchan_by_dname(chname);  
+
+  if (chan)
+    dprintf(DP_HELP, "PRIVMSG %s :MD5(%s) = %s\n", chan->dname, par, MD5(par));
+  else
+    dprintf(DP_HELP, "NOTICE %s :MD5(%s) = %s\n", nick, par, MD5(par));
+  return BIND_RET_BREAK;
+}
+
+static int msgc_sha1(char *nick, char *host, struct userrec *u, char *par, char *chname)
+{
+  struct chanset_t *chan = NULL;
+
+  putlog(LOG_CMDS, "*", "(%s!%s) !%s! %s %sSHA1 %s", nick, host, u->handle, chname ? chname : "", cmdprefix, par ? par : "");
+  
+  if (chname && chname[0])
+    chan = findchan_by_dname(chname);  
+
+  if (chan)
+    dprintf(DP_HELP, "PRIVMSG %s :SHA1(%s) = %s\n", chan->dname, par, SHA1(par));
+  else
+    dprintf(DP_HELP, "NOTICE %s :SHA1(%s) = %s\n", nick, par, SHA1(par));
+  return BIND_RET_BREAK;
+}
+
 static int msgc_invite(char *nick, char *host, struct userrec *u, char *par, char *chname)
 {
   struct chanset_t *chan = NULL;
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
   int force = 0;
 
-  if (match_my_nick(nick))
-    return BIND_RET_BREAK;
-
   if (chname && chname[0])
     return 0;
  
@@ -675,6 +692,8 @@ static cmd_t C_msgc[] =
   {"getkey",		"",	(Function) msgc_getkey,		NULL},
   {"invite",		"",	(Function) msgc_invite,		NULL},
   {"help",		"",	(Function) msgc_help,		NULL},
+  {"md5",		"",	(Function) msgc_md5,		NULL},
+  {"sha1",		"",	(Function) msgc_sha1,		NULL},
   {NULL,		NULL,	NULL,				NULL}
 };
 #endif /* S_AUTHCMDS */

+ 1 - 1
src/modules.c

@@ -245,7 +245,7 @@ Function global_table[] =
   (Function) & global_bans,	 /* struct banrec *			*/
   (Function) & global_ign,	 /* struct igrec *			*/
   (Function) 0,
-  (Function) md5,
+  (Function) MD5,
   /* 100 - 103 */
   (Function) & max_dcc,		 /* int					*/
   (Function) shouldjoin,