tfc_conf: nr_turns: do not apply to sksum turns.
[tfcrypt.git] / tfcrypt.c
index df62420769d0b07b0db2a72a424cb72f6885d081..3fdf9c65ad893d4b78513ccd6a615101dffeaa26 100644 (file)
--- a/tfcrypt.c
+++ b/tfcrypt.c
@@ -62,9 +62,22 @@ int main(int argc, char **argv)
 
        if (!isatty(2)) do_statline_dynamic = NO;
 
+       s = (char *)srcblk;
+       d = getenv("HOME");
+       if (!d) d = "";
+       n = PATH_MAX > sizeof(srcblk) ? sizeof(srcblk) : PATH_MAX;
+       if (xstrlcpy(s, d, n) >= n) goto _baddfname;
+       if (xstrlcat(s, "/.tfcrypt.defs", n) >= n) goto _baddfname;
+       read_defaults(s, YES);
+_baddfname:
+       memset(s, 0, n);
+
        opterr = 0;
-       while ((c = getopt(argc, argv, "s:aU:C:r:K:t:TPkzxc:l:qedn:vV:pwE:O:S:AmM:R:Z:WHD:")) != -1) {
+       while ((c = getopt(argc, argv, "L:s:aU:C:r:K:t:TPkzxc:l:qedn:vV:pwE:O:S:AmM:R:Z:WHD:")) != -1) {
                switch (c) {
+                       case 'L':
+                               read_defaults(optarg, NO);
+                               break;
                        case 's':
                                saltf = optarg;
                                break;
@@ -78,6 +91,8 @@ int main(int argc, char **argv)
                                        counter_opt = TFC_CTR_HEAD;
                                else if (!strcasecmp(optarg, "rand"))
                                        counter_opt = TFC_CTR_RAND;
+                               else if (!strcasecmp(optarg, "zero"))
+                                       counter_opt = TFC_CTR_ZERO;
                                else counter_file = sksum_hashlist_file = optarg;
                                break;
                        case 'C':
@@ -144,10 +159,11 @@ int main(int argc, char **argv)
                                break;
                        case 't':
                                tweakf = optarg;
+                               do_full_key = NO;
                                break;
                        case 'T':
                                tfc_saltsz = 0;
-                               do_tfcrypt1 = YES;
+                               do_full_key = NO;
                                break;
                        case 'l':
                                if (maxlen != NOFSIZE) break;
@@ -171,6 +187,10 @@ int main(int argc, char **argv)
                                        catch_all_errors = YES;
                                        break;
                                }
+                               if (!strcmp(optarg, "xseek")) {
+                                       ignore_seek_errors = YES;
+                                       break;
+                               }
                                if (!strcmp(optarg, "exit"))
                                        error_action = TFC_ERRACT_EXIT;
                                else if (!strncmp(optarg, "cont", 4))
@@ -474,8 +494,6 @@ int main(int argc, char **argv)
                xerror(NO, YES, YES, "Cannot encrypt and read CTR from source!");
        if (overwrite_source && counter_opt == TFC_CTR_RAND)
                xerror(NO, YES, YES, "Cannot embed a CTR into file when overwriting it!");
-       if (tweakf && do_tfcrypt1 == NO)
-               xerror(NO, YES, YES, "Use -T with -t tweakfile to enable old tfcrypt mode!");
        if (ctr_mode == TFC_MODE_PLAIN
        && (do_edcrypt || do_mac || rawkey
        || mackey_opt || counter_opt || counter_file))
@@ -599,16 +617,16 @@ _mkragain:                lio = xread(mkfd, pblk, lrem);
        else password = YES;
 
        errno = 0;
-       if (do_tfcrypt1 == YES && tweakf) {
+       if (do_full_key == NO && tweakf) {
                int twfd;
 
                if (!strcmp(tweakf, "-")) twfd = 0;
                else twfd = open(tweakf, O_RDONLY | O_LARGEFILE);
                if (twfd == -1) xerror(NO, NO, YES, "%s", tweakf);
-               lio = ldone = xread(twfd, key+TF_FROM_BITS(TF_MAX_BITS)+TF_SIZE_UNIT, 2*TF_SIZE_UNIT);
+               lio = ldone = xread(twfd, tweak, TF_TWEAK_SIZE);
                if (lio == NOSIZE) xerror(NO, NO, YES, "%s", tweakf);
-               if (ldone < 2*TF_SIZE_UNIT)
-                       xerror(NO, NO, YES, "%s: %zu bytes tweak required", tweakf, 2*TF_SIZE_UNIT);
+               if (ldone < TF_TWEAK_SIZE)
+                       xerror(NO, NO, YES, "%s: %zu bytes tweak required", tweakf, TF_TWEAK_SIZE);
                xclose(twfd);
        }
 
@@ -695,7 +713,7 @@ _ctrskip1:
                if (counter_opt == TFC_CTR_HEAD && ctr_mode != TFC_MODE_ECB)
                        iseek += ctrsz;
                if (lseek(sfd, iseek, SEEK_SET) == -1)
-                       xerror(YES, NO, NO, "%s: seek failed", srcfname);
+                       xerror(ignore_seek_errors, NO, NO, "%s: seek failed", srcfname);
        }
 
        if (ctr_mode == TFC_MODE_PLAIN) goto _plain;
@@ -895,11 +913,10 @@ _xts2genkey:      if (xwrite(krfd, pblk, TF_FROM_BITS(TFC_KEY_BITS)) == NOSIZE) xerro
 
        tf_convkey(key);
        if (ctr_mode == TFC_MODE_XTS) tf_convkey(xtskey);
-       if (do_tfcrypt1 == YES) {
-               if (!tweakf) skein(key+TF_FROM_BITS(TF_MAX_BITS)+TF_SIZE_UNIT, 2*TF_UNIT_BITS, NULL, key, TF_FROM_BITS(TFC_KEY_BITS));
-               tf_key_tweak_compat(key);
+       if (do_full_key == NO) {
+               if (!tweakf) skein(tweak, TF_NR_TWEAK_BITS, NULL, key, TF_FROM_BITS(TFC_KEY_BITS));
+               tf_tweak_set(key, tweak);
        }
-       if (ctr_mode == TFC_MODE_STREAM) tfe_init_iv(&tfe, key, ctr);
        if (ctr_mode == TFC_MODE_ECB) goto _ctrskip2;
        tfc_data_to_words64(&iseek_blocks, sizeof(iseek_blocks));
        tf_ctr_set(ctr, &iseek_blocks, sizeof(iseek_blocks));
@@ -913,6 +930,7 @@ _xts2genkey:        if (xwrite(krfd, pblk, TF_FROM_BITS(TFC_KEY_BITS)) == NOSIZE) xerro
                        }
                        break;
                case TFC_CTR_RAND: tfc_getrandom(ctr, ctrsz); break;
+               case TFC_CTR_ZERO: memset(ctr, 0, ctrsz); break;
        }
 
 _ctrskip2:
@@ -938,7 +956,7 @@ _plain:
 
        if (oseek) {
                if (lseek(dfd, oseek, SEEK_SET) == -1)
-                       xerror(YES, NO, NO, "%s: seek failed", dstfname);
+                       xerror(ignore_seek_errors, NO, NO, "%s: seek failed", dstfname);
        }
 
        for (x = 1; x < NSIG; x++) signal(x, SIG_IGN);
@@ -985,6 +1003,8 @@ _ctrwagain:        lio = xwrite(dfd, pblk, lrem);
                delta_processed += ldone;
        }
 
+       if (ctr_mode == TFC_MODE_STREAM) tfe_init_iv(&tfe, key, ctr);
+
        errno = 0;
        do_stop = NO;
        while (1) {