X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=client_common.c;h=396fd88c894cda20e4f55a7955a9a4fe77e9633d;hb=refs%2Fheads%2Fpu;hp=95e59fd29de2015fcc65443a4ffc6442387ec0f8;hpb=9228213e72bbcdaf42665f51c633af6c4ccc78bf;p=paraslash.git diff --git a/client_common.c b/client_common.c index 95e59fd2..cbd78bbb 100644 --- a/client_common.c +++ b/client_common.c @@ -262,7 +262,7 @@ static bool has_feature(const char *feature, struct client_task *ct) return false; for (int i = 0; ct->features[i]; i++) if (strcmp(feature, ct->features[i]) == 0) - return i; + return true; return false; } @@ -324,7 +324,7 @@ static int client_post_monitor(struct sched *s, void *context) */ { /* decrypted challenge/session key buffer */ - unsigned char crypt_buf[1024]; + unsigned char *crypt_buf; struct sb_buffer sbb; ret = recv_sb(ct, &sbb); @@ -337,22 +337,31 @@ static int client_post_monitor(struct sched *s, void *context) } n = sbb.iov.iov_len; PARA_INFO_LOG("<-- [challenge] (%zu bytes)\n", n); - ret = apc_priv_decrypt(ct->key_file, crypt_buf, + ret = apc_priv_decrypt(ct->key_file, &crypt_buf, sbb.iov.iov_base, n); free(sbb.iov.iov_base); if (ret < 0) goto out; + if (ret != APC_CHALLENGE_SIZE + 2 * SESSION_KEY_LEN) { + free(crypt_buf); + ret = -E_DECRYPT; + goto out; + } ct->challenge_hash = alloc(HASH2_SIZE); if (has_feature("sha256", ct)) { - hash2_function((char *)crypt_buf, APC_CHALLENGE_SIZE, ct->challenge_hash); + hash2_function((char *)crypt_buf, APC_CHALLENGE_SIZE, + ct->challenge_hash); hash2_to_asc(ct->challenge_hash, buf); } else { - hash_function((char *)crypt_buf, APC_CHALLENGE_SIZE, ct->challenge_hash); + hash_function((char *)crypt_buf, APC_CHALLENGE_SIZE, + ct->challenge_hash); hash_to_asc(ct->challenge_hash, buf); } - ct->scc.send = sc_new(crypt_buf + APC_CHALLENGE_SIZE, SESSION_KEY_LEN); - ct->scc.recv = sc_new(crypt_buf + APC_CHALLENGE_SIZE + SESSION_KEY_LEN, - SESSION_KEY_LEN); + ct->scc.send = sc_new(crypt_buf + APC_CHALLENGE_SIZE, + SESSION_KEY_LEN); + ct->scc.recv = sc_new(crypt_buf + APC_CHALLENGE_SIZE + + SESSION_KEY_LEN, SESSION_KEY_LEN); + free(crypt_buf); PARA_INFO_LOG("--> %s\n", buf); ct->status = CL_RECEIVED_CHALLENGE; return 0; @@ -398,12 +407,12 @@ static int client_post_monitor(struct sched *s, void *context) char *buf2; size_t sz; ret = btr_node_status(ct->btrn[1], 0, BTR_NT_LEAF); - if (ret == -E_BTR_EOF) { + if (ret == -E_EOF) { /* empty blob data packet indicates EOF */ PARA_INFO_LOG("blob sent\n"); ret = send_sb(ct, 1, NULL, 0, SBD_BLOB_DATA, true); if (ret >= 0) - ret = -E_BTR_EOF; + ret = -E_EOF; } if (ret < 0) goto close1; @@ -556,7 +565,7 @@ int client_parse_config(int argc, char *argv[], struct client_task **ct_ptr, struct lls_parse_result *lpr; int ret, ll; struct client_task *ct; - char *kf = NULL, *user, *errctx, *home = para_homedir(); + char *kf = NULL, *user, *errctx; ret = lls(lls_parse(argc, argv, cmd, &lpr, &errctx)); if (ret < 0) @@ -578,8 +587,12 @@ int client_parse_config(int argc, char *argv[], struct client_task **ct_ptr, if (CLIENT_OPT_GIVEN(KEY_FILE, lpr)) kf = para_strdup(CLIENT_OPT_STRING_VAL(KEY_FILE, lpr)); else { - kf = make_message("%s/.paraslash/key.%s", home, user); - if (!file_exists(kf)) { + struct stat statbuf; + const char *confdir = get_confdir(); + kf = make_message("%s/key.%s", confdir, user); + if (stat(kf, &statbuf) != 0) { /* assume file does not exist */ + const char *home = getenv("HOME"); + assert(home); /* get_confdir() above succeeded */ free(kf); kf = make_message("%s/.ssh/id_rsa", home); } @@ -595,7 +608,6 @@ int client_parse_config(int argc, char *argv[], struct client_task **ct_ptr, *ct_ptr = ct; ret = lls_num_inputs(lpr); out: - free(home); if (ret < 0) { if (errctx) PARA_ERROR_LOG("%s\n", errctx);