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);
}
示例#2
0
/* 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);
}
示例#3
0
/**
	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;
}
示例#5
0
/* 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);
}