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)
{
int fd;
+ tfc_yesno ro;
if (!strcmp(logfile, "-")) return;
- fd = open(logfile, O_WRONLY | O_CREAT | O_LARGEFILE | O_TRUNC, 0666);
- if (fd == -1) xerror(NO, NO, YES, "%s", logfile);
+ ro = read_only;
+ read_only = NO;
+ fd = xopen(logfile, O_WRONLY | O_CREAT | O_LARGEFILE | O_TRUNC);
+ read_only = ro;
xclose(2);
if (dup2(fd, 2) == -1) xexit(2);
xclose(fd);
ctr_mode = TFC_MODE_ECB;
else if (!strcasecmp(optarg, "xts"))
ctr_mode = TFC_MODE_XTS;
- else if (!strcasecmp(optarg, "ocb"))
- ctr_mode = TFC_MODE_OCB;
else xerror(NO, YES, YES, "%s: invalid mode of operation", optarg);
break;
case 'P':
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"))
do_pad = YES;
+ else if (!strcmp(s, "ro"))
+ read_only = YES;
+ else if (!strcmp(s, "rw"))
+ read_only = NO;
else if (!strcmp(s, "xtime"))
do_preserve_time = YES;
else if (!strcmp(s, "gibsize"))
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;
"%s: invalid block size value", s);
}
else blksize = (size_t)tfc_modifysize((tfc_fsize)blksize, strchr(s, ':'));
- if (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",
}
else oseek = tfc_modifysize(oseek, strchr(s, ':'));
}
+ else if (!strncmp(s, "ioseek", 6) && *(s+6) == '=') {
+ s += 7;
+
+ iseek = tfc_humanfsize(s, &stoi);
+ if (!str_empty(stoi)) {
+ iseek = tfc_fnamesize(s, YES);
+ iseek = tfc_modifysize(iseek, strchr(s, ':'));
+ if (iseek == NOFSIZE) xerror(NO, YES, YES,
+ "%s: invalid iseek value", s);
+ }
+ else iseek = tfc_modifysize(iseek, strchr(s, ':'));
+ if (ctr_mode != TFC_MODE_PLAIN && iseek % TF_BLOCK_SIZE)
+ xerror(NO, YES, YES,
+ "%s: not round to TF block size "
+ "of %u bytes",
+ s, TFC_U(TF_BLOCK_SIZE));
+ iseek_blocks = iseek / TF_BLOCK_SIZE;
+
+ oseek = tfc_humanfsize(s, &stoi);
+ if (!str_empty(stoi)) {
+ oseek = tfc_fnamesize(s, YES);
+ oseek = tfc_modifysize(oseek, strchr(s, ':'));
+ if (oseek == NOFSIZE) xerror(NO, YES, YES,
+ "%s: invalid oseek value", s);
+ }
+ else oseek = tfc_modifysize(oseek, strchr(s, ':'));
+ }
else if (!strncmp(s, "count", 5) && *(s+5) == '=') {
s += 6;
maxlen = tfc_humanfsize(s, &stoi);
if (!strcasecmp(saltf, "disable")) goto _nosalt;
if (!strcmp(saltf, "-")) saltfd = 0;
- else saltfd = open(saltf, O_RDONLY | O_LARGEFILE);
- if (saltfd == -1) xerror(NO, NO, YES, "%s", saltf);
+ else saltfd = xopen(saltf, O_RDONLY | O_LARGEFILE);
lio = xread(saltfd, tfc_salt, TFC_MAX_SALT - TF_FROM_BITS(TFC_KEY_BITS));
if (lio == NOSIZE) xerror(NO, NO, YES, "%s", saltf);
tfc_saltsz = lio;
tfc_yesno do_stop;
if (!strcmp(mackeyf, "-")) mkfd = 0;
- else mkfd = open(mackeyf, O_RDONLY | O_LARGEFILE);
- if (mkfd == -1) xerror(NO, NO, YES, "%s", mackeyf);
+ else mkfd = xopen(mackeyf, O_RDONLY | O_LARGEFILE);
skein_init(&sk, TFC_KEY_BITS);
if (argv[idx]) {
if (password || rawkey > TFC_RAWKEY_KEYFILE) goto _nokeyfd;
if (!strcmp(argv[idx], "-")) kfd = 0;
- else kfd = open(argv[idx], O_RDONLY | O_LARGEFILE);
- if (kfd == -1) xerror(NO, NO, YES, "%s", argv[idx]);
+ else kfd = xopen(argv[idx], O_RDONLY | O_LARGEFILE);
lio = strnlen(argv[idx], PATH_MAX);
memset(argv[idx], '*', lio);
if (argv[idx]) {
if (!strcmp(argv[idx], "-") && kfd) sfd = 0;
else {
- sfd = open(argv[idx], O_RDONLY | O_LARGEFILE);
+ sfd = xopen(argv[idx], O_RDONLY | O_LARGEFILE);
if (do_preserve_time) if (fstat(sfd, &s_stat) == -1)
xerror(YES, NO, YES, "stat(%s)", argv[idx]);
}
- 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,
int ctrfd;
if (!strcmp(counter_file, "-")) ctrfd = 0;
- else ctrfd = open(counter_file, O_RDONLY | O_LARGEFILE);
- if (ctrfd == -1) xerror(NO, NO, YES, "%s", counter_file);
+ else ctrfd = xopen(counter_file, O_RDONLY | O_LARGEFILE);
lio = xread(ctrfd, ctr, ctrsz);
if (lio == NOSIZE) xerror(NO, NO, YES, "%s", counter_file);
if (lio < ctrsz) xerror(NO, YES, YES, "counter file is too small (%zu)!", lio);
pblk = key;
if (!strcmp(genkeyf, "-")) krfd = 1;
- else krfd = open(genkeyf, O_WRONLY | O_CREAT | O_LARGEFILE | write_flags, 0666);
- if (krfd == -1) xerror(NO, NO, YES, "%s", genkeyf);
+ else krfd = xopen(genkeyf, O_WRONLY | O_CREAT | O_LARGEFILE | write_flags);
_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) {
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) {
- if (verbose) tfc_esay("%s: doing MAC calculation, processing speed "
- "will be slower.", tfc_format_pid(progname));
- if (mackey_opt) skein_init_key(&sk, mackey, macbits);
- else skein_init(&sk, macbits);
- }
+ if (verbose) tfc_esay("%s: doing MAC calculation, processing speed "
+ "will be slower.", tfc_format_pid(progname));
+ if (mackey_opt) skein_init_key(&sk, mackey, macbits);
+ else skein_init(&sk, macbits);
}
if (!counter_file && counter_opt <= TFC_CTR_SHOW && ctr_mode != TFC_MODE_ECB) {
_plain:
if (argv[idx]) {
if (!strcmp(argv[idx], "-")) dfd = 1;
- else dfd = open(argv[idx], O_RDWR | O_LARGEFILE | write_flags, 0666);
- if (dfd == -1) {
- dfd = open(argv[idx], O_WRONLY | O_CREAT | O_LARGEFILE | write_flags, 0666);
- if (dfd == -1) xerror(NO, NO, YES, "%s", argv[idx]);
- }
+ else dfd = xxopen(YES, argv[idx], O_RDWR | O_LARGEFILE | write_flags);
+ if (dfd == -1) dfd = xopen(argv[idx], O_WRONLY | O_CREAT | O_LARGEFILE | write_flags);
dstfname = argv[idx];
idx++;
}
lrem -= lio;
goto _ctrwagain;
}
+ total_written_dst += ldone;
total_processed_dst += ldone;
delta_processed += ldone;
}
default: xerror(NO, NO, NO, "%s", srcfname); break;
}
}
- if (lio && lio < lrem) {
+ if (unbuffered == NO && lio && lio < lrem) {
pblk += lio;
lrem -= lio;
goto _ragain;
memset(srcblk+orig, 0, sizeof(srcblk)-orig);
}
- if (do_mac == TFC_MAC_SIGN && ctr_mode < TFC_MODE_OCB)
- skein_update(&sk, srcblk, ldone);
+ if (do_mac == TFC_MAC_SIGN) skein_update(&sk, srcblk, ldone);
if (ctr_mode == TFC_MODE_CTR) tf_ctr_crypt(key, ctr, dstblk, srcblk, ldone);
else if (ctr_mode == TFC_MODE_STREAM) tf_stream_crypt(&tfe, dstblk, srcblk, ldone);
else if (ctr_mode == TFC_MODE_CBC && do_edcrypt == TFC_DO_DECRYPT)
tf_cbc_decrypt(key, ctr, dstblk, srcblk, ldone);
- else if (ctr_mode == TFC_MODE_OCB && do_edcrypt == TFC_DO_ENCRYPT)
- tf_ocb_encrypt(key, ctr, dstblk, do_mac == TFC_MAC_SIGN ? macresult : NULL, srcblk, ldone, xtsblocks);
- else if (ctr_mode == TFC_MODE_OCB && do_edcrypt == TFC_DO_DECRYPT)
- tf_ocb_decrypt(key, ctr, dstblk, do_mac >= TFC_MAC_VRFY ? macresult : NULL, srcblk, ldone, xtsblocks);
-
else if (ctr_mode == TFC_MODE_PLAIN)
memcpy(dstblk, srcblk, ldone);
- if (do_mac >= TFC_MAC_VRFY && ctr_mode < TFC_MODE_OCB)
- skein_update(&sk, dstblk, ldone);
+ if (do_mac >= TFC_MAC_VRFY) skein_update(&sk, dstblk, ldone);
if (do_mac >= TFC_MAC_JUST_VRFY) goto _nowrite;
pblk = dstblk;
}
}
+ 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) {
int mfd;
if (!strcmp(do_mac_file, "-")) mfd = 0;
- else mfd = open(do_mac_file, O_RDONLY | O_LARGEFILE);
- if (mfd == -1) xerror(YES, NO, NO, "%s", do_mac_file);
+ else mfd = xopen(do_mac_file, O_RDONLY | O_LARGEFILE);
lio = ldone = xread(mfd, tmpdata, sizeof(tmpdata));
if (lio == NOSIZE) xerror(NO, NO, YES, "%s", do_mac_file);
if (!memcmp(tmpdata, TFC_ASCII_TFC_MAC_FOURCC, TFC_ASCII_TFC_MAC_FOURCC_LEN)) {
goto _shortmac;
}
- if (ctr_mode < TFC_MODE_OCB) skein_final(macresult, &sk);
- else skein(macresult, macbits, mackey, macresult, TF_FROM_BITS(macbits));
+ skein_final(macresult, &sk);
if (ctr_mode == TFC_MODE_CTR) tf_ctr_crypt(key, ctr, tmpdata, macvrfy, TF_FROM_BITS(macbits));
else if (ctr_mode == TFC_MODE_STREAM) tf_stream_crypt(&tfe, tmpdata, macvrfy, TF_FROM_BITS(macbits));
else if (ctr_mode == TFC_MODE_XTS) tf_xts_decrypt(key, xtskey, ctr, tmpdata, macvrfy, TF_FROM_BITS(macbits), xtsblocks);
else if (ctr_mode == TFC_MODE_ECB) tf_ecb_decrypt(key, tmpdata, macvrfy, TF_FROM_BITS(macbits));
else if (ctr_mode == TFC_MODE_CBC) tf_cbc_decrypt(key, ctr, tmpdata, macvrfy, TF_FROM_BITS(macbits));
- else if (ctr_mode == TFC_MODE_OCB) tf_ocb_decrypt(key, ctr, tmpdata, NULL, macvrfy, TF_FROM_BITS(macbits), xtsblocks);
if (!memcmp(tmpdata, macresult, TF_FROM_BITS(macbits))) {
if (quiet == NO) {
}
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;
}
}
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));
+ skein_final(macresult, &sk);
if (ctr_mode == TFC_MODE_CTR) tf_ctr_crypt(key, ctr, tmpdata, macresult, TF_FROM_BITS(macbits));
else if (ctr_mode == TFC_MODE_STREAM) tf_stream_crypt(&tfe, tmpdata, macresult, TF_FROM_BITS(macbits));
else if (ctr_mode == TFC_MODE_XTS) tf_xts_encrypt(key, xtskey, ctr, tmpdata, macresult, TF_FROM_BITS(macbits), xtsblocks);
else if (ctr_mode == TFC_MODE_ECB) tf_ecb_encrypt(key, tmpdata, macresult, TF_FROM_BITS(macbits));
else if (ctr_mode == TFC_MODE_CBC) tf_cbc_encrypt(key, ctr, tmpdata, macresult, TF_FROM_BITS(macbits));
- else if (ctr_mode == TFC_MODE_OCB) tf_ocb_encrypt(key, ctr, tmpdata, NULL, macresult, TF_FROM_BITS(macbits), xtsblocks);
memset(macresult, 0, sizeof(macresult));
if (!do_mac_file) {
lrem -= lio;
goto _macwagain;
}
+ total_written_dst += ldone;
total_processed_dst += ldone;
delta_processed += ldone;
}
int mfd;
if (!strcmp(do_mac_file, "-")) mfd = 1;
- else mfd = open(do_mac_file, O_WRONLY | O_CREAT | O_LARGEFILE | write_flags, 0666);
- if (mfd == -1) xerror(YES, NO, NO, "%s", do_mac_file);
+ else mfd = xopen(do_mac_file, O_WRONLY | O_CREAT | O_LARGEFILE | write_flags);
if (do_outfmt == TFC_OUTFMT_B64) {
memcpy(macvrfy, tmpdata, TF_FROM_BITS(macbits));
memset(tmpdata, 0, TFC_TMPSIZE);
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);