static tfc_byte svctr[TF_BLOCK_SIZE];
static tfc_fsize rwd, do_read_loops, loopcnt;
static tfc_byte svctr[TF_BLOCK_SIZE];
static tfc_fsize rwd, do_read_loops, loopcnt;
if (!strcmp(progname, "iotool")) {
do_edcrypt = TFC_DO_PLAIN;
if (!strcmp(progname, "iotool")) {
do_edcrypt = TFC_DO_PLAIN;
+ if (!strcmp(progname, "xor")) {
+ do_edcrypt = TFC_DO_PLAIN;
+ ctr_mode = TFC_MODE_XOR;
+ /* xor: default to stdin if invoked without args */
+ kfd = 0;
+ }
+
- while ((c = getopt(argc, argv, "L:s:aU:C:r:K:t:Pkzxc: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) {
+ 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;
case 'c':
if (!strcasecmp(optarg, "show"))
counter_opt = TFC_CTR_SHOW;
ctr_mode = TFC_MODE_STREAM;
else if (!strcasecmp(optarg, "cbc"))
ctr_mode = TFC_MODE_CBC;
ctr_mode = TFC_MODE_STREAM;
else if (!strcasecmp(optarg, "cbc"))
ctr_mode = TFC_MODE_CBC;
else if (!strcasecmp(optarg, "ecb"))
ctr_mode = TFC_MODE_ECB;
else if (!strcasecmp(optarg, "xts"))
ctr_mode = TFC_MODE_XTS;
else if (!strcasecmp(optarg, "ecb"))
ctr_mode = TFC_MODE_ECB;
else if (!strcasecmp(optarg, "xts"))
ctr_mode = TFC_MODE_XTS;
else xerror(NO, YES, YES, "%s: invalid mode of operation", optarg);
break;
case 'P':
else xerror(NO, YES, YES, "%s: invalid mode of operation", optarg);
break;
case 'P':
+ 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;
else if (!strncmp(s, "readloops", 9) && *(s+9) == '=') {
do_read_loops = tfc_humanfsize(s+10, &stoi);
if (!str_empty(stoi)) do_read_loops = NOSIZE;
"%s: invalid block size value", s);
}
else blksize = (size_t)tfc_modifysize((tfc_fsize)blksize, strchr(s, ':'));
"%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",
"%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",
"%s: invalid iseek value", s);
}
else iseek = tfc_modifysize(iseek, strchr(s, ':'));
"%s: invalid iseek value", s);
}
else iseek = tfc_modifysize(iseek, strchr(s, ':'));
"%s: invalid iseek value", s);
}
else iseek = tfc_modifysize(iseek, strchr(s, ':'));
"%s: invalid iseek value", s);
}
else iseek = tfc_modifysize(iseek, strchr(s, ':'));
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!");
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 (ctr_mode == TFC_MODE_PLAIN
- && (do_edcrypt || do_mac || rawkey
- || mackey_opt || counter_opt || counter_file))
+ if (do_edcrypt == TFC_DO_PLAIN
+ && (do_mac || saltf || rawkey || mackey_opt || counter_opt || counter_file))
xerror(NO, YES, YES, "Encryption facility is disabled when in plain IO mode.");
errno = 0;
xerror(NO, YES, YES, "Encryption facility is disabled when in plain IO mode.");
errno = 0;
|| !memcmp(progname+5, "sum", 3)
|| !memcmp(progname+6, "sum", 3)))))
do_sksum(progname, argv+optind);
|| !memcmp(progname+5, "sum", 3)
|| !memcmp(progname+6, "sum", 3)))))
do_sksum(progname, argv+optind);
if (!strcmp(argv[idx], "-")) kfd = 0;
else kfd = xopen(argv[idx], O_RDONLY | O_LARGEFILE);
if (!strcmp(argv[idx], "-")) kfd = 0;
else kfd = xopen(argv[idx], O_RDONLY | O_LARGEFILE);
lio = strnlen(argv[idx], PATH_MAX);
memset(argv[idx], '*', lio);
lio = strnlen(argv[idx], PATH_MAX);
memset(argv[idx], '*', lio);
xerror(ignore_seek_errors, NO, NO, "%s: seek failed", srcfname);
}
xerror(ignore_seek_errors, NO, NO, "%s: seek failed", srcfname);
}
if (do_mac != NO) {
if (mackey_opt == TFC_MACKEY_RAWKEY) skein(mackey, TF_MAX_BITS, key, key, TF_FROM_BITS(TFC_KEY_BITS));
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) {
- if (verbose) tfc_esay("%s: doing MAC calculation, processing speed "
- "will be slower.", tfc_format_pid(progname));
- if (mackey_opt) skein_init_key(&sk, mackey, macbits);
- else skein_init(&sk, macbits);
- }
+ if (verbose) tfc_esay("%s: doing MAC calculation, processing speed "
+ "will be slower.", tfc_format_pid(progname));
+ if (mackey_opt) skein_init_key(&sk, mackey, macbits);
+ else skein_init(&sk, macbits);
}
total_processed_src = rwd;
memcpy(ctr, svctr, TF_BLOCK_SIZE);
}
total_processed_src = rwd;
memcpy(ctr, svctr, TF_BLOCK_SIZE);
- if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(sfd);
-_ragain: lio = xread(sfd, pblk, lrem);
+ if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(FLFD(sfd, kfd));
+_ragain: lio = xread(FLFD(sfd, kfd), pblk, lrem);
- if ((do_read_loops != 0 && sfd != 0) && (loopcnt < do_read_loops)) {
- lseek(sfd, 0L, SEEK_SET);
+ if ((do_read_loops != 0 && FLFD(sfd, kfd) != 0) && (loopcnt < do_read_loops)) {
+ lseek(FLFD(sfd, kfd), 0L, SEEK_SET);
xerror(YES, NO, NO, "%s", srcfname);
lio = ldone = lrem = lblock;
memset(srcblk, 0, lio);
xerror(YES, NO, NO, "%s", srcfname);
lio = ldone = lrem = lblock;
memset(srcblk, 0, lio);
- if (rdpos == NOFSIZE) lseek(sfd, lio, SEEK_CUR);
- else lseek(sfd, rdpos + lio, SEEK_SET);
+ if (rdpos == NOFSIZE) lseek(FLFD(sfd, kfd), lio, SEEK_CUR);
+ else lseek(FLFD(sfd, kfd), rdpos + lio, SEEK_SET);
break;
default: xerror(NO, NO, NO, "%s", srcfname); break;
}
}
break;
default: xerror(NO, NO, NO, "%s", srcfname); break;
}
}
- if (do_mac == TFC_MAC_SIGN && ctr_mode < TFC_MODE_OCB)
- skein_update(&sk, srcblk, ldone);
+ if (ctr_mode == TFC_MODE_XOR && flipfd == NO) {
+ if (do_stop) blksize = ldone;
+ flipfd = YES;
+ pblk = dstblk;
+ goto _nextblk;
+ }
+
+ if (do_mac == TFC_MAC_SIGN) skein_update(&sk, srcblk, ldone);
if (ctr_mode == TFC_MODE_CTR) tf_ctr_crypt(key, ctr, dstblk, srcblk, ldone);
else if (ctr_mode == TFC_MODE_STREAM) tf_stream_crypt(&tfe, dstblk, srcblk, ldone);
if (ctr_mode == TFC_MODE_CTR) tf_ctr_crypt(key, ctr, dstblk, srcblk, ldone);
else if (ctr_mode == TFC_MODE_STREAM) tf_stream_crypt(&tfe, dstblk, srcblk, ldone);
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);
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_OCB && do_edcrypt == TFC_DO_ENCRYPT)
- tf_ocb_encrypt(key, ctr, dstblk, do_mac == TFC_MAC_SIGN ? macresult : NULL, srcblk, ldone, xtsblocks);
- else if (ctr_mode == TFC_MODE_OCB && do_edcrypt == TFC_DO_DECRYPT)
- tf_ocb_decrypt(key, ctr, dstblk, do_mac >= TFC_MAC_VRFY ? macresult : NULL, srcblk, ldone, xtsblocks);
+ 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);
else if (ctr_mode == TFC_MODE_PLAIN)
memcpy(dstblk, srcblk, ldone);
- if (do_mac >= TFC_MAC_VRFY && ctr_mode < TFC_MODE_OCB)
- skein_update(&sk, dstblk, ldone);
+ else if (ctr_mode == TFC_MODE_XOR)
+ xor_block(dstblk, srcblk, ldone);
+
+ if (do_mac >= TFC_MAC_VRFY) skein_update(&sk, dstblk, ldone);
- if (ctr_mode < TFC_MODE_OCB) skein_final(macresult, &sk);
- else skein(macresult, macbits, mackey, macresult, TF_FROM_BITS(macbits));
+ skein_final(macresult, &sk);
if (ctr_mode == TFC_MODE_CTR) tf_ctr_crypt(key, ctr, tmpdata, macvrfy, TF_FROM_BITS(macbits));
else if (ctr_mode == TFC_MODE_STREAM) tf_stream_crypt(&tfe, tmpdata, macvrfy, TF_FROM_BITS(macbits));
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));
if (ctr_mode == TFC_MODE_CTR) tf_ctr_crypt(key, ctr, tmpdata, macvrfy, TF_FROM_BITS(macbits));
else if (ctr_mode == TFC_MODE_STREAM) tf_stream_crypt(&tfe, tmpdata, macvrfy, TF_FROM_BITS(macbits));
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_OCB) tf_ocb_decrypt(key, ctr, tmpdata, NULL, macvrfy, TF_FROM_BITS(macbits), xtsblocks);
+ else if (ctr_mode == TFC_MODE_PCBC) tf_pcbc_decrypt(key, ctr, tmpdata, macvrfy, TF_FROM_BITS(macbits));
memset(tmpdata, 0, sizeof(tmpdata));
}
else if (do_mac == TFC_MAC_SIGN) {
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));
+ skein_final(macresult, &sk);
if (ctr_mode == TFC_MODE_CTR) tf_ctr_crypt(key, ctr, tmpdata, macresult, TF_FROM_BITS(macbits));
else if (ctr_mode == TFC_MODE_STREAM) tf_stream_crypt(&tfe, tmpdata, macresult, TF_FROM_BITS(macbits));
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));
if (ctr_mode == TFC_MODE_CTR) tf_ctr_crypt(key, ctr, tmpdata, macresult, TF_FROM_BITS(macbits));
else if (ctr_mode == TFC_MODE_STREAM) tf_stream_crypt(&tfe, tmpdata, macresult, TF_FROM_BITS(macbits));
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_OCB) tf_ocb_encrypt(key, ctr, tmpdata, NULL, macresult, TF_FROM_BITS(macbits), xtsblocks);
+ else if (ctr_mode == TFC_MODE_PCBC) tf_pcbc_encrypt(key, ctr, tmpdata, macresult, TF_FROM_BITS(macbits));