$ git clone https://socialnetwork.ion.nu/socialnetwork.git
commit fa5d177e1f2da66b1e2afcbfee57bbbbd0e17577
Author: Alicia <...>
Date:   Tue May 2 15:38:04 2017 +0000

    Switched from SHA-1 to SHA-256 for everything else as well.

diff --git a/peer.c b/peer.c
index 4aaeb7e..7d02247 100644
--- a/peer.c
+++ b/peer.c
@@ -34,7 +34,7 @@ struct command
   void(*callback)(struct peer*,void*,unsigned int);
 };
 
-unsigned char peer_id[20];
+unsigned char peer_id[ID_SIZE];
 gnutls_privkey_t peer_privkey=0;
 static struct peer** peers=0;
 static unsigned int peercount=0;
@@ -127,32 +127,32 @@ printf("We now have %u peers\n", peercount);
 
 struct findpeer_request
 {
-  unsigned char id[20];
+  unsigned char id[ID_SIZE];
   struct sockaddr addr;
   uint16_t addrlen;
   time_t timestamp;
 };
 static void findpeer(struct peer* peer, void* data, unsigned int len)
 {
-  // <target ID, 20><ttl, 2>[<addrlen, 2><source addr>]
+  // <target ID, 32><ttl, 2>[<addrlen, 2><source addr>]
   // Sender can't know their own address, so the first recipient will need to add the address of whoever they got it from
   uint16_t ttl;
-  if(len<20+sizeof(ttl)){return;}
-  unsigned char id[20];
-  memcpy(id, data, 20);
+  if(len<ID_SIZE+sizeof(ttl)){return;}
+  unsigned char id[ID_SIZE];
+  memcpy(id, data, ID_SIZE);
 printf("Got findpeer request for '"PEERFMT"'\n", PEERARG(id));
-  memcpy(&ttl, data+20, sizeof(ttl));
+  memcpy(&ttl, data+ID_SIZE, sizeof(ttl));
   if(!ttl){return;}
   --ttl;
   struct sockaddr addr;
   uint16_t addrlen;
-  if(len>20+sizeof(ttl)+sizeof(addrlen))
+  if(len>ID_SIZE+sizeof(ttl)+sizeof(addrlen))
   { // Has address already
-    memcpy(&addrlen, data+20+sizeof(ttl), sizeof(addrlen));
-    if(len<20+sizeof(ttl)+sizeof(addrlen)+addrlen){return;}
-    memcpy(&addr, data+20+sizeof(ttl)+sizeof(addrlen), addrlen);
+    memcpy(&addrlen, data+ID_SIZE+sizeof(ttl), sizeof(addrlen));
+    if(len<ID_SIZE+sizeof(ttl)+sizeof(addrlen)+addrlen){return;}
+    memcpy(&addr, data+ID_SIZE+sizeof(ttl)+sizeof(addrlen), addrlen);
   }
-  else if(len==20+sizeof(ttl))
+  else if(len==ID_SIZE+sizeof(ttl))
   { // Get address from sender
     addrlen=peer->addrlen;
     memcpy(&addr, &peer->addr, addrlen);
@@ -169,7 +169,7 @@ printf("Got findpeer request for '"PEERFMT"'\n", PEERARG(id));
     {
       newentry=&reqs[i]; // Mark as replacable
     }
-    else if(!memcmp(reqs[i].id, id, 20) && reqs[i].addrlen==addrlen && !memcmp(&reqs[i].addr, &addr, addrlen))
+    else if(!memcmp(reqs[i].id, id, ID_SIZE) && reqs[i].addrlen==addrlen && !memcmp(&reqs[i].addr, &addr, addrlen))
     { // Already handled, update the timestamp too in case it keeps coming for a while
       reqs[i].timestamp=now;
       return;
@@ -181,12 +181,12 @@ printf("Got findpeer request for '"PEERFMT"'\n", PEERARG(id));
     reqs=realloc(reqs, sizeof(struct findpeer_request)*reqcount);
     newentry=&reqs[reqcount-1];
   }
-  memcpy(newentry->id, id, 20);
+  memcpy(newentry->id, id, ID_SIZE);
   memcpy(&newentry->addr, &addr, addrlen);
   newentry->addrlen=addrlen;
   newentry->timestamp=now;
   // Check if it's us
-  if(!memcmp(id, peer_id, 20))
+  if(!memcmp(id, peer_id, ID_SIZE))
   {
     peer_new_unique(udpstream_getsocket(peer->stream), &addr, addrlen);
     return;
@@ -194,12 +194,12 @@ printf("Got findpeer request for '"PEERFMT"'\n", PEERARG(id));
   // Propagate (unless it was us, !ttl, or already handled)
   if(ttl)
   {
-    len=20+sizeof(ttl)+sizeof(addrlen)+addrlen;
+    len=ID_SIZE+sizeof(ttl)+sizeof(addrlen)+addrlen;
     unsigned char data[len];
-    memcpy(data, id, 20);
-    memcpy(data+20, &ttl, sizeof(ttl));
-    memcpy(data+20+sizeof(ttl), &addrlen, sizeof(addrlen));
-    memcpy(data+20+sizeof(ttl)+sizeof(addrlen), &addr, addrlen);
+    memcpy(data, id, ID_SIZE);
+    memcpy(data+ID_SIZE, &ttl, sizeof(ttl));
+    memcpy(data+ID_SIZE+sizeof(ttl), &addrlen, sizeof(addrlen));
+    memcpy(data+ID_SIZE+sizeof(ttl)+sizeof(addrlen), &addr, addrlen);
     peer_sendcmd(0, "findpeer", data, len);
   }
 }
@@ -239,8 +239,8 @@ void peer_init(const char* keypath)
       close(f);
       gnutls_free(keydata.data);
     }
-    size_t size=20;
-    gnutls_x509_privkey_get_key_id(privkey, 0, peer_id, &size);
+    size_t size=ID_SIZE;
+    gnutls_x509_privkey_get_key_id(privkey, GNUTLS_KEYID_USE_SHA256, peer_id, &size);
     gnutls_privkey_init(&peer_privkey);
     gnutls_privkey_import_x509(peer_privkey, privkey, 0);
   }
@@ -268,10 +268,10 @@ static int checkcert(gnutls_session_t tls)
   gnutls_x509_crt_init(&peer->cert);
   gnutls_x509_crt_import(peer->cert, certs, GNUTLS_X509_FMT_DER);
   // Get the certificate's public key ID
-  size_t size=20;
-  gnutls_x509_crt_get_key_id(peer->cert, 0, peer->id, &size);
+  size_t size=ID_SIZE;
+  gnutls_x509_crt_get_key_id(peer->cert, GNUTLS_KEYID_USE_SHA256, peer->id, &size);
   // Make sure we're not connecting to ourselves. TODO: Make sure we're not connecting to someone else we're already connected to as well? (different addresses, same ID) may cause issues with reconnects and/or multiple sessions
-  return !memcmp(peer->id, peer_id, 20);
+  return !memcmp(peer->id, peer_id, ID_SIZE);
 }
 
 static void generatecert(gnutls_certificate_credentials_t cred)
@@ -314,7 +314,7 @@ struct peer* peer_new(struct udpstream* stream, char server)
   peer->datalength=-1;
   peer->addrlen=sizeof(peer->addr);
   udpstream_getaddr(stream, &peer->addr, &peer->addrlen);
-  memset(peer->id, 0, 20);
+  memset(peer->id, 0, ID_SIZE);
   peer->cert=0;
   gnutls_init(&peer->tls, (server?GNUTLS_SERVER:GNUTLS_CLIENT)|GNUTLS_NONBLOCK);
   // Priority
@@ -485,23 +485,23 @@ void peer_disconnect(struct peer* peer, char cleanly)
   }
 }
 
-void peer_findpeer(const unsigned char id[20])
+void peer_findpeer(const unsigned char id[ID_SIZE])
 {
   uint16_t ttl=8; // 8 is probably a good level to start at, might need to be higher in the future
-  unsigned int len=20+sizeof(ttl);
+  unsigned int len=ID_SIZE+sizeof(ttl);
   unsigned char data[len];
-  memcpy(data, id, 20);
-  memcpy(data+20, &ttl, sizeof(ttl));
+  memcpy(data, id, ID_SIZE);
+  memcpy(data+ID_SIZE, &ttl, sizeof(ttl));
   peer_sendcmd(0, "findpeer", data, len);
 }
 
-struct peer* peer_findbyid(const unsigned char id[20])
+struct peer* peer_findbyid(const unsigned char id[ID_SIZE])
 {
   unsigned int i;
   for(i=0; i<peercount; ++i)
   {
     if(!peers[i]->handshake){continue;}
-    if(!memcmp(peers[i]->id, id, 20)){return peers[i];}
+    if(!memcmp(peers[i]->id, id, ID_SIZE)){return peers[i];}
   }
   return 0;
 }
diff --git a/peer.h b/peer.h
index 655e9de..b0b85b4 100644
--- a/peer.h
+++ b/peer.h
@@ -17,6 +17,7 @@
 #include <stdint.h>
 #include <gnutls/gnutls.h>
 #include "udpstream.h"
+#define ID_SIZE 32
 
 struct peer
 {
@@ -29,14 +30,14 @@ struct peer
   int32_t datalength;
   struct sockaddr addr;
   socklen_t addrlen;
-  unsigned char id[20]; // SHA-1 sum of public key (binary)
+  unsigned char id[ID_SIZE]; // SHA2-256 sum of public key (binary)
   gnutls_x509_crt_t cert;
   // TODO: Account stuff?
 };
 // Macros for printing peer IDs in printf-family of functions
-#define PEERFMT "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
-#define PEERARG(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15],x[16],x[17],x[18],x[19]
-extern unsigned char peer_id[20];
+#define PEERFMT "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
+#define PEERARG(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15],x[16],x[17],x[18],x[19],x[20],x[21],x[22],x[23],x[24],x[25],x[26],x[27],x[28],x[29],x[30],x[31]
+extern unsigned char peer_id[ID_SIZE];
 extern gnutls_privkey_t peer_privkey;
 
 extern void peer_registercmd(const char* name, void(*callback)(struct peer*,void*,unsigned int));
@@ -48,6 +49,6 @@ extern void peer_bootstrap(int sock, const char* peerlist);
 extern void peer_handlesocket(int sock); // Incoming data
 extern void peer_sendcmd(struct peer* peer, const char* cmd, const void* data, uint32_t len);
 extern void peer_disconnect(struct peer* peer, char cleanly);
-extern void peer_findpeer(const unsigned char id[20]); // Find and ask a peer to connect to us
-extern struct peer* peer_findbyid(const unsigned char id[20]);
+extern void peer_findpeer(const unsigned char id[ID_SIZE]); // Find and ask a peer to connect to us
+extern struct peer* peer_findbyid(const unsigned char id[ID_SIZE]);
 extern void peer_exportpeers(const char* path);
diff --git a/social.c b/social.c
index bc367ba..a416d9d 100644
--- a/social.c
+++ b/social.c
@@ -35,15 +35,15 @@ char* social_prefix=0;
 
 static void updateinfo(struct peer* peer, void* data, unsigned int len)
 {
-  // <id, 20><sigsize, 4><signature><seq, 8><type, 1><timestamp, 8><type-specific data>
-  if(len<20){return;}
+  // <id, 32><sigsize, 4><signature><seq, 8><type, 1><timestamp, 8><type-specific data>
+  if(len<ID_SIZE){return;}
   struct user* user=social_finduser(data);
   if(!user || !user->pubkey)
   {
-    if(user){peer_sendcmd(peer, "getpubkey", data, 20);}
+    if(user){peer_sendcmd(peer, "getpubkey", data, ID_SIZE);}
     return;
   }
-  struct update* update=social_update_parse(user, data+20, len-20);
+  struct update* update=social_update_parse(user, data+ID_SIZE, len-ID_SIZE);
   if(update){social_update_save(user, update);}
 }
 
@@ -98,10 +98,10 @@ static void user_load(struct user* user)
   }
 }
 
-static struct user* user_new(const unsigned char id[20])
+static struct user* user_new(const unsigned char id[ID_SIZE])
 {
   struct user* user=malloc(sizeof(struct user));
-  memcpy(user->id, id, 20);
+  memcpy(user->id, id, ID_SIZE);
   user->pubkey=0;
   user->peer=peer_findbyid(id);
   user->name=0;
@@ -117,14 +117,14 @@ static struct user* user_new(const unsigned char id[20])
   return user;
 }
 
-static struct user* user_findfriend(struct user* user, const unsigned char id[20])
+static struct user* user_findfriend(struct user* user, const unsigned char id[ID_SIZE])
 {
   unsigned int i, i2;
   for(i=0; i<user->circlecount; ++i)
   for(i2=0; i2<user->circles[i].count; ++i2)
   {
     struct user* user2=social_self->circles[i].friends[i2];
-    if(!memcmp(user2->id, id, 20)){return user2;}
+    if(!memcmp(user2->id, id, ID_SIZE)){return user2;}
   }
   return 0;
 }
@@ -145,10 +145,10 @@ static void greetpeer(struct peer* peer, void* data, unsigned int len)
     if(user_findfriend(social_self, peer->id)) // Friend of ours
     {
       // Ask for updates
-      len=20+sizeof(uint64_t);
+      len=ID_SIZE+sizeof(uint64_t);
       unsigned char arg[len];
-      memcpy(arg, user->id, 20);
-      memcpy(arg+20, &user->seq, sizeof(user->seq));
+      memcpy(arg, user->id, ID_SIZE);
+      memcpy(arg+ID_SIZE, &user->seq, sizeof(user->seq));
       peer_sendcmd(user->peer, "getupdates", arg, len);
     }
     // Check if they know any of our other friends who are not connected
@@ -160,10 +160,10 @@ static void greetpeer(struct peer* peer, void* data, unsigned int len)
       if(friend->peer){continue;}
       if(user_findfriend(user, friend->id))
       { // Friend of friend, ask for updates
-        len=20+sizeof(uint64_t);
+        len=ID_SIZE+sizeof(uint64_t);
         unsigned char arg[len];
-        memcpy(arg, friend->id, 20);
-        memcpy(arg+20, &friend->seq, sizeof(friend->seq));
+        memcpy(arg, friend->id, ID_SIZE);
+        memcpy(arg+ID_SIZE, &friend->seq, sizeof(friend->seq));
         peer_sendcmd(peer, "getupdates", arg, len);
       }
     }
@@ -174,16 +174,16 @@ static void greetpeer(struct peer* peer, void* data, unsigned int len)
   {
     if(!social_users[i]->pubkey)
     {
-      peer_sendcmd(peer, "getpubkey", social_users[i]->id, 20);
+      peer_sendcmd(peer, "getpubkey", social_users[i]->id, ID_SIZE);
     }
   }
 }
 
-static void sendupdate(struct peer* peer, const unsigned char id[20], struct update* update)
+static void sendupdate(struct peer* peer, const unsigned char id[ID_SIZE], struct update* update)
 {
   struct buffer buf;
   buffer_init(buf);
-  buffer_write(buf, id, 20);
+  buffer_write(buf, id, ID_SIZE);
   buffer_write(buf, &update->signaturesize, sizeof(update->signaturesize));
   buffer_write(buf, update->signature, update->signaturesize);
   social_update_write(&buf, update);
@@ -193,10 +193,10 @@ static void sendupdate(struct peer* peer, const unsigned char id[20], struct upd
 
 static void sendupdates(struct peer* peer, void* data, unsigned int len)
 {
-  // <ID, 20><seq, 8>
+  // <ID, 32><seq, 8>
   uint64_t seq;
-  if(len<20+sizeof(seq)){return;}
-  memcpy(&seq, data+20, sizeof(seq));
+  if(len<ID_SIZE+sizeof(seq)){return;}
+  memcpy(&seq, data+ID_SIZE, sizeof(seq));
   struct user* user;
   // "getupdates" can also be requests for data of friends of friends
   user=social_finduser(data);
@@ -216,7 +216,7 @@ static void sendupdates(struct peer* peer, void* data, unsigned int len)
 
 static void sendpubkey(struct peer* peer, void* data, unsigned int len)
 { // Request for offline user's public key (note: only direct connections are asked, since only they would send updates anyway)
-  if(len!=20){return;}
+  if(len!=ID_SIZE){return;}
   struct user* user=social_finduser(data);
   if(!user || !user->pubkey){return;}
   // Export key
@@ -234,8 +234,8 @@ static void receivepubkey(struct peer* peer, void* data, unsigned int len)
   gnutls_pubkey_t pubkey;
   gnutls_pubkey_init(&pubkey);
   gnutls_pubkey_import(pubkey, &key, GNUTLS_X509_FMT_DER);
-  unsigned char keyid[20];
-  size_t size=20;
+  unsigned char keyid[ID_SIZE];
+  size_t size=ID_SIZE;
   gnutls_pubkey_get_key_id(pubkey, 0, keyid, &size);
   // Find the matching user, if we know them
   struct user* user=social_finduser(keyid);
@@ -280,6 +280,7 @@ void social_findfriends(void) // Call a second or so after init (once we have so
     if(social_users[i]->peer){continue;}
     peer_findpeer(social_users[i]->id);
   }
+// TODO: Send out a "getupdates" for ourselves (to at least partially enable sharing just the privkey between devices)
 }
 
 struct friendslist* social_user_getcircle(struct user* user, uint32_t circle)
@@ -300,7 +301,7 @@ struct friendslist* social_user_getcircle(struct user* user, uint32_t circle)
   return &user->circles[circle];
 }
 
-void social_user_addtocircle(struct user* user, uint32_t circle, const unsigned char id[20])
+void social_user_addtocircle(struct user* user, uint32_t circle, const unsigned char id[ID_SIZE])
 {
   struct user* friend=social_finduser(id);
   if(!friend){friend=user_new(id);}
@@ -310,7 +311,7 @@ void social_user_addtocircle(struct user* user, uint32_t circle, const unsigned
   c->friends[c->count-1]=friend;
 }
 
-void social_user_removefromcircle(struct user* user, uint32_t circle, const unsigned char id[20])
+void social_user_removefromcircle(struct user* user, uint32_t circle, const unsigned char id[ID_SIZE])
 {
   struct user* friend=social_finduser(id);
   if(!friend){friend=user_new(id);}
@@ -327,7 +328,7 @@ void social_user_removefromcircle(struct user* user, uint32_t circle, const unsi
   }
 }
 
-void social_addfriend(const unsigned char id[20], uint32_t circle)
+void social_addfriend(const unsigned char id[ID_SIZE], uint32_t circle)
 {
   struct user* friend=social_finduser(id);
   if(!friend){friend=user_new(id);}
@@ -335,7 +336,7 @@ void social_addfriend(const unsigned char id[20], uint32_t circle)
   {
     peer_findpeer(id);
     // Request updates from any mutual friends we're connected to in the meantime
-    peer_sendcmd(0, "getpubkey", id, 20);
+    peer_sendcmd(0, "getpubkey", id, ID_SIZE);
   }else{
     if(!friend->pubkey)
     {
@@ -343,10 +344,10 @@ void social_addfriend(const unsigned char id[20], uint32_t circle)
       gnutls_pubkey_import_x509(friend->pubkey, friend->peer->cert, 0);
       user_save(friend);
     }
-    unsigned int len=20+sizeof(uint64_t);
+    unsigned int len=ID_SIZE+sizeof(uint64_t);
     unsigned char arg[len];
-    memcpy(arg, friend->id, 20);
-    memcpy(arg+20, &friend->seq, sizeof(friend->seq));
+    memcpy(arg, friend->id, ID_SIZE);
+    memcpy(arg+ID_SIZE, &friend->seq, sizeof(friend->seq));
     peer_sendcmd(friend->peer, "getupdates", arg, len);
   }
   social_user_addtocircle(social_self, circle, id);
@@ -360,9 +361,13 @@ void social_addfriend(const unsigned char id[20], uint32_t circle)
   social_update_sign(update);
   social_update_save(social_self, update);
   social_shareupdate(update);
+// TODO: Send all old updates 'user' now has gained access to but won't request due to having a higher seq for us (updates visible only to this circle and other circles they're not in)
+//   Alternatively we could make the update requests include ranges of missing seqs? but that will make the getupdates request bloaty.
+//   The benefit of the second option would be not having to be connected directly to the user, but maybe something similar can be achieved by leaving messages with friends to deliver when they're seen (encrypted and signed) listing the now-visible seqs
+//     This would again require knowing their public key and not just ID.
 }
 
-void social_removefriend(const unsigned char id[20], uint32_t circle)
+void social_removefriend(const unsigned char id[ID_SIZE], uint32_t circle)
 {
   social_user_removefromcircle(social_self, circle, id);
   struct update* update=social_update_getfriend(social_self, circle, id);
@@ -405,12 +410,12 @@ void social_updatefield(const char* name, const char* value, struct privacy* pri
   social_shareupdate(post);
 }
 
-struct user* social_finduser(const unsigned char id[20])
+struct user* social_finduser(const unsigned char id[ID_SIZE])
 {
   unsigned int i;
   for(i=0; i<social_usercount; ++i)
   {
-    if(!memcmp(social_users[i]->id, id, 20)){return social_users[i];}
+    if(!memcmp(social_users[i]->id, id, ID_SIZE)){return social_users[i];}
   }
   return 0;
 }
diff --git a/social.h b/social.h
index e359b87..5240ae6 100644
--- a/social.h
+++ b/social.h
@@ -43,7 +43,7 @@ struct friendslist
 
 struct user
 {
-  unsigned char id[20];
+  unsigned char id[ID_SIZE];
   gnutls_pubkey_t pubkey;
   struct peer* peer;
   const char* name;
@@ -60,13 +60,13 @@ extern struct user* social_self; // Most things we need to keep track of for our
 extern char* social_prefix;
 extern void social_init(const char* keypath, const char* pathprefix);
 extern struct friendslist* social_user_getcircle(struct user* user, uint32_t circle);
-extern void social_user_addtocircle(struct user* user, uint32_t circle, const unsigned char id[20]);
-extern void social_user_removefromcircle(struct user* user, uint32_t circle, const unsigned char id[20]);
-extern void social_addfriend(const unsigned char id[20], uint32_t circle);
-extern void social_removefriend(const unsigned char id[20], uint32_t circle);
+extern void social_user_addtocircle(struct user* user, uint32_t circle, const unsigned char id[ID_SIZE]);
+extern void social_user_removefromcircle(struct user* user, uint32_t circle, const unsigned char id[ID_SIZE]);
+extern void social_addfriend(const unsigned char id[ID_SIZE], uint32_t circle);
+extern void social_removefriend(const unsigned char id[ID_SIZE], uint32_t circle);
 extern void social_createpost(const char* msg, struct privacy* privacy);
 extern void social_updatefield(const char* name, const char* value, struct privacy* privacy);
-extern struct user* social_finduser(const unsigned char id[20]);
+extern struct user* social_finduser(const unsigned char id[ID_SIZE]);
 extern void social_shareupdate(struct update* update);
 extern char social_privacy_check(struct user* origin, struct privacy* privacy, struct user* user);
 extern void social_setcircle(uint32_t circle, const char* name, struct privacy* privacy);
diff --git a/socialtest.c b/socialtest.c
index ad2ada4..5ecdbd9 100644
--- a/socialtest.c
+++ b/socialtest.c
@@ -128,9 +128,9 @@ int main(int argc, char** argv)
       {
         if(strlen(&buf[10])<40){continue;}
         char byte[3]={0,0,0};
-        unsigned char binid[20];
+        unsigned char binid[ID_SIZE];
         unsigned int i;
-        for(i=0; i<20; ++i)
+        for(i=0; i<ID_SIZE; ++i)
         {
           memcpy(byte, &buf[10+i*2], 2);
           binid[i]=strtoul(byte, 0, 16);
diff --git a/update.c b/update.c
index 36cf08d..9d13a4e 100644
--- a/update.c
+++ b/update.c
@@ -68,7 +68,7 @@ void social_update_write(struct buffer* buf, struct update* update)
   case UPDATE_FRIENDS:
     buffer_write(*buf, &update->friends.circle, sizeof(update->friends.circle));
     buffer_write(*buf, &update->friends.add, sizeof(update->friends.add));
-    buffer_write(*buf, update->friends.id, 20);
+    buffer_write(*buf, update->friends.id, ID_SIZE);
     break;
   case UPDATE_CIRCLE:
     buffer_write(*buf, &update->circle.circle, sizeof(update->circle.circle));
@@ -143,21 +143,21 @@ struct update* social_update_getfield(struct user* user, const char* name)
   return ret;
 }
 
-struct update* social_update_getfriend(struct user* user, uint32_t circle, const unsigned char id[20])
+struct update* social_update_getfriend(struct user* user, uint32_t circle, const unsigned char id[ID_SIZE])
 {
   unsigned int i;
   for(i=0; i<user->updatecount; ++i)
   {
     if(user->updates[i].type!=UPDATE_FRIENDS){continue;}
     if(user->updates[i].friends.circle!=circle){continue;}
-    if(!memcmp(user->updates[i].friends.id, id, 20)){return &user->updates[i];}
+    if(!memcmp(user->updates[i].friends.id, id, ID_SIZE)){return &user->updates[i];}
   }
   struct update* ret=social_update_new(user);
   ret->type=UPDATE_FRIENDS;
   ret->seq=0;
   ret->signature=0;
   ret->friends.circle=circle;
-  memcpy(ret->friends.id, id, 20);
+  memcpy(ret->friends.id, id, ID_SIZE);
   return ret;
 }
 
@@ -267,11 +267,11 @@ struct update* social_update_parse(struct user* user, void* data, unsigned int l
   case UPDATE_FRIENDS:
     {
     uint32_t circle;
-    unsigned char id[20];
+    unsigned char id[ID_SIZE];
     char add;
     readbin(data, len, &circle, sizeof(circle));
     readbin(data, len, &add, sizeof(add));
-    readbin(data, len, id, 20);
+    readbin(data, len, id, ID_SIZE);
     if(add)
     {
       social_user_addtocircle(user, circle, id);
diff --git a/update.h b/update.h
index f215655..d7a23c8 100644
--- a/update.h
+++ b/update.h
@@ -55,7 +55,7 @@ struct update
     struct
     {
       uint32_t circle;
-      unsigned char id[20];
+      unsigned char id[ID_SIZE];
       char add; // 1=add, 0=remove
     } friends;
     struct
@@ -71,6 +71,6 @@ extern struct update* social_update_new(struct user* user);
 extern void social_update_sign(struct update* update);
 extern void social_update_save(struct user* user, struct update* update);
 extern struct update* social_update_getfield(struct user* user, const char* name);
-extern struct update* social_update_getfriend(struct user* user, uint32_t circle, const unsigned char id[20]);
+extern struct update* social_update_getfriend(struct user* user, uint32_t circle, const unsigned char id[ID_SIZE]);
 extern struct update* social_update_getcircle(struct user* user, uint32_t circle);
 extern struct update* social_update_parse(struct user* user, void* data, unsigned int len); // Both for receiving updates and loading them from file