X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=tfcrypt.c;h=83f6c69869a689b2505b691abf8b07c92dc2cca1;hb=a874fa08a172c1d5006d15d05e494e1b9fbda211;hp=5ed5bbf1979cad49d5ee15bc876495b82ebc822a;hpb=ee5e048cace46d40dfb9fe450eb00f977c78ab12;p=tfcrypt.git diff --git a/tfcrypt.c b/tfcrypt.c index 5ed5bbf..83f6c69 100644 --- a/tfcrypt.c +++ b/tfcrypt.c @@ -2,7 +2,7 @@ * tfcrypt -- high security Threefish encryption tool. * * tfcrypt is copyrighted: - * Copyright (C) 2012-2018 Andrey Rys. All rights reserved. + * Copyright (C) 2012-2019 Andrey Rys. All rights reserved. * * tfcrypt is licensed to you under the terms of std. MIT/X11 license: * @@ -83,6 +83,30 @@ static int getps_plain_hex_filter(struct getpasswd_state *getps, char chr, size_ return 1; } +static void make_hint(void *hint, size_t szhint, const void *data, size_t szdata) +{ + char t[TF_FROM_BITS(TF_MAX_BITS)]; + + skein(t, TF_MAX_BITS, NULL, data, szdata); + xor_shrink(hint, szhint, t, sizeof(t)); + memset(t, 0, sizeof(t)); +} + +static void raw_say_hint(void *hint, size_t szhint, const void *data, size_t szdata, const char *prompt) +{ + make_hint(hint, szhint, data, szdata); + if (prompt) tfc_nfsay(stderr, "%s: ", prompt); + mehexdump(hint, szhint, szhint, 1); + memset(hint, 0, szhint); +} + +static void say_hint(const void *data, size_t szdata, const char *prompt) +{ + char t[TF_SIZE_UNIT]; + raw_say_hint(t, TF_SIZE_UNIT, data, szdata, prompt); + /* t[] is erased (automatically) */ +} + int main(int argc, char **argv) { int c; @@ -104,6 +128,12 @@ int main(int argc, char **argv) _baddfname: memset(s, 0, n); + if (!strcmp(progname, "iotool")) { + do_edcrypt = TFC_DO_PLAIN; + password = YES; + ctr_mode = TFC_MODE_PLAIN; + } + opterr = 0; while ((c = getopt(argc, argv, "L:s:aU:C:r:K:t:Pkzxc:l:qedn:vV:pwE:O:S:AmM:R:Z:WHD:")) != -1) { switch (c) { @@ -125,6 +155,29 @@ _baddfname: counter_opt = TFC_CTR_RAND; else if (!strcasecmp(optarg, "zero")) counter_opt = TFC_CTR_ZERO; + else if (strchr(optarg, ':')) { + char *ss, chr; + + counter_opt = TFC_CTR_SSET; + n = sizeof(ctr); + + s = d = optarg; t = NULL; + while ((s = strtok_r(d, ",", &t))) { + if (d) d = NULL; + + if (n == 0) break; + ss = strchr(s, ':'); + if (!ss) continue; + *ss = 0; ss++; + chr = (char)strtoul(s, &stoi, 16); + if (!str_empty(stoi)) continue; + x = (size_t)strtoul(ss, &stoi, 10); + if (!str_empty(stoi)) continue; + if (x > n) x = n; + memset(ctr+(sizeof(ctr)-n), (int)chr, x); + n -= x; + } + } else counter_file = sksum_hashlist_file = optarg; break; case 'C': @@ -148,10 +201,10 @@ _baddfname: ctr_mode = TFC_MODE_PLAIN; break; case 'e': - do_edcrypt = TFC_DO_ENCRYPT; + if (do_edcrypt != TFC_DO_PLAIN) do_edcrypt = TFC_DO_ENCRYPT; break; case 'd': - do_edcrypt = TFC_DO_DECRYPT; + if (do_edcrypt != TFC_DO_PLAIN) do_edcrypt = TFC_DO_DECRYPT; break; case 'D': macbits = strtoul(optarg, &stoi, 10); @@ -376,6 +429,24 @@ _baddfname: if (counter_opt == TFC_CTR_HEAD) maxlen += TF_BLOCK_SIZE; } + else if (!strncmp(s, "ftrunc", 6) && *(s+6) == '=') { + s += 7; + if (!strcmp(s, "tail")) { + do_ftrunc = TFC_FTRUNC_TAIL; + ftrunc_dfd = NOFSIZE; + } + else { + do_ftrunc = TFC_DO_FTRUNC; + ftrunc_dfd = tfc_humanfsize(s, &stoi); + if (!str_empty(stoi)) { + ftrunc_dfd = tfc_fnamesize(s, YES); + ftrunc_dfd = tfc_modifysize(ftrunc_dfd, strchr(s, ':')); + if (ftrunc_dfd == NOFSIZE) xerror(NO, YES, YES, + "%s: invalid ftrunc value", s); + } + else ftrunc_dfd = tfc_modifysize(ftrunc_dfd, strchr(s, ':')); + } + } else if (!strncmp(s, "xkey", 4) && *(s+4) == '=') { s += 5; maxkeylen = tfc_humanfsize(s, &stoi); @@ -477,6 +548,7 @@ _baddfname: case 'q': quiet = YES; verbose = NO; + do_full_hexdump = NO; status_timer = 0; break; case 'v': @@ -569,7 +641,7 @@ _nosalt: lrem = lblock = sizeof(tmpdata); if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(mkfd); _mkragain: lio = xread(mkfd, pblk, lrem); - if (lio == 0) do_stop = YES; + if (lio == 0 && do_stop == NO) do_stop = YES; if (lio != NOSIZE) ldone += lio; else { if (errno != EIO && catch_all_errors != YES) @@ -612,14 +684,8 @@ _mkragain: lio = xread(mkfd, pblk, lrem); n = xgetpasswd(&getps); if (n == NOSIZE) xerror(NO, NO, YES, "getting MAC password"); if (n == ((size_t)-2)) xexit(1); + if (verbose) say_hint(pwdask, n, "MAC password hint"); skein(mackey, TF_MAX_BITS, NULL, pwdask, n); - if (verbose) { - skein(tmpdata, TF_MAX_BITS, NULL, mackey, TF_FROM_BITS(TF_MAX_BITS)); - xor_shrink(tmpdata+TF_FROM_BITS(TF_MAX_BITS), TF_SIZE_UNIT, tmpdata, TF_FROM_BITS(TF_MAX_BITS)); - tfc_nfsay(stderr, "MAC password hint: "); - mehexdump(tmpdata+TF_FROM_BITS(TF_MAX_BITS), TF_SIZE_UNIT, TF_SIZE_UNIT, 1); - memset(tmpdata, 0, sizeof(tmpdata)); - } } @@ -807,6 +873,7 @@ _xts2keyaskstr: memset(&getps, 0, sizeof(struct getpasswd_state)); n = xgetpasswd(&getps); if (n == NOSIZE) xerror(NO, NO, YES, "getting string rawkey"); if (n == ((size_t)-2)) xexit(1); + if (verbose) say_hint(pblk, n, "Raw string key hint"); if (ctr_mode == TFC_MODE_XTS) { if (xtskeyset == NO) { pblk = xtskey; n = sizeof(xtskey); @@ -837,6 +904,7 @@ _rawkey_hex_again: } hex2bin(pblk, pwdask); memset(pwdask, 0, sizeof(pwdask)); + if (verbose) say_hint(pblk, n/2, "Raw hex key hint"); if (ctr_mode == TFC_MODE_XTS) { if (xtskeyset == NO) { pblk = xtskey; @@ -871,6 +939,7 @@ _pwdagain: memset(&getps, 0, sizeof(struct getpasswd_state)); goto _pwdagain; } } + if (verbose) say_hint(pwdask, n, "Password hint"); skein(key, TFC_KEY_BITS, mackey_opt ? mackey : NULL, pwdask, n); memset(pwdask, 0, sizeof(pwdask)); memset(pwdagain, 0, sizeof(pwdagain)); @@ -1046,7 +1115,7 @@ _ctrwagain: lio = xwrite(dfd, pblk, lrem); lrem = lblock = blk_len_adj(maxlen, total_processed_src, blksize); if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(sfd); _ragain: lio = xread(sfd, pblk, lrem); - if (lio == 0) do_stop = TFC_STOP_BEGAN; + if (lio == 0) do_stop = YES; if (lio != NOSIZE) ldone += lio; else { if (errno != EIO && catch_all_errors != YES) @@ -1126,8 +1195,6 @@ _nowrite: total_processed_dst += ldone; if (maxlen != NOFSIZE && total_processed_src >= maxlen) break; } - if (do_stop == TFC_STOP_FULL) goto _nomac; - errno = 0; if (do_mac >= TFC_MAC_VRFY) { if (!do_mac_file) { @@ -1272,11 +1339,14 @@ _macwagain: lio = xwrite(dfd, pblk, lrem); memset(tmpdata, 0, sizeof(tmpdata)); } -_nomac: - if (verbose || status_timer || do_stop == TFC_STOP_FULL) print_crypt_status(0); + if (verbose || status_timer || do_stop == YES) print_crypt_status(0); if (do_preserve_time) fcopy_matime(dfd, &s_stat); xclose(sfd); + if (do_ftrunc > TFC_NO_FTRUNC) { + if (do_ftrunc == TFC_FTRUNC_TAIL) ftrunc_dfd = total_processed_dst; + if (ftruncate(dfd, (off_t)ftrunc_dfd) == -1) xerror(YES, NO, YES, "ftruncate(%d)", dfd); + } xclose(dfd); xexit(exitcode);