static int handle_ping_response(void *_dht, IP_Port source, size_t *packet, size_t length) { DHT *dht = _dht; int rc; size_t ping_id; if (length != DHT_PING_SIZE) return 1; PING *ping = dht->ping; if (id_equal(packet + 1, ping->dht->self_public_key)) return 1; // Decrypt ping_id rc = decrypt_data(packet + 1, ping->dht->self_secret_key, packet + 1 + CLIENT_ID_SIZE, packet + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES, sizeof(ping_id) + crypto_box_MACBYTES, (size_t *) &ping_id); if (rc != sizeof(ping_id)) return 1; /* Make sure ping_id is correct. */ int ping_index = is_pinging(ping, source, ping_id); if (!ping_index) return 1; addto_lists(dht, source, packet + 1); return 0; }
int handle_ping_response(uint8_t* packet, uint32_t length, IP_Port source) { pingres_t* p = (pingres_t*) packet; int rc; uint64_t ping_id; if (length != sizeof(pingres_t) || id_eq(&p->client_id, self_id)) return 1; // Decrypt ping_id rc = decrypt_data((uint8_t*) &p->client_id, self_secret_key, (uint8_t*) &p->nonce, (uint8_t*) &p->ping_id, sizeof(ping_id) + ENCRYPTION_PADDING, (uint8_t*) &ping_id); if (rc != sizeof(ping_id)) return 1; // Make sure ping_id is correct if(!is_pinging(source, ping_id)) return 1; // Associate source ip with client_id addto_lists(source, (uint8_t*) &p->client_id); return 0; }
int send_ping_request(PING *ping, IP_Port ipp, size_t *client_id) { size_t pk[DHT_PING_SIZE]; int rc; size_t ping_id; if (is_pinging(ping, ipp, 0) || id_equal(client_id, ping->dht->self_public_key)) return 1; // Generate random ping_id. ping_id = add_ping(ping, ipp); pk[0] = NET_PACKET_PING_REQUEST; id_copy(pk + 1, ping->dht->self_public_key); // Our pubkey new_nonce(pk + 1 + CLIENT_ID_SIZE); // Generate new nonce // Encrypt ping_id using recipient privkey rc = encrypt_data(client_id, ping->dht->self_secret_key, pk + 1 + CLIENT_ID_SIZE, (size_t *) &ping_id, sizeof(ping_id), pk + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES); if (rc != sizeof(ping_id) + crypto_box_MACBYTES) return 1; return sendpacket(ping->dht->net, ipp, pk, sizeof(pk)); }
int handle_pingres(uint8_t * packet, uint32_t length, IP_Port source) { uint64_t ping_id; if(length != 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES + sizeof(ping_id) + ENCRYPTION_PADDING) { return 1; } if(memcmp(packet + 1, self_public_key, CLIENT_ID_SIZE) == 0)//check if packet is from ourself. { return 1; } int len = decrypt_data(packet + 1, self_secret_key, packet + 1 + CLIENT_ID_SIZE, packet + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES, sizeof(ping_id) + ENCRYPTION_PADDING, (uint8_t *)&ping_id); if(len != sizeof(ping_id)) { return 1; } if(is_pinging(source, ping_id)) { addto_lists(source, packet + 1); return 0; } return 1; }
int send_ping_request(IP_Port ipp, clientid_t* client_id) { pingreq_t pk; int rc; uint64_t ping_id; if (is_pinging(ipp, 0) || id_eq(client_id, self_id)) return 1; // Generate random ping_id ping_id = add_ping(ipp); pk.magic = PACKET_PING_REQ; id_cpy(&pk.client_id, self_id); // Our pubkey random_nonce((uint8_t*) &pk.nonce); // Generate random nonce // Encrypt ping_id using recipient privkey rc = encrypt_data((uint8_t*) client_id, self_secret_key, (uint8_t*) &pk.nonce, (uint8_t*) &ping_id, sizeof(ping_id), (uint8_t*) &pk.ping_id); if (rc != sizeof(ping_id) + ENCRYPTION_PADDING) return 1; return sendpacket(ipp, (uint8_t*) &pk, sizeof(pk)); }
static int handle_ping_response(void *_dht, IP_Port source, uint8_t *packet, uint32_t length) { DHT *dht = _dht; int rc; uint64_t ping_id; if (length != DHT_PING_SIZE) return 1; PING *ping = dht->ping; if (id_eq(packet + 1, ping->c->self_public_key)) return 1; // Decrypt ping_id rc = decrypt_data(packet + 1, ping->c->self_secret_key, packet + 1 + CLIENT_ID_SIZE, packet + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES, sizeof(ping_id) + ENCRYPTION_PADDING, (uint8_t *) &ping_id); if (rc != sizeof(ping_id)) return 1; /* Make sure ping_id is correct. */ if (!is_pinging(ping, source, ping_id)) return 1; // Associate source ip with client_id addto_lists(dht, source, packet + 1); return 0; }
int handle_pingres(char * packet, uint32_t length, IP_Port source) { if(length != (5 + CLIENT_ID_SIZE)) { return 1; } uint32_t ping_id; memcpy(&ping_id, packet + 1, 4); if(is_pinging(source, ping_id)) { addto_lists(source, packet + 5); return 0; } return 1; }
//send a ping request //Ping request only works if none has been sent to that ip/port in the last 5 seconds. int pingreq(IP_Port ip_port) { if(is_pinging(ip_port, 0)) { return 1; } int ping_id = add_pinging(ip_port); if(ping_id == 0) { return 1; } char data[5 + CLIENT_ID_SIZE]; data[0] = 0; memcpy(data + 1, &ping_id, 4); memcpy(data + 5, self_client_id, CLIENT_ID_SIZE); return sendpacket(ip_port, data, sizeof(data)); }
int handle_pingreq(char * packet, uint32_t length, IP_Port source)//tested { if(length != 5 + CLIENT_ID_SIZE) { return 1; } uint32_t ping_id; memcpy(&ping_id, packet + 1, 4); IP_Port bad_ip = {{{0}}, 0}; if(is_pinging(bad_ip, ping_id))//check if packet is from ourself. { return 1; } pingres(source, ping_id); pingreq(source); return 0; }
//send a ping request //Ping request only works if none has been sent to that ip/port in the last 5 seconds. static int pingreq(IP_Port ip_port, uint8_t * public_key) { if(memcmp(public_key, self_public_key, CLIENT_ID_SIZE) == 0)//check if packet is gonna be sent to ourself { return 1; } if(is_pinging(ip_port, 0)) { return 1; } uint64_t ping_id = add_pinging(ip_port); if(ping_id == 0) { return 1; } uint8_t data[1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES + sizeof(ping_id) + ENCRYPTION_PADDING]; uint8_t encrypt[sizeof(ping_id) + ENCRYPTION_PADDING]; uint8_t nonce[crypto_box_NONCEBYTES]; random_nonce(nonce); int len = encrypt_data(public_key, self_secret_key, nonce, (uint8_t *)&ping_id, sizeof(ping_id), encrypt); if(len != sizeof(ping_id) + ENCRYPTION_PADDING) { return -1; } data[0] = 0; memcpy(data + 1, self_public_key, CLIENT_ID_SIZE); memcpy(data + 1 + CLIENT_ID_SIZE, nonce, crypto_box_NONCEBYTES); memcpy(data + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES, encrypt, len); return sendpacket(ip_port, data, sizeof(data)); }