From c0d678824537239f5e17822cd8473ac32f1ed251 Mon Sep 17 00:00:00 2001 From: Andrey Rys Date: Sun, 16 Jan 2022 12:21:54 +0100 Subject: [PATCH] -O nobuf: disable IO buffering useful for online "as user types" encrypting cannot use CTR here because CTR increases counter each time message continuation appears --- VERSION | 2 +- tfc_error.c | 2 ++ tfc_misc.c | 3 +-- tfcrypt.c | 11 +++++++++-- tfcrypt.h | 2 +- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/VERSION b/VERSION index 4b9026d..900731f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -63 +64 diff --git a/tfc_error.c b/tfc_error.c index a00b070..2b50807 100644 --- a/tfc_error.c +++ b/tfc_error.c @@ -162,6 +162,7 @@ void usage(void) tfc_say(" when the whole status line width is smaller than tty width."); tfc_say(" statless: emit less information in status line (only processed data)."); tfc_say(" iobs=val: set IO block size value. Must not exceed %u bytes.", TFC_U(TFC_BLKSIZE)); + tfc_say(" nobuf: disable IO buffering, write as soon as data received (only for stream ciphers!)"); tfc_say(" iseek=val: seek source file/device by these val bytes."); tfc_say(" oseek=val: seek destination file/device by these val bytes."); tfc_say(" ioseek=val: seek both source and destination."); @@ -341,6 +342,7 @@ void usage(void) tfc_say(" shorthex: with -H, do not print printable characters, dump only hex string."); tfc_say(" logfile: (same as -o) redirect all messages to logfile instead of stderr."); tfc_say(" iobs=val: set IO block size value. Must not exceed %u bytes.", TFC_U(TFC_BLKSIZE)); + tfc_say(" nobuf: disable IO buffering, write as soon as data received (only for stream ciphers!)"); tfc_say(" xtsblocks=val: use these nr of TF blocks per XTS block. Default is %u.", TFC_U(TFC_XTSBLOCKS)); tfc_say(" iseek=val: seek source file/device by these val bytes."); tfc_say(" Initial counter is adjusted automatically."); diff --git a/tfc_misc.c b/tfc_misc.c index b140a82..01998f2 100644 --- a/tfc_misc.c +++ b/tfc_misc.c @@ -102,11 +102,10 @@ const char *tfc_modename(int mode) return NULL; } -tfc_yesno tfc_is_stream(int mode) +tfc_yesno tfc_is_freestream(int mode) { switch (mode) { case TFC_MODE_PLAIN: - case TFC_MODE_CTR: case TFC_MODE_STREAM: return YES; } diff --git a/tfcrypt.c b/tfcrypt.c index 2b2a26f..bad1d43 100644 --- a/tfcrypt.c +++ b/tfcrypt.c @@ -30,6 +30,7 @@ static tfc_byte svctr[TF_BLOCK_SIZE]; static tfc_fsize rwd, do_read_loops, loopcnt; +static tfc_yesno unbuffered; static void open_log(const char *logfile) { @@ -346,6 +347,12 @@ _baddfname: show_when_done = YES; else if (!strcmp(s, "pid")) show_pid = YES; + else if (!strcmp(s, "nobuf")) { + if (!tfc_is_freestream(ctr_mode)) xerror(NO, YES, YES, + "cannot activate unbuffered mode for non-stream cipher mode %s!", + tfc_modename(ctr_mode)); + else unbuffered = 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; @@ -362,7 +369,7 @@ _baddfname: "%s: invalid block size value", s); } else blksize = (size_t)tfc_modifysize((tfc_fsize)blksize, strchr(s, ':')); - if (!tfc_is_stream(ctr_mode) && blksize < TF_BLOCK_SIZE) xerror(NO, YES, YES, + if (!tfc_is_freestream(ctr_mode) && blksize < TF_BLOCK_SIZE) xerror(NO, YES, YES, "%s: block size is lesser than TF_BLOCK_SIZE (%u bytes)", s, TFC_U(TF_BLOCK_SIZE)); if (blksize > TFC_BLKSIZE) xerror(NO, YES, YES, "%s: block size exceeds %u bytes", @@ -1209,7 +1216,7 @@ _ragain: lio = xread(sfd, pblk, lrem); default: xerror(NO, NO, NO, "%s", srcfname); break; } } - if (lio && lio < lrem) { + if (unbuffered == NO && lio && lio < lrem) { pblk += lio; lrem -= lio; goto _ragain; diff --git a/tfcrypt.h b/tfcrypt.h index 42088a1..2806614 100644 --- a/tfcrypt.h +++ b/tfcrypt.h @@ -193,7 +193,7 @@ int xxopen(tfc_yesno noerr, const char *pathname, int flags); int xopen(const char *pathname, int flags); void xclose(int fd); const char *tfc_modename(int mode); -tfc_yesno tfc_is_stream(int mode); +tfc_yesno tfc_is_freestream(int mode); void tfc_getcurtime(tfc_useconds *tx); char *tfc_format_time(tfc_useconds t); char *tfc_format_pid(const char *str); -- 2.31.1