function naming and whatnot

This commit is contained in:
Levi Neely 2025-03-09 09:09:41 +01:00
parent 75723dc9ae
commit 1811bba8f2
5 changed files with 206 additions and 229 deletions

View File

@ -7,7 +7,7 @@ ifneq (,$(filter clang%,$(CC)))
CFLAGS += -Wthread-safety
endif
CXXFLAGS = $(CFLAGS)
LIBLDFLAGS = $(COMMONFLAGS) -lpthread -ludev -lsqlite3 -lz -l:libmbedtls.so.14 -l:libmbedx509.so.1 -l:libmbedcrypto.so.7
LIBLDFLAGS = $(COMMONFLAGS) -lreadline -lpthread -ludev -lsqlite3 -lz -l:libmbedtls.so.14 -l:libmbedx509.so.1 -l:libmbedcrypto.so.7
EXECLDFLAGS = $(COMMONFLAGS) -lboost_program_options -lfuse
SCAN := 0

View File

@ -52,6 +52,7 @@
#include "pssl.h"
#include "prun.h"
#include "psys.h"
#include "ptask.h"
#include <string.h>
@ -94,22 +95,22 @@ typedef struct {
unsigned char hmackey[PSYNC_CRYPTO_HMAC_SHA512_KEY_LEN];
} sym_key_ver1;
void sha1_hex_null_term(const void *data, size_t len, char *out);
static void sha1hex(const void *data, size_t len, char *out);
void pcryptofolder_cache_clean() {
const char *prefixes[] = {"DKEY", "FKEY", "FLDE", "FLDD", "SEEN"};
pcache_clean_oneof(prefixes, ARRAY_SIZE(prefixes));
}
static inline int psync_crypto_is_error(const void *ptr) {
static inline int is_err(const void *ptr) {
return (uintptr_t)ptr <= PSYNC_CRYPTO_MAX_ERROR;
}
static inline int psync_crypto_to_error(const void *ptr) {
static inline int to_err(const void *ptr) {
return -((int)(uintptr_t)ptr);
}
static void psync_cloud_crypto_setup_save_to_db(
static void save_to_db(
const unsigned char *rsapriv, size_t rsaprivlen,
const unsigned char *rsapub, size_t rsapublen, const unsigned char *salt,
size_t saltlen, size_t iterations, time_t expires, const char *publicsha1,
@ -150,7 +151,7 @@ static void psync_cloud_crypto_setup_save_to_db(
psync_sql_commit_transaction();
}
static int psync_cloud_crypto_setup_do_upload(const unsigned char *rsapriv,
static int setup_do_upload(const unsigned char *rsapriv,
size_t rsaprivlen,
const unsigned char *rsapub,
size_t rsapublen,
@ -210,7 +211,7 @@ static void load_str_to(const psync_variant *v, unsigned char **ptr,
*len = l;
}
static int psync_cloud_crypto_download_keys(
static int download_keys(
unsigned char **rsapriv, size_t *rsaprivlen, unsigned char **rsapub,
size_t *rsapublen, unsigned char **salt, size_t *saltlen,
size_t *iterations, char *publicsha1, char *privatesha1, uint32_t *flags) {
@ -259,8 +260,8 @@ static int psync_cloud_crypto_download_keys(
rsapubstruct = psync_base64_decode((const unsigned char *)data->str,
data->length, &rsapubstructlen);
psync_free(res);
sha1_hex_null_term(rsaprivstruct, rsaprivstructlen, privatesha1);
sha1_hex_null_term(rsapubstruct, rsapubstructlen, publicsha1);
sha1hex(rsaprivstruct, rsaprivstructlen, privatesha1);
sha1hex(rsapubstruct, rsapubstructlen, publicsha1);
debug(D_NOTICE, "rsapubstruct=%s", rsapubstruct);
switch (*((uint32_t *)rsapubstruct)) {
case PSYNC_CRYPTO_PUB_TYPE_RSA4096:
@ -319,7 +320,7 @@ static binresult *psync_get_keys_bin_auth(const char *auth) {
}
static int
psync_cloud_crypto_setup_upload(const unsigned char *rsapriv, size_t rsaprivlen,
setup_upload(const unsigned char *rsapriv, size_t rsaprivlen,
const unsigned char *rsapub, size_t rsapublen,
const unsigned char *salt, const char *hint,
time_t *cryptoexpires, char *publicsha1,
@ -340,9 +341,9 @@ psync_cloud_crypto_setup_upload(const unsigned char *rsapriv, size_t rsaprivlen,
pub->type = PSYNC_CRYPTO_PUB_TYPE_RSA4096;
pub->flags = 0;
memcpy(pub->key, rsapub, rsapublen);
sha1_hex_null_term(priv, offsetof(priv_key_ver1, key) + rsaprivlen,
sha1hex(priv, offsetof(priv_key_ver1, key) + rsaprivlen,
privatesha1);
sha1_hex_null_term(pub, offsetof(pub_key_ver1, key) + rsapublen, publicsha1);
sha1hex(pub, offsetof(pub_key_ver1, key) + rsapublen, publicsha1);
b64priv = psync_base64_encode((unsigned char *)priv,
offsetof(priv_key_ver1, key) + rsaprivlen,
&b64privlen);
@ -351,7 +352,7 @@ psync_cloud_crypto_setup_upload(const unsigned char *rsapriv, size_t rsaprivlen,
offsetof(pub_key_ver1, key) + rsapublen, &b64publen);
psync_free(priv);
psync_free(pub);
ret = psync_cloud_crypto_setup_do_upload(b64priv, b64privlen, b64pub,
ret = setup_do_upload(b64priv, b64privlen, b64pub,
b64publen, hint, cryptoexpires);
psync_free(b64priv);
psync_free(b64pub);
@ -432,7 +433,7 @@ int pcryptofolder_setup(const char *password, const char *hint) {
rsaprivatebin->datalen, 0);
pcrypto_ctr_encdec_free(enc);
debug(D_NOTICE, "encoded private key, uploading keys");
ret = psync_cloud_crypto_setup_upload(
ret = setup_upload(
rsaprivatebin->data, rsaprivatebin->datalen, rsapublicbin->data,
rsapublicbin->datalen, salt, hint, &cryptoexpires, publicsha1,
privatesha1);
@ -443,7 +444,7 @@ int pcryptofolder_setup(const char *password, const char *hint) {
return ret;
}
debug(D_NOTICE, "keys uploaded");
psync_cloud_crypto_setup_save_to_db(
save_to_db(
rsaprivatebin->data, rsaprivatebin->datalen, rsapublicbin->data,
rsapublicbin->datalen, salt, PSYNC_CRYPTO_PBKDF2_SALT_LEN,
PSYNC_CRYPTO_PASS_TO_KEY_ITERATIONS, cryptoexpires, publicsha1,
@ -592,7 +593,7 @@ int pcryptofolder_unlock(const char *password) {
psync_free(rsapub);
psync_free(salt);
}
ret = psync_cloud_crypto_download_keys(
ret = download_keys(
&rsapriv, &rsaprivlen, &rsapub, &rsapublen, &salt, &saltlen,
&iterations, publicsha1, privatesha1, &flags);
if (ret != PSYNC_CRYPTO_START_SUCCESS) {
@ -668,7 +669,7 @@ int pcryptofolder_unlock(const char *password) {
pthread_rwlock_unlock(&crypto_lock);
if (rowcnt < 4) {
debug(D_NOTICE, "saving crypto setup to database");
psync_cloud_crypto_setup_save_to_db(rsapriv, rsaprivlen, rsapub, rsapublen,
save_to_db(rsapriv, rsaprivlen, rsapub, rsapublen,
salt, saltlen, iterations, 0,
publicsha1, privatesha1, flags);
}
@ -758,7 +759,16 @@ int pcryptofolder_reset() {
}
}
static void *err_to_ptr(int err) { return (void *)(uintptr_t)(-err); }
static void sha1hex(const void *data, size_t len, char *out) {
unsigned char sha1bin[PSYNC_SHA1_DIGEST_LEN + 1];
psync_sha1((const unsigned char *)data, len, (unsigned char *)sha1bin);
psync_binhex(out, sha1bin, PSYNC_SHA1_DIGEST_LEN);
out[PSYNC_SHA1_DIGEST_HEXLEN] = 0; // add null terminator
}
static void *errptr(int err) {
return (void *)(uintptr_t)(-err);
}
static void set_crypto_err_msg(const binresult *res) {
const binresult *msg;
@ -770,25 +780,7 @@ static void set_crypto_err_msg(const binresult *res) {
memcpy(crypto_api_err, msg->str, l);
}
typedef struct {
psync_encrypted_symmetric_key_t key;
psync_folderid_t id;
} insert_folder_key_task;
static void save_folder_key_task(void *ptr) {
insert_folder_key_task *t;
psync_sql_res *res;
t = (insert_folder_key_task *)ptr;
res = psync_sql_prep_statement(
"REPLACE INTO cryptofolderkey (folderid, enckey) VALUES (?, ?)");
psync_sql_bind_uint(res, 1, t->id);
psync_sql_bind_blob(res, 2, (const char *)t->key->data, t->key->datalen);
psync_sql_run_free(res);
psync_free(t->key);
psync_free(t);
}
static void save_folder_key_to_db(psync_folderid_t folderid,
static void save_folder_key(psync_folderid_t folderid,
psync_encrypted_symmetric_key_t enckey) {
// we are likely holding (few) read locks on the database, so executing here
// will deadlock
@ -796,27 +788,7 @@ static void save_folder_key_to_db(psync_folderid_t folderid,
t = psync_new(insert_folder_key_task);
t->key = psync_ssl_copy_encrypted_symmetric_key(enckey);
t->id = folderid;
prun_thread1("save folder key to db task", save_folder_key_task, t);
}
typedef struct {
psync_encrypted_symmetric_key_t key;
psync_fileid_t id;
uint64_t hash;
} insert_file_key_task;
static void save_file_key_task(void *ptr) {
insert_file_key_task *t;
psync_sql_res *res;
t = (insert_file_key_task *)ptr;
res = psync_sql_prep_statement(
"REPLACE INTO cryptofilekey (fileid, hash, enckey) VALUES (?, ?, ?)");
psync_sql_bind_uint(res, 1, t->id);
psync_sql_bind_uint(res, 2, t->hash);
psync_sql_bind_blob(res, 3, (const char *)t->key->data, t->key->datalen);
psync_sql_run_free(res);
psync_free(t->key);
psync_free(t);
prun_thread1("save folder key to db task", ptask_cfldr_save_fldrkey, t);
}
static void save_file_key_to_db(psync_fileid_t fileid, uint64_t hash,
@ -826,11 +798,10 @@ static void save_file_key_to_db(psync_fileid_t fileid, uint64_t hash,
t->key = psync_ssl_copy_encrypted_symmetric_key(enckey);
t->id = fileid;
t->hash = hash;
prun_thread1("save file key to db task", save_file_key_task, t);
prun_thread1("save file key to db task", ptask_cfldr_save_filekey, t);
}
static psync_encrypted_symmetric_key_t
psync_crypto_download_folder_enc_key(psync_folderid_t folderid) {
static psync_encrypted_symmetric_key_t download_fldr_enckey(psync_folderid_t folderid) {
binparam params[] = {PAPI_STR("auth", psync_my_auth),
PAPI_NUM("folderid", folderid)};
psock_t *api;
@ -846,13 +817,13 @@ psync_crypto_download_folder_enc_key(psync_folderid_t folderid) {
while (1) {
api = psync_apipool_get();
if (!api)
return (psync_encrypted_symmetric_key_t)err_to_ptr(
return (psync_encrypted_symmetric_key_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_CANT_CONNECT));
res = papi_send2(api, "crypto_getfolderkey", params);
if (unlikely_log(!res)) {
psync_apipool_release_bad(api);
if (++tries > 5)
return (psync_encrypted_symmetric_key_t)err_to_ptr(
return (psync_encrypted_symmetric_key_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_CANT_CONNECT));
} else {
psync_apipool_release(api);
@ -867,7 +838,7 @@ psync_crypto_download_folder_enc_key(psync_folderid_t folderid) {
set_crypto_err_msg(res);
psync_free(res);
psync_process_api_error(result);
return (psync_encrypted_symmetric_key_t)err_to_ptr(
return (psync_encrypted_symmetric_key_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_API_ERR_INTERNAL));
}
b64key = papi_find_result2(res, "key", PARAM_STR);
@ -875,17 +846,16 @@ psync_crypto_download_folder_enc_key(psync_folderid_t folderid) {
&keylen);
psync_free(res);
if (!key)
return (psync_encrypted_symmetric_key_t)err_to_ptr(
return (psync_encrypted_symmetric_key_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_INVALID_KEY));
ret = psync_ssl_alloc_encrypted_symmetric_key(keylen);
memcpy(ret->data, key, keylen);
psync_free(key);
save_folder_key_to_db(folderid, ret);
save_folder_key(folderid, ret);
return ret;
}
static psync_encrypted_symmetric_key_t
psync_crypto_download_file_enc_key(psync_fileid_t fileid) {
static psync_encrypted_symmetric_key_t download_file_enckey(psync_fileid_t fileid) {
binparam params[] = {PAPI_STR("auth", psync_my_auth), PAPI_NUM("fileid", fileid)};
psock_t *api;
binresult *res;
@ -900,13 +870,13 @@ psync_crypto_download_file_enc_key(psync_fileid_t fileid) {
while (1) {
api = psync_apipool_get();
if (!api)
return (psync_encrypted_symmetric_key_t)err_to_ptr(
return (psync_encrypted_symmetric_key_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_CANT_CONNECT));
res = papi_send2(api, "crypto_getfilekey", params);
if (unlikely_log(!res)) {
psync_apipool_release_bad(api);
if (++tries > 5)
return (psync_encrypted_symmetric_key_t)err_to_ptr(
return (psync_encrypted_symmetric_key_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_CANT_CONNECT));
} else {
psync_apipool_release(api);
@ -920,7 +890,7 @@ psync_crypto_download_file_enc_key(psync_fileid_t fileid) {
crypto_api_errno = result;
set_crypto_err_msg(res);
psync_free(res);
return (psync_encrypted_symmetric_key_t)err_to_ptr(
return (psync_encrypted_symmetric_key_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_API_ERR_INTERNAL));
}
result = papi_find_result2(res, "hash", PARAM_NUM)->num;
@ -929,7 +899,7 @@ psync_crypto_download_file_enc_key(psync_fileid_t fileid) {
&keylen);
psync_free(res);
if (!key)
return (psync_encrypted_symmetric_key_t)err_to_ptr(
return (psync_encrypted_symmetric_key_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_INVALID_KEY));
ret = psync_ssl_alloc_encrypted_symmetric_key(keylen);
memcpy(ret->data, key, keylen);
@ -938,8 +908,7 @@ psync_crypto_download_file_enc_key(psync_fileid_t fileid) {
return ret;
}
static psync_encrypted_symmetric_key_t
psync_crypto_get_folder_enc_key(psync_folderid_t folderid) {
static psync_encrypted_symmetric_key_t get_fldr_enckey(psync_folderid_t folderid) {
psync_encrypted_symmetric_key_t enckey;
psync_sql_res *res;
psync_variant_row row;
@ -956,11 +925,10 @@ psync_crypto_get_folder_enc_key(psync_folderid_t folderid) {
return enckey;
}
psync_sql_free_result(res);
return psync_crypto_download_folder_enc_key(folderid);
return download_fldr_enckey(folderid);
}
static psync_encrypted_symmetric_key_t
psync_crypto_get_file_enc_key(psync_fileid_t fileid, uint64_t hash,
static psync_encrypted_symmetric_key_t get_file_enckey(psync_fileid_t fileid, uint64_t hash,
int nonetwork) {
psync_encrypted_symmetric_key_t enckey;
psync_sql_res *res;
@ -985,11 +953,10 @@ psync_crypto_get_file_enc_key(psync_fileid_t fileid, uint64_t hash,
return (
psync_encrypted_symmetric_key_t)PSYNC_CRYPTO_UNLOADED_SECTOR_ENCODER;
} else
return psync_crypto_download_file_enc_key(fileid);
return download_file_enckey(fileid);
}
static psync_symmetric_key_t
psync_crypto_get_folder_symkey_locked(psync_folderid_t folderid) {
static psync_symmetric_key_t get_fldr_symkey_safe(psync_folderid_t folderid) {
char buff[16];
psync_encrypted_symmetric_key_t enckey;
psync_symmetric_key_t symkey;
@ -997,21 +964,20 @@ psync_crypto_get_folder_symkey_locked(psync_folderid_t folderid) {
symkey = (psync_symmetric_key_t)pcache_get(buff);
if (symkey)
return symkey;
enckey = psync_crypto_get_folder_enc_key(folderid);
if (psync_crypto_is_error(enckey))
enckey = get_fldr_enckey(folderid);
if (is_err(enckey))
return (psync_symmetric_key_t)enckey;
symkey = psync_ssl_rsa_decrypt_symm_key_lock(&crypto_privkey, &enckey);
psync_free(enckey);
if (symkey == PSYNC_INVALID_SYM_KEY)
return (psync_symmetric_key_t)err_to_ptr(
return (psync_symmetric_key_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_INVALID_KEY));
return symkey;
}
static psync_symmetric_key_t
psync_crypto_get_file_symkey_locked(psync_fileid_t fileid, uint64_t hash,
static psync_symmetric_key_t get_file_symkey_safe(psync_fileid_t fileid, uint64_t hash,
int nonetwork) {
char buff[32];
psync_encrypted_symmetric_key_t enckey;
@ -1022,8 +988,8 @@ psync_crypto_get_file_symkey_locked(psync_fileid_t fileid, uint64_t hash,
debug(D_NOTICE, "got key for file %lu from cache", (unsigned long)fileid);
return symkey;
}
enckey = psync_crypto_get_file_enc_key(fileid, hash, nonetwork);
if (unlikely_log(psync_crypto_is_error(enckey)))
enckey = get_file_enckey(fileid, hash, nonetwork);
if (unlikely_log(is_err(enckey)))
return (psync_symmetric_key_t)enckey;
if (nonetwork &&
enckey ==
@ -1034,12 +1000,12 @@ psync_crypto_get_file_symkey_locked(psync_fileid_t fileid, uint64_t hash,
psync_free(enckey);
if (unlikely_log(symkey == PSYNC_INVALID_SYM_KEY))
return (psync_symmetric_key_t)err_to_ptr(
return (psync_symmetric_key_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_INVALID_KEY));
return symkey;
}
static void psync_crypto_release_symkey_ptr(void *ptr) {
static void free_symkey(void *ptr) {
psync_ssl_free_symmetric_key((psync_symmetric_key_t)ptr);
}
@ -1049,7 +1015,7 @@ psync_crypto_release_folder_symkey_locked(psync_folderid_t folderid,
char buff[16];
psync_get_string_id(buff, "FKEY", folderid);
pcache_add(buff, key, PSYNC_CRYPTO_CACHE_DIR_SYM_KEY,
psync_crypto_release_symkey_ptr, 2);
free_symkey, 2);
}
static void psync_crypto_release_file_symkey_locked(psync_fileid_t fileid,
@ -1058,11 +1024,10 @@ static void psync_crypto_release_file_symkey_locked(psync_fileid_t fileid,
char buff[32];
psync_get_string_id2(buff, "DKEY", fileid, hash);
pcache_add(buff, key, PSYNC_CRYPTO_CACHE_FILE_SYM_KEY,
psync_crypto_release_symkey_ptr, 2);
free_symkey, 2);
}
static psync_symmetric_key_t
psync_crypto_sym_key_ver1_to_sym_key(sym_key_ver1 *v1) {
static psync_symmetric_key_t symkeyv1_to_symkey(sym_key_ver1 *v1) {
psync_symmetric_key_t key;
key = (psync_symmetric_key_t)pmemlock_malloc(
offsetof(psync_symmetric_key_struct_t, key) + PSYNC_AES256_KEY_SIZE +
@ -1074,13 +1039,12 @@ psync_crypto_sym_key_ver1_to_sym_key(sym_key_ver1 *v1) {
return key;
}
static pcrypto_textenc_t
psync_crypto_get_folder_encoder_locked(psync_folderid_t folderid) {
static pcrypto_textenc_t get_fldr_encoder(psync_folderid_t folderid) {
pcrypto_textenc_t enc;
psync_symmetric_key_t symkey, realkey;
sym_key_ver1 *skv1;
symkey = psync_crypto_get_folder_symkey_locked(folderid);
if (psync_crypto_is_error(symkey))
symkey = get_fldr_symkey_safe(folderid);
if (is_err(symkey))
return (pcrypto_textenc_t)symkey;
skv1 = (sym_key_ver1 *)symkey->key;
switch (skv1->type) {
@ -1096,7 +1060,7 @@ psync_crypto_get_folder_encoder_locked(psync_folderid_t folderid) {
(unsigned long)folderid);
goto def1;
}
realkey = psync_crypto_sym_key_ver1_to_sym_key(skv1);
realkey = symkeyv1_to_symkey(skv1);
psync_crypto_release_folder_symkey_locked(folderid, symkey);
enc = pcrypto_textenc_create(realkey);
psync_ssl_free_symmetric_key(realkey);
@ -1105,13 +1069,12 @@ psync_crypto_get_folder_encoder_locked(psync_folderid_t folderid) {
debug(D_WARNING, "unkown key type %u", (unsigned)skv1->type);
def1:
psync_ssl_free_symmetric_key(symkey);
return (pcrypto_textenc_t)err_to_ptr(
return (pcrypto_textenc_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_INVALID_KEY));
}
}
static pcrypto_textenc_t
psync_crypto_get_folder_encoder_check_cache_locked(psync_folderid_t folderid) {
static pcrypto_textenc_t get_fldr_encoder_cache(psync_folderid_t folderid) {
char buff[16];
pcrypto_textenc_t enc;
psync_get_string_id(buff, "FLDE", folderid);
@ -1119,16 +1082,15 @@ psync_crypto_get_folder_encoder_check_cache_locked(psync_folderid_t folderid) {
if (enc)
return enc;
else
return psync_crypto_get_folder_encoder_locked(folderid);
return get_fldr_encoder(folderid);
}
static pcrypto_textdec_t
psync_crypto_get_folder_decoder_locked(psync_folderid_t folderid) {
static pcrypto_textdec_t get_fldrdecoder_safe(psync_folderid_t folderid) {
pcrypto_textdec_t dec;
psync_symmetric_key_t symkey, realkey;
sym_key_ver1 *skv1;
symkey = psync_crypto_get_folder_symkey_locked(folderid);
if (psync_crypto_is_error(symkey))
symkey = get_fldr_symkey_safe(folderid);
if (is_err(symkey))
return (pcrypto_textenc_t)symkey;
skv1 = (sym_key_ver1 *)symkey->key;
switch (skv1->type) {
@ -1138,7 +1100,7 @@ psync_crypto_get_folder_decoder_locked(psync_folderid_t folderid) {
(unsigned long)sizeof(sym_key_ver1), (unsigned long)symkey->keylen);
goto def1;
}
realkey = psync_crypto_sym_key_ver1_to_sym_key(skv1);
realkey = symkeyv1_to_symkey(skv1);
psync_crypto_release_folder_symkey_locked(folderid, symkey);
dec = pcrypto_textdec_create(realkey);
psync_ssl_free_symmetric_key(realkey);
@ -1147,13 +1109,12 @@ psync_crypto_get_folder_decoder_locked(psync_folderid_t folderid) {
debug(D_WARNING, "unkown key type %u", (unsigned)skv1->type);
def1:
psync_ssl_free_symmetric_key(symkey);
return (pcrypto_textdec_t)err_to_ptr(
return (pcrypto_textdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_INVALID_KEY));
}
}
static pcrypto_textenc_t
psync_crypto_get_temp_folder_encoder_locked(psync_fsfolderid_t folderid) {
static pcrypto_textenc_t get_tmp_fldrencoder_safe(psync_fsfolderid_t folderid) {
pcrypto_textenc_t enc;
psync_symmetric_key_t symkey, realkey;
sym_key_ver1 *skv1;
@ -1168,7 +1129,7 @@ psync_crypto_get_temp_folder_encoder_locked(psync_fsfolderid_t folderid) {
;
if (psync_is_null(row[0])) {
psync_sql_free_result(res);
return (pcrypto_textenc_t)err_to_ptr(
return (pcrypto_textenc_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_FOLDER_NOT_ENCRYPTED));
}
b64enckey = (const unsigned char *)psync_get_lstring(row[0], &b64enckeylen);
@ -1181,11 +1142,11 @@ psync_crypto_get_temp_folder_encoder_locked(psync_fsfolderid_t folderid) {
symkey = PSYNC_INVALID_SYM_KEY;
} else {
psync_sql_free_result(res);
return (pcrypto_textenc_t)err_to_ptr(
return (pcrypto_textenc_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_FOLDER_NOT_FOUND));
}
if (symkey == PSYNC_INVALID_SYM_KEY)
return (pcrypto_textenc_t)err_to_ptr(
return (pcrypto_textenc_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_INVALID_KEY));
skv1 = (sym_key_ver1 *)symkey->key;
switch (skv1->type) {
@ -1195,7 +1156,7 @@ psync_crypto_get_temp_folder_encoder_locked(psync_fsfolderid_t folderid) {
(unsigned long)sizeof(sym_key_ver1), (unsigned long)symkey->keylen);
goto def1;
}
realkey = psync_crypto_sym_key_ver1_to_sym_key(skv1);
realkey = symkeyv1_to_symkey(skv1);
psync_ssl_free_symmetric_key(symkey);
enc = pcrypto_textenc_create(realkey);
psync_ssl_free_symmetric_key(realkey);
@ -1204,13 +1165,12 @@ psync_crypto_get_temp_folder_encoder_locked(psync_fsfolderid_t folderid) {
debug(D_WARNING, "unkown key type %u", (unsigned)skv1->type);
def1:
psync_ssl_free_symmetric_key(symkey);
return (pcrypto_textenc_t)err_to_ptr(
return (pcrypto_textenc_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_INVALID_KEY));
}
}
static pcrypto_textdec_t
psync_crypto_get_temp_folder_decoder_locked(psync_fsfolderid_t folderid) {
static pcrypto_textdec_t get_tmp_fldrdecoder_safe(psync_fsfolderid_t folderid) {
pcrypto_textdec_t dec;
psync_symmetric_key_t symkey, realkey;
sym_key_ver1 *skv1;
@ -1225,7 +1185,7 @@ psync_crypto_get_temp_folder_decoder_locked(psync_fsfolderid_t folderid) {
;
if (psync_is_null(row[0])) {
psync_sql_free_result(res);
return (pcrypto_textdec_t)err_to_ptr(
return (pcrypto_textdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_FOLDER_NOT_ENCRYPTED));
}
b64enckey = (const unsigned char *)psync_get_lstring(row[0], &b64enckeylen);
@ -1243,11 +1203,11 @@ psync_crypto_get_temp_folder_decoder_locked(psync_fsfolderid_t folderid) {
}
} else {
psync_sql_free_result(res);
return (pcrypto_textdec_t)err_to_ptr(
return (pcrypto_textdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_FOLDER_NOT_FOUND));
}
if (symkey == PSYNC_INVALID_SYM_KEY)
return (pcrypto_textdec_t)err_to_ptr(
return (pcrypto_textdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_INVALID_KEY));
skv1 = (sym_key_ver1 *)symkey->key;
switch (skv1->type) {
@ -1257,7 +1217,7 @@ psync_crypto_get_temp_folder_decoder_locked(psync_fsfolderid_t folderid) {
(unsigned long)sizeof(sym_key_ver1), (unsigned long)symkey->keylen);
goto def1;
}
realkey = psync_crypto_sym_key_ver1_to_sym_key(skv1);
realkey = symkeyv1_to_symkey(skv1);
psync_ssl_free_symmetric_key(symkey);
dec = pcrypto_textdec_create(realkey);
psync_ssl_free_symmetric_key(realkey);
@ -1266,17 +1226,16 @@ psync_crypto_get_temp_folder_decoder_locked(psync_fsfolderid_t folderid) {
debug(D_WARNING, "unkown key type %u", (unsigned)skv1->type);
def1:
psync_ssl_free_symmetric_key(symkey);
return (pcrypto_textdec_t)err_to_ptr(
return (pcrypto_textdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_INVALID_KEY));
}
}
pcrypto_textdec_t
pcryptofolder_flddecoder_get(psync_fsfolderid_t folderid) {
pcrypto_textdec_t pcryptofolder_flddecoder_get(psync_fsfolderid_t folderid) {
char buff[16];
pcrypto_textdec_t dec;
if (!crypto_started_un)
return (pcrypto_textdec_t)err_to_ptr(
return (pcrypto_textdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_NOT_STARTED));
if (folderid >= 0) {
psync_get_string_id(buff, "FLDD", folderid);
@ -1286,14 +1245,14 @@ pcryptofolder_flddecoder_get(psync_fsfolderid_t folderid) {
}
pthread_rwlock_rdlock(&crypto_lock);
if (!crypto_started_l) {
dec = (pcrypto_textdec_t)err_to_ptr(
dec = (pcrypto_textdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_NOT_STARTED));
} else if (folderid > 0) {
dec = psync_crypto_get_folder_decoder_locked(folderid);
dec = get_fldrdecoder_safe(folderid);
} else if (folderid < 0) {
dec = psync_crypto_get_temp_folder_decoder_locked(folderid);
dec = get_tmp_fldrdecoder_safe(folderid);
} else {
dec = (pcrypto_textdec_t)err_to_ptr(
dec = (pcrypto_textdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_FOLDER_NOT_ENCRYPTED));
}
pthread_rwlock_unlock(&crypto_lock);
@ -1316,8 +1275,7 @@ void pcryptofolder_flddecoder_release(
pcrypto_textdec_free(decoder);
}
char *
pcryptofolder_flddecode_filename(pcrypto_textdec_t decoder,
char *pcryptofolder_flddecode_filename(pcrypto_textdec_t decoder,
const char *name) {
unsigned char *filenameenc, *filenamedec;
size_t filenameenclen;
@ -1331,25 +1289,22 @@ pcryptofolder_flddecode_filename(pcrypto_textdec_t decoder,
return (char *)filenamedec;
}
static void psync_crypto_free_folder_encoder(void *ptr) {
pcrypto_textenc_free(
(pcrypto_textenc_t)ptr);
static void proc_free_direncoder(void *ptr) {
pcrypto_textenc_free((pcrypto_textenc_t)ptr);
}
static void psync_crypto_release_folder_encoder_locked(
static void free_direncoder(
psync_folderid_t folderid, pcrypto_textenc_t enc) {
char buff[16];
psync_get_string_id(buff, "FLDE", folderid);
pcache_add(buff, enc, PSYNC_CRYPTO_CACHE_DIR_ECODER_SEC,
psync_crypto_free_folder_encoder, 2);
pcache_add(buff, enc, PSYNC_CRYPTO_CACHE_DIR_ECODER_SEC, proc_free_direncoder, 2);
}
pcrypto_textenc_t
pcryptofolder_fldencoder_get(psync_fsfolderid_t folderid) {
pcrypto_textenc_t pcryptofolder_fldencoder_get(psync_fsfolderid_t folderid) {
char buff[16];
pcrypto_textenc_t enc;
if (!crypto_started_un) {
return (pcrypto_textenc_t)err_to_ptr(
return (pcrypto_textenc_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_NOT_STARTED));
}
@ -1363,14 +1318,14 @@ pcryptofolder_fldencoder_get(psync_fsfolderid_t folderid) {
pthread_rwlock_rdlock(&crypto_lock);
if (!crypto_started_l) {
enc = (pcrypto_textenc_t)err_to_ptr(
enc = (pcrypto_textenc_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_NOT_STARTED));
} else if (folderid > 0) {
enc = psync_crypto_get_folder_encoder_locked(folderid);
enc = get_fldr_encoder(folderid);
} else if (folderid < 0) {
enc = psync_crypto_get_temp_folder_encoder_locked(folderid);
enc = get_tmp_fldrencoder_safe(folderid);
} else {
enc = (pcrypto_textenc_t)err_to_ptr(
enc = (pcrypto_textenc_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_FOLDER_NOT_ENCRYPTED));
}
pthread_rwlock_unlock(&crypto_lock);
@ -1383,13 +1338,12 @@ void pcryptofolder_fldencoder_release(
if (crypto_started_un && folderid >= 0) {
psync_get_string_id(buff, "FLDE", folderid);
pcache_add(buff, encoder, PSYNC_CRYPTO_CACHE_DIR_ECODER_SEC,
psync_crypto_free_folder_encoder, 2);
proc_free_direncoder, 2);
} else
pcrypto_textenc_free(encoder);
}
char *
pcryptofolder_fldencode_filename(pcrypto_textenc_t encoder,
char * pcryptofolder_fldencode_filename(pcrypto_textenc_t encoder,
const char *name) {
unsigned char *filenameenc, *filenameb32;
size_t filenameenclen;
@ -1401,14 +1355,13 @@ pcryptofolder_fldencode_filename(pcrypto_textenc_t encoder,
return (char *)filenameb32;
}
static pcrypto_sector_encdec_t
psync_crypto_get_file_encoder_locked(psync_fileid_t fileid, uint64_t hash,
static pcrypto_sector_encdec_t get_fileencoder(psync_fileid_t fileid, uint64_t hash,
int nonetwork) {
pcrypto_sector_encdec_t enc;
psync_symmetric_key_t symkey, realkey;
sym_key_ver1 *skv1;
symkey = psync_crypto_get_file_symkey_locked(fileid, hash, nonetwork);
if (unlikely_log(psync_crypto_is_error(symkey)))
symkey = get_file_symkey_safe(fileid, hash, nonetwork);
if (unlikely_log(is_err(symkey)))
return (pcrypto_sector_encdec_t)symkey;
if (nonetwork && (pcrypto_sector_encdec_t)symkey ==
PSYNC_CRYPTO_UNLOADED_SECTOR_ENCODER)
@ -1427,7 +1380,7 @@ psync_crypto_get_file_encoder_locked(psync_fileid_t fileid, uint64_t hash,
(unsigned long)fileid);
goto def1;
}
realkey = psync_crypto_sym_key_ver1_to_sym_key(skv1);
realkey = symkeyv1_to_symkey(skv1);
psync_crypto_release_file_symkey_locked(fileid, hash, symkey);
enc = pcrypto_sec_encdec_create(realkey);
psync_ssl_free_symmetric_key(realkey);
@ -1436,13 +1389,12 @@ psync_crypto_get_file_encoder_locked(psync_fileid_t fileid, uint64_t hash,
debug(D_WARNING, "unkown key type %u", (unsigned)skv1->type);
def1:
psync_ssl_free_symmetric_key(symkey);
return (pcrypto_sector_encdec_t)err_to_ptr(
return (pcrypto_sector_encdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_INVALID_KEY));
}
}
static pcrypto_sector_encdec_t
psync_crypto_get_temp_file_encoder_locked(psync_fsfileid_t fileid,
static pcrypto_sector_encdec_t get_fileencoder_tmp(psync_fsfileid_t fileid,
int nonetwork) {
uint64_t hash;
psync_sql_res *res;
@ -1460,7 +1412,7 @@ psync_crypto_get_temp_file_encoder_locked(psync_fsfileid_t fileid,
row = psync_sql_fetch_row(res);
if (unlikely_log(!row)) {
psync_sql_free_result(res);
return (pcrypto_sector_encdec_t)err_to_ptr(
return (pcrypto_sector_encdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_FILE_NOT_FOUND));
}
switch (psync_get_number(row[0])) {
@ -1475,7 +1427,7 @@ psync_crypto_get_temp_file_encoder_locked(psync_fsfileid_t fileid,
} else
symkey = PSYNC_INVALID_SYM_KEY;
if (symkey == PSYNC_INVALID_SYM_KEY)
return (pcrypto_sector_encdec_t)err_to_ptr(
return (pcrypto_sector_encdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_INVALID_KEY));
skv1 = (sym_key_ver1 *)symkey->key;
switch (skv1->type) {
@ -1486,7 +1438,7 @@ psync_crypto_get_temp_file_encoder_locked(psync_fsfileid_t fileid,
(unsigned long)symkey->keylen);
goto def1;
}
realkey = psync_crypto_sym_key_ver1_to_sym_key(skv1);
realkey = symkeyv1_to_symkey(skv1);
psync_ssl_free_symmetric_key(symkey);
enc = pcrypto_sec_encdec_create(realkey);
psync_ssl_free_symmetric_key(realkey);
@ -1495,28 +1447,27 @@ psync_crypto_get_temp_file_encoder_locked(psync_fsfileid_t fileid,
debug(D_WARNING, "unkown key type %u", (unsigned)skv1->type);
def1:
psync_ssl_free_symmetric_key(symkey);
return (pcrypto_sector_encdec_t)err_to_ptr(
return (pcrypto_sector_encdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_INVALID_KEY));
}
case PSYNC_FS_TASK_MODIFY:
fileid = psync_get_number(row[1]);
hash = psync_get_number(row[3]);
psync_sql_free_result(res);
return psync_crypto_get_file_encoder_locked(fileid, hash, nonetwork);
return get_fileencoder(fileid, hash, nonetwork);
default:
psync_sql_free_result(res);
return (pcrypto_sector_encdec_t)err_to_ptr(
return (pcrypto_sector_encdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_INTERNAL_ERROR));
}
}
pcrypto_sector_encdec_t
pcryptofolder_filencoder_get(psync_fsfileid_t fileid, uint64_t hash,
pcrypto_sector_encdec_t pcryptofolder_filencoder_get(psync_fsfileid_t fileid, uint64_t hash,
int nonetwork) {
char buff[32];
pcrypto_sector_encdec_t enc;
if (!crypto_started_un)
return (pcrypto_sector_encdec_t)err_to_ptr(
return (pcrypto_sector_encdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_NOT_STARTED));
if (fileid >= 0) {
psync_get_string_id2(buff, "SEEN", fileid, hash);
@ -1526,22 +1477,21 @@ pcryptofolder_filencoder_get(psync_fsfileid_t fileid, uint64_t hash,
}
pthread_rwlock_rdlock(&crypto_lock);
if (!crypto_started_l) {
enc = (pcrypto_sector_encdec_t)err_to_ptr(
enc = (pcrypto_sector_encdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_NOT_STARTED));
} else if (fileid > 0) {
enc = psync_crypto_get_file_encoder_locked(fileid, hash, nonetwork);
enc = get_fileencoder(fileid, hash, nonetwork);
} else if (fileid < 0) {
enc = psync_crypto_get_temp_file_encoder_locked(fileid, nonetwork);
enc = get_fileencoder_tmp(fileid, nonetwork);
} else {
enc = (pcrypto_sector_encdec_t)err_to_ptr(
enc = (pcrypto_sector_encdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_FOLDER_NOT_ENCRYPTED));
}
pthread_rwlock_unlock(&crypto_lock);
return enc;
}
pcrypto_sector_encdec_t
pcryptofolder_filencoder_from_binresult(psync_fileid_t fileid,
pcrypto_sector_encdec_t pcryptofolder_filencoder_from_binresult(psync_fileid_t fileid,
binresult *res) {
const binresult *b64key;
unsigned char *key;
@ -1554,7 +1504,7 @@ pcryptofolder_filencoder_from_binresult(psync_fileid_t fileid,
key = psync_base64_decode((const unsigned char *)b64key->str, b64key->length,
&keylen);
if (!key)
return (pcrypto_sector_encdec_t)err_to_ptr(
return (pcrypto_sector_encdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_INVALID_KEY));
esym = psync_ssl_alloc_encrypted_symmetric_key(keylen);
memcpy(esym->data, key, keylen);
@ -1563,16 +1513,16 @@ pcryptofolder_filencoder_from_binresult(psync_fileid_t fileid,
save_file_key_to_db(fileid, hash, esym);
pthread_rwlock_rdlock(&crypto_lock);
if (!crypto_started_l)
enc = (pcrypto_sector_encdec_t)err_to_ptr(
enc = (pcrypto_sector_encdec_t)errptr(
PRINT_RETURN_CONST(PSYNC_CRYPTO_NOT_STARTED));
else {
// save_file_key_to_db runs thread to save to db, that's why we insert
// decrypted key to cache, so psync_crypto_get_file_encoder_locked finds
// decrypted key to cache, so get_fileencoder finds
// it
symkey = psync_ssl_rsa_decrypt_symm_key_lock(&crypto_privkey, &esym);
psync_crypto_release_file_symkey_locked(fileid, hash, symkey);
enc = psync_crypto_get_file_encoder_locked(fileid, hash, 0);
enc = get_fileencoder(fileid, hash, 0);
}
pthread_rwlock_unlock(&crypto_lock);
psync_free(esym);
@ -1596,19 +1546,19 @@ void pcryptofolder_filencoder_release(
pcrypto_sec_encdec_free(encoder);
}
char *psync_crypto_get_name_encoded_locked(psync_folderid_t folderid,
static char *get_name_encoded(psync_folderid_t folderid,
const char *name) {
pcrypto_textenc_t enc;
unsigned char *nameenc;
char *ret;
size_t nameenclen;
enc = psync_crypto_get_folder_encoder_check_cache_locked(folderid);
if (psync_crypto_is_error(enc))
enc = get_fldr_encoder_cache(folderid);
if (is_err(enc))
return (char *)enc;
pcrypto_encode_text(enc, (const unsigned char *)name,
strlen(name), &nameenc, &nameenclen);
ret = (char *)psync_base32_encode(nameenc, nameenclen, &nameenclen);
psync_crypto_release_folder_encoder_locked(folderid, enc);
free_direncoder(folderid, enc);
psync_free(nameenc);
return ret;
}
@ -1628,18 +1578,19 @@ static int set_err(int ret, const char **err) {
return ret;
}
static int get_name_for_enc_folder_locked(psync_folderid_t folderid,
static int get_cfldr_name(psync_folderid_t folderid,
const char *name, char **ename,
const char **err) {
char *encname;
encname = psync_crypto_get_name_encoded_locked(folderid, name);
if (psync_crypto_is_error(encname))
return set_err(psync_crypto_to_error(encname), err);
char *encname;
encname = get_name_encoded(folderid, name);
if (is_err(encname))
return set_err(to_err(encname), err);
*ename = encname;
return PSYNC_CRYPTO_SUCCESS;
}
static int get_name_for_folder_locked(psync_folderid_t folderid,
static int get_fldr_name(psync_folderid_t folderid,
const char *name, char **ename,
const char **err) {
if (folderid == 0) {
@ -1657,7 +1608,7 @@ static int get_name_for_folder_locked(psync_folderid_t folderid,
if (!row)
return set_err(PRINT_RETURN_CONST(PSYNC_CRYPTO_FOLDER_NOT_FOUND), err);
if (enc)
return get_name_for_enc_folder_locked(folderid, name, ename, err);
return get_cfldr_name(folderid, name, ename, err);
else {
*ename = psync_strdup(name);
return PSYNC_CRYPTO_SUCCESS;
@ -1711,7 +1662,7 @@ int psync_cloud_crypto_send_mkdir(psync_folderid_t folderid, const char *name,
*newfolderid = papi_find_result2(meta, "folderid", PARAM_NUM)->num;
psync_sql_start_transaction();
pfileops_create_fldr(meta);
save_folder_key_to_db(papi_find_result2(meta, "folderid", PARAM_NUM)->num,
save_folder_key(papi_find_result2(meta, "folderid", PARAM_NUM)->num,
encsym);
psync_sql_commit_transaction();
psync_free(res);
@ -1723,9 +1674,9 @@ char *pcryptofolder_filencoder_key_get(psync_fsfileid_t fileid,
psync_encrypted_symmetric_key_t encsym;
char *ret;
if (fileid < 0)
return (char *)err_to_ptr(PRINT_RETURN_CONST(PSYNC_CRYPTO_FILE_NOT_FOUND));
encsym = psync_crypto_get_file_enc_key(fileid, hash, 0);
if (psync_crypto_is_error(encsym))
return (char *)errptr(PRINT_RETURN_CONST(PSYNC_CRYPTO_FILE_NOT_FOUND));
encsym = get_file_enckey(fileid, hash, 0);
if (is_err(encsym))
return (char *)encsym;
ret = (char *)psync_base64_encode(encsym->data, encsym->datalen, keylen);
psync_free(encsym);
@ -1737,7 +1688,7 @@ char *pcryptofolder_filencoder_key_new(uint32_t flags, size_t *keylen) {
sym_key_ver1 sym;
char *ret;
if (!crypto_started_un)
return (char *)err_to_ptr(PRINT_RETURN_CONST(PSYNC_CRYPTO_NOT_STARTED));
return (char *)errptr(PRINT_RETURN_CONST(PSYNC_CRYPTO_NOT_STARTED));
sym.type = PSYNC_CRYPTO_SYM_AES256_1024BIT_HMAC;
sym.flags = flags;
psync_ssl_rand_strong(sym.hmackey, PSYNC_CRYPTO_HMAC_SHA512_KEY_LEN);
@ -1745,14 +1696,14 @@ char *pcryptofolder_filencoder_key_new(uint32_t flags, size_t *keylen) {
pthread_rwlock_rdlock(&crypto_lock);
if (!crypto_started_l) {
pthread_rwlock_unlock(&crypto_lock);
return (char *)err_to_ptr(PRINT_RETURN_CONST(PSYNC_CRYPTO_NOT_STARTED));
return (char *)errptr(PRINT_RETURN_CONST(PSYNC_CRYPTO_NOT_STARTED));
}
encsym = psync_ssl_rsa_encrypt_data(crypto_pubkey, (unsigned char *)&sym,
sizeof(sym));
pthread_rwlock_unlock(&crypto_lock);
if (encsym == PSYNC_INVALID_ENC_SYM_KEY) {
debug(D_ERROR, "RSA encryption failed");
return (char *)err_to_ptr(PRINT_RETURN_CONST(PSYNC_CRYPTO_RSA_ERROR));
return (char *)errptr(PRINT_RETURN_CONST(PSYNC_CRYPTO_RSA_ERROR));
}
psync_ssl_memclean(&sym, sizeof(sym));
ret = (char *)psync_base64_encode(encsym->data, encsym->datalen, keylen);
@ -1766,7 +1717,7 @@ char *pcryptofolder_filencoder_key_newplain(
sym_key_ver1 sym;
char *ret;
if (!crypto_started_un)
return (char *)err_to_ptr(PRINT_RETURN_CONST(PSYNC_CRYPTO_NOT_STARTED));
return (char *)errptr(PRINT_RETURN_CONST(PSYNC_CRYPTO_NOT_STARTED));
sym.type = PSYNC_CRYPTO_SYM_AES256_1024BIT_HMAC;
sym.flags = flags;
psync_ssl_rand_strong(sym.hmackey, PSYNC_CRYPTO_HMAC_SHA512_KEY_LEN);
@ -1774,16 +1725,16 @@ char *pcryptofolder_filencoder_key_newplain(
pthread_rwlock_rdlock(&crypto_lock);
if (!crypto_started_l) {
pthread_rwlock_unlock(&crypto_lock);
return (char *)err_to_ptr(PRINT_RETURN_CONST(PSYNC_CRYPTO_NOT_STARTED));
return (char *)errptr(PRINT_RETURN_CONST(PSYNC_CRYPTO_NOT_STARTED));
}
encsym = psync_ssl_rsa_encrypt_data(crypto_pubkey, (unsigned char *)&sym,
sizeof(sym));
pthread_rwlock_unlock(&crypto_lock);
if (encsym == PSYNC_INVALID_ENC_SYM_KEY) {
debug(D_ERROR, "RSA encryption failed");
return (char *)err_to_ptr(PRINT_RETURN_CONST(PSYNC_CRYPTO_RSA_ERROR));
return (char *)errptr(PRINT_RETURN_CONST(PSYNC_CRYPTO_RSA_ERROR));
}
*deckey = psync_crypto_sym_key_ver1_to_sym_key(&sym);
*deckey = symkeyv1_to_symkey(&sym);
psync_ssl_memclean(&sym, sizeof(sym));
ret = (char *)psync_base64_encode(encsym->data, encsym->datalen, keylen);
psync_free(encsym);
@ -1813,7 +1764,7 @@ int pcryptofolder_mkdir(psync_folderid_t folderid, const char *name,
encsym = psync_ssl_rsa_encrypt_data(crypto_pubkey, (unsigned char *)&sym,
sizeof(sym));
psync_ssl_memclean(&sym, sizeof(sym));
ret = get_name_for_folder_locked(folderid, name, &ename, err);
ret = get_fldr_name(folderid, name, &ename, err);
pthread_rwlock_unlock(&crypto_lock);
if (ret) {
if (encsym != PSYNC_INVALID_ENC_SYM_KEY)
@ -1928,11 +1879,11 @@ int psync_pcloud_crypto_reencode_key(
goto err_ph_2;
psync_sha256(newpriv, newprivlen, newprivsha);
rsasign = psync_ssl_rsa_sign_sha256_hash(priv, newprivsha);
if (psync_crypto_is_error(rsasign)) {
psync_free(newpriv);
if (is_err(rsasign)) {
psync_free(is_err);
psync_ssl_rsa_free_public(pub);
psync_ssl_rsa_free_private(priv);
return psync_crypto_to_error(rsasign);
return to_err(rsasign);
}
*privenc = (char *)psync_base64_encode(newpriv, newprivlen, &dummy);
*sign = (char *)psync_base64_encode(rsasign->data, rsasign->datalen, &dummy);
@ -2003,10 +1954,10 @@ int psync_pcloud_crypto_encode_key(const char *newpassphrase, uint32_t flags,
psync_sha256(newpriv, rsaprivlen, newprivsha);
rsasign = psync_ssl_rsa_sign_sha256_hash(crypto_privkey, newprivsha);
if (psync_crypto_is_error(rsasign)) {
if (is_err(rsasign)) {
psync_free(newpriv);
psync_ssl_rsa_free_binary(rsapriv);
return psync_crypto_to_error(rsasign);
return to_err(rsasign);
}
*privenc = (char *)psync_base64_encode(newpriv, rsaprivlen, &dummy);
*sign = (char *)psync_base64_encode(rsasign->data, rsasign->datalen, &dummy);
@ -2164,10 +2115,3 @@ int pcryptofolder_change_pass_unlocked(const char *newpassphrase,
cres = psync_pcloud_crypto_encode_key(newpassphrase, flags, privenc, sign);
return cres;
}
void sha1_hex_null_term(const void *data, size_t len, char *out) {
unsigned char sha1bin[PSYNC_SHA1_DIGEST_LEN];
psync_sha1((const unsigned char *)data, len, (unsigned char *)sha1bin);
psync_binhex(out, sha1bin, PSYNC_SHA1_DIGEST_LEN);
out[PSYNC_SHA1_DIGEST_HEXLEN] = 0;
}

View File

@ -50,33 +50,27 @@
#define PSYNC_SHA1_DIGEST_LEN 20
#define PSYNC_SHA1_DIGEST_HEXLEN 40
#define psync_sha1_ctx mbedtls_sha1_context
#define psync_sha1(data, datalen, checksum) \
mbedtls_sha1(data, datalen, checksum)
#define psync_sha1(data, datalen, checksum) mbedtls_sha1(data, datalen, checksum)
#define psync_sha1_init(pctx) mbedtls_sha1_starts(pctx)
#define psync_sha1_update(pctx, data, datalen) \
mbedtls_sha1_update(pctx, (const unsigned char *)data, datalen)
#define psync_sha1_update(pctx, data, datalen) mbedtls_sha1_update(pctx, (const unsigned char *)data, datalen)
#define psync_sha1_final(checksum, pctx) mbedtls_sha1_finish(pctx, checksum)
#define PSYNC_SHA256_BLOCK_LEN 64
#define PSYNC_SHA256_DIGEST_LEN 32
#define PSYNC_SHA256_DIGEST_HEXLEN 64
#define psync_sha256_ctx mbedtls_sha256_context
#define psync_sha256(data, datalen, checksum) \
mbedtls_sha256(data, datalen, checksum, 0)
#define psync_sha256(data, datalen, checksum) mbedtls_sha256(data, datalen, checksum, 0)
#define psync_sha256_init(pctx) mbedtls_sha256_starts(pctx, 0)
#define psync_sha256_update(pctx, data, datalen) \
mbedtls_sha256_update(pctx, (const unsigned char *)data, datalen)
#define psync_sha256_update(pctx, data, datalen) mbedtls_sha256_update(pctx, (const unsigned char *)data, datalen)
#define psync_sha256_final(checksum, pctx) mbedtls_sha256_finish(pctx, checksum)
#define PSYNC_SHA512_BLOCK_LEN 128
#define PSYNC_SHA512_DIGEST_LEN 64
#define PSYNC_SHA512_DIGEST_HEXLEN 128
#define psync_sha512_ctx mbedtls_sha512_context
#define psync_sha512(data, datalen, checksum) \
mbedtls_sha512(data, datalen, checksum, 0)
#define psync_sha512(data, datalen, checksum) mbedtls_sha512(data, datalen, checksum, 0)
#define psync_sha512_init(pctx) mbedtls_sha512_starts(pctx, 0)
#define psync_sha512_update(pctx, data, datalen) \
mbedtls_sha512_update(pctx, (const unsigned char *)data, datalen)
#define psync_sha512_update(pctx, data, datalen) mbedtls_sha512_update(pctx, (const unsigned char *)data, datalen)
#define psync_sha512_final(checksum, pctx) mbedtls_sha512_finish(pctx, checksum)
typedef mbedtls_rsa_context *psync_rsa_t;

View File

@ -1055,3 +1055,30 @@ int ptask_download_needed_async(psync_fileid_t fileid,
task.request.cbext = cbext;
return task_send_async(&task, sizeof(task));
}
void ptask_cfldr_save_fldrkey(void *ptr) {
insert_folder_key_task *t;
psync_sql_res *res;
t = (insert_folder_key_task *)ptr;
res = psync_sql_prep_statement(
"REPLACE INTO cryptofolderkey (folderid, enckey) VALUES (?, ?)");
psync_sql_bind_uint(res, 1, t->id);
psync_sql_bind_blob(res, 2, (const char *)t->key->data, t->key->datalen);
psync_sql_run_free(res);
psync_free(t->key);
psync_free(t);
}
void ptask_cfldr_save_filekey(void *ptr) {
insert_file_key_task *t;
psync_sql_res *res;
t = (insert_file_key_task *)ptr;
res = psync_sql_prep_statement(
"REPLACE INTO cryptofilekey (fileid, hash, enckey) VALUES (?, ?, ?)");
psync_sql_bind_uint(res, 1, t->id);
psync_sql_bind_uint(res, 2, t->hash);
psync_sql_bind_blob(res, 3, (const char *)t->key->data, t->key->datalen);
psync_sql_run_free(res);
psync_free(t->key);
psync_free(t);
}

View File

@ -32,15 +32,12 @@
#ifndef _PSYNC_TASKS_H
#define _PSYNC_TASKS_H
#include "psynclib.h"
#include "pfoldersync.h"
#include "pssl.h"
#define PSYNC_ASYNC_ERR_FLAG_PERM \
0x01 // the error is permanent(ish) and there is no reason to retry
#define PSYNC_ASYNC_ERR_FLAG_RETRY_AS_IS \
0x02 // same request may succeed in the future if retried as is
#define PSYNC_ASYNC_ERR_FLAG_SUCCESS \
0x04 // like no action performed because of no need - file already exists and
// so on
#define PSYNC_ASYNC_ERR_FLAG_PERM 0x01 // the error is permanent(ish) and there is no reason to retry
#define PSYNC_ASYNC_ERR_FLAG_RETRY_AS_IS 0x02 // same request may succeed in the future if retried as is
#define PSYNC_ASYNC_ERR_FLAG_SUCCESS 0x04 // like no action performed because of no need - file already exists and so on
#define PSYNC_ASYNC_ERROR_NET 1
#define PSYNC_ASYNC_ERROR_FILE 2
@ -119,6 +116,17 @@ typedef struct {
};
} psync_async_result_t;
typedef struct {
psync_encrypted_symmetric_key_t key;
psync_fileid_t id;
uint64_t hash;
} insert_file_key_task;
typedef struct {
psync_encrypted_symmetric_key_t key;
psync_folderid_t id;
} insert_folder_key_task;
typedef void (*psync_async_callback_t)(void *, psync_async_result_t *);
@ -154,4 +162,8 @@ void ptask_download_q(psync_syncid_t syncid, psync_fileid_t fileid, psync_folder
void ptask_upload(psync_syncid_t syncid, psync_fileid_t localfileid, const char *name);
void ptask_upload_q(psync_syncid_t syncid, psync_fileid_t localfileid, const char *name);
// crypto folder
void ptask_cfldr_save_fldrkey(void *ptr);
void ptask_cfldr_save_filekey(void *ptr);
#endif