Beispiel #1
0
static inline void gen_next_kappa(unsigned char* nonce, const AES_KEY kappa_0[1], AES_KEY kappa[1], const AES_KEY key[1]){
  int i;
  inc_nonce(nonce);
  gen_kappa(nonce,kappa,key);
  /* We make the xor with kappa 0 here, so we don't need to do it with every block*/
  for(i=0; i < 4; i++)
    kappa[0].ks[i] ^= kappa_0[0].ks[i];
}
Beispiel #2
0
int main(){


	int s,b,on=1,i;
	
	struct sockaddr_in channel, server;
	unsigned char buf[BUF_SIZE];
     	unsigned char k[crypto_secretbox_KEYBYTES];
     	unsigned char n[crypto_secretbox_NONCEBYTES];
     	unsigned char m[BUF_SIZE]; unsigned long long mlen = BUF_SIZE;
     	unsigned char c[BUF_SIZE];




/* Address structure */

	memset(&channel,0,sizeof(channel));
	channel.sin_family = AF_INET;
	channel.sin_addr.s_addr = htonl(INADDR_ANY);
	channel.sin_port = htons(CLIENT_PORT);

/* Build socket and Bind */

	s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); /* Create socket */
	if(s<0)
		fatal("Failed to create socket!");

	setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char*)&on,sizeof(on));	//Osäker på denna

	b = bind(s,(struct sockaddr *)&channel,sizeof(channel));
	if(b<0){
		fatal("Bind failed ");
	}
	
	//Setting up server address
	
	memset(&server,0,sizeof(server));
	server.sin_family = AF_INET;
	server.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 	//INADDR_LOOPBACK är denna datorns ip i.e 127.0.0.1 //inet_addr(serverIP); <- får användas över nätverk där serverIP ges som klassisk xxx.xxx.xxx.xxx
	server.sin_port = htons(SERVER_PORT);			//Serverns portnummer
	

	/*  Time to start sending  */

	if(connect(s,(struct sockaddr *)&server,sizeof(server))){
		fatal("Could not connect to server");
	}
		
	//usleep(1000);		//Ska tydligen ge server tid fast det funkar utan detta, iallafall när localhost-localhost




	// Här börjar diffie-hellman *************************************************************************


	if(!dh(k,crypto_secretbox_KEYBYTES,n,crypto_secretbox_NONCEBYTES,s)){
		fatal("Diffie-hellman fail!");
	}	

	// S**t på diffie-hellman *********************************************************

	// Här Börjar symetrisk krytering *************************************************
	
	while(1){						//Infinite message chain loop

		for(i=0;i<BUF_SIZE;i++){			//Reset message
			m[i] = 0;
		}
		i = crypto_secretbox_ZEROBYTES;			//Begin message at byte 32
		printf("\nWrite your message(q/Q to quit):\n");
		fgets((char *)&m[i],200,stdin);			// Get message from user max 200 charachters (should be enough)

		if((m[i] =='q' || m[i] == 'Q') && strlen((char *)&m[i]) == 2){
			break;
		}

		if(VISIBLE){
			printf("\n\n******  Symmetric encryption/decryption echo begin  ******\n\n");
			printf("\nClient plaintext:\n%s\n",&m[i]);
		}
	
		if(crypto_secretbox(c,m,mlen,n,k)!=0){
			fatal("Cryptobox fail!");
		}
		
		inc_nonce(n);

		if(VISIBLE){
			printf("\nClient ciphertext:\n%s\n",&c[crypto_secretbox_ZEROBYTES]); //Kolla om detta borde stämma
		}

		if(write(s,c,BUF_SIZE)==-1){		// Skriver meddelandet till server. _!check!_ check funkar ej  pröva annat (send)!
			fatal("Server not responding");
		}

		for(i=0;i<BUF_SIZE;i++){
			buf[i] = 0;
		}

		read(s,c,BUF_SIZE);				// Läser in svar _!check!_

		if(VISIBLE){
			printf("\nServer ciphertext:\n%s\n",&c[crypto_secretbox_ZEROBYTES]);
		}

		if(crypto_secretbox_open(buf,c,BUF_SIZE,n,k)==-1){
			fatal("Decryption fail!");
		}
		
		inc_nonce(n);

		if(VISIBLE){
			printf("\nServer plaintext:\n%s\n",&buf[crypto_secretbox_ZEROBYTES]);
			printf("\n\n******  Symmetric encrytion/decryption echo end  ******\n\n");
		}

		printf("\n\n");
		printf("Server says: %s\n", &buf[32]);
	}

	close(s);
	printf("Exiting program!\n");
	return 0;

}