-O append: append to output flag
[tfcrypt.git] / tfcrypt.c
index 6b21e960dbe93e6e68188a0df0d17a152bf6b666..e8514391b8036b8168c5f85d7ef32e8383c59542 100644 (file)
--- a/tfcrypt.c
+++ b/tfcrypt.c
@@ -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"))
@@ -773,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,
@@ -1026,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) {
@@ -1137,6 +1127,7 @@ _ctrwagain:       lio = xwrite(dfd, pblk, lrem);
                        lrem -= lio;
                        goto _ctrwagain;
                }
+               total_written_dst += ldone;
                total_processed_dst += ldone;
                delta_processed += ldone;
        }
@@ -1263,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) {
@@ -1340,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;
                        }
                }
@@ -1357,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));
@@ -1383,6 +1376,7 @@ _macwagain:               lio = xwrite(dfd, pblk, lrem);
                                lrem -= lio;
                                goto _macwagain;
                        }
+                       total_written_dst += ldone;
                        total_processed_dst += ldone;
                        delta_processed += ldone;
                }
@@ -1414,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);