if (!isatty(2)) do_statline_dynamic = NO;
+ s = (char *)srcblk;
+ d = getenv("HOME");
+ if (!d) d = "";
+ xstrlcat(s, d, PATH_MAX > sizeof(srcblk) ? sizeof(srcblk) : PATH_MAX);
+ xstrlcat(s, "/.tfcrypt.defs", PATH_MAX > sizeof(srcblk) ? sizeof(srcblk) : PATH_MAX);
+ read_defaults(s, YES);
+ memset(s, 0, PATH_MAX > sizeof(srcblk) ? sizeof(srcblk) : PATH_MAX);
+
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;
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))
s += 5;
maxkeylen = tfc_humanfsize(s, &stoi);
if (!str_empty(stoi)) {
- maxkeylen = (size_t)tfc_fnamesize(s, YES);
- maxkeylen = (size_t)tfc_modifysize((tfc_fsize)maxkeylen, strchr(s, ':'));
+ maxkeylen = tfc_fnamesize(s, YES);
+ maxkeylen = tfc_modifysize(maxkeylen, strchr(s, ':'));
if (maxkeylen == NOSIZE)
xerror(NO, YES, YES,
"%s: invalid key length value", s);
}
- else maxkeylen = (size_t)tfc_modifysize((tfc_fsize)maxkeylen, strchr(s, ':'));
+ else maxkeylen = tfc_modifysize(maxkeylen, strchr(s, ':'));
+ }
+ else if (!strncmp(s, "okey", 4) && *(s+4) == '=') {
+ s += 5;
+ keyoffset = tfc_humanfsize(s, &stoi);
+ if (!str_empty(stoi)) {
+ keyoffset = tfc_fnamesize(s, YES);
+ keyoffset = tfc_modifysize(keyoffset, strchr(s, ':'));
+ if (keyoffset == NOFSIZE)
+ xerror(NO, YES, YES,
+ "%s: invalid key offset value", s);
+ }
+ else keyoffset = tfc_modifysize(keyoffset, strchr(s, ':'));
}
else if (!strncmp(s, "xctr", 4) && *(s+4) == '=') {
s += 5;
if (!strcmp(saltf, "-")) saltfd = 0;
else saltfd = open(saltf, O_RDONLY | O_LARGEFILE);
if (saltfd == -1) xerror(NO, NO, YES, "%s", saltf);
- lio = read(saltfd, tfc_salt, TFC_MAX_SALT - TF_FROM_BITS(TFC_KEY_BITS));
+ lio = xread(saltfd, tfc_salt, TFC_MAX_SALT - TF_FROM_BITS(TFC_KEY_BITS));
if (lio == NOSIZE) xerror(NO, NO, YES, "%s", saltf);
tfc_saltsz = lio;
xclose(saltfd);
ldone = 0;
lrem = lblock = sizeof(tmpdata);
if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(mkfd);
-_mkragain: lio = read(mkfd, pblk, lrem);
+_mkragain: lio = xread(mkfd, pblk, lrem);
if (lio == 0) do_stop = YES;
if (lio != NOSIZE) ldone += lio;
else {
if (!strcmp(tweakf, "-")) twfd = 0;
else twfd = open(tweakf, O_RDONLY | O_LARGEFILE);
if (twfd == -1) xerror(NO, NO, YES, "%s", tweakf);
- lio = ldone = read(twfd, key+TF_FROM_BITS(TF_MAX_BITS)+TF_SIZE_UNIT, 2*TF_SIZE_UNIT);
+ lio = ldone = xread(twfd, key+TF_FROM_BITS(TF_MAX_BITS)+TF_SIZE_UNIT, 2*TF_SIZE_UNIT);
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 (!strcmp(counter_file, "-")) ctrfd = 0;
else ctrfd = open(counter_file, O_RDONLY | O_LARGEFILE);
if (ctrfd == -1) xerror(NO, NO, YES, "%s", counter_file);
- lio = read(ctrfd, ctr, ctrsz);
+ lio = xread(ctrfd, ctr, ctrsz);
if (lio == NOSIZE) xerror(NO, NO, YES, "%s", counter_file);
if (lio < ctrsz) xerror(NO, YES, YES, "counter file is too small (%zu)!", lio);
xclose(ctrfd);
ldone = 0;
lrem = lblock = ctrsz;
if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(sfd);
-_ctrragain: lio = read(sfd, pblk, lrem);
+_ctrragain: lio = xread(sfd, pblk, lrem);
if (lio != NOSIZE) ldone += lio;
else {
if (errno != EIO && catch_all_errors != YES)
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;
_xts2key: ldone = 0;
lrem = lblock = TF_FROM_BITS(TFC_KEY_BITS);
if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(kfd);
-_keyragain: lio = read(kfd, pblk, lrem);
+_keyragain: lio = xread(kfd, pblk, lrem);
if (lio != NOSIZE) ldone += lio;
else {
if (errno != EIO && catch_all_errors != YES)
memset(pwdagain, 0, sizeof(pwdagain));
}
else {
- if (skeinfd(key, TFC_KEY_BITS, mackey_opt ? mackey : NULL, kfd, maxkeylen) != YES)
+ if (skeinfd(key, TFC_KEY_BITS, mackey_opt ? mackey : NULL, kfd, keyoffset, maxkeylen) != YES)
xerror(NO, NO, YES, "hashing key");
}
if (!strcmp(genkeyf, "-")) krfd = 1;
else krfd = open(genkeyf, O_WRONLY | O_CREAT | O_LARGEFILE | write_flags, 0666);
if (krfd == -1) xerror(NO, NO, YES, "%s", genkeyf);
-_xts2genkey: if (write(krfd, pblk, TF_FROM_BITS(TFC_KEY_BITS)) == -1) xerror(NO, NO, YES, "%s", genkeyf);
+_xts2genkey: if (xwrite(krfd, pblk, TF_FROM_BITS(TFC_KEY_BITS)) == NOSIZE) xerror(NO, NO, YES, "%s", genkeyf);
if (do_fsync && fsync(krfd) == -1) xerror(NO, NO, YES, "%s", genkeyf);
if (verbose && xtskeyset == NO) {
tfc_esay("%s: password hashing done", progname);
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 (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));
+ if (ctr_mode == TFC_MODE_STREAM) tfe_init_iv(&tfe, key, ctr);
+
switch (counter_opt) {
case TFC_CTR_SHOW:
switch (do_outfmt) {
case TFC_OUTFMT_B64: tfc_printbase64(stderr, ctr, ctrsz, YES); break;
- case TFC_OUTFMT_RAW: write(2, ctr, ctrsz); break;
+ case TFC_OUTFMT_RAW: xwrite(2, ctr, ctrsz); break;
case TFC_OUTFMT_HEX: mehexdump(ctr, ctrsz, ctrsz, YES); break;
}
break;
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);
pblk = ctr;
lio = lrem = ctrsz;
ldone = 0;
-_ctrwagain: lio = write(dfd, pblk, lrem);
+_ctrwagain: lio = xwrite(dfd, pblk, lrem);
if (lio != NOSIZE) ldone += lio;
else xerror(NO, NO, NO, "%s", dstfname);
if (do_fsync && fsync(dfd) == -1) xerror(NO, NO, NO, "%s", dstfname);
ldone = 0;
lrem = lblock = blk_len_adj(maxlen, total_processed_src, blksize);
if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(sfd);
-_ragain: lio = read(sfd, pblk, lrem);
+_ragain: lio = xread(sfd, pblk, lrem);
if (lio == 0) do_stop = TFC_STOP_BEGAN;
if (lio != NOSIZE) ldone += lio;
else {
pblk = dstblk;
lrem = ldone;
ldone = 0;
-_wagain: lio = write(dfd, pblk, lrem);
+_wagain: lio = xwrite(dfd, pblk, lrem);
if (lio != NOSIZE) ldone += lio;
else xerror(NO, NO, NO, "%s", dstfname);
if (do_fsync && fsync(dfd) == -1) xerror(NO, NO, NO, "%s", dstfname);
ldone = 0;
lrem = lblock = TF_FROM_BITS(macbits);
if (error_action == TFC_ERRACT_SYNC) rdpos = tfc_fdgetpos(sfd);
-_macragain: lio = read(sfd, pblk, lrem);
+_macragain: lio = xread(sfd, pblk, lrem);
if (lio != NOSIZE) ldone += lio;
else {
if (errno != EIO && catch_all_errors != YES)
if (!strcmp(do_mac_file, "-")) mfd = 0;
else mfd = open(do_mac_file, O_RDONLY | O_LARGEFILE);
if (mfd == -1) xerror(YES, NO, NO, "%s", do_mac_file);
- lio = ldone = read(mfd, tmpdata, sizeof(tmpdata));
+ lio = ldone = xread(mfd, tmpdata, sizeof(tmpdata));
if (lio == NOSIZE) xerror(NO, NO, YES, "%s", do_mac_file);
if (!memcmp(tmpdata, TFC_ASCII_TFC_MAC_FOURCC, TFC_ASCII_TFC_MAC_FOURCC_LEN)) {
memmove(tmpdata, tmpdata+TFC_ASCII_TFC_MAC_FOURCC_LEN,
pblk = tmpdata;
lio = lrem = TF_FROM_BITS(macbits);
ldone = 0;
-_macwagain: lio = write(dfd, pblk, lrem);
+_macwagain: lio = xwrite(dfd, pblk, lrem);
if (lio != NOSIZE) ldone += lio;
else xerror(NO, NO, NO, "%s", dstfname);
if (do_fsync && fsync(dfd) == -1) xerror(NO, NO, NO, "%s", dstfname);
tmpdata[lrem] = '\n';
lrem++;
}
- lio = write(mfd, tmpdata, lrem);
+ lio = xwrite(mfd, tmpdata, lrem);
}
- else lio = write(mfd, tmpdata, TF_FROM_BITS(macbits));
+ else lio = xwrite(mfd, tmpdata, TF_FROM_BITS(macbits));
if (lio == NOSIZE) xerror(NO, NO, YES, "%s", do_mac_file);
if (do_fsync && fsync(mfd) == -1) xerror(NO, NO, YES, "%s", do_mac_file);
xclose(mfd);