From ffb13e4716e002c0e532afec6723d90ded72d451 Mon Sep 17 00:00:00 2001 From: dubslow Date: Fri, 17 Oct 2014 06:02:15 -0500 Subject: add load/save from key instead of pw --- toxencryptsave/toxencryptsave.c | 45 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'toxencryptsave/toxencryptsave.c') diff --git a/toxencryptsave/toxencryptsave.c b/toxencryptsave/toxencryptsave.c index 7492f06b..0d63a0aa 100644 --- a/toxencryptsave/toxencryptsave.c +++ b/toxencryptsave/toxencryptsave.c @@ -175,6 +175,28 @@ int tox_encrypted_save(const Tox *tox, uint8_t *data, uint8_t *passphrase, uint3 return tox_pass_encrypt(temp_data, temp_size, passphrase, pplength, data); } +/* Save the messenger data encrypted with the given key from tox_derive_key. + * data must be at least tox_encrypted_size(). + * + * returns 0 on success + * returns -1 on failure + */ +int tox_encrypted_key_save(const Tox* tox, uint8_t* data, uint8_t* key) +{ + /* first get plain save data */ + uint32_t temp_size = tox_size(tox); + uint8_t temp_data[temp_size]; + tox_save(tox, temp_data); + + /* the output data consists of, in order: magic number, enc_data */ + /* first add the magic number */ + memcpy(data, TOX_ENC_SAVE_MAGIC_NUMBER, TOX_ENC_SAVE_MAGIC_LENGTH); + data += TOX_ENC_SAVE_MAGIC_LENGTH; + + /* encrypt */ + return tox_pass_key_encrypt(temp_data, temp_size, key, data); +} + /* This is the inverse of tox_pass_key_encrypt, also using only keys produced by * tox_derive_key_from_pass. * @@ -260,6 +282,29 @@ int tox_encrypted_load(Tox *tox, const uint8_t *data, uint32_t length, uint8_t * return tox_load(tox, temp_data, decrypt_length); } +/* Load the messenger from encrypted data of size length, with key from tox_derive_key. + * + * returns 0 on success + * returns -1 on failure + */ +int tox_encrypted_key_load(Tox *tox, const uint8_t *data, uint32_t length, uint8_t* key) +{ + if (memcmp(data, TOX_ENC_SAVE_MAGIC_NUMBER, TOX_ENC_SAVE_MAGIC_LENGTH) != 0) + return -1; + + data += TOX_ENC_SAVE_MAGIC_LENGTH; + length -= TOX_ENC_SAVE_MAGIC_LENGTH; + + uint32_t decrypt_length = length - TOX_PASS_ENCRYPTION_EXTRA_LENGTH; + uint8_t temp_data[decrypt_length]; + + if (tox_pass_key_decrypt(data, length, key, temp_data) + != decrypt_length) + return -1; + printf("tox key load: decryption passed\n"); + return tox_load(tox, temp_data, decrypt_length); +} + /* Determines whether or not the given data is encrypted (by checking the magic number) * * returns 1 if it is encrypted -- cgit v1.2.3 From ff1d4faa744138946d12f98d21fcc10f33db10bd Mon Sep 17 00:00:00 2001 From: dubslow Date: Fri, 17 Oct 2014 09:19:27 -0500 Subject: add new test cases, cleanup astray printf --- auto_tests/encryptsave_test.c | 33 +++++++++++++++++++++++++++++++++ toxencryptsave/toxencryptsave.c | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) (limited to 'toxencryptsave/toxencryptsave.c') diff --git a/auto_tests/encryptsave_test.c b/auto_tests/encryptsave_test.c index b335cbe1..85952392 100644 --- a/auto_tests/encryptsave_test.c +++ b/auto_tests/encryptsave_test.c @@ -116,12 +116,45 @@ START_TEST(test_save_friend) } END_TEST +START_TEST(test_keys) +{ + uint8_t key[tox_pass_key_length()]; + tox_derive_key_from_pass("123qweasdzxc", 12, key); + uint8_t* string = "No Patrick, mayonnaise is not an instrument."; // 44 + + uint8_t encrypted[44+tox_pass_encryption_extra_length()]; + int sz = tox_pass_key_encrypt(string, 44, key, encrypted); + + uint8_t encrypted2[44+tox_pass_encryption_extra_length()]; + int sz2 = tox_pass_encrypt(string, 44, "123qweasdzxc", 12, encrypted2); + + ck_assert_msg(sz == sz2, "an encryption failed"); + + uint8_t out1[44+tox_pass_encryption_extra_length()]; + uint8_t out2[44+tox_pass_encryption_extra_length()]; + + sz = tox_pass_key_decrypt(encrypted, 44+tox_pass_encryption_extra_length(), key, out1); + ck_assert_msg(sz == 44, "sz isn't right"); + ck_assert_msg(memcmp(out1, string, 44) == 0, "decryption 1 failed"); + + sz2 = tox_pass_decrypt(encrypted2, 44+tox_pass_encryption_extra_length(), "123qweasdzxc", 12, out2); + ck_assert_msg(sz2 == 44, "sz2 isn't right"); + ck_assert_msg(memcmp(out2, string, 44) == 0, "decryption 2 failed"); + + // test that pass_decrypt can decrypt things from pass_key_encrypt + sz = tox_pass_decrypt(encrypted, 44+tox_pass_encryption_extra_length(), "123qweasdzxc", 12, out1); + ck_assert_msg(sz == 44, "sz isn't right"); + ck_assert_msg(memcmp(out1, string, 44) == 0, "decryption 3 failed"); +} +END_TEST + Suite * encryptsave_suite(void) { Suite *s = suite_create("encryptsave"); DEFTESTCASE_SLOW(known_kdf, 60); /* is 5-10 seconds on my computer, but is directly dependent on CPU */ DEFTESTCASE(save_friend); + DEFTESTCASE(keys); return s; } diff --git a/toxencryptsave/toxencryptsave.c b/toxencryptsave/toxencryptsave.c index 0d63a0aa..d1926246 100644 --- a/toxencryptsave/toxencryptsave.c +++ b/toxencryptsave/toxencryptsave.c @@ -301,7 +301,7 @@ int tox_encrypted_key_load(Tox *tox, const uint8_t *data, uint32_t length, uint8 if (tox_pass_key_decrypt(data, length, key, temp_data) != decrypt_length) return -1; - printf("tox key load: decryption passed\n"); + return tox_load(tox, temp_data, decrypt_length); } -- cgit v1.2.3