Support loading tfcrypt_defs.h variables from file.
authorAndrey Rys <rys@lynxlynx.ru>
Sat, 16 Mar 2019 10:02:42 +0000 (17:02 +0700)
committerAndrey Rys <rys@lynxlynx.ru>
Sat, 16 Mar 2019 10:18:55 +0000 (17:18 +0700)
VERSION
tfc_conf.c [new file with mode: 0644]
tfc_error.c
tfc_skein.c
tfcrypt.c
tfcrypt.h
xstrlcat.c [new file with mode: 0644]

diff --git a/VERSION b/VERSION
index 8351c19397f4fcd5238d10034fa7fa384f14d580..60d3b2f4a4cd5f1637eba020358bfe5ecb5edcf2 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-14
+15
diff --git a/tfc_conf.c b/tfc_conf.c
new file mode 100644 (file)
index 0000000..bd2b112
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * tfcrypt -- high security Threefish encryption tool.
+ *
+ * tfcrypt is copyrighted:
+ * Copyright (C) 2012-2018 Andrey Rys. All rights reserved.
+ *
+ * tfcrypt is licensed to you under the terms of std. MIT/X11 license:
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "tfcrypt.h"
+
+void read_defaults(const char *path, tfc_yesno noerr)
+{
+       static char ln[4096];
+       char *s, *d, *t, *stoi;
+       FILE *f;
+       tfc_yesno valid = NO;
+
+       f = fopen(path, "r");
+       if (!f) {
+               if (noerr == YES) return;
+               xerror(NO, NO, YES, "%s", path);
+       }
+
+       while (1) {
+               memset(ln, 0, sizeof(ln));
+               if (xfgets(ln, sizeof(ln), f) != YES) break;
+
+               if (valid == NO) {
+                       if (!strcmp(ln, "# tfcrypt.defs")) valid = YES;
+                       continue;
+               }
+
+               if (str_empty(ln) || ln[0] == '#') continue;
+
+               s = ln;
+               d = strchr(s, '=');
+               if (!d) continue;
+               *d = 0; d++;
+
+               /* yay! GOTO hell! You'll "like" it! */
+_spc1:         t = strchr(s, ' ');
+               if (!t) goto _spc2;
+               *t = 0; goto _spc1;
+_spc2:         t = strchr(d, ' ');
+               if (!t) goto _nspc;
+               *t = 0; d = t+1; goto _spc2;
+_nspc:
+               if (!strcmp(s, "nr_turns")) {
+                       nr_turns = sksum_turns = strtoul(d, &stoi, 10);
+                       if (!str_empty(stoi)) xerror(NO, YES, YES, "[%s] nr_turns=%s: invalid number of turns", path, d);
+               }
+               else if (!strcmp(s, "ctr_mode")) {
+                       if (!strcasecmp(d, "ctr"))
+                               ctr_mode = TFC_MODE_CTR;
+                       else if (!strcasecmp(d, "stream"))
+                               ctr_mode = TFC_MODE_STREAM;
+                       else if (!strcasecmp(d, "cbc"))
+                               ctr_mode = TFC_MODE_CBC;
+                       else if (!strcasecmp(d, "ecb"))
+                               ctr_mode = TFC_MODE_ECB;
+                       else if (!strcasecmp(d, "xts"))
+                               ctr_mode = TFC_MODE_XTS;
+                       else if (!strcasecmp(d, "ocb"))
+                               ctr_mode = TFC_MODE_OCB;
+                       else xerror(NO, YES, YES, "[%s] ctr_mode=%s: invalid mode of operation", path, d);
+               }
+               else if (!strcmp(s, "tfc_salt")) {
+                       memset(tfc_salt, 0, TFC_MAX_SALT);
+                       tfc_saltsz = base64_decode((char *)tfc_salt, TFC_MAX_SALT, d, strlen(d));
+               }
+               else if (!strcmp(s, "macbits")) {
+                       macbits = strtoul(d, &stoi, 10);
+                       if (macbits == 0 || !str_empty(stoi) || macbits < 8
+                       || macbits > TF_MAX_BITS || macbits % 8)
+                               xerror(NO, YES, YES, "[%s] macbits=%s: invalid MAC bits setting", path, d);
+               }
+               else xerror(NO, YES, YES, "[%s] %s: unknown keyword", path, s);
+       }
+
+       memset(ln, 0, sizeof(ln));
+       fclose(f);
+}
index cb8ee057e7f25756e22dc3e512fb4aa94d0a7a11..6e2dabf30f9a18cc99a6e9cd4ff37abe5b732cd3 100644 (file)
@@ -151,6 +151,8 @@ void usage(void)
        tfc_say("convert encrypted data into ASCII format to ease transmission.");
        tfc_say("\n");
        tfc_say("  -e, -d: encrypt, decrypt (it maybe required).");
+       tfc_say("  -L <file>: load tfcrypt defsults from file.");
+       tfc_say("    defaults is text file which defines salt, nr_turns and default mode.");
        tfc_say("  -s <file>: load tfcrypt salt from file.");
        tfc_say("  -s disable: disable key salting at all.");
        tfc_say("  -p: instead of using key, ask for password.");
index 5d457deac828513156db13ced328d11feb6ef9e7..4eb6f92d7734695d45558f028f5613742974aaf5 100644 (file)
@@ -204,8 +204,7 @@ _dothat:
 
                while (1) {
                        memset(sksblk, 0, sizeof(sksblk));
-                       x = xfgets(sksblk, sizeof(sksblk), f);
-                       if (x == 0) break;
+                       if (xfgets(sksblk, sizeof(sksblk), f) != YES) break;
 
                        s = d = sksblk; t = NULL;
                        shash = fname = NULL;
index 4724c0fab024cf88ab10fa8492dfce05c0cbeb76..2390516a2ae9b35d7b3715f82e8deb596d7d1c8b 100644 (file)
--- a/tfcrypt.c
+++ b/tfcrypt.c
@@ -62,9 +62,20 @@ int main(int argc, char **argv)
 
        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;
index fddb1ae3ebadfb5bdfbd5b96350001c487e1386a..649fc06063707c2465912049edd254ea1f2b6f0d 100644 (file)
--- a/tfcrypt.h
+++ b/tfcrypt.h
@@ -119,6 +119,9 @@ int xmhexdump(int to, const void *data, size_t szdata, int hgroup, int hexstr, i
 #define mhexdump(data, szdata, group, newline) xmhexdump(1, data, szdata, group, do_full_hexdump, newline)
 #define mehexdump(data, szdata, group, newline) xmhexdump(2, data, szdata, group, do_full_hexdump, newline)
 
+size_t xstrlcpy(char *dst, const char *src, size_t size);
+size_t xstrlcat(char *dst, const char *src, size_t size);
+
 extern size_t nr_turns;
 extern int ctr_mode;
 extern size_t macbits;
@@ -203,6 +206,8 @@ void skein(void *hash, size_t bits, const void *key, const void *data, size_t sz
 void tf_key_tweak_compat(void *key);
 tfc_yesno skeinfd(void *hash, size_t bits, const void *key, int fd, tfc_fsize offset, tfc_fsize readto);
 
+void read_defaults(const char *path, tfc_yesno noerr);
+
 void gen_write_bytes(const char *foutname, tfc_fsize offset, tfc_fsize nrbytes);
 void do_edbase64(char **fargv);
 void do_sksum(char *spec, char **fargv);
diff --git a/xstrlcat.c b/xstrlcat.c
new file mode 100644 (file)
index 0000000..341b048
--- /dev/null
@@ -0,0 +1,19 @@
+#include <string.h>
+
+size_t xstrlcpy(char *dst, const char *src, size_t size)
+{
+       size_t len, srclen;
+       srclen = strlen(src);
+       if (size-- <= 0) return srclen;
+       len = (size < srclen) ? size : srclen;
+       memmove(dst, src, len);
+       dst[len] = '\0';
+       return srclen;
+}
+
+size_t xstrlcat(char *dst, const char *src, size_t size)
+{
+       size_t dstlen = strnlen(dst, size);
+       if (dstlen == size) return dstlen + strlen(src);
+       return dstlen + xstrlcpy(dst+dstlen, src, size-dstlen);
+}