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]; }
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; }