diff --git a/core/net_crypto.c b/core/net_crypto.c index 62df614e..c819c8c4 100644 --- a/core/net_crypto.c +++ b/core/net_crypto.c @@ -28,23 +28,23 @@ #include "net_crypto.h" -//Our public and secret keys. +/* Our public and secret keys. */ uint8_t self_public_key[crypto_box_PUBLICKEYBYTES]; uint8_t self_secret_key[crypto_box_SECRETKEYBYTES]; typedef struct { - uint8_t public_key[crypto_box_PUBLICKEYBYTES];//the real public key of the peer. - uint8_t recv_nonce[crypto_box_NONCEBYTES];//nonce of received packets - uint8_t sent_nonce[crypto_box_NONCEBYTES];//nonce of sent packets. - uint8_t sessionpublic_key[crypto_box_PUBLICKEYBYTES];//our public key for this session. - uint8_t sessionsecret_key[crypto_box_SECRETKEYBYTES];//our private key for this session. - uint8_t peersessionpublic_key[crypto_box_PUBLICKEYBYTES];//The public key of the peer. - uint8_t status;//0 if no connection, 1 we have sent a handshake, 2 if connexion is not confirmed yet - //(we have received a handshake but no empty data packet), 3 if the connection is established. - //4 if the connection is timed out. - uint16_t number; //Lossless_UDP connection number corresponding to this connection. + uint8_t public_key[crypto_box_PUBLICKEYBYTES]; /* the real public key of the peer. */ + uint8_t recv_nonce[crypto_box_NONCEBYTES]; /* nonce of received packets */ + uint8_t sent_nonce[crypto_box_NONCEBYTES]; /* nonce of sent packets. */ + uint8_t sessionpublic_key[crypto_box_PUBLICKEYBYTES]; /* our public key for this session. */ + uint8_t sessionsecret_key[crypto_box_SECRETKEYBYTES];our private key for this session. + uint8_t peersessionpublic_key[crypto_box_PUBLICKEYBYTES]; /* The public key of the peer. */ + uint8_t status;/* 0 if no connection, 1 we have sent a handshake, 2 if connexion is not confirmed yet + (we have received a handshake but no empty data packet), 3 if the connection is established. + 4 if the connection is timed out. */ + uint16_t number; /* Lossless_UDP connection number corresponding to this connection. */ }Crypto_Connection; @@ -54,18 +54,18 @@ static Crypto_Connection crypto_connections[MAX_CRYPTO_CONNECTIONS]; #define MAX_FRIEND_REQUESTS 32 -//keeps track of the connection numbers for friends request so we can check later if they were sent +/* keeps track of the connection numbers for friends request so we can check later if they were sent */ static int outbound_friendrequests[MAX_FRIEND_REQUESTS]; #define MAX_INCOMING 64 -//keeps track of the connection numbers for friends request so we can check later if they were sent +/* keeps track of the connection numbers for friends request so we can check later if they were sent */ static int incoming_connections[MAX_INCOMING]; -//encrypts plain of length length to encrypted of length + 16 using the -//public key(32 bytes) of the receiver and the secret key of the sender and a 24 byte nonce -//return -1 if there was a problem. -//return length of encrypted data if everything was fine. +/* encrypts plain of length length to encrypted of length + 16 using the + public key(32 bytes) of the receiver and the secret key of the sender and a 24 byte nonce + return -1 if there was a problem. + return length of encrypted data if everything was fine. */ int encrypt_data(uint8_t * public_key, uint8_t * secret_key, uint8_t * nonce, uint8_t * plain, uint32_t length, uint8_t * encrypted) { @@ -78,24 +78,24 @@ int encrypt_data(uint8_t * public_key, uint8_t * secret_key, uint8_t * nonce, uint8_t temp_encrypted[MAX_DATA_SIZE + crypto_box_ZEROBYTES]; uint8_t zeroes[crypto_box_BOXZEROBYTES] = {0}; - memcpy(temp_plain + crypto_box_ZEROBYTES, plain, length);//pad the message with 32 0 bytes. + memcpy(temp_plain + crypto_box_ZEROBYTES, plain, length); /* pad the message with 32 0 bytes. */ crypto_box(temp_encrypted, temp_plain, length + crypto_box_ZEROBYTES, nonce, public_key, secret_key); - //if encryption is successful the first crypto_box_BOXZEROBYTES of the message will be zero + /* if encryption is successful the first crypto_box_BOXZEROBYTES of the message will be zero */ if(memcmp(temp_encrypted, zeroes, crypto_box_BOXZEROBYTES) != 0) { return -1; } - //unpad the encrypted message + /* unpad the encrypted message */ memcpy(encrypted, temp_encrypted + crypto_box_BOXZEROBYTES, length - crypto_box_BOXZEROBYTES + crypto_box_ZEROBYTES); return length - crypto_box_BOXZEROBYTES + crypto_box_ZEROBYTES; } -//decrypts encrypted of length length to plain of length length - 16 using the -//public key(32 bytes) of the sender, the secret key of the receiver and a 24 byte nonce -//return -1 if there was a problem(decryption failed) -//return length of plain data if everything was fine. +/* decrypts encrypted of length length to plain of length length - 16 using the + public key(32 bytes) of the sender, the secret key of the receiver and a 24 byte nonce + return -1 if there was a problem(decryption failed) + return length of plain data if everything was fine. */ int decrypt_data(uint8_t * public_key, uint8_t * secret_key, uint8_t * nonce, uint8_t * encrypted, uint32_t length, uint8_t * plain) { @@ -107,30 +107,30 @@ int decrypt_data(uint8_t * public_key, uint8_t * secret_key, uint8_t * nonce, uint8_t temp_encrypted[MAX_DATA_SIZE + crypto_box_ZEROBYTES] = {0}; uint8_t zeroes[crypto_box_ZEROBYTES] = {0}; - memcpy(temp_encrypted + crypto_box_BOXZEROBYTES, encrypted, length);//pad the message with 16 0 bytes. + memcpy(temp_encrypted + crypto_box_BOXZEROBYTES, encrypted, length); /* pad the message with 16 0 bytes. */ if(crypto_box_open(temp_plain, temp_encrypted, length + crypto_box_BOXZEROBYTES, nonce, public_key, secret_key) == -1) { return -1; } - //if decryption is successful the first crypto_box_ZEROBYTES of the message will be zero + /* if decryption is successful the first crypto_box_ZEROBYTES of the message will be zero */ if(memcmp(temp_plain, zeroes, crypto_box_ZEROBYTES) != 0) { return -1; } - //unpad the plain message + /* unpad the plain message */ memcpy(plain, temp_plain + crypto_box_ZEROBYTES, length - crypto_box_ZEROBYTES + crypto_box_BOXZEROBYTES); return length - crypto_box_ZEROBYTES + crypto_box_BOXZEROBYTES; } -//increment the given nonce by 1 +/* increment the given nonce by 1 */ void increment_nonce(uint8_t * nonce) { uint32_t i; - for(i = 0; i < crypto_box_NONCEBYTES; i++) + for(i = 0; i < crypto_box_NONCEBYTES; ++i) { - nonce[i]++; + ++nonce[i]; if(nonce[i] != 0) { break; @@ -138,20 +138,20 @@ void increment_nonce(uint8_t * nonce) } } -//fill the given nonce with random bytes. -//TODO: make this more optimized +/* fill the given nonce with random bytes. + TODO: make this more optimized */ void random_nonce(uint8_t * nonce) { uint32_t i; - for(i = 0; i < crypto_box_NONCEBYTES; i++) + for(i = 0; i < crypto_box_NONCEBYTES; ++i) { nonce[i] = random_int() % 256; } } -//return 0 if there is no received data in the buffer -//return -1 if the packet was discarded. -//return length of received data if successful +/* return 0 if there is no received data in the buffer + return -1 if the packet was discarded. + return length of received data if successful */ int read_cryptpacket(int crypt_connection_id, uint8_t * data) { if(crypt_connection_id < 0 || crypt_connection_id >= MAX_CRYPTO_CONNECTIONS) @@ -184,8 +184,8 @@ int read_cryptpacket(int crypt_connection_id, uint8_t * data) } -//return 0 if data could not be put in packet queue -//return 1 if data was put into the queue +/* return 0 if data could not be put in packet queue + return 1 if data was put into the queue */ int write_cryptpacket(int crypt_connection_id, uint8_t * data, uint32_t length) { if(crypt_connection_id < 0 || crypt_connection_id >= MAX_CRYPTO_CONNECTIONS) @@ -217,10 +217,10 @@ int write_cryptpacket(int crypt_connection_id, uint8_t * data, uint32_t length) return 1; } -//send a friend request to peer with public_key and ip_port. -//Data represents the data we send with the friends request. -//returns -1 on failure -//returns a positive friend request id that can be used later to see if it was sent correctly on success. +/* send a friend request to peer with public_key and ip_port. + Data represents the data we send with the friends request. + returns -1 on failure + returns a positive friend request id that can be used later to see if it was sent correctly on success. */ int send_friendrequest(uint8_t * public_key, IP_Port ip_port, uint8_t * data, uint32_t length) { if(length > MAX_DATA_SIZE - 1 - crypto_box_PUBLICKEYBYTES - crypto_box_NONCEBYTES) @@ -228,7 +228,7 @@ int send_friendrequest(uint8_t * public_key, IP_Port ip_port, uint8_t * data, ui return -1; } uint32_t i; - for(i = 0; i < MAX_FRIEND_REQUESTS; i++) + for(i = 0; i < MAX_FRIEND_REQUESTS; ++i) { if(outbound_friendrequests[i] == -1) { @@ -264,10 +264,10 @@ int send_friendrequest(uint8_t * public_key, IP_Port ip_port, uint8_t * data, ui return -1; } -//return -1 if failure -//return 0 if connection is still trying to send the request. -//return 1 if sent correctly -//return 2 if connection timed out +/* return -1 if failure + return 0 if connection is still trying to send the request. + return 1 if sent correctly + return 2 if connection timed out */ int check_friendrequest(int friend_request) { if(friend_request < 0 || friend_request > MAX_FRIEND_REQUESTS) @@ -299,9 +299,9 @@ int check_friendrequest(int friend_request) return 0; } -//Send a crypto handshake packet containing an encrypted secret nonce and session public key -//to peer with connection_id and public_key -//the packet is encrypted with a random nonce which is sent in plain text with the packet +/* Send a crypto handshake packet containing an encrypted secret nonce and session public key + to peer with connection_id and public_key + the packet is encrypted with a random nonce which is sent in plain text with the packet */ int send_cryptohandshake(int connection_id, uint8_t * public_key, uint8_t * secret_nonce, uint8_t * session_key) { uint8_t temp_data[MAX_DATA_SIZE]; @@ -324,9 +324,9 @@ int send_cryptohandshake(int connection_id, uint8_t * public_key, uint8_t * secr return write_packet(connection_id, temp_data, len + 1 + crypto_box_PUBLICKEYBYTES + crypto_box_NONCEBYTES); } -//Extract secret nonce, session public key and public_key from a packet(data) with length length -//return 1 if successful -//return 0 if failure +/* Extract secret nonce, session public key and public_key from a packet(data) with length length + return 1 if successful + return 0 if failure */ int handle_cryptohandshake(uint8_t * public_key, uint8_t * secret_nonce, uint8_t * session_key, uint8_t * data, uint16_t length) { @@ -359,13 +359,13 @@ int handle_cryptohandshake(uint8_t * public_key, uint8_t * secret_nonce, } -//puts the public key of the friend if public_key, the data from the request -//in data if a friend request was sent to us and returns the length of the data. -//return -1 if no valid friend requests. +/* puts the public key of the friend if public_key, the data from the request + in data if a friend request was sent to us and returns the length of the data. + return -1 if no valid friend requests. */ int handle_friendrequest(uint8_t * public_key, uint8_t * data) { uint32_t i; - for(i = 0; i < MAX_INCOMING; i++) + for(i = 0; i < MAX_INCOMING; ++i) { if(incoming_connections[i] != -1) { @@ -384,12 +384,12 @@ int handle_friendrequest(uint8_t * public_key, uint8_t * data) if(len1 != -1) { kill_connection(incoming_connections[i]); - //kill_connection_in(incoming_connections[i], 1); //conection is useless now, kill it in 1 seconds + /* kill_connection_in(incoming_connections[i], 1); //conection is useless now, kill it in 1 seconds */ incoming_connections[i] = -1; return len1; } } - kill_connection(incoming_connections[i]); //conection is useless now, kill it. + kill_connection(incoming_connections[i]); /* conection is useless now, kill it. */ incoming_connections[i] = -1; } } @@ -397,13 +397,13 @@ int handle_friendrequest(uint8_t * public_key, uint8_t * data) return -1; } -//get crypto connection id from public key of peer -//return -1 if there are no connections like we are looking for -//return id if it found it +/* get crypto connection id from public key of peer + return -1 if there are no connections like we are looking for + return id if it found it */ int getcryptconnection_id(uint8_t * public_key) { uint32_t i; - for(i = 0; i < MAX_CRYPTO_CONNECTIONS; i++) + for(i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) { if(crypto_connections[i].status > 0) { @@ -417,9 +417,9 @@ int getcryptconnection_id(uint8_t * public_key) } -//Start a secure connection with other peer who has public_key and ip_port -//returns -1 if failure -//returns crypt_connection_id of the initialized connection if everything went well. +/* Start a secure connection with other peer who has public_key and ip_port + returns -1 if failure + returns crypt_connection_id of the initialized connection if everything went well. */ int crypto_connect(uint8_t * public_key, IP_Port ip_port) { uint32_t i; @@ -432,7 +432,7 @@ int crypto_connect(uint8_t * public_key, IP_Port ip_port) return -1; } } - for(i = 0; i < MAX_CRYPTO_CONNECTIONS; i++) + for(i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) { if(crypto_connections[i].status == 0) { @@ -453,23 +453,23 @@ int crypto_connect(uint8_t * public_key, IP_Port ip_port) increment_nonce(crypto_connections[i].recv_nonce); return i; } - return -1;//this should never happen. + return -1; /* this should never happen. */ } } return -1; } -//handle an incoming connection -//return -1 if no crypto inbound connection -//return incoming connection id (Lossless_UDP one) if there is an incoming crypto connection -//Put the public key of the peer in public_key, the secret_nonce from the handshake into secret_nonce -//and the session public key for the connection in session_key -//to accept it see: accept_crypto_inbound(...) -//to refuse it just call kill_connection(...) on the connection id +/* handle an incoming connection + return -1 if no crypto inbound connection + return incoming connection id (Lossless_UDP one) if there is an incoming crypto connection + Put the public key of the peer in public_key, the secret_nonce from the handshake into secret_nonce + and the session public key for the connection in session_key + to accept it see: accept_crypto_inbound(...) + to refuse it just call kill_connection(...) on the connection id */ int crypto_inbound(uint8_t * public_key, uint8_t * secret_nonce, uint8_t * session_key) { uint32_t i; - for(i = 0; i < MAX_INCOMING; i++) + for(i = 0; i < MAX_INCOMING; ++i) { if(incoming_connections[i] != -1) { @@ -486,7 +486,7 @@ int crypto_inbound(uint8_t * public_key, uint8_t * secret_nonce, uint8_t * sessi if(handle_cryptohandshake(public_key, secret_nonce, session_key, temp_data, len)) { int connection_id = incoming_connections[i]; - incoming_connections[i] = -1;//remove this connection from the incoming connection list. + incoming_connections[i] = -1; /* remove this connection from the incoming connection list. */ return connection_id; } } @@ -495,9 +495,9 @@ int crypto_inbound(uint8_t * public_key, uint8_t * secret_nonce, uint8_t * sessi return -1; } -//kill a crypto connection -//return 0 if killed successfully -//return 1 if there was a problem. +/* kill a crypto connection + return 0 if killed successfully + return 1 if there was a problem. */ int crypto_kill(int crypt_connection_id) { if(crypt_connection_id < 0 || crypt_connection_id >= MAX_CRYPTO_CONNECTIONS) @@ -515,9 +515,9 @@ int crypto_kill(int crypt_connection_id) } -//accept an incoming connection using the parameters provided by crypto_inbound -//return -1 if not successful -//returns the crypt_connection_id if successful +/* accept an incoming connection using the parameters provided by crypto_inbound + return -1 if not successful + returns the crypt_connection_id if successful */ int accept_crypto_inbound(int connection_id, uint8_t * public_key, uint8_t * secret_nonce, uint8_t * session_key) { uint32_t i; @@ -530,7 +530,7 @@ int accept_crypto_inbound(int connection_id, uint8_t * public_key, uint8_t * sec { return -1; }*/ - for(i = 0; i < MAX_CRYPTO_CONNECTIONS; i++) + for(i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) { if(crypto_connections[i].status == 0) { @@ -549,20 +549,20 @@ int accept_crypto_inbound(int connection_id, uint8_t * public_key, uint8_t * sec { increment_nonce(crypto_connections[i].recv_nonce); uint32_t zero = 0; - crypto_connections[i].status = 3;//connection status needs to be 3 for write_cryptpacket() to work + crypto_connections[i].status = 3; /* connection status needs to be 3 for write_cryptpacket() to work */ write_cryptpacket(i, ((uint8_t *)&zero), sizeof(zero)); - crypto_connections[i].status = 2;//set it to its proper value right after. + crypto_connections[i].status = 2; /* set it to its proper value right after. */ return i; } - return -1;//this should never happen. + return -1; /* this should never happen. */ } } return -1; } -//return 0 if no connection, 1 we have sent a handshake, 2 if connexion is not confirmed yet -//(we have received a handshake but no empty data packet), 3 if the connection is established. -//4 if the connection is timed out and waiting to be killed +/* return 0 if no connection, 1 we have sent a handshake, 2 if connexion is not confirmed yet + (we have received a handshake but no empty data packet), 3 if the connection is established. + 4 if the connection is timed out and waiting to be killed */ int is_cryptoconnected(int crypt_connection_id) { if(crypt_connection_id >= 0 && crypt_connection_id < MAX_CRYPTO_CONNECTIONS) @@ -573,37 +573,37 @@ int is_cryptoconnected(int crypt_connection_id) } -//Generate our public and private keys -//Only call this function the first time the program starts. +/* Generate our public and private keys + Only call this function the first time the program starts. */ void new_keys() { crypto_box_keypair(self_public_key,self_secret_key); } -//save the public and private keys to the keys array -//Length must be crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES +/* save the public and private keys to the keys array + Length must be crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES */ void save_keys(uint8_t * keys) { memcpy(keys, self_public_key, crypto_box_PUBLICKEYBYTES); memcpy(keys + crypto_box_PUBLICKEYBYTES, self_secret_key, crypto_box_SECRETKEYBYTES); } -//load the public and private keys from the keys array -//Length must be crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES +/* load the public and private keys from the keys array + Length must be crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES */ void load_keys(uint8_t * keys) { memcpy(self_public_key, keys, crypto_box_PUBLICKEYBYTES); memcpy(self_secret_key, keys + crypto_box_PUBLICKEYBYTES, crypto_box_SECRETKEYBYTES); } -//TODO: optimize this -//adds an incoming connection to the incoming_connection list. -//returns 0 if successful -//returns 1 if failure +/* TODO: optimize this + adds an incoming connection to the incoming_connection list. + returns 0 if successful + returns 1 if failure */ int new_incoming(int id) { uint32_t i; - for(i = 0; i < MAX_INCOMING; i++) + for(i = 0; i < MAX_INCOMING; ++i) { if(incoming_connections[i] == -1) { @@ -614,8 +614,8 @@ int new_incoming(int id) return 1; } -//TODO: optimize this -//handle all new incoming connections. +/* TODO: optimize this + handle all new incoming connections. */ static void handle_incomings() { int income; @@ -629,11 +629,11 @@ static void handle_incomings() } } -//handle received packets for not yet established crypto connections. +/* handle received packets for not yet established crypto connections. */ static void receive_crypto() { uint32_t i; - for(i = 0; i < MAX_CRYPTO_CONNECTIONS; i++) + for(i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) { if(crypto_connections[i].status == 1) { @@ -643,12 +643,12 @@ static void receive_crypto() uint8_t session_key[crypto_box_PUBLICKEYBYTES]; uint16_t len; if(id_packet(crypto_connections[i].number) == 1) - //if the packet is a friend request drop it (because we are already friends) + /* if the packet is a friend request drop it (because we are already friends) */ { len = read_packet(crypto_connections[i].number, temp_data); } - if(id_packet(crypto_connections[i].number) == 2)//handle handshake packet. + if(id_packet(crypto_connections[i].number) == 2) /* handle handshake packet. */ { len = read_packet(crypto_connections[i].number, temp_data); if(handle_cryptohandshake(public_key, secret_nonce, session_key, temp_data, len)) @@ -659,16 +659,16 @@ static void receive_crypto() memcpy(crypto_connections[i].peersessionpublic_key, session_key, crypto_box_PUBLICKEYBYTES); increment_nonce(crypto_connections[i].sent_nonce); uint32_t zero = 0; - crypto_connections[i].status = 3;//connection status needs to be 3 for write_cryptpacket() to work + crypto_connections[i].status = 3; /* connection status needs to be 3 for write_cryptpacket() to work */ write_cryptpacket(i, ((uint8_t *)&zero), sizeof(zero)); - crypto_connections[i].status = 2;//set it to its proper value right after. + crypto_connections[i].status = 2; /* set it to its proper value right after. */ } } } else if(id_packet(crypto_connections[i].number) != -1) { - //This should not happen - //kill the connection if it does + /* This should not happen + kill the connection if it does */ crypto_kill(crypto_connections[i].number); } @@ -689,35 +689,35 @@ static void receive_crypto() increment_nonce(crypto_connections[i].recv_nonce); crypto_connections[i].status = 3; - //connection is accepted so we disable the auto kill by setting it to about 1 month from now. + /* connection is accepted so we disable the auto kill by setting it to about 1 month from now. */ kill_connection_in(crypto_connections[i].number, 3000000); } else { - //This should not happen - //kill the connection if it does + /* This should not happen + kill the connection if it does */ crypto_kill(crypto_connections[i].number); } } else if(id_packet(crypto_connections[i].number) != -1) { - //This should not happen - //kill the connection if it does + /* This should not happen + kill the connection if it does */ crypto_kill(crypto_connections[i].number); } } } } -//run this to (re)initialize net_crypto -//sets all the global connection variables to their default values. +/* run this to (re)initialize net_crypto + sets all the global connection variables to their default values. */ void initNetCrypto() { memset(crypto_connections, 0 ,sizeof(crypto_connections)); memset(outbound_friendrequests, -1 ,sizeof(outbound_friendrequests)); memset(incoming_connections, -1 ,sizeof(incoming_connections)); uint32_t i; - for(i = 0; i < MAX_CRYPTO_CONNECTIONS; i++) + for(i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) { crypto_connections[i].number = ~0; } @@ -726,7 +726,7 @@ void initNetCrypto() static void killTimedout() { uint32_t i; - for(i = 0; i < MAX_CRYPTO_CONNECTIONS; i++) + for(i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) { if(crypto_connections[i].status != 0 && is_connected(crypto_connections[i].number) == 4) { @@ -740,12 +740,12 @@ static void killTimedout() } } -//main loop +/* main loop */ void doNetCrypto() { - //TODO:check if friend requests were sent correctly - //handle new incoming connections - //handle friend requests + /* TODO:check if friend requests were sent correctly + handle new incoming connections + handle friend requests */ handle_incomings(); receive_crypto(); killTimedout(); diff --git a/core/net_crypto.h b/core/net_crypto.h index df2cb9ca..0bf21f60 100644 --- a/core/net_crypto.h +++ b/core/net_crypto.h @@ -26,111 +26,111 @@ #include "Lossless_UDP.h" -//Our public key. +/* Our public key. */ extern uint8_t self_public_key[crypto_box_PUBLICKEYBYTES]; extern uint8_t self_secret_key[crypto_box_SECRETKEYBYTES]; #define ENCRYPTION_PADDING (crypto_box_ZEROBYTES - crypto_box_BOXZEROBYTES) -//encrypts plain of length length to encrypted of length + 16 using the -//public key(32 bytes) of the receiver and the secret key of the sender and a 24 byte nonce -//return -1 if there was a problem. -//return length of encrypted data if everything was fine. +/* encrypts plain of length length to encrypted of length + 16 using the + public key(32 bytes) of the receiver and the secret key of the sender and a 24 byte nonce + return -1 if there was a problem. + return length of encrypted data if everything was fine. */ int encrypt_data(uint8_t * public_key, uint8_t * secret_key, uint8_t * nonce, uint8_t * plain, uint32_t length, uint8_t * encrypted); -//decrypts encrypted of length length to plain of length length - 16 using the -//public key(32 bytes) of the sender, the secret key of the receiver and a 24 byte nonce -//return -1 if there was a problem(decryption failed) -//return length of plain data if everything was fine. +/* decrypts encrypted of length length to plain of length length - 16 using the + public key(32 bytes) of the sender, the secret key of the receiver and a 24 byte nonce + return -1 if there was a problem(decryption failed) + return length of plain data if everything was fine. */ int decrypt_data(uint8_t * public_key, uint8_t * secret_key, uint8_t * nonce, uint8_t * encrypted, uint32_t length, uint8_t * plain); -//fill the given nonce with random bytes. +/* fill the given nonce with random bytes. */ void random_nonce(uint8_t * nonce); -//return 0 if there is no received data in the buffer -//return -1 if the packet was discarded. -//return length of received data if successful +/* return 0 if there is no received data in the buffer + return -1 if the packet was discarded. + return length of received data if successful */ int read_cryptpacket(int crypt_connection_id, uint8_t * data); -//return 0 if data could not be put in packet queue -//return 1 if data was put into the queue +/* return 0 if data could not be put in packet queue + return 1 if data was put into the queue */ int write_cryptpacket(int crypt_connection_id, uint8_t * data, uint32_t length); -//send a friend request to peer with public_key and ip_port. -//Data represents the data we send with the friends request. -//returns -1 on failure -//returns a positive friend request id that can be used later to see if it was sent correctly on success. +/* send a friend request to peer with public_key and ip_port. + Data represents the data we send with the friends request. + returns -1 on failure + returns a positive friend request id that can be used later to see if it was sent correctly on success. */ int send_friendrequest(uint8_t * public_key, IP_Port ip_port, uint8_t * data, uint32_t length); -//return -1 if failure -//return 0 if connection is still trying to send the request. -//return 1 if sent correctly -//return 2 if connection timed out +/* return -1 if failure + return 0 if connection is still trying to send the request. + return 1 if sent correctly + return 2 if connection timed out */ int check_friendrequest(int friend_request); -//puts the public key of the friend if public_key, the data from the request -//in data if a friend request was sent to us and returns the length of the data. -//return -1 if no valid friend requests. +/* puts the public key of the friend if public_key, the data from the request + in data if a friend request was sent to us and returns the length of the data. + return -1 if no valid friend requests. */ int handle_friendrequest(uint8_t * public_key, uint8_t * data); -//Start a secure connection with other peer who has public_key and ip_port -//returns -1 if failure -//returns crypt_connection_id of the initialized connection if everything went well. +/* Start a secure connection with other peer who has public_key and ip_port + returns -1 if failure + returns crypt_connection_id of the initialized connection if everything went well. */ int crypto_connect(uint8_t * public_key, IP_Port ip_port); -//kill a crypto connection -//return 0 if killed successfully -//return 1 if there was a problem. +/* kill a crypto connection + return 0 if killed successfully + return 1 if there was a problem. */ int crypto_kill(int crypt_connection_id); -//handle an incoming connection -//return -1 if no crypto inbound connection -//return incoming connection id (Lossless_UDP one) if there is an incoming crypto connection -//Put the public key of the peer in public_key, the secret_nonce from the handshake into secret_nonce -//and the session public key for the connection in session_key -//to accept it see: accept_crypto_inbound(...) -//to refuse it just call kill_connection(...) on the connection id +/* handle an incoming connection + return -1 if no crypto inbound connection + return incoming connection id (Lossless_UDP one) if there is an incoming crypto connection + Put the public key of the peer in public_key, the secret_nonce from the handshake into secret_nonce + and the session public key for the connection in session_key + to accept it see: accept_crypto_inbound(...) + to refuse it just call kill_connection(...) on the connection id */ int crypto_inbound(uint8_t * public_key, uint8_t * secret_nonce, uint8_t * session_key); -//accept an incoming connection using the parameters provided by crypto_inbound -//return -1 if not successful -//returns the crypt_connection_id if successful +/* accept an incoming connection using the parameters provided by crypto_inbound + return -1 if not successful + returns the crypt_connection_id if successful */ int accept_crypto_inbound(int connection_id, uint8_t * public_key, uint8_t * secret_nonce, uint8_t * session_key); -//return 0 if no connection, 1 we have sent a handshake, 2 if connexion is not confirmed yet -//(we have received a handshake but no empty data packet), 3 if the connection is established. -//4 if the connection is timed out and waiting to be killed +/* return 0 if no connection, 1 we have sent a handshake, 2 if connexion is not confirmed yet + (we have received a handshake but no empty data packet), 3 if the connection is established. + 4 if the connection is timed out and waiting to be killed */ int is_cryptoconnected(int crypt_connection_id); -//Generate our public and private keys -//Only call this function the first time the program starts. +/* Generate our public and private keys + Only call this function the first time the program starts. */ void new_keys(); -//save the public and private keys to the keys array -//Length must be crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES +/* save the public and private keys to the keys array + Length must be crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES */ void save_keys(uint8_t * keys); -//load the public and private keys from the keys array -//Length must be crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES +/* load the public and private keys from the keys array + Length must be crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES */ void load_keys(uint8_t * keys); -//run this to (re)initialize net_crypto -//sets all the global connection variables to their default values. +/* run this to (re)initialize net_crypto + sets all the global connection variables to their default values. */ void initNetCrypto(); -//main loop +/* main loop */ void doNetCrypto(); diff --git a/core/network.c b/core/network.c index c08b3512..dbe4574c 100644 --- a/core/network.c +++ b/core/network.c @@ -25,12 +25,12 @@ #include "network.h" -//returns current UNIX time in microseconds (us). +/* returns current UNIX time in microseconds (us). */ uint64_t current_time() { uint64_t time; #ifdef WIN32 - //This probably works fine + /* This probably works fine */ FILETIME ft; GetSystemTimeAsFileTime(&ft); time = ft.dwHighDateTime; @@ -48,8 +48,8 @@ uint64_t current_time() } -//return a random number -//NOTE: this function should probably not be used where cryptographic randomness is absolutely necessary +/* return a random number + NOTE: this function should probably not be used where cryptographic randomness is absolutely necessary */ uint32_t random_int() { #ifndef VANILLA_NACL @@ -60,11 +60,11 @@ uint32_t random_int() #endif } -//our UDP socket, a global variable. +/* our UDP socket, a global variable. */ static int sock; -//Basic network functions: -//Function to send packet(data) of length length to ip_port +/* Basic network functions: + Function to send packet(data) of length length to ip_port */ int sendpacket(IP_Port ip_port, uint8_t * data, uint32_t length) { ADDR addr = {AF_INET, ip_port.port, ip_port.ip}; @@ -72,10 +72,10 @@ int sendpacket(IP_Port ip_port, uint8_t * data, uint32_t length) } -//Function to receive data, ip and port of sender is put into ip_port -//the packet data into data -//the packet length into length. -//dump all empty packets. +/* Function to receive data, ip and port of sender is put into ip_port + the packet data into data + the packet length into length. + dump all empty packets. */ int receivepacket(IP_Port * ip_port, uint8_t * data, uint32_t * length) { ADDR addr; @@ -87,8 +87,8 @@ int receivepacket(IP_Port * ip_port, uint8_t * data, uint32_t * length) (*(int32_t *)length) = recvfrom(sock,(char *) data, MAX_UDP_PACKET_SIZE, 0, (struct sockaddr *)&addr, &addrlen); if(*(int32_t *)length <= 0) { - //nothing received - //or empty packet + /* nothing received + or empty packet */ return -1; } ip_port->ip = addr.ip; @@ -97,12 +97,12 @@ int receivepacket(IP_Port * ip_port, uint8_t * data, uint32_t * length) } -//initialize networking -//bind to ip and port -//ip must be in network order EX: 127.0.0.1 = (7F000001) -//port is in host byte order (this means don't worry about it) -//returns 0 if no problems -//TODO: add something to check if there are errors +/* initialize networking + bind to ip and port + ip must be in network order EX: 127.0.0.1 = (7F000001) + port is in host byte order (this means don't worry about it) + returns 0 if no problems + TODO: add something to check if there are errors */ int init_networking(IP ip ,uint16_t port) { #ifdef WIN32 @@ -117,11 +117,11 @@ int init_networking(IP ip ,uint16_t port) #endif srand((uint32_t)current_time()); - //initialize our socket + /* initialize our socket */ sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - //Functions to increase the size of the send and receive UDP buffers - //NOTE: uncomment if necessary + /* Functions to increase the size of the send and receive UDP buffers + NOTE: uncomment if necessary */ /* int n = 1024 * 1024 * 2; if(setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char*)&n, sizeof(n)) == -1) @@ -134,28 +134,28 @@ int init_networking(IP ip ,uint16_t port) return -1; }*/ - //Set socket nonblocking + /* Set socket nonblocking */ #ifdef WIN32 - //I think this works for windows + /* I think this works for windows */ u_long mode = 1; - //ioctl(sock, FIONBIO, &mode); + /* ioctl(sock, FIONBIO, &mode); */ ioctlsocket(sock, FIONBIO, &mode); #else fcntl(sock, F_SETFL, O_NONBLOCK, 1); #endif - //Bind our socket to port PORT and address 0.0.0.0 + /* Bind our socket to port PORT and address 0.0.0.0 */ ADDR addr = {AF_INET, htons(port), ip}; bind(sock, (struct sockaddr*)&addr, sizeof(addr)); return 0; } -//function to cleanup networking stuff +/* function to cleanup networking stuff */ void shutdown_networking() { #ifdef WIN32 WSACleanup(); #endif return; -} \ No newline at end of file +} diff --git a/core/network.h b/core/network.h index 33f11239..8f88940c 100644 --- a/core/network.h +++ b/core/network.h @@ -1,6 +1,6 @@ /* network.h * -* Datatypes, functions and includes for the core networking. +* Functions for the core networking. * Copyright (C) 2013 Tox project All Rights Reserved. @@ -21,104 +21,141 @@ along with Tox. If not, see . */ - -#ifndef NETWORK_H -#define NETWORK_H - -#include -#include -#include -#include -#include +#include "network.h" - -#ifdef WIN32 //Put win32 includes here - -#include -#include - -#undef VANILLA_NACL//make sure on windows we use libsodium - -#else //Linux includes - -#include -#include -#include -#include -#include - - -#endif - -#ifndef VANILLA_NACL -//we use libsodium by default -#include -#else - -//TODO: Including stuff like this is bad. This needs fixing. -//We keep support for the original NaCl for now. -#include "../nacl/build/Linux/include/amd64/crypto_box.h" - -#endif - - -#define MAX_UDP_PACKET_SIZE 65507 - -typedef union +/* returns current UNIX time in microseconds (us). */ +uint64_t current_time() { - uint8_t c[4]; - uint16_t s[2]; - uint32_t i; -}IP; - -typedef struct -{ - IP ip; - uint16_t port; - //not used for anything right now - uint16_t padding; -}IP_Port; - -typedef struct -{ - int16_t family; - uint16_t port; - IP ip; - uint8_t zeroes[8]; - #ifdef ENABLE_IPV6 - uint8_t zeroes2[12]; + uint64_t time; + #ifdef WIN32 + /* This probably works fine */ + FILETIME ft; + GetSystemTimeAsFileTime(&ft); + time = ft.dwHighDateTime; + time <<=32; + time |= ft.dwLowDateTime; + time -= 116444736000000000UL; + return time/10; + #else + struct timeval a; + gettimeofday(&a, NULL); + time = 1000000UL*a.tv_sec + a.tv_usec; + return time; #endif -}ADDR; + + +} +/* return a random number + NOTE: this function should probably not be used where cryptographic randomness is absolutely necessary */ +uint32_t random_int() +{ + #ifndef VANILLA_NACL + /* NOTE: this function comes from libsodium */ + return randombytes_random(); + #else + return random(); + #endif +} -//returns current time in milleseconds since the epoch. -uint64_t current_time(); +/* our UDP socket, a global variable. */ +static int sock; -//return a random number -//NOTE: this function should probably not be used where cryptographic randomness is absolutely necessary -uint32_t random_int(); +/* Basic network functions: + Function to send packet(data) of length length to ip_port */ +int sendpacket(IP_Port ip_port, uint8_t * data, uint32_t length) +{ + ADDR addr = {AF_INET, ip_port.port, ip_port.ip}; + return sendto(sock,(char *) data, length, 0, (struct sockaddr *)&addr, sizeof(addr)); + +} -//Basic network functions: +/* Function to receive data, ip and port of sender is put into ip_port + the packet data into data + the packet length into length. + dump all empty packets. */ +int receivepacket(IP_Port * ip_port, uint8_t * data, uint32_t * length) +{ + ADDR addr; + #ifdef WIN32 + int addrlen = sizeof(addr); + #else + uint32_t addrlen = sizeof(addr); + #endif + (*(int32_t *)length) = recvfrom(sock,(char *) data, MAX_UDP_PACKET_SIZE, 0, (struct sockaddr *)&addr, &addrlen); + if(*(int32_t *)length <= 0) + { + /* nothing received + or empty packet */ + return -1; + } + ip_port->ip = addr.ip; + ip_port->port = addr.port; + return 0; + +} -//Function to send packet(data) of length length to ip_port -int sendpacket(IP_Port ip_port, uint8_t * data, uint32_t length); +/* initialize networking + bind to ip and port + ip must be in network order EX: 127.0.0.1 = (7F000001) + port is in host byte order (this means don't worry about it) + returns 0 if no problems + TODO: add something to check if there are errors */ +int init_networking(IP ip ,uint16_t port) +{ + #ifdef WIN32 + WSADATA wsaData; + if(WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR) + { + return -1; + } + + #else + srandom((uint32_t)current_time()); + #endif + srand((uint32_t)current_time()); + + /* initialize our socket */ + sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + + /* Functions to increase the size of the send and receive UDP buffers + NOTE: uncomment if necessary + + int n = 1024 * 1024 * 2; + if(setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char*)&n, sizeof(n)) == -1) + { + return -1; + } -//Function to receive data, ip and port of sender is put into ip_port -//the packet data into data -//the packet length into length. -int receivepacket(IP_Port * ip_port, uint8_t * data, uint32_t * length); + if(setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char*)&n, sizeof(n)) == -1) + { + return -1; + }*/ + + /*Set socket nonblocking */ + #ifdef WIN32 + /* I think this works for windows */ + u_long mode = 1; + /* ioctl(sock, FIONBIO, &mode); */ + ioctlsocket(sock, FIONBIO, &mode); + #else + fcntl(sock, F_SETFL, O_NONBLOCK, 1); + #endif + + /* Bind our socket to port PORT and address 0.0.0.0 */ + ADDR addr = {AF_INET, htons(port), ip}; + bind(sock, (struct sockaddr*)&addr, sizeof(addr)); + return 0; -//initialize networking -//bind to ip and port -//ip must be in network order EX: 127.0.0.1 = (7F000001) -//port is in host byte order (this means don't worry about it) -//returns 0 if no problems -//TODO: add something to check if there are errors -int init_networking(IP ip ,uint16_t port); +} - -//function to cleanup networking stuff(doesn't do much right now) -void shutdown_networking(); -#endif +/* function to cleanup networking stuff */ +void shutdown_networking() +{ + #ifdef WIN32 + WSACleanup(); + #endif + return; +}