summaryrefslogtreecommitdiff
path: root/core/Messenger.c
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2013-08-13 19:07:59 -0400
committerirungentoo <irungentoo@gmail.com>2013-08-13 19:07:59 -0400
commit06ccdb5b91eb2f2dfc444da60db76476a9882fa8 (patch)
tree0221856e99709f4553a7bafd2ec28b0fcbc3dd92 /core/Messenger.c
parent4132cdff49855e87701b10bd42aa55e35a87b6f0 (diff)
Simple XOR checksum added to address.
Diffstat (limited to 'core/Messenger.c')
-rw-r--r--core/Messenger.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/core/Messenger.c b/core/Messenger.c
index 2cc5c7a3..72f59036 100644
--- a/core/Messenger.c
+++ b/core/Messenger.c
@@ -75,6 +75,21 @@ int getclient_id(Messenger *m, int friend_id, uint8_t *client_id)
75 75
76 return -1; 76 return -1;
77} 77}
78/*
79 * returns a uint16_t that represents the checksum of address of length len
80 *
81 * TODO: Another checksum algorithm might be better.
82 */
83static uint16_t address_checksum(uint8_t *address, uint32_t len)
84{
85 uint8_t checksum[2] = {0};
86 uint16_t check;
87 uint32_t i;
88 for(i = 0; i < len; ++i)
89 checksum[i % 2] ^= address[i];
90 memcpy(&check, checksum, sizeof(check));
91 return check;
92}
78 93
79/* 94/*
80 * returns a FRIEND_ADDRESS_SIZE byte address to give to others. 95 * returns a FRIEND_ADDRESS_SIZE byte address to give to others.
@@ -88,6 +103,8 @@ void getaddress(Messenger *m, uint8_t *address)
88 memcpy(address, self_public_key, crypto_box_PUBLICKEYBYTES); 103 memcpy(address, self_public_key, crypto_box_PUBLICKEYBYTES);
89 uint32_t nospam = get_nospam(); 104 uint32_t nospam = get_nospam();
90 memcpy(address + crypto_box_PUBLICKEYBYTES, &nospam, sizeof(nospam)); 105 memcpy(address + crypto_box_PUBLICKEYBYTES, &nospam, sizeof(nospam));
106 uint16_t checksum = address_checksum(address, FRIEND_ADDRESS_SIZE - sizeof(checksum));
107 memcpy(address + crypto_box_PUBLICKEYBYTES + sizeof(nospam), &checksum, sizeof(checksum));
91} 108}
92 109
93/* 110/*
@@ -101,6 +118,9 @@ void getaddress(Messenger *m, uint8_t *address)
101 * return FAERR_OWNKEY if user's own key 118 * return FAERR_OWNKEY if user's own key
102 * return FAERR_ALREADYSENT if friend request already sent or already a friend 119 * return FAERR_ALREADYSENT if friend request already sent or already a friend
103 * return FAERR_UNKNOWN for unknown error 120 * return FAERR_UNKNOWN for unknown error
121 * return FAERR_BADCHECKSUM if bad checksum in address
122 * return FAERR_SETNEWNOSPAM if the friend was already there but the nospam was different
123 * (the nospam for that friend was set to the new one)
104 */ 124 */
105int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length) 125int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length)
106{ 126{
@@ -110,6 +130,10 @@ int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length)
110 return FAERR_TOOLONG; 130 return FAERR_TOOLONG;
111 uint8_t client_id[crypto_box_PUBLICKEYBYTES]; 131 uint8_t client_id[crypto_box_PUBLICKEYBYTES];
112 memcpy(client_id, address, crypto_box_PUBLICKEYBYTES); 132 memcpy(client_id, address, crypto_box_PUBLICKEYBYTES);
133 uint16_t check, checksum = address_checksum(address, FRIEND_ADDRESS_SIZE - sizeof(checksum));
134 memcpy(&check, address + crypto_box_PUBLICKEYBYTES + sizeof(uint32_t), sizeof(check));
135 if (check != checksum)
136 return FAERR_BADCHECKSUM;
113 if (length < 1) 137 if (length < 1)
114 return FAERR_NOMESSAGE; 138 return FAERR_NOMESSAGE;
115 if (memcmp(client_id, self_public_key, crypto_box_PUBLICKEYBYTES) == 0) 139 if (memcmp(client_id, self_public_key, crypto_box_PUBLICKEYBYTES) == 0)
@@ -117,11 +141,11 @@ int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length)
117 int friend_id = getfriend_id(m, client_id); 141 int friend_id = getfriend_id(m, client_id);
118 if (friend_id != -1) { 142 if (friend_id != -1) {
119 uint32_t nospam; 143 uint32_t nospam;
120 memcpy(&nospam, address + crypto_box_PUBLICKEYBYTES, sizeof(uint32_t)); 144 memcpy(&nospam, address + crypto_box_PUBLICKEYBYTES, sizeof(nospam));
121 if(m->friendlist[friend_id].friendrequest_nospam == nospam) 145 if(m->friendlist[friend_id].friendrequest_nospam == nospam)
122 return FAERR_ALREADYSENT; 146 return FAERR_ALREADYSENT;
123 m->friendlist[friend_id].friendrequest_nospam = nospam; 147 m->friendlist[friend_id].friendrequest_nospam = nospam;
124 return FAERR_ALREADYSENT; /*TODO: decide what to return when updating the nospam of a friend*/ 148 return FAERR_SETNEWNOSPAM;
125 } 149 }
126 150
127 /* resize the friend list if necessary */ 151 /* resize the friend list if necessary */