void manage_keys(DHT *dht) { const uint32_t KEYS_SIZE = crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES; uint8_t keys[KEYS_SIZE]; FILE *keys_file = fopen("key", "r"); if (keys_file != NULL) { /* If file was opened successfully -- load keys, otherwise save new keys */ size_t read_size = fread(keys, sizeof(uint8_t), KEYS_SIZE, keys_file); if (read_size != KEYS_SIZE) { printf("Error while reading the key file\nExiting.\n"); exit(1); } load_keys(dht->c, keys); printf("Keys loaded successfully.\n"); } else { new_keys(dht->c); save_keys(dht->c, keys); keys_file = fopen("key", "w"); if (fwrite(keys, sizeof(uint8_t), KEYS_SIZE, keys_file) != KEYS_SIZE) { printf("Error while writing the key file.\nExiting.\n"); exit(1); } printf("Keys saved successfully.\n"); } fclose(keys_file); }
/* 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_probekeys Loads public and private keys for the probe. If it cannot load them, it generates and saves them. Returns 0 if we get actual keys and -1 if no keys could be loaded or generated. */ static int load_probekeys() { int r; char *pubfn, *privfn; pubfn = fm_abs(FM_KEY_PROBE_PUBLIC); privfn = fm_abs(FM_KEY_PROBE_PRIVATE); r = load_keys(pubfn, privfn, &probe); if(r == -1 && DSA_generate_key(probe)) { save_keys(pubfn, privfn, probe); r = 0; } free(pubfn); free(privfn); return r; }
int manage_keys(DHT *dht, char *keys_file_path) { const uint32_t KEYS_SIZE = crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES; uint8_t keys[KEYS_SIZE]; FILE *keys_file; // Check if file exits, proceed to open and load keys keys_file = fopen(keys_file_path, "r"); if (keys_file != NULL) { size_t read_size = fread(keys, sizeof(uint8_t), KEYS_SIZE, keys_file); if (read_size != KEYS_SIZE) { return 0; } load_keys(dht->c, keys); } else { // Otherwise save new keys new_keys(dht->c); save_keys(dht->c, keys); keys_file = fopen(keys_file_path, "w"); size_t write_size = fwrite(keys, sizeof(uint8_t), KEYS_SIZE, keys_file); if (write_size != KEYS_SIZE) { return 0; } } fclose(keys_file); // We want our DHT public key to be the same as our internal one since this is a bootstrap server memcpy(dht->self_public_key, dht->c->self_public_key, crypto_box_PUBLICKEYBYTES); memcpy(dht->self_secret_key, dht->c->self_secret_key, crypto_box_SECRETKEYBYTES); return 1; }
/* save the messenger in data of size Messenger_size() */ void Messenger_save(Messenger *m, uint8_t *data) { save_keys(data); data += crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES; uint32_t nospam = get_nospam(); memcpy(data, &nospam, sizeof(nospam)); data += sizeof(nospam); uint32_t size = DHT_size(); memcpy(data, &size, sizeof(size)); data += sizeof(size); DHT_save(data); data += size; size = sizeof(Friend) * m->numfriends; memcpy(data, &size, sizeof(size)); data += sizeof(size); memcpy(data, m->friendlist, sizeof(Friend) * m->numfriends); data += size; uint16_t small_size = m->name_length; memcpy(data, &small_size, sizeof(small_size)); data += sizeof(small_size); memcpy(data, m->name, small_size); }
void manage_keys(DHT *dht, char *keys_file) { const uint32_t KEYS_SIZE = crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES; uint8_t keys[KEYS_SIZE]; struct stat existence; FILE *keysf; /* Check if file exits, proceed to open and load keys */ if (stat(keys_file, &existence) >= 0) { keysf = fopen(keys_file, "r"); size_t read_size = fread(keys, sizeof(uint8_t), KEYS_SIZE, keysf); if (read_size != KEYS_SIZE) { printf("Error while reading the key file\nExiting.\n"); exit(1); } else { printf("Keys loaded successfully\n"); } load_keys(dht->c, keys); } else { /* otherwise save new keys */ /* Silly work-around to ignore any errors coming from new_keys() */ new_keys(dht->c); save_keys(dht->c, keys); keysf = fopen(keys_file, "w"); if (fwrite(keys, sizeof(uint8_t), KEYS_SIZE, keysf) != KEYS_SIZE) { printf("Error while writing the key file.\nExiting.\n"); exit(1); } else { printf("Keys saved successfully\n"); } } fclose(keysf); }