#include #include #include #include #include #include #include #include #include #include #include "feistel.c" #define SETLOCALINFO bind #define SETPEERINFO connect #define LISTENPORT 40004 #define KEYSIZE 128 #define NSIZE 32 void readkey(char *keyname, unsigned char key[KEYSIZE]) { int infd, n; char filename[NSIZE+4]; sprintf(filename,"%s.key",keyname); infd = open(filename,O_RDONLY,0); n = 0; while (n1) s = atoi(argv[1]); srand(s); // seed random number generator printf("RKS (C) server started, using random seed %d\n",s); int sockfd, i, x, y,result, mlen; unsigned int plen; unsigned char Aname[NSIZE]; unsigned char AK[KEYSIZE]; unsigned char newAK[KEYSIZE]; unsigned char outbuf[KEYSIZE+NSIZE]; unsigned char inbuf[NSIZE]; unsigned char nbuf[NSIZE]; struct sockaddr_in peeraddr; // client addr struct sockaddr_in myaddr; // "sever" addr struct sockaddr_in caddr; // copy of original client addr sockfd = socket(AF_INET,SOCK_DGRAM,0); // gets udp over ipv4 socket myaddr.sin_family = AF_INET; myaddr.sin_addr.s_addr = htonl(INADDR_ANY); // accept from any source ip myaddr.sin_port = htons(LISTENPORT); plen = sizeof(peeraddr); mlen = sizeof(myaddr); bind(sockfd,(struct sockaddr *)&myaddr,mlen); // bind still needed. // Can't receive packets until other side is ready: //printf("press a key to begin: "); getchar(); result = recvfrom(sockfd,Aname,NSIZE,0,(struct sockaddr*)&peeraddr,&plen); printf("RKS (C) request from %s at %s\n",Aname,inet_ntoa(peeraddr.sin_addr)); memcpy(&caddr,&peeraddr,plen); // save a copy of client address readkey(Aname,AK); genkey(newAK); keycrypt(AK,newAK,KEYSIZE,outbuf,0); // AK(newAK) keycrypt(AK,Aname,NSIZE,outbuf+KEYSIZE,0); // AK(Aname); result = sendto(sockfd,outbuf,KEYSIZE+NSIZE,0,(struct sockaddr*)&peeraddr,plen); // send back to peeraddr as determined by receive do { result = recvfrom(sockfd,nbuf,NSIZE,0,(struct sockaddr*)&peeraddr,&plen); x = peeraddr.sin_addr.s_addr == caddr.sin_addr.s_addr; y = peeraddr.sin_port == caddr.sin_port; } while (!x || !y); // why need? keycrypt(newAK,nbuf,NSIZE,inbuf,1); // decrypt newAK(Aname); result = strcmp(Aname,inbuf); if (result==0) // name same { savenewkey(Aname,AK,newAK); printf("new key for %s saved\n",Aname); } else printf("decrypted client name %s not authentic\n",inbuf); close(sockfd); // only have local meaning - no packets exchanged. return 0; }//main // goto https://www.gta.ufrj.br/ensino/eel878/sockets/sockaddr_inman.html // for info on sockaddr_in contents