- Use CFB mode for encrypting packets: it works and we don't need padding.
This commit is contained in:
		
							parent
							
								
									cea3d8f305
								
							
						
					
					
						commit
						ec12269355
					
				
					 4 changed files with 48 additions and 28 deletions
				
			
		| 
						 | 
				
			
			@ -17,7 +17,7 @@
 | 
			
		|||
    along with this program; if not, write to the Free Software
 | 
			
		||||
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
			
		||||
 | 
			
		||||
    $Id: connlist.h,v 1.1.2.7 2000/10/29 01:27:23 guus Exp $
 | 
			
		||||
    $Id: connlist.h,v 1.1.2.8 2000/10/29 22:10:41 guus Exp $
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef __TINC_CONNLIST_H__
 | 
			
		||||
| 
						 | 
				
			
			@ -70,9 +70,9 @@ typedef struct conn_list_t {
 | 
			
		|||
  EVP_CIPHER_CTX *cipher_inctx;    /* Context of encrypted meta data that will come from him to us */
 | 
			
		||||
  EVP_CIPHER_CTX *cipher_outctx;   /* Context of encrypted meta data that will be sent from us to him */
 | 
			
		||||
 | 
			
		||||
  EVP_CIPHER_CTX *cipher_pktctx;   /* Context of encrypted vpn packets that will be sent to him */
 | 
			
		||||
  EVP_CIPHER *cipher_pkttype;      /* Cipher type for encrypted vpn packets */ 
 | 
			
		||||
  char *cipher_pktkey;             /* Cipher key */
 | 
			
		||||
  char *cipher_pktkey;             /* Cipher key and iv */
 | 
			
		||||
  int cipher_pktkeylength;         /* Cipher key and iv length*/
 | 
			
		||||
 | 
			
		||||
  char *buffer;                    /* metadata input buffer */
 | 
			
		||||
  int buflen;                      /* bytes read into buffer */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										37
									
								
								src/net.c
									
										
									
									
									
								
							
							
						
						
									
										37
									
								
								src/net.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -17,7 +17,7 @@
 | 
			
		|||
    along with this program; if not, write to the Free Software
 | 
			
		||||
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
			
		||||
 | 
			
		||||
    $Id: net.c,v 1.35.4.54 2000/10/29 10:39:06 guus Exp $
 | 
			
		||||
    $Id: net.c,v 1.35.4.55 2000/10/29 22:10:42 guus Exp $
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -111,7 +111,9 @@ int xsend(conn_list_t *cl, vpn_packet_t *inpkt)
 | 
			
		|||
cp
 | 
			
		||||
  outpkt.len = inpkt->len;
 | 
			
		||||
  
 | 
			
		||||
  EVP_EncryptInit(&ctx, cl->cipher_pkttype, cl->cipher_pktkey, cl->cipher_pktkey);
 | 
			
		||||
  /* Encrypt the packet */
 | 
			
		||||
  
 | 
			
		||||
  EVP_EncryptInit(&ctx, cl->cipher_pkttype, cl->cipher_pktkey, cl->cipher_pktkey + cl->cipher_pkttype->key_len);
 | 
			
		||||
  EVP_EncryptUpdate(&ctx, outpkt.data, &outlen, inpkt->data, inpkt->len);
 | 
			
		||||
  EVP_EncryptFinal(&ctx, outpkt.data + outlen, &outpad);
 | 
			
		||||
  outlen += outpad + 2;
 | 
			
		||||
| 
						 | 
				
			
			@ -146,8 +148,11 @@ int xrecv(vpn_packet_t *inpkt)
 | 
			
		|||
  EVP_CIPHER_CTX ctx;
 | 
			
		||||
cp
 | 
			
		||||
  outpkt.len = inpkt->len;
 | 
			
		||||
  EVP_DecryptInit(&ctx, myself->cipher_pkttype, myself->cipher_pktkey, NULL);
 | 
			
		||||
  EVP_DecryptUpdate(&ctx, outpkt.data, &outlen, inpkt->data, inpkt->len);
 | 
			
		||||
 | 
			
		||||
  /* Decrypt the packet */
 | 
			
		||||
 | 
			
		||||
  EVP_DecryptInit(&ctx, myself->cipher_pkttype, myself->cipher_pktkey, myself->cipher_pktkey + myself->cipher_pkttype->key_len);
 | 
			
		||||
  EVP_DecryptUpdate(&ctx, outpkt.data, &outlen, inpkt->data, inpkt->len + 8);
 | 
			
		||||
  EVP_DecryptFinal(&ctx, outpkt.data + outlen, &outpad);
 | 
			
		||||
  outlen += outpad;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -156,6 +161,10 @@ cp
 | 
			
		|||
  memcpy(&outpkt, inpkt, outlen);
 | 
			
		||||
*/
 | 
			
		||||
     
 | 
			
		||||
  if(debug_lvl >= DEBUG_TRAFFIC)
 | 
			
		||||
    syslog(LOG_ERR, _("Writing packet of %d (%d) bytes to tap device"),
 | 
			
		||||
           outpkt.len, outlen);
 | 
			
		||||
 | 
			
		||||
  /* Fix mac address */
 | 
			
		||||
 | 
			
		||||
  memcpy(outpkt.data, mymac.net.mac.address.x, 6);
 | 
			
		||||
| 
						 | 
				
			
			@ -770,10 +779,12 @@ cp
 | 
			
		|||
 | 
			
		||||
  /* Generate packet encryption key */
 | 
			
		||||
 | 
			
		||||
  myself->cipher_pkttype = EVP_bf_cbc();
 | 
			
		||||
  myself->cipher_pkttype = EVP_bf_cfb();
 | 
			
		||||
 | 
			
		||||
  myself->cipher_pktkey = (char *)xmalloc(64);
 | 
			
		||||
  RAND_bytes(myself->cipher_pktkey, 64);
 | 
			
		||||
  myself->cipher_pktkeylength = myself->cipher_pkttype->key_len + myself->cipher_pkttype->iv_len;
 | 
			
		||||
 | 
			
		||||
  myself->cipher_pktkey = (char *)xmalloc(myself->cipher_pktkeylength);
 | 
			
		||||
  RAND_bytes(myself->cipher_pktkey, myself->cipher_pktkeylength);
 | 
			
		||||
 | 
			
		||||
  if(!(cfg = get_config_val(config, keyexpire)))
 | 
			
		||||
    keylifetime = 3600;
 | 
			
		||||
| 
						 | 
				
			
			@ -1041,6 +1052,7 @@ int handle_incoming_vpn_data()
 | 
			
		|||
  vpn_packet_t pkt;
 | 
			
		||||
  int x, l = sizeof(x);
 | 
			
		||||
  struct sockaddr from;
 | 
			
		||||
  int lenin;
 | 
			
		||||
  socklen_t fromlen = sizeof(from);
 | 
			
		||||
cp
 | 
			
		||||
  if(getsockopt(myself->socket, SOL_SOCKET, SO_ERROR, &x, &l) < 0)
 | 
			
		||||
| 
						 | 
				
			
			@ -1055,18 +1067,17 @@ cp
 | 
			
		|||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if(recvfrom(myself->socket, (char *) &(pkt.len), MTU, 0, &from, &fromlen) <= 0)
 | 
			
		||||
  if((lenin = recvfrom(myself->socket, (char *) &(pkt.len), MTU, 0, &from, &fromlen)) <= 0)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, _("Receiving packet failed: %m"));
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
  if(debug_lvl >= DEBUG_TRAFFIC)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_DEBUG, _("Received packet of %d bytes from %d.%d.%d.%d"), pkt.len,
 | 
			
		||||
             from.sa_addr[0], from.sa_addr[1], from.sa_addr[2], from.sa_addr[3]);
 | 
			
		||||
      syslog(LOG_DEBUG, _("Received packet of %d bytes"), lenin);
 | 
			
		||||
    } 
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
cp
 | 
			
		||||
  return xrecv(&pkt);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1362,7 +1373,7 @@ cp
 | 
			
		|||
              if(debug_lvl >= DEBUG_STATUS)
 | 
			
		||||
                syslog(LOG_INFO, _("Regenerating symmetric key"));
 | 
			
		||||
                
 | 
			
		||||
              RAND_bytes(myself->cipher_pktkey, 64);
 | 
			
		||||
              RAND_bytes(myself->cipher_pktkey, myself->cipher_pktkeylength);
 | 
			
		||||
              send_key_changed(myself, NULL);
 | 
			
		||||
              keyexpires = time(NULL) + keylifetime;
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,7 +17,7 @@
 | 
			
		|||
    along with this program; if not, write to the Free Software
 | 
			
		||||
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
			
		||||
 | 
			
		||||
    $Id: protocol.c,v 1.28.4.51 2000/10/29 10:39:08 guus Exp $
 | 
			
		||||
    $Id: protocol.c,v 1.28.4.52 2000/10/29 22:10:43 guus Exp $
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -471,7 +471,8 @@ cp
 | 
			
		|||
  cl->allow_request = ALL;
 | 
			
		||||
  cl->status.active = 1;
 | 
			
		||||
  cl->nexthop = cl;
 | 
			
		||||
  cl->cipher_pkttype = EVP_bf_cbc();
 | 
			
		||||
  cl->cipher_pkttype = EVP_bf_cfb();
 | 
			
		||||
  cl->cipher_pktkeylength = cl->cipher_pkttype->key_len + cl->cipher_pkttype->iv_len;
 | 
			
		||||
 | 
			
		||||
  if(debug_lvl >= DEBUG_CONNECTIONS)
 | 
			
		||||
    syslog(LOG_NOTICE, _("Connection with %s (%s) activated"), cl->name, cl->hostname);
 | 
			
		||||
| 
						 | 
				
			
			@ -1015,8 +1016,8 @@ cp
 | 
			
		|||
 | 
			
		||||
  if(!strcmp(to_id, myself->name))
 | 
			
		||||
    {
 | 
			
		||||
      bin2hex(myself->cipher_pktkey, pktkey, 64);
 | 
			
		||||
      pktkey[128] = 0;
 | 
			
		||||
      bin2hex(myself->cipher_pktkey, pktkey, myself->cipher_pktkeylength);
 | 
			
		||||
      pktkey[myself->cipher_pktkeylength*2] = '\0';
 | 
			
		||||
      send_ans_key(myself, from, pktkey);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
| 
						 | 
				
			
			@ -1028,7 +1029,15 @@ cp
 | 
			
		|||
          free(from_id); free(to_id);
 | 
			
		||||
          return -1;
 | 
			
		||||
        }
 | 
			
		||||
      send_req_key(from, to);
 | 
			
		||||
        
 | 
			
		||||
      if(to->status.validkey)	/* Proxy keys */
 | 
			
		||||
        {
 | 
			
		||||
          bin2hex(to->cipher_pktkey, pktkey, to->cipher_pktkeylength);
 | 
			
		||||
          pktkey[to->cipher_pktkeylength*2] = '\0';
 | 
			
		||||
          send_ans_key(to, from, pktkey);
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        send_req_key(from, to);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  free(from_id); free(to_id);
 | 
			
		||||
| 
						 | 
				
			
			@ -1068,9 +1077,9 @@ cp
 | 
			
		|||
 | 
			
		||||
  keylength = strlen(pktkey);
 | 
			
		||||
 | 
			
		||||
  if((keylength%2)!=0 || (keylength <= 0))
 | 
			
		||||
  if(keylength != from->cipher_pktkeylength*2)
 | 
			
		||||
    {
 | 
			
		||||
      syslog(LOG_ERR, _("Got bad ANS_KEY from %s (%s) origin %s: invalid key"),
 | 
			
		||||
      syslog(LOG_ERR, _("Got bad ANS_KEY from %s (%s) origin %s: invalid key length"),
 | 
			
		||||
             cl->name, cl->hostname, from->name);
 | 
			
		||||
      free(from_id); free(to_id); free(pktkey);
 | 
			
		||||
      return -1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										10
									
								
								src/tincd.c
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/tincd.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -17,7 +17,7 @@
 | 
			
		|||
    along with this program; if not, write to the Free Software
 | 
			
		||||
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
			
		||||
 | 
			
		||||
    $Id: tincd.c,v 1.10.4.19 2000/10/29 09:19:27 guus Exp $
 | 
			
		||||
    $Id: tincd.c,v 1.10.4.20 2000/10/29 22:10:44 guus Exp $
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "config.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -33,6 +33,7 @@
 | 
			
		|||
#include <signal.h>
 | 
			
		||||
#include <openssl/rand.h>
 | 
			
		||||
#include <openssl/rsa.h>
 | 
			
		||||
#include <openssl/err.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_SYS_IOCTL_H
 | 
			
		||||
| 
						 | 
				
			
			@ -436,10 +437,9 @@ main(int argc, char **argv, char **envp)
 | 
			
		|||
  if(detach())
 | 
			
		||||
    exit(0);
 | 
			
		||||
 | 
			
		||||
/* FIXME: wt* is this suppose to do?
 | 
			
		||||
  if(security_init())
 | 
			
		||||
    return 1;
 | 
			
		||||
*/
 | 
			
		||||
  if(debug_lvl >= DEBUG_ERROR)
 | 
			
		||||
    ERR_load_crypto_strings();
 | 
			
		||||
    
 | 
			
		||||
  for(;;)
 | 
			
		||||
    {
 | 
			
		||||
      if(!setup_network_connections())
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue