void encrypt_stdio(char* key) { rc4_state_t *state = (rc4_state_t*) malloc(sizeof(rc4_state_t)); rc4_initialize(state, key, strlen(key)); char to_encrypt; char encrypted; clearerr(stdin); while( !feof(stdin) ) { to_encrypt = getchar(); rc4_cipher(state, &to_encrypt, &encrypted, sizeof(char)); printf("%c", encrypted); } }
static int dev_xmit(struct netdev* dev,struct socket *sk) { fd_set in; int ret,maxfd; struct mbuf mb; struct rc4_context ctx; rc4_prepare_shared_key(&ctx,shr_key); memset(&mb,0,sizeof(struct mbuf)); mb.mb_data = (u_int8_t*)malloc(dev->nd_mtu * sizeof(u_int8_t)); if(!mb.mb_data) { perror("dev_xmit:malloc"); return -1; } memset(mb.mb_data,0,sizeof(dev->nd_mtu*sizeof(u_int8_t))); printf("[+] Connected ... OK\n"); FD_ZERO(&in); maxfd = (sk->sk_fd > dev->nd_fd)? sk->sk_fd:dev->nd_fd; for(;;) { FD_SET(dev->nd_fd,&in); FD_SET(sk->sk_fd,&in); ret = select(maxfd+1,&in,NULL,NULL,NULL); if(ret == -1 || errno == EINTR) continue; /* we got something from tun/tap inetface */ if(FD_ISSET(dev->nd_fd,&in)) { mb.mb_len = read(dev->nd_fd,mb.mb_data,dev->nd_mtu); if(mb.mb_len == 0) break; if(mb.mb_len < 0) { if(verbose) perrx("[-] TAP read error"); goto bad; } rc4_cipher(mb.mb_data,mb.mb_len,&ctx); if (verbose) printf("[+] Received %d bytes from %s \n", (unsigned int)mb.mb_len,dev->nd_name); mb.mb_len = write(sk->sk_fd,mb.mb_data,mb.mb_len); if(mb.mb_len <= 0) { if(verbose) perrx("[-] TAP write error"); goto bad; } } if(FD_ISSET(sk->sk_fd,&in)) { mb.mb_len = read(sk->sk_fd,mb.mb_data,dev->nd_mtu); if(mb.mb_len == 0) break; if(mb.mb_len < 0) { if(verbose) perrx("[-] Socket read error\n"); goto bad; } if (verbose) printf("[+] Received %d bytes from socket\n",(unsigned int)mb.mb_len); rc4_cipher(mb.mb_data,mb.mb_len,&ctx); mb.mb_len = write(dev->nd_fd,mb.mb_data,mb.mb_len); if(mb.mb_len <= 0) { if(verbose) perrx("[-] Socket write error"); goto bad; } } } return 0; bad: close(sk->sk_fd); close(dev->nd_fd); if(mb.mb_data) free(mb.mb_data); return -1; }