X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=tfcrypt.c;h=45438cb2bde7dc46cdc05ea0fba5b20d7ca7eebf;hb=f5397c396bfedcd6de90ab648fa600aca3b22bbb;hp=88420817cbf9d4004a226bfa4ba6ce959d144a93;hpb=d659ac85a7c63b7833ab793be2f37fbc4ca7ba6b;p=tfcrypt.git diff --git a/tfcrypt.c b/tfcrypt.c index 8842081..45438cb 100644 --- a/tfcrypt.c +++ b/tfcrypt.c @@ -30,6 +30,7 @@ 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) { @@ -208,6 +209,8 @@ _baddfname: ctr_mode = TFC_MODE_STREAM; else if (!strcasecmp(optarg, "cbc")) ctr_mode = TFC_MODE_CBC; + else if (!strcasecmp(optarg, "pcbc")) + ctr_mode = TFC_MODE_PCBC; else if (!strcasecmp(optarg, "ecb")) ctr_mode = TFC_MODE_ECB; else if (!strcasecmp(optarg, "xts")) @@ -346,6 +349,12 @@ _baddfname: 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; @@ -362,7 +371,7 @@ _baddfname: "%s: invalid block size value", s); } else blksize = (size_t)tfc_modifysize((tfc_fsize)blksize, strchr(s, ':')); - if (do_edcrypt != TFC_DO_PLAIN && 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", @@ -763,7 +772,7 @@ _mkragain: lio = xread(mkfd, pblk, lrem); || !memcmp(progname+5, "sum", 3) || !memcmp(progname+6, "sum", 3))))) do_sksum(progname, argv+optind); - if (!strcmp(progname, "tfbase64")) do_edbase64(argv+optind); + if (!strcmp(progname, "base64")) do_edbase64(argv+optind); idx = optind; @@ -1209,7 +1218,7 @@ _ragain: lio = xread(sfd, pblk, lrem); default: xerror(NO, NO, NO, "%s", srcfname); break; } } - if (lio && lio < lrem) { + if (unbuffered == NO && lio && lio < lrem) { pblk += lio; lrem -= lio; goto _ragain; @@ -1239,6 +1248,10 @@ _ragain: lio = xread(sfd, pblk, lrem); tf_cbc_encrypt(key, ctr, 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_PCBC && do_edcrypt == TFC_DO_ENCRYPT) + tf_pcbc_encrypt(key, ctr, dstblk, srcblk, ldone); + else if (ctr_mode == TFC_MODE_PCBC && do_edcrypt == TFC_DO_DECRYPT) + tf_pcbc_decrypt(key, ctr, dstblk, srcblk, ldone); else if (ctr_mode == TFC_MODE_PLAIN) memcpy(dstblk, srcblk, ldone); @@ -1333,6 +1346,7 @@ _macragain: lio = xread(sfd, pblk, lrem); 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_PCBC) tf_pcbc_decrypt(key, ctr, tmpdata, macvrfy, TF_FROM_BITS(macbits)); if (!memcmp(tmpdata, macresult, TF_FROM_BITS(macbits))) { if (quiet == NO) { @@ -1370,6 +1384,7 @@ _shortmac: memset(macvrfy, 0, sizeof(macvrfy)); 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_PCBC) tf_pcbc_encrypt(key, ctr, tmpdata, macresult, TF_FROM_BITS(macbits)); memset(macresult, 0, sizeof(macresult)); if (!do_mac_file) {