#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)
{
double td;
char *s, *d, *t, *stoi;
size_t x, n;
- tfc_fsize rwd;
+ progpid = getpid();
progname = basename(argv[0]);
if (!isatty(2)) do_statline_dynamic = NO;
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"))
show_secrets = YES;
else if (!strcmp(s, "finished"))
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) == '=') {
break;
case 'q':
quiet = YES;
+ xexit_no_nl = YES;
verbose = NO;
do_full_hexdump = NO;
status_timer = 0;
}
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.", 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,
if (ctr_mode == TFC_MODE_PLAIN) goto _plain;
- if (verbose) tfc_esay("%s: hashing password", progname);
+ if (verbose) tfc_esay("%s: hashing password", tfc_format_pid(progname));
if (rawkey == TFC_RAWKEY_KEYFILE) {
tfc_yesno xtskeyset = NO;
_xts2genkey: if (xwrite(krfd, pblk, TF_FROM_BITS(TFC_KEY_BITS)) == NOSIZE) xerror(NO, NO, YES, "%s", genkeyf);
if (do_fsync && fsync(krfd) == -1) xerror(NO, NO, YES, "%s", genkeyf);
if (verbose && xtskeyset == NO) {
- tfc_esay("%s: password hashing done", progname);
- tfc_esay("%s: rawkey written to %s.", progname, genkeyf);
- tfc_esay("%s: Have a nice day!", progname);
+ tfc_esay("%s: password hashing done", tfc_format_pid(progname));
+ tfc_esay("%s: rawkey written to %s.", tfc_format_pid(progname), genkeyf);
+ tfc_esay("%s: Have a nice day!", tfc_format_pid(progname));
}
if (ctr_mode == TFC_MODE_XTS) {
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.", 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) {
if (verbose) tfc_esay("%s: doing MAC calculation, processing speed "
- "will be slower.", progname);
+ "will be slower.", tfc_format_pid(progname));
if (mackey_opt) skein_init_key(&sk, mackey, macbits);
else skein_init(&sk, macbits);
}
xclose(kfd);
kfd = -1;
}
- if (verbose) tfc_esay("%s: password hashing done", progname);
+ if (verbose) tfc_esay("%s: password hashing done", tfc_format_pid(progname));
if (overwrite_source && srcfname) argv[idx] = srcfname;
lrem -= lio;
goto _ctrwagain;
}
+ total_written_dst += ldone;
total_processed_dst += ldone;
delta_processed += ldone;
}
if (do_mac == TFC_MAC_JUST_VRFY2) {
rwd = tfc_fdgetpos(sfd);
if (rwd == NOFSIZE) {
- tfc_esay("%s: WARNING: input is not seekable, disabling MAC testing mode", progname);
+ tfc_esay("%s: WARNING: input is not seekable, disabling MAC testing mode", tfc_format_pid(progname));
do_mac = TFC_MAC_VRFY;
}
goto _nodecrypt_again_vrfy2;
}
_nodecrypt_again_vrfy2:
+ loopcnt = 1;
errno = 0;
do_stop = NO;
while (1) {
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)
}
}
+ 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) {
if (ldone < TF_FROM_BITS(macbits)) {
if (quiet == NO) tfc_esay("%s: short signature (%zu), "
- "not verifying", progname, ldone);
+ "not verifying", tfc_format_pid(progname), ldone);
exitcode = 1;
goto _shortmac;
}
if (!memcmp(tmpdata, macresult, TF_FROM_BITS(macbits))) {
if (quiet == NO) {
- tfc_esay("%s: signature is good", progname);
+ tfc_esay("%s: signature is good", tfc_format_pid(progname));
if (verbose) {
if (do_outfmt == TFC_OUTFMT_B64) tfc_printbase64(stderr, macresult, TF_FROM_BITS(macbits), YES);
else mehexdump(macresult, TF_FROM_BITS(macbits), TF_FROM_BITS(macbits), YES);
}
}
if (do_mac == TFC_MAC_JUST_VRFY2) {
- if (verbose) tfc_esay("%s: -u: MAC signature is valid, proceeding with decrypting it again", progname);
- do_mac = TFC_MAC_DROP;
+ if (verbose) tfc_esay("%s: -u: MAC signature is valid, proceeding with decrypting it again", tfc_format_pid(progname));
+ maxlen = total_processed_src - SKEIN_DIGEST_SIZE;
+ do_mac = TFC_MAC_DROP2;
goto _decrypt_again_vrfy2;
}
}
else {
if (quiet == NO) {
tfc_esay("%s: signature is BAD: "
- "wrong password, key, mode, or file is not signed", progname);
- if (do_mac == TFC_MAC_JUST_VRFY2) tfc_esay("%s: -u: MAC signature is invalid, not decrypting it again", progname);
+ "wrong password, key, mode, or file is not signed", tfc_format_pid(progname));
+ if (do_mac == TFC_MAC_JUST_VRFY2) tfc_esay("%s: -u: MAC signature is invalid, not decrypting it again", tfc_format_pid(progname));
}
exitcode = 1;
}
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));
lrem -= lio;
goto _macwagain;
}
+ total_written_dst += ldone;
total_processed_dst += ldone;
delta_processed += ldone;
}
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);