]> jfr.im git - irc/quakenet/newserv.git/blobdiff - nterface/esockets.c
r439@blue (orig r429): slug | 2006-02-23 13:39:37 +0000
[irc/quakenet/newserv.git] / nterface / esockets.c
index 76477e8f68f20f74ea55e34eab645c9ce4ddd993..2be2f44c84ec5f821800e9441fc4a1aa3fd89752 100644 (file)
@@ -2,6 +2,8 @@
   Easy async socket library with HELIX encryption and authentication
   Copyright (C) 2004-2005 Chris Porter.
 
+  v1.03
+    - changed nonce logic
   v1.02
     - added some \n stripping in crypto code
   v1.01
@@ -16,7 +18,6 @@
 #include <errno.h>
 #include <signal.h>
 #include <stdlib.h>
-#include <sys/types.h>
 #include <unistd.h>
 #include <string.h>
 #include <limits.h>
@@ -183,6 +184,7 @@ void esocket_disconnect(struct esocket *active) {
         socklist = p->next;
       }
      
+
       deregisterhandler(p->fd, 1);
 
       for(;pkt;) {
@@ -266,6 +268,7 @@ struct esocket_packet *esocket_new_packet(struct esocket_out_buffer *buf, char *
 
   nw->next = NULL;
   nw->size = bytes;
+  nw->startpos = 0;
 
   memcpy(nw->line, buffer, bytes);
 
@@ -316,7 +319,7 @@ int esocket_raw_write(struct esocket *sock, char *buffer, int bytes) {
   } else if(buf->count) { /* if we're just flushing the buffer */
     int ret;
     for(;;) {
-      ret = write(sock->fd, buf->head->line, buf->head->size);
+      ret = write(sock->fd, buf->head->line + buf->head->startpos, buf->head->size);
       if(!ret) {
         return 0;
       } else if(ret == buf->head->size) {
@@ -351,7 +354,7 @@ int esocket_raw_write(struct esocket *sock, char *buffer, int bytes) {
             break;
         }
       } else {
-        buf->head->line+=ret;
+        buf->head->startpos+=ret;
         buf->head->size-=ret;
       }
     }
@@ -362,6 +365,12 @@ int esocket_raw_write(struct esocket *sock, char *buffer, int bytes) {
   return 1;
 }
 
+unsigned char *increase_nonce(unsigned char *nonce) {
+  u_int64_t *inonce = (u_int64_t *)(nonce + 8);
+  *inonce = htonq(ntohq(*inonce) + 1);
+  return nonce;
+}
+
 int esocket_write(struct esocket *sock, char *buffer, int bytes) {
   int ret;
   if(sock->in.on_parse == buffer_parse_ascii) {
@@ -375,6 +384,7 @@ int esocket_write(struct esocket *sock, char *buffer, int bytes) {
     packetlength = htons(bytes + USED_MAC_LEN);
 
     memcpy(newbuf, &packetlength, sizeof(packet_t));
+    h_nonce(&sock->keysend, increase_nonce(sock->sendnonce));
     h_encrypt(&sock->keysend, (unsigned char *)buffer, bytes, mac);
 
     memcpy(newbuf + sizeof(packet_t), buffer, bytes);
@@ -463,6 +473,7 @@ int buffer_parse_crypt(struct esocket *sock) {
   if(buf->packet_length <= buf->writepos - buf->startpos) {
     int ret;
     char *newline, *p;
+    h_nonce(&sock->keyreceive, increase_nonce(sock->recvnonce));
     h_decrypt(&sock->keyreceive, (unsigned char *)buf->startpos, buf->packet_length - USED_MAC_LEN, mac);
     
     if(memcmp(mac, buf->startpos + buf->packet_length - USED_MAC_LEN, USED_MAC_LEN))
@@ -479,10 +490,8 @@ int buffer_parse_crypt(struct esocket *sock) {
     buf->packet_length = 0;
 
     ret = sock->events.on_line(sock, newline);
-    if(ret) {
-      printf("returning error\n");
+    if(ret)
       return ret;
-    }
 
     return BUF_CONT;
   }
@@ -495,6 +504,9 @@ void switch_buffer_mode(struct esocket *sock, char *key, unsigned char *ournonce
   unsigned char ukey[20];
   SHA1_CTX context;
 
+  memcpy(sock->sendnonce, ournonce, sizeof(sock->sendnonce));
+  memcpy(sock->recvnonce, theirnonce, sizeof(sock->recvnonce));
+
   SHA1Init(&context);
   SHA1Update(&context, (unsigned char *)key, strlen(key));
   SHA1Update(&context, (unsigned char *)" ", 1);
@@ -504,10 +516,8 @@ void switch_buffer_mode(struct esocket *sock, char *key, unsigned char *ournonce
 
   sock->in.on_parse = buffer_parse_crypt;
   sock->in.buffer_size = MAX_BINARY_LINE_SIZE;
-
   
   h_key(&sock->keysend, ukey, sizeof(ukey));
-  h_nonce(&sock->keysend, ournonce);
 
   SHA1Init(&context);
   SHA1Update(&context, (unsigned char *)key, strlen(key));
@@ -516,6 +526,5 @@ void switch_buffer_mode(struct esocket *sock, char *key, unsigned char *ournonce
   SHA1Final(ukey, &context);
 
   h_key(&sock->keyreceive, ukey, sizeof(ukey));
-  h_nonce(&sock->keyreceive, theirnonce);
 }