X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=tfcrypt.c;h=e8514391b8036b8168c5f85d7ef32e8383c59542;hb=9ac86c906f37b9b9dce4f018c90d420f947e05a9;hp=dd137ae6ba4d9ac26d05fd5596bee5c4e9d22d6e;hpb=cdd9119e29f2f865403303adb8b6004b863db968;p=tfcrypt.git diff --git a/tfcrypt.c b/tfcrypt.c index dd137ae..e851439 100644 --- a/tfcrypt.c +++ b/tfcrypt.c @@ -29,6 +29,7 @@ #include "tfcrypt.h" static tfc_byte svctr[TF_BLOCK_SIZE]; +static tfc_fsize rwd, do_read_loops, loopcnt; static void open_log(const char *logfile) { @@ -129,7 +130,6 @@ int main(int argc, char **argv) double td; char *s, *d, *t, *stoi; size_t x, n; - tfc_fsize rwd; progpid = getpid(); progname = basename(argv[0]); @@ -311,6 +311,8 @@ _baddfname: write_flags |= O_SYNC; else if (!strcmp(s, "trunc")) write_flags |= O_TRUNC; + else if (!strcmp(s, "append")) + write_flags |= O_APPEND; else if (!strcmp(s, "fsync")) do_fsync = YES; else if (!strcmp(s, "pad")) @@ -339,6 +341,10 @@ _baddfname: show_when_done = YES; else if (!strcmp(s, "pid")) show_pid = YES; + else if (!strncmp(s, "readloops", 9) && *(s+9) == '=') { + do_read_loops = tfc_humanfsize(s+10, &stoi); + if (!str_empty(stoi)) do_read_loops = NOSIZE; + } else if (!strncmp(s, "logfile", 7) && *(s+7) == '=') open_log(s+8); else if (!strncmp(s, "iobs", 4) && *(s+4) == '=') { @@ -576,6 +582,7 @@ _baddfname: break; case 'q': quiet = YES; + xexit_no_nl = YES; verbose = NO; do_full_hexdump = NO; status_timer = 0; @@ -768,13 +775,7 @@ _nokeyfd: } if (sfd == -1) xerror(NO, NO, YES, "%s", argv[idx]); - if (do_edcrypt == TFC_DO_DECRYPT && do_mac != NO && maxlen != NOFSIZE) { - if (verbose) tfc_esay("%s: disabling signature verification on " - "requested partial decryption.", tfc_format_pid(progname)); - do_mac = NO; - } - - if ((do_mac >= TFC_MAC_VRFY || do_mac == TFC_MAC_DROP) && !do_mac_file) { + if ((do_mac >= TFC_MAC_VRFY || do_mac <= TFC_MAC_DROP) && !do_mac_file) { maxlen = tfc_fdsize(sfd); if (maxlen == NOFSIZE) xerror(NO, YES, YES, @@ -1021,12 +1022,6 @@ _xts2genkey: if (xwrite(krfd, pblk, TF_FROM_BITS(TFC_KEY_BITS)) == NOSIZE) xerro xexit(0); } - if (iseek_blocks && (do_edcrypt == TFC_DO_DECRYPT && do_mac != NO)) { - if (verbose) tfc_esay("%s: disabling signature verification on " - "requested partial decryption.", tfc_format_pid(progname)); - do_mac = NO; - } - if (do_mac != NO) { if (mackey_opt == TFC_MACKEY_RAWKEY) skein(mackey, TF_MAX_BITS, key, key, TF_FROM_BITS(TFC_KEY_BITS)); if (ctr_mode < TFC_MODE_OCB) { @@ -1132,6 +1127,7 @@ _ctrwagain: lio = xwrite(dfd, pblk, lrem); lrem -= lio; goto _ctrwagain; } + total_written_dst += ldone; total_processed_dst += ldone; delta_processed += ldone; } @@ -1156,6 +1152,7 @@ _decrypt_again_vrfy2: } _nodecrypt_again_vrfy2: + loopcnt = 1; errno = 0; do_stop = NO; while (1) { @@ -1165,7 +1162,15 @@ _nodecrypt_again_vrfy2: 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 = YES; + if (lio == 0) { + if ((do_read_loops != 0 && sfd != 0) && (loopcnt < do_read_loops)) { + lseek(sfd, 0L, SEEK_SET); + loopcnt++; + goto _ragain; + } + + do_stop = YES; + } if (lio != NOSIZE) ldone += lio; else { if (errno != EIO && catch_all_errors != YES) @@ -1249,6 +1254,8 @@ _nowrite: total_processed_dst += ldone; } } + if (verbose && status_timer && do_statline_dynamic == YES && statline_was_shown == YES) tfc_esay("\n"); + errno = 0; if (do_mac >= TFC_MAC_VRFY) { if (!do_mac_file) { @@ -1326,7 +1333,8 @@ _macragain: lio = xread(sfd, pblk, lrem); } if (do_mac == TFC_MAC_JUST_VRFY2) { if (verbose) tfc_esay("%s: -u: MAC signature is valid, proceeding with decrypting it again", tfc_format_pid(progname)); - do_mac = TFC_MAC_DROP; + maxlen = total_processed_src - SKEIN_DIGEST_SIZE; + do_mac = TFC_MAC_DROP2; goto _decrypt_again_vrfy2; } } @@ -1343,7 +1351,6 @@ _shortmac: memset(macvrfy, 0, sizeof(macvrfy)); memset(macresult, 0, sizeof(macresult)); memset(tmpdata, 0, sizeof(tmpdata)); } - else if (do_mac == TFC_MAC_SIGN) { if (ctr_mode < TFC_MODE_OCB) skein_final(macresult, &sk); else skein(macresult, macbits, mackey, macresult, TF_FROM_BITS(macbits)); @@ -1369,6 +1376,7 @@ _macwagain: lio = xwrite(dfd, pblk, lrem); lrem -= lio; goto _macwagain; } + total_written_dst += ldone; total_processed_dst += ldone; delta_processed += ldone; } @@ -1400,6 +1408,7 @@ _macwagain: lio = xwrite(dfd, pblk, lrem); memset(macresult, 0, sizeof(macresult)); memset(tmpdata, 0, sizeof(tmpdata)); } + else if (do_mac == TFC_MAC_DROP2) total_processed_src += SKEIN_DIGEST_SIZE; if (verbose || status_timer || (do_stop == YES && quiet == NO)) print_crypt_status(0);