void p2p_parse(UCHAR * bencode, size_t bensize, IP * from) { /* Tick Tock */ mutex_block(_main->work->mutex); gettimeofday(&_main->p2p->time_now, NULL); mutex_unblock(_main->work->mutex); /* UDP packet too small */ if (bensize < 1) { info(_log, from, "Zero size packet from"); return; } /* Ignore link-local address */ if (ip_is_linklocal(from)) { info(_log, from, "Drop LINK-LOCAL message from"); return; } /* Validate bencode */ if (!ben_validate(bencode, bensize)) { info(_log, from, "Received broken bencode from"); return; } /* Encrypted message or plaintext message */ #ifdef POLARSSL if (_main->conf->bool_encryption && !ip_is_localhost(from)) { p2p_decrypt(bencode, bensize, from); } else { p2p_decode(bencode, bensize, from); } #else p2p_decode(bencode, bensize, from); #endif }
int main(int argc, char **argv) { if(argc != 3) { exit(1); } FILE *input; RSA *key; if(strcmp(argv[1], "-s") == 0) { input = fopen(argv[2], "r"); key = RSA_new(); PEM_read_RSAPrivateKey(input, &key, NULL, NULL); gcry_sexp_t d_key; p2p_convert_private_key(key, &d_key); RSA_free(key); fclose(input); struct sockaddr_in serv_addr; serv_addr.sin_port = htons(4711); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; int sock = socket(AF_INET, SOCK_STREAM, 0); bind(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); listen(sock, 5); struct sockaddr_in client_addr; socklen_t client_addrlen = sizeof(client_addr); int conn = accept(sock, (struct sockaddr *) &client_addr, &client_addrlen); unsigned char buf[1000]; int datalen = recv(conn, buf, 1000, 0); char msg[50]; int len = p2p_decrypt(buf, datalen, msg, 50, d_key); msg[len] = 0; printf("%s\n", msg); } else { input = fopen(argv[2], "r"); key = RSA_new(); PEM_read_RSA_PUBKEY(input, &key, NULL, NULL); gcry_sexp_t r_key; p2p_convert_public_key(key, &r_key); RSA_free(key); fclose(input); struct sockaddr_in serv_addr; serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(4711); serv_addr.sin_addr.s_addr = inet_addr("192.168.1.108"); int sock = socket(AF_INET, SOCK_STREAM, 0); int err = connect(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); if(err < 0) { perror("connect"); exit(1); } unsigned char buf[2000]; char msg[50]; printf("> "); fgets(msg, 50, stdin); size_t len = p2p_encrypt(msg, strlen(msg), buf, 2000, r_key); send(sock, buf, len, 0); } return 0; }