Bug fixed, Loading and saving added to core.

This commit is contained in:
irungentoo 2013-07-17 12:07:19 -04:00
parent ffa809b379
commit 4864cb9edb
4 changed files with 142 additions and 13 deletions

View File

@ -280,6 +280,7 @@ static void doFriends()
break; break;
case 4: case 4:
crypto_kill(friendlist[i].crypt_connection_id); crypto_kill(friendlist[i].crypt_connection_id);
friendlist[i].crypt_connection_id = -1;
break; break;
default: default:
break; break;
@ -300,6 +301,7 @@ static void doFriends()
if(is_cryptoconnected(friendlist[i].crypt_connection_id) == 4)//if the connection timed out, kill it if(is_cryptoconnected(friendlist[i].crypt_connection_id) == 4)//if the connection timed out, kill it
{ {
crypto_kill(friendlist[i].crypt_connection_id); crypto_kill(friendlist[i].crypt_connection_id);
friendlist[i].crypt_connection_id = -1;
friendlist[i].status = 3; friendlist[i].status = 3;
} }
break; break;
@ -333,6 +335,7 @@ static void doInbound()
int friend_id = getfriend_id(public_key); int friend_id = getfriend_id(public_key);
if(friend_id != -1) if(friend_id != -1)
{ {
crypto_kill(friendlist[friend_id].crypt_connection_id);
friendlist[friend_id].crypt_connection_id = friendlist[friend_id].crypt_connection_id =
accept_crypto_inbound(inconnection, public_key, secret_nonce, session_key); accept_crypto_inbound(inconnection, public_key, secret_nonce, session_key);
@ -362,7 +365,7 @@ void doMessenger()
printf("Received handled packet with length: %u\n", length); printf("Received handled packet with length: %u\n", length);
} }
//} //}
printf("Status: %u %u\n",friendlist[0].status ,is_cryptoconnected(friendlist[0].crypt_connection_id) ); printf("Status: %u %u %u\n",friendlist[0].status ,is_cryptoconnected(friendlist[0].crypt_connection_id), friendlist[0].crypt_connection_id);
#else #else
DHT_handlepacket(data, length, ip_port); DHT_handlepacket(data, length, ip_port);
LosslessUDP_handlepacket(data, length, ip_port); LosslessUDP_handlepacket(data, length, ip_port);
@ -377,3 +380,74 @@ void doMessenger()
doFriends(); doFriends();
} }
//returns the size of the messenger data (for saving)
uint32_t Messenger_size()
{
return crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES
+ sizeof(uint32_t) + DHT_size() + sizeof(uint32_t) + sizeof(Friend) * numfriends;
}
//save the messenger in data of size Messenger_size()
void Messenger_save(uint8_t * data)
{
save_keys(data);
data += crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES;
uint32_t size = DHT_size();
memcpy(data, &size, sizeof(size));
data += sizeof(size);
DHT_save(data);
data += size;
size = sizeof(Friend) * numfriends;
memcpy(data, &size, sizeof(size));
data += sizeof(size);
memcpy(data, friendlist, sizeof(Friend) * numfriends);
}
//load the messenger from data of size length.
int Messenger_load(uint8_t * data, uint32_t length)
{
if(length == ~0)
{
return -1;
}
if(length < crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES + sizeof(uint32_t) * 2)
{
return -1;
}
length -= crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES + sizeof(uint32_t) * 2;
load_keys(data);
data += crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES;
uint32_t size;
memcpy(&size, data, sizeof(size));
data += sizeof(size);
if(length < size)
{
return -1;
}
length -= size;
if(DHT_load(data, size) == -1)
{
return -1;
}
data += size;
memcpy(&size, data, sizeof(size));
data += sizeof(size);
if(length != size || length % sizeof(Friend) != 0)
{
return -1;
}
Friend * temp = malloc(size);
memcpy(temp, data, size);
uint16_t num = size / sizeof(Friend);
uint32_t i;
for(i = 0; i < num; i++)
{
m_addfriend_norequest(temp[i].client_id);
}
free(temp);
return 0;
}

View File

@ -89,4 +89,16 @@ void initMessenger();
//the main loop that needs to be run at least 200 times per second. //the main loop that needs to be run at least 200 times per second.
void doMessenger(); void doMessenger();
//SAVING AND LOADING FUNCTIONS:
//returns the size of the messenger data (for saving)
uint32_t Messenger_size();
//save the messenger in data (must be allocated memory of size Messenger_size())
void Messenger_save(uint8_t * data);
//load the messenger from data of size length.
int Messenger_load(uint8_t * data, uint32_t length);
#endif #endif

View File

@ -423,10 +423,15 @@ int getcryptconnection_id(uint8_t * public_key)
int crypto_connect(uint8_t * public_key, IP_Port ip_port) int crypto_connect(uint8_t * public_key, IP_Port ip_port)
{ {
uint32_t i; uint32_t i;
if(getcryptconnection_id(public_key) != -1) int id = getcryptconnection_id(public_key);
if(id != -1)
{
IP_Port c_ip = connection_ip(crypto_connections[id].number);
if(c_ip.ip.i == ip_port.ip.i && c_ip.port == ip_port.port)
{ {
return -1; return -1;
} }
}
for(i = 0; i < MAX_CRYPTO_CONNECTIONS; i++) for(i = 0; i < MAX_CRYPTO_CONNECTIONS; i++)
{ {
if(crypto_connections[i].status == 0) if(crypto_connections[i].status == 0)
@ -503,6 +508,7 @@ int crypto_kill(int crypt_connection_id)
{ {
crypto_connections[crypt_connection_id].status = 0; crypto_connections[crypt_connection_id].status = 0;
kill_connection(crypto_connections[crypt_connection_id].number); kill_connection(crypto_connections[crypt_connection_id].number);
crypto_connections[crypt_connection_id].number = ~0;
return 0; return 0;
} }
return 1; return 1;
@ -519,10 +525,11 @@ int accept_crypto_inbound(int connection_id, uint8_t * public_key, uint8_t * sec
{ {
return -1; return -1;
} }
/*
if(getcryptconnection_id(public_key) != -1) if(getcryptconnection_id(public_key) != -1)
{ {
return -1; return -1;
} }*/
for(i = 0; i < MAX_CRYPTO_CONNECTIONS; i++) for(i = 0; i < MAX_CRYPTO_CONNECTIONS; i++)
{ {
if(crypto_connections[i].status == 0) if(crypto_connections[i].status == 0)
@ -709,6 +716,11 @@ void initNetCrypto()
memset(crypto_connections, 0 ,sizeof(crypto_connections)); memset(crypto_connections, 0 ,sizeof(crypto_connections));
memset(outbound_friendrequests, -1 ,sizeof(outbound_friendrequests)); memset(outbound_friendrequests, -1 ,sizeof(outbound_friendrequests));
memset(incoming_connections, -1 ,sizeof(incoming_connections)); memset(incoming_connections, -1 ,sizeof(incoming_connections));
uint32_t i;
for(i = 0; i < MAX_CRYPTO_CONNECTIONS; i++)
{
crypto_connections[i].number = ~0;
}
} }
static void killTimedout() static void killTimedout()
@ -720,6 +732,11 @@ static void killTimedout()
{ {
crypto_connections[i].status = 4; crypto_connections[i].status = 4;
} }
else if(is_connected(crypto_connections[i].number) == 4)
{
kill_connection(crypto_connections[i].number);
crypto_connections[i].number = ~0;
}
} }
} }

View File

@ -10,9 +10,14 @@
* This is how I compile it: gcc -O2 -Wall -D VANILLA_NACL -o test ../core/Lossless_UDP.c ../core/network.c ../core/net_crypto.c ../core/Messenger.c ../core/DHT.c ../nacl/build/${HOSTNAME%.*}/lib/amd64/{cpucycles.o,libnacl.a,randombytes.o} Messenger_test.c * This is how I compile it: gcc -O2 -Wall -D VANILLA_NACL -o test ../core/Lossless_UDP.c ../core/network.c ../core/net_crypto.c ../core/Messenger.c ../core/DHT.c ../nacl/build/${HOSTNAME%.*}/lib/amd64/{cpucycles.o,libnacl.a,randombytes.o} Messenger_test.c
* *
* *
* Command line arguments are the ip and port of a node (for bootstrapping). * Command line arguments are the ip, port and public_key of a node (for bootstrapping).
*
* EX: ./test 127.0.0.1 33445 CDCFD319CE3460824B33BE58FD86B8941C9585181D8FBD7C79C5721D7C2E9F7C
*
* Or the argument can be the path to the save file.
*
* EX: ./test Save.bak
* *
* EX: ./test 127.0.0.1 33445
*/ */
#include "../core/Messenger.h" #include "../core/Messenger.h"
@ -77,11 +82,29 @@ void print_message(int friendnumber, uint8_t * string, uint16_t length)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
if (argc < 4) { if (argc < 4 && argc != 2) {
printf("usage %s ip port public_key (of the DHT bootstrap node)\n", argv[0]); printf("usage %s ip port public_key (of the DHT bootstrap node)\n or\n %s Save.bak\n", argv[0], argv[0]);
exit(0); exit(0);
} }
initMessenger(); initMessenger();
if(argc > 3)
{
IP_Port bootstrap_ip_port;
bootstrap_ip_port.port = htons(atoi(argv[2]));
bootstrap_ip_port.ip.i = inet_addr(argv[1]);
DHT_bootstrap(bootstrap_ip_port, hex_string_to_bin(argv[3]));
}
else
{
FILE *file = fopen(argv[1], "rb");
if ( file==NULL ){return 1;}
int read;
uint8_t buffer[128000];
read = fread(buffer, 1, 128000, file);
printf("Messenger loaded: %i\n", Messenger_load(buffer, read));
fclose(file);
}
m_callback_friendrequest(print_request); m_callback_friendrequest(print_request);
m_callback_friendmessage(print_message); m_callback_friendmessage(print_message);
@ -103,16 +126,19 @@ int main(int argc, char *argv[])
int num = m_addfriend(hex_string_to_bin(temp_id), (uint8_t*)"Install Gentoo", sizeof("Install Gentoo")); int num = m_addfriend(hex_string_to_bin(temp_id), (uint8_t*)"Install Gentoo", sizeof("Install Gentoo"));
perror("Initialization"); perror("Initialization");
IP_Port bootstrap_ip_port;
bootstrap_ip_port.port = htons(atoi(argv[2]));
bootstrap_ip_port.ip.i = inet_addr(argv[1]);
DHT_bootstrap(bootstrap_ip_port, hex_string_to_bin(argv[3]));
while(1) while(1)
{ {
m_sendmessage(num, (uint8_t*)"Test", 5); m_sendmessage(num, (uint8_t*)"Test", 5);
doMessenger(); doMessenger();
c_sleep(30); c_sleep(30);
FILE *file = fopen("Save.bak", "wb");
if ( file==NULL ){return 1;}
uint8_t * buffer = malloc(Messenger_size());
Messenger_save(buffer);
fwrite(buffer, 1, Messenger_size(), file);
free(buffer);
fclose(file);
} }
} }