示例#1
0
int main(int argc, char *argv[])
{
	unsigned char buf[BUF_SIZE];
	unsigned char newbuf[BUF_SIZE];
	char addrstr[INET_ADDRSTRLEN];
	int sd, newsd;
	ssize_t n;
	socklen_t len;
	struct sockaddr_in sa;
	
	if (argc != 2) {
		fprintf(stderr, "Usage: %s key\n", argv[0]);
		exit(1);
	}
	unsigned char key[KEY_SIZE];
	memcpy(key, argv[1], 16);
	
	memset(buf, 0, sizeof(buf));
	
	/* Make sure a broken connection doesn't kill us */
	signal(SIGPIPE, SIG_IGN);

	/* Create TCP/IP socket, used as main chat channel */
	if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
		perror("socket");
		exit(1);
	}
	fprintf(stderr, "Created TCP socket\n");

	/* Bind to a well-known port */
	memset(&sa, 0, sizeof(sa));
	sa.sin_family = AF_INET;
	sa.sin_port = htons(TCP_PORT);
	sa.sin_addr.s_addr = htonl(INADDR_ANY);
	if (bind(sd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
		perror("bind");
		exit(1);
	}
	fprintf(stderr, "Bound TCP socket to port %d\n", TCP_PORT);

	/* Listen for incoming connections */
	if (listen(sd, TCP_BACKLOG) < 0) {
		perror("listen");
		exit(1);
	}

	/* Loop forever, accept()ing connections */
	for (;;) {
		fprintf(stderr, "Waiting for an incoming connection...\n");

		/* Accept an incoming connection */
		len = sizeof(struct sockaddr_in);
		if ((newsd = accept(sd, (struct sockaddr *)&sa, &len)) < 0) {
			perror("accept");
			exit(1);
		}
		if (!inet_ntop(AF_INET, &sa.sin_addr, addrstr, sizeof(addrstr))) {
			perror("could not format IP address");
			exit(1);
		}
		fprintf(stderr, "Incoming connection from %s:%d\n",
			addrstr, ntohs(sa.sin_port));
		
		/* Initialize crypto device */
		int cfd;

		cfd = open("/dev/crypto", O_RDWR);
		if (cfd < 0) {
			perror("open(/dev/crypto)");
			exit(1);
		}
		
		struct session_op sess;
		struct crypt_op cryp;

		memset(&sess, 0, sizeof(sess));
		memset(&cryp, 0, sizeof(cryp));
		
		/*
		 * Use random values for the encryption key,
		 * the initialization vector (IV), and the
		 * data to be encrypted
		 */
		
		unsigned char iv[BLOCK_SIZE]="asdfghjklzxcvbnm";
		
		cryp.iv = iv;

		sess.key = key;
		
		/*
		 * Get crypto session for AES128
		 */
		sess.cipher = CRYPTO_AES_CBC;
		sess.keylen = KEY_SIZE;

		if (ioctl(cfd, CIOCGSESSION, &sess)) {
			perror("ioctl(CIOCGSESSION)");
			exit(1);
		}
		
		cryp.ses = sess.ses;
		cryp.len = BUF_SIZE;
	
		/* Start chating... */
		for (;;) {
			struct timeval timeout;
			timeout.tv_sec  = sec;
			timeout.tv_usec = msec;
			
			fd_set set;
			FD_ZERO(&set);
			FD_SET(newsd, &set);
			FD_SET(STDIN_FILENO, &set);

			int returned = select(newsd + 1, &set, NULL, NULL, &timeout);

			if ( returned > 0 ){
				if (FD_ISSET(newsd, &set)) {
					n = read(newsd, buf, sizeof(buf));
					if (n <= 0) {
						if (n < 0)
							perror("read from remote peer failed");
						else
							fprintf(stderr, "Peer went away\n");
						break;
					}
					
					/*
					 * Decrypt data
					 */
					cryp.src = buf;
					cryp.dst = newbuf;
					cryp.len = BUF_SIZE;
					cryp.op = COP_DECRYPT;
					if (ioctl(cfd, CIOCCRYPT, &cryp)) {
						perror("ioctl(CIOCCRYPT)");
						exit(1);
					}
					
					printf("Client: %s", newbuf);
				}
				if (FD_ISSET(STDIN_FILENO, &set)) {
					n = read(STDIN_FILENO, buf, sizeof(buf));
					
					/*
					 * Encrypt data.in to data.encrypted
					 */
					cryp.ses = sess.ses;
					cryp.src = buf;
					cryp.dst = newbuf;
					cryp.len = BUF_SIZE;
					//change iv////////////////////////////////
					cryp.op = COP_ENCRYPT;

					if (ioctl(cfd, CIOCCRYPT, &cryp)) {
						perror("ioctl(CIOCCRYPT)");
						exit(1);
					}
					
					if (insist_write(newsd, newbuf, BUF_SIZE) != BUF_SIZE) {
						perror("write to remote peer failed");
						break;
					}
				}
			}
			else if ( returned < 0 ) {
				perror("select failed!");
				exit(1);
			}

			memset(buf, 0, sizeof(buf));
		}
		/* Make sure we don't leak open files */
		if (close(newsd) < 0)
			perror("close");
			
		/* Finish crypto session */
		if (ioctl(cfd, CIOCFSESSION, &sess.ses)) {
			perror("ioctl(CIOCFSESSION)");
			return 1;
		}
		
		if (close(cfd) < 0) {
			perror("close(fd)");
			return 1;
		}
	}

	/* This will never happen */
	return 1;
}
示例#2
0
int main(int argc, char *argv[])
{
	int sd, port;
	ssize_t n;
	char buf[100];
	char *hostname;
	struct hostent *hp;
	struct sockaddr_in sa;

	fd_set socks;        /* Socket file descriptors we want to wake
			up for, using select() */

	if (argc != 3) {
		fprintf(stderr, "Usage: %s hostname port\n", argv[0]);
		exit(1);
	}
	hostname = argv[1];
	port = atoi(argv[2]); /* Needs better error checking */

	/* Create TCP/IP socket, used as main chat channel */
	if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
		perror("socket");
		exit(1);
	}
	fprintf(stderr, "Created TCP socket\n");
	
	/* Look up remote hostname on DNS */
	if ( !(hp = gethostbyname(hostname))) {
		printf("DNS lookup failed for host %s\n", hostname);
		exit(1);
	}

	/* Connect to remote TCP port */
	sa.sin_family = AF_INET;
	sa.sin_port = htons(port);
	memcpy(&sa.sin_addr.s_addr, hp->h_addr, sizeof(struct in_addr));
	fprintf(stderr, "Connecting to remote host... "); fflush(stderr);
	if (connect(sd, (struct sockaddr *) &sa, sizeof(sa)) < 0) {
		perror("connect");
		exit(1);
	}
	fprintf(stderr, "Connected.\n");

	/* Be careful with buffer overruns, ensure NUL-termination */
	//strncpy(buf, HELLO_THERE, sizeof(buf));
	//strncpy(buf, "First Message", sizeof(buf));
	//buf[sizeof(buf) - 1] = '\0';

	/* Say something to other side!!! */
	/*if (insist_write(sd, buf, strlen(buf)) != strlen(buf)) {
		perror("write");
		exit(1);
	}*/
	//fprintf(stdout, "I said:\n%s\nRemote says:\n", buf);
	//fflush(stdout);
	
	//printf("Before shutDown\n");	

	/*
	 * Let the remote know we're not going to write anything else.
	 * Try removing the shutdown() call and see what happens.
	 */
	/*if (shutdown(sd, SHUT_WR) < 0) {
		perror("shutdown");
		exit(1);
	}*/

	

	printf("Remote fd: %d, Local fd: %d\n",sd , 0 );

	printf("\n\nNew Session Started!!!\n\n\n");



	/* Read answer and write it to standard output */
	for (;;) {
		//printf("\n~~~~~~~~~~~~~~~~~~~~Client in loop again!!!!!!!!\n");
		
		 FD_ZERO(&socks);
		 FD_SET(sd,&socks);
		 FD_SET(STDIN_FILENO,&socks);
		 fprintf(stdout, "me: ");
		 fflush(stdout);
		 int readsocks = select(sd+1, &socks, NULL, NULL, NULL);

		 /* select() returns the number of sockets that had
			things going on with them -- i.e. they're readable. */
		
		/* Once select() returns, the original fd_set has been
			modified so it now reflects the state of why select()
			woke up. i.e. If file descriptor 4 was originally in
			the fd_set, and then it became readable, the fd_set
			contains file descriptor 4 in it. */
		
		if (readsocks < 0) {
			
			perror("select");
			exit(EXIT_FAILURE);
		}
		else{
				/* handle remote input */
				if (FD_ISSET(sd,&socks)){
					//printf("Checking remote buffer\n");
					n = read(sd, buf, sizeof(buf));
					if (n <= 0) {
						if (n < 0)
							perror("read from remote peer failed");
						else
							fprintf(stderr, "\nPeer went away...\n");
						break;
					}
					//toupper_buf(buf, n);
					fprintf(stdout, "\nRemote: ");
					fflush(stdout);
					if (insist_write(STDOUT_FILENO, buf, n) != n) {
						perror("write to local buff failed");
						break;
					}
				}
				else{ /* handle local-buffer */
					//printf("Checking local buffer\n");
					n = read(0, buf, sizeof(buf));
					if (n <= 0) {
						if (n < 0)
							perror("read from localy  failed");
						else
							fprintf(stderr, "I went away\n");
						break;
					}
					//toupper_buf(buf, n);
					if (insist_write(sd, buf, n) != n) {
						perror("write to remote  failed");
						break;

					}
					//printf("message sent\n");
				}

			  
			}

			

		
	}


	/* Make sure we don't leak open files */
	if (close(sd) < 0)
		perror("close");
	

	fprintf(stderr, "\nDone.\n");
	return 0;
}
示例#3
0
int main(int argv, char ** argc)
{
        int fd,cr;

        cr = open("/dev/cryptodev0", O_RDWR);
        if (cr < 0) {
                perror("open(/dev/cryptodev0)");
                return 1;
        }


        struct session_op sess;
        struct crypt_op cryp;

        memset(key,0,sizeof(key));
//      fprintf(stdout,"Give the key\n");
//      read(0,key,sizeof(key));
//      fprintf(stdout,"Give the iv\n");
        memset(iv,0,sizeof(iv));
//      read(0,iv,sizeof(iv));
        strcpy(key,"marios");
        strcpy(iv,"123");
        init(cr,&sess,key);
        char addrstr[INET_ADDRSTRLEN];
        int sd, newsd;
        ssize_t n;
        socklen_t len;
        struct sockaddr_un un;

        signal(SIGPIPE, SIG_IGN);

        if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
                perror("socket");
                exit(1);
        }
	unlink("encrypt.socket");
        fprintf(stderr, "Created Unix socket\n");

        memset(&un, 0, sizeof(un));
        un.sun_family = AF_UNIX;
        strcpy(un.sun_path,"encrypt.socket");
        int size = offsetof(struct sockaddr_un,sun_path) + strlen(un.sun_path) ;
        if (bind(fd, (struct sockaddr *)&un, size) < 0) {
                perror("bind");
                exit(1);
        }
        fprintf(stderr, "Bound unix socket\n");

        if (listen(fd, TCP_BACKLOG) < 0) {
                perror("listen");
                exit(1);
        }

        printf("accepted connection\n");

        if ((newsd = accept(fd, (struct sockaddr *)&un, &len)) < 0) {
                        perror("accept");
                        exit(1);
                }
        unsigned char buf[DATA_SIZE];
        memset(buf,0,sizeof(buf));
        for (;;) {

                n = read(newsd, buf, sizeof(buf));
                if (n <= 0) {
                        if (n < 0)
                                perror("read from remote peer failed");
                        else
                                fprintf(stderr, "Peer went away\n");
                        break;
                }

                test_crypto(cr,buf,n,&sess,&cryp);
                if (insist_write(newsd, res, 256) != 256) {
                        perror("write to remote peer failed");
                        break;
                }
                memset(buf,0,sizeof(buf));
        }

        if (ioctl(cr, CIOCFSESSION, &sess.ses)) {
                perror("ioctl(CIOCFSESSION)");
                return 1;
        }

        if (close(newsd) < 0)
                perror("close");

        if (close(cr) < 0) {
                perror("close(fd)");
                return 1;
        }
        return 0;
}
示例#4
0
文件: server.c 项目: dsarlis/OSLab
void server(unsigned char * key) {

	char addrstr[INET_ADDRSTRLEN];
    	socklen_t len;
	int sd, yes = 1, sd_max, curr_sd, cfd, ret, newsd;

    	struct sockaddr_in sa;

	struct client *clients = NULL, *ptr = NULL, *ptr2 = NULL;
			
	ssize_t n;
	fd_set readfds, master;
	struct timeval tv;
	struct session_op sess;
        struct crypt_op cryp;
	struct crypt_data data ; 
	/* Make sure a broken connection doesn't kill us */
    	signal(SIGPIPE, SIG_IGN);
   	/* Create TCP/IP socket, used as main chat channel */
    	if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
       		perror("socket");
        	exit(1);
 	}
 	fprintf(stderr, "Created TCP socket\n");
	
	setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));

 	/* Bind to a well-known port */
   	memset(&sa, 0, sizeof(sa));
  	sa.sin_family = AF_INET;
   	sa.sin_port = htons(TCP_PORT);
  	sa.sin_addr.s_addr = htonl(INADDR_ANY);
   	if (bind(sd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
     		perror("bind");
       		exit(1);
  	}
 	fprintf(stderr, "Bound TCP socket to port %d\n", TCP_PORT);

  	/* Listen for incoming connections */
 	if (listen(sd, TCP_BACKLOG) < 0) {
     		perror("listen");
      		exit(1);
    	}	

	memset(&sess, 0, sizeof(sess));
        memset(&cryp, 0, sizeof(cryp));
	memset(data.in,'\0', BUF_SIZE);
	memset(data.encin,'\0', BUF_SIZE);
	memset(data.encout,'\0', BUF_SIZE);
	memset(data.decrypted,'\0', BUF_SIZE);

        cfd = open("/dev/cryptodev0", O_RDWR);
	if (cfd < 0) {
		perror("open(/dev/cryptodev0)");
		exit(1);
	}
	if (fill_urandom_buf(data.iv, BLOCK_SIZE) < 0) {
                perror("getting data from /dev/urandom\n");
                exit(1);
        }

	/*
         * Get crypto session for AES128
         */
        sess.cipher = CRYPTO_AES_CBC;
        sess.keylen = KEY_SIZE;
        sess.key = key;
        if (ioctl(cfd, CIOCGSESSION, &sess)) {
                perror("ioctl(CIOCGSESSION)");
                exit(1);
        }

	cryp.ses = sess.ses;
	cryp.len = sizeof(data.in);
        cryp.iv = data.iv;
	sd_max = sd; 
	/* Clear the reading and master set */
	FD_ZERO(&master);
	FD_ZERO(&readfds);

    	/* Add the proper file descriptors to sets */
    	FD_SET(sd, &master);

	for (;;) {
		/* Determine a timeout parameter */
		tv.tv_sec = 100;
        	tv.tv_usec = 0;

		readfds = master;
        	ret = select(sd_max+1, &readfds, NULL, NULL, &tv);

        	if (ret == -1) {
            		perror("select");
            		exit(1);
        	}	
        	else if (ret == 0) {
            		fprintf(stderr, "Timeout occured! No data after 1000 seconds!\n");
			printf("Attention server shutting down!\n");
			goto out;
        	}
		else {
			if (FD_ISSET(sd, &readfds)) {
				fprintf(stderr, "Waiting for an incoming connection...\n");
				/* Accept an incoming connection */
   				len = sizeof(struct sockaddr_in);
   				if ((newsd = accept(sd, (struct sockaddr *)&sa, &len)) < 0) {
       					perror("accept");
      					exit(1);
  				}
				if (!inet_ntop(AF_INET, &sa.sin_addr, addrstr, sizeof(addrstr))) {
    					perror("could not format IP address");
       					exit(1);
  				}

				printf("[%s:%d] logged in.\n", addrstr, ntohs(sa.sin_port));
                                snprintf((char *) data.in, BUF_SIZE, "[%s:%d]: logged in.\n", addrstr, ntohs(sa.sin_port));
				/* encrypt data.in to data.encin */
				encrypt_data(cfd,&cryp,&data);

                                for (ptr = clients; ptr != NULL; ptr = ptr->next) {
                                        n = insist_write(ptr->sd, data.encin, BUF_SIZE);
                                }

				memset(data.in,'\0', BUF_SIZE);
                                memset(data.encin,'\0', BUF_SIZE);

				if (newsd > sd_max)
					sd_max = newsd;
				FD_SET(newsd, &master);
				clients = insert(clients, newsd, addrstr, sa.sin_port);
			}
			else {
				for (ptr = clients; ptr != NULL; ptr = ptr->next) {
					if (FD_ISSET(ptr->sd, &readfds)) {
						curr_sd = ptr->sd;
						n = insist_read(curr_sd, data.encout, BUF_SIZE);
                				if (n < 0){
                    					perror("read from remote peer failed");
                    					exit(1);
                				}
                				if (n == 0) {
                    					printf("[%s:%d] logged out.\n", ptr->addr, ntohs(ptr->port));
							snprintf((char *) data.in, BUF_SIZE, "[%s:%d]: logged out.\n", ptr->addr, ntohs(ptr->port));
								
							encrypt_data(cfd,&cryp,&data);

							for (ptr2 = clients; ptr2 != NULL; ptr2=ptr2->next) {
								if (curr_sd != ptr2->sd) {
									n = insist_write(ptr2->sd, data.encin, BUF_SIZE);
								}								
							}
							memset(data.in,'\0', BUF_SIZE);
                                                        memset(data.encin,'\0', BUF_SIZE);
						
							FD_CLR(curr_sd, &master);
							clients = delete(clients, curr_sd);
							if (close(curr_sd) < 0) {
								perror("close");
								exit(1);
							}
							continue;
                				}
						if (n != BUF_SIZE) {
                                        		fprintf(stderr, "Unexpected short read!\n");
                                        		exit(1);
                                		}

						snprintf((char *) data.in, BUF_SIZE, "[%s:%d]: ", ptr->addr, ntohs(ptr->port));	
						encrypt_data(cfd,&cryp,&data);
						
						for (ptr2 = clients; ptr2 != NULL; ptr2=ptr2->next) {
							n = insist_write(ptr2->sd, data.encin, BUF_SIZE);
							n = insist_write(ptr2->sd, data.encout, BUF_SIZE);								
						}
						memset(data.in,'\0', BUF_SIZE);
                                                memset(data.encin,'\0', BUF_SIZE);
                                                memset(data.encout, '\0', BUF_SIZE);						
					}
				}
			}
		}
	}

 	if (close(sd) < 0) {
      		perror("close");
		exit(1);	
	}

out:
	if (ioctl(cfd, CIOCFSESSION, &sess.ses)) {
        	perror("ioctl(CIOCFSESSION)");
       		exit(1);
    	}

	exit(0);
}
示例#5
0
int main(void)
{
	char addrstr[INET_ADDRSTRLEN];
	int sd, newsd;
	ssize_t n;
	socklen_t len;
	struct sockaddr_in sa;

	fd_set socks;        /* Socket file descriptors we want to wake
			up for, using select() */
	
	/* Make sure a broken connection doesn't kill us */
	signal(SIGPIPE, SIG_IGN);


	/* encryption */

	int i;	
	int crypto_fd;
	unsigned char buf[DATA_SIZE], encrypted[DATA_SIZE], decrypted[DATA_SIZE];
	unsigned char *key = "0123456789abcdef";
	unsigned char *iv = "0123456789abcdef";
	struct session_op sess;
	struct crypt_op cryp;

	memset(&sess, 0, sizeof(sess));
	memset(&cryp, 0, sizeof(cryp));

	/* encryption */

	/* Create TCP/IP socket, used as main chat channel */
	if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
		perror("socket");
		exit(1);
	}
	fprintf(stderr, "Created TCP socket\n");

	/* Bind to a well-known port */
	memset(&sa, 0, sizeof(sa));
	sa.sin_family = AF_INET;
	sa.sin_port = htons(TCP_PORT);
	sa.sin_addr.s_addr = htonl(INADDR_ANY);
	if (bind(sd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
		perror("bind");
		exit(1);
	}
	fprintf(stderr, "Bound TCP socket to port %d\n", TCP_PORT);

	/* Listen for incoming connections */
	if (listen(sd, TCP_BACKLOG) < 0) {
		perror("listen");
		exit(1);
	}

	/* Loop forever, accept()ing connections */
	for (;;) {
		fprintf(stderr, "Waiting for an incoming connection...\n");

		/* Accept an incoming connection */
		len = sizeof(struct sockaddr_in);
		if ((newsd = accept(sd, (struct sockaddr *)&sa, &len)) < 0) {
			perror("accept");
			exit(1);
		}
		if (!inet_ntop(AF_INET, &sa.sin_addr, addrstr, sizeof(addrstr))) {
			perror("could not format IP address");
			exit(1);
		}
		fprintf(stderr, "Incoming connection from %s:%d\n",
			addrstr, ntohs(sa.sin_port));

		

		printf("Remote fd: %d, Local fd: %d\n",newsd , STDIN_FILENO );

		printf("\n\nNew Session Started!!!\n\n\n");

		crypto_fd = open("/dev/crypto", O_RDWR);
		if (crypto_fd < 0) {
			perror("open(/dev/crypto)");
			return 1;
		}
		else {
			printf("encrypted connection established\n");
		}
		/* We break out of the loop when the remote peer goes away */
		for (;;) {

			//printf("ok in loop again\n");
			FD_ZERO(&socks);
			FD_SET(newsd,&socks);
			FD_SET(STDIN_FILENO,&socks);
			fprintf(stdout, "me: ");
			fflush(stdout);
			int readsocks = select(newsd+1, &socks, NULL, NULL, NULL);  //&except_socks

			/* select() returns the number of sockets that had
				things going on with them -- i.e. they're readable. */
			
			/* Once select() returns, the original fd_set has been
				modified so it now reflects the state of why select()
				woke up. i.e. If file descriptor 4 was originally in
				the fd_set, and then it became readable, the fd_set
				contains file descriptor 4 in it. */
			//printf("readsocks = %d \n", readsocks);	
			if (readsocks < 0) {
				perror("select");
				exit(EXIT_FAILURE);
			} 
			else{
				/*
				 * Get crypto session for AES128
				 */

				/* handle remote input */
				if (FD_ISSET(newsd,&socks)){
					/*
					 * Get crypto session for AES128
					 */
				
					sess.cipher = CRYPTO_AES_CBC;
					sess.keylen = KEY_SIZE;
					sess.key = key;

					if (ioctl(crypto_fd, CIOCGSESSION, &sess)) {
						perror("ioctl(CIOCGSESSION)");
						return 1;
					}
					//printf("Checking remote buffer\n");
					n = read(newsd, buf, sizeof(buf));
					if (n <= 0) {
						if (n < 0)
							perror("read from remote peer failed");
						else
							fprintf(stderr, "\nPeer went away...\n");
						break;
					}

					cryp.ses = sess.ses;
					cryp.len = sizeof(buf);
					cryp.src = buf;
					cryp.dst = decrypted;
					cryp.iv = iv;
					cryp.op = COP_DECRYPT;

					if (ioctl(crypto_fd, CIOCCRYPT, &cryp)) {
						perror("ioctl(CIOCCRYPT)");
						return 1;
					}

					fprintf(stdout, "\nRemote: ");
					fflush(stdout);
					/*if (insist_write(STDOUT_FILENO, buf, n) != n) {
						perror("write to local buff failed");
						break;
					}*/

					for (i = 0; i < n; i++) {
						if (decrypted[i] == '\n')
							break;			
						else
							printf("%c", decrypted[i]);
					}
					printf("\n");

					
				}
				else{ /* handle local-buffer */

					/*
					 * Get crypto session for AES128
					 */
				
					sess.cipher = CRYPTO_AES_CBC;
					sess.keylen = KEY_SIZE;
					sess.key = key;

					if (ioctl(crypto_fd, CIOCGSESSION, &sess)) {
						perror("ioctl(CIOCGSESSION)");
						return 1;
					}

					//printf("Checking local buffer\n");
					n = read(0, buf, sizeof(buf));
					if (n <= 0) {
						if (n < 0)
							perror("read from localy failed");
						else
							fprintf(stderr, "I went away\n");
						break;
					}

					cryp.ses = sess.ses;
					cryp.len = sizeof(buf);
					cryp.src = buf;
				        cryp.dst = encrypted;
					cryp.iv = iv;
					cryp.op = COP_ENCRYPT;

					if (ioctl(crypto_fd, CIOCCRYPT, &cryp)) {
						perror("ioctl(CIOCCRYPT)");
						return 1;
					}
	
					if (insist_write(newsd, encrypted, sizeof(encrypted)) != sizeof(encrypted)) {
						perror("write to remote failed");
						break;

					}
					//printf("ok i send the message to remote \n");
				}
			}
			
			/* Finish crypto session */
			if (ioctl(crypto_fd, CIOCFSESSION, &sess.ses)) {
				perror("ioctl(CIOCFSESSION)");
				return 1;
			}

		}
		/* Make sure we don't leak open files */
		if (close(newsd) < 0)
			perror("close");



		if (close(crypto_fd) < 0) {
			perror("close(crypto_fd)");
			return 1;
		}
	}

	/* This will never happen */
	return 1;
}
示例#6
0
int main(int argc, char *argv[])
{
	int sd, port;
	ssize_t n;
	char buf[100];
	char *hostname;
	struct hostent *hp;
	struct sockaddr_in sa;

	if (argc != 3) {
		fprintf(stderr, "Usage: %s hostname port\n", argv[0]);
		exit(1);
	}
	hostname = argv[1];
	port = atoi(argv[2]); /* Needs better error checking */

	/* Create TCP/IP socket, used as main chat channel */
	if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
		perror("socket");
		exit(1);
	}
	fprintf(stderr, "Created TCP socket\n");
	
	/* Look up remote hostname on DNS */
	if ( !(hp = gethostbyname(hostname))) {
		printf("DNS lookup failed for host %s\n", hostname);
		exit(1);
	}

	/* Connect to remote TCP port */
	sa.sin_family = AF_INET;
	sa.sin_port = htons(port);
	memcpy(&sa.sin_addr.s_addr, hp->h_addr, sizeof(struct in_addr));
	fprintf(stderr, "Connecting to remote host... "); fflush(stderr);
	if (connect(sd, (struct sockaddr *) &sa, sizeof(sa)) < 0) {
		perror("connect");
		exit(1);
	}
	fprintf(stderr, "Connected.\n");

	/* Be careful with buffer overruns, ensure NUL-termination */
	strncpy(buf, HELLO_THERE, sizeof(buf));
	buf[sizeof(buf) - 1] = '\0';

	/* Say something... */
	if (insist_write(sd, buf, strlen(buf)) != strlen(buf)) {
		perror("write");
		exit(1);
	}
	fprintf(stdout, "I said:\n%s\nRemote says:\n", buf);
	fflush(stdout);

	/*
	 * Let the remote know we're not going to write anything else.
	 * Try removing the shutdown() call and see what happens.
	 */
	if (shutdown(sd, SHUT_WR) < 0) {
		perror("shutdown");
		exit(1);
	}

	/* Read answer and write it to standard output */
	for (;;) {
		n = read(sd, buf, sizeof(buf));

		if (n < 0) {
			perror("read");
			exit(1);
		}

		if (n <= 0)
			break;

		if (insist_write(0, buf, n) != n) {
			perror("write");
			exit(1);
		}
	}

	fprintf(stderr, "\nDone.\n");
	return 0;
}