summaryrefslogtreecommitdiff
path: root/toxencryptsave
diff options
context:
space:
mode:
authorDubslow <bunslow@gmail.com>2015-03-31 19:30:09 -0500
committerDubslow <bunslow@gmail.com>2015-03-31 19:30:09 -0500
commit9b66c57bd0ec8d7e89b7fa751d83ffabd1ce2e75 (patch)
treef04117c0ab975665ec1dd2f67f8a8afdcc7afdb0 /toxencryptsave
parenta47fad15e08ab006c235d1203f731570ffea1ba0 (diff)
Fix minor code duplication
Diffstat (limited to 'toxencryptsave')
-rw-r--r--toxencryptsave/toxencryptsave.c22
-rw-r--r--toxencryptsave/toxencryptsave.h4
2 files changed, 12 insertions, 14 deletions
diff --git a/toxencryptsave/toxencryptsave.c b/toxencryptsave/toxencryptsave.c
index 9b202f49..c086ddb7 100644
--- a/toxencryptsave/toxencryptsave.c
+++ b/toxencryptsave/toxencryptsave.c
@@ -28,7 +28,6 @@
28#include "toxencryptsave.h" 28#include "toxencryptsave.h"
29#include "defines.h" 29#include "defines.h"
30#include "../toxcore/crypto_core.h" 30#include "../toxcore/crypto_core.h"
31#include "../toxcore/tox.h"
32#define SET_ERROR_PARAMETER(param, x) {if(param) {*param = x;}} 31#define SET_ERROR_PARAMETER(param, x) {if(param) {*param = x;}}
33 32
34#ifdef VANILLA_NACL 33#ifdef VANILLA_NACL
@@ -91,7 +90,7 @@ bool tox_derive_key_from_pass(uint8_t *passphrase, size_t pplength, uint8_t *out
91} 90}
92 91
93/* Same as above, except with use the given salt for deterministic key derivation. 92/* Same as above, except with use the given salt for deterministic key derivation.
94 * The salt must be tox_salt_length() bytes in length. 93 * The salt must be TOX_PASS_SALT_LENGTH bytes in length.
95 */ 94 */
96bool tox_derive_key_with_salt(uint8_t *passphrase, size_t pplength, uint8_t *salt, uint8_t *out_key, 95bool tox_derive_key_with_salt(uint8_t *passphrase, size_t pplength, uint8_t *salt, uint8_t *out_key,
97 TOX_ERR_KEY_DERIVATION *error) 96 TOX_ERR_KEY_DERIVATION *error)
@@ -254,32 +253,31 @@ bool tox_pass_key_decrypt(const uint8_t *data, size_t length, const uint8_t *key
254bool tox_pass_decrypt(const uint8_t *data, size_t length, uint8_t *passphrase, size_t pplength, uint8_t *out, 253bool tox_pass_decrypt(const uint8_t *data, size_t length, uint8_t *passphrase, size_t pplength, uint8_t *out,
255 TOX_ERR_DECRYPTION *error) 254 TOX_ERR_DECRYPTION *error)
256{ 255{
256 if (length <= TOX_PASS_ENCRYPTION_EXTRA_LENGTH || pplength == 0) {
257 SET_ERROR_PARAMETER(error, TOX_ERR_DECRYPTION_INVALID_LENGTH);
258 return 0;
259 }
260 if (!data || !passphrase || !out) {
261 SET_ERROR_PARAMETER(error, TOX_ERR_DECRYPTION_NULL);
262 return 0;
263 }
257 if (memcmp(data, TOX_ENC_SAVE_MAGIC_NUMBER, TOX_ENC_SAVE_MAGIC_LENGTH) != 0) { 264 if (memcmp(data, TOX_ENC_SAVE_MAGIC_NUMBER, TOX_ENC_SAVE_MAGIC_LENGTH) != 0) {
258 SET_ERROR_PARAMETER(error, TOX_ERR_DECRYPTION_BAD_FORMAT); 265 SET_ERROR_PARAMETER(error, TOX_ERR_DECRYPTION_BAD_FORMAT);
259 return 0; 266 return 0;
260 } 267 }
261 268
262 uint8_t passkey[crypto_hash_sha256_BYTES];
263 crypto_hash_sha256(passkey, passphrase, pplength);
264
265 uint8_t salt[crypto_pwhash_scryptsalsa208sha256_SALTBYTES]; 269 uint8_t salt[crypto_pwhash_scryptsalsa208sha256_SALTBYTES];
266 memcpy(salt, data + TOX_ENC_SAVE_MAGIC_LENGTH, crypto_pwhash_scryptsalsa208sha256_SALTBYTES); 270 memcpy(salt, data + TOX_ENC_SAVE_MAGIC_LENGTH, crypto_pwhash_scryptsalsa208sha256_SALTBYTES);
267 271
268 /* derive the key */ 272 /* derive the key */
269 uint8_t key[crypto_box_KEYBYTES + crypto_pwhash_scryptsalsa208sha256_SALTBYTES]; 273 uint8_t key[crypto_box_KEYBYTES + crypto_pwhash_scryptsalsa208sha256_SALTBYTES];
270 274
271 if (crypto_pwhash_scryptsalsa208sha256( 275 if (!tox_derive_key_with_salt(passphrase, pplength, salt, key, NULL)) {
272 key + crypto_pwhash_scryptsalsa208sha256_SALTBYTES,
273 crypto_box_KEYBYTES, (char *)passkey, sizeof(passkey), salt,
274 crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE * 2, /* slightly stronger */
275 crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE) != 0) {
276 /* out of memory most likely */ 276 /* out of memory most likely */
277 SET_ERROR_PARAMETER(error, TOX_ERR_DECRYPTION_KEY_DERIVATION_FAILED); 277 SET_ERROR_PARAMETER(error, TOX_ERR_DECRYPTION_KEY_DERIVATION_FAILED);
278 return 0; 278 return 0;
279 } 279 }
280 280
281 sodium_memzero(passkey, crypto_hash_sha256_BYTES); /* wipe plaintext pw */
282
283 return tox_pass_key_decrypt(data, length, key, out, error); 281 return tox_pass_key_decrypt(data, length, key, out, error);
284} 282}
285 283
diff --git a/toxencryptsave/toxencryptsave.h b/toxencryptsave/toxencryptsave.h
index 2ee4af46..51f75c66 100644
--- a/toxencryptsave/toxencryptsave.h
+++ b/toxencryptsave/toxencryptsave.h
@@ -168,8 +168,8 @@ bool tox_pass_decrypt(const uint8_t *data, size_t length, uint8_t *passphrase, s
168 */ 168 */
169bool tox_derive_key_from_pass(uint8_t *passphrase, size_t pplength, uint8_t *out_key, TOX_ERR_KEY_DERIVATION *error); 169bool tox_derive_key_from_pass(uint8_t *passphrase, size_t pplength, uint8_t *out_key, TOX_ERR_KEY_DERIVATION *error);
170 170
171/* Same as above, except with use the given salt for deterministic key derivation. 171/* Same as above, except use the given salt for deterministic key derivation.
172 * The salt must be tox_salt_length() bytes in length. 172 * The salt must be TOX_PASS_SALT_LENGTH bytes in length.
173 */ 173 */
174bool tox_derive_key_with_salt(uint8_t *passphrase, size_t pplength, uint8_t *salt, uint8_t *out_key, 174bool tox_derive_key_with_salt(uint8_t *passphrase, size_t pplength, uint8_t *salt, uint8_t *out_key,
175 TOX_ERR_KEY_DERIVATION *error); 175 TOX_ERR_KEY_DERIVATION *error);