Example #1
0
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
}
Example #2
0
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;
}