Switch to old tfcrypt1 mode by default.
[tfcrypt.git] / tfcrypt.c
index 4724c0fab024cf88ab10fa8492dfce05c0cbeb76..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;
@@ -478,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))
@@ -603,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);
        }
 
@@ -899,16 +913,14 @@ _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_ECB) goto _ctrskip2;
        tfc_data_to_words64(&iseek_blocks, sizeof(iseek_blocks));
        tf_ctr_set(ctr, &iseek_blocks, sizeof(iseek_blocks));
 
-       if (ctr_mode == TFC_MODE_STREAM) tfe_init_iv(&tfe, key, ctr);
-
        switch (counter_opt) {
                case TFC_CTR_SHOW:
                        switch (do_outfmt) {
@@ -918,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:
@@ -990,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) {