tfcrypt: fix "-M mac -u" failing to decrypt data due to missing ctr.
[tfcrypt.git] / tfcrypt.c
index a540db4b77e7586fb00f351b682244e2ce7f1ca7..9e0e6293804f258d2e00cae1bfee6a578b749da7 100644 (file)
--- a/tfcrypt.c
+++ b/tfcrypt.c
@@ -164,7 +164,7 @@ _baddfname:
        }
 
        opterr = 0;
-       while ((c = getopt(argc, argv, "L:s:aU:C:r:K:t:PXkzxc:l:qedn:vV:pwE:o:O:S:AmuM:R:Z:WHD:")) != -1) {
+       while ((c = getopt(argc, argv, "L:s:aU:C:r:K:t:PXkzxc:l:qedn:vV:pwE:o:O:S:AmuM:R:Z:WHD:gj")) != -1) {
                switch (c) {
                        case 'L':
                                read_defaults(optarg, NO);
@@ -175,6 +175,14 @@ _baddfname:
                        case 'r':
                                randsource = optarg;
                                break;
+                       case 'j':
+                       case 'g':
+                               if (c == 'j') ctr_mode = TFC_MODE_CTR;
+                               else if (c == 'g') ctr_mode = TFC_MODE_STREAM;
+                               if (do_edcrypt == TFC_DO_DECRYPT) counter_opt = TFC_CTR_HEAD;
+                               else if (do_edcrypt == TFC_DO_ENCRYPT) counter_opt = TFC_CTR_RAND;
+                               else xerror(NO, YES, YES, "plain mode was selected with -%c, cannot continue", c);
+                               break;
                        case 'c':
                                if (!strcasecmp(optarg, "show"))
                                        counter_opt = TFC_CTR_SHOW;
@@ -1197,6 +1205,7 @@ _decrypt_again_vrfy2:
                }
                total_processed_src = rwd;
                memcpy(ctr, svctr, TF_BLOCK_SIZE);
+               if (ctr_mode == TFC_MODE_STREAM) tfe_init_iv(&tfe, key, ctr);
                memset(svctr, 0, TF_BLOCK_SIZE);
        }