51 broke -E logic completely, rewise it
[tfcrypt.git] / tfcrypt.h
1 /*
2  * tfcrypt -- high security Threefish encryption tool.
3  *
4  * tfcrypt is copyrighted:
5  * Copyright (C) 2012-2019 Andrey Rys. All rights reserved.
6  *
7  * tfcrypt is licensed to you under the terms of std. MIT/X11 license:
8  *
9  * Permission is hereby granted, free of charge, to any person obtaining
10  * a copy of this software and associated documentation files (the
11  * "Software"), to deal in the Software without restriction, including
12  * without limitation the rights to use, copy, modify, merge, publish,
13  * distribute, sublicense, and/or sell copies of the Software, and to
14  * permit persons to whom the Software is furnished to do so, subject to
15  * the following conditions:
16  *
17  * The above copyright notice and this permission notice shall be
18  * included in all copies or substantial portions of the Software.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27  */
28
29 #ifndef _TFCRYPT_H
30 #define _TFCRYPT_H
31
32 #ifndef _DEFAULT_SOURCE
33 #define _DEFAULT_SOURCE
34 #endif
35 #ifndef _BSD_SOURCE
36 #define _BSD_SOURCE
37 #endif
38 #ifndef _XOPEN_SOURCE
39 #define _XOPEN_SOURCE 700
40 #endif
41 #ifndef _LARGEFILE64_SOURCE
42 #define _LARGEFILE64_SOURCE
43 #endif
44 #ifndef _FILE_OFFSET_BITS
45 #define _FILE_OFFSET_BITS 64
46 #endif
47
48 #ifndef _TFCRYPT_VERSION
49 #error Version number may help you to identify missing functionality.
50 #endif
51
52 #include <stdio.h>
53 #include <string.h>
54 #include <stdlib.h>
55 #include <unistd.h>
56 #include <errno.h>
57 #include <libgen.h>
58 #include <stdarg.h>
59 #include <sys/types.h>
60 #include <sys/stat.h>
61 #include <limits.h>
62 #include <fcntl.h>
63 #include <signal.h>
64 #include <time.h>
65 #include <sys/time.h>
66 #include <stdint.h>
67
68 typedef void (*sighandler_t)(int);
69
70 #include "base64.h"
71 #include "getpasswd.h"
72 #include "tfdef.h"
73 #include "skein.h"
74 #include "tfe.h"
75 #include "tfprng.h"
76
77 typedef short tfc_yesno;
78 typedef TF_BYTE_TYPE tfc_byte;
79 typedef unsigned long long tfc_fsize;
80 typedef unsigned long long tfc_useconds;
81
82 #ifndef TFC_BLKSIZE
83 #define TFC_BLKSIZE 65536
84 #endif
85
86 #ifndef TFC_MAX_SALT
87 #define TFC_MAX_SALT (2048 + TF_KEY_SIZE)
88 #endif
89
90 #ifndef TFC_XTSBLOCKS
91 #define TFC_XTSBLOCKS 32
92 #endif
93
94 #ifndef TFC_B64_WIDTH
95 #define TFC_B64_WIDTH 76
96 #endif
97 #define TFC_B64_EWIDTH (TFC_B64_WIDTH - (TFC_B64_WIDTH / 4))
98 #define TFC_B64_DWIDTH TFC_BLKSIZE
99
100 #define NOSIZE ((size_t)-1)
101 #define NOFSIZE ((tfc_fsize)-1)
102 #define TFC_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
103
104 #define TFC_KEY_BITS (do_full_key == NO ? TF_MAX_BITS : TF_NR_KEY_BITS)
105
106 #define TFC_ASCII_TFC_MAC_FOURCC "%TF"
107 #define TFC_ASCII_TFC_MAC_FOURCC_LEN (sizeof(TFC_ASCII_TFC_MAC_FOURCC)-1)
108
109 #define TFC_U(x) ((unsigned)x)
110 #define TFC_DTOUSECS(x) ((x) * 1000000.0)
111 #define TFC_UTODSECS(x) ((x) / 1000000.0)
112
113 #define TFC_DEFAULT_RANDSOURCE "/dev/urandom"
114 #define TFC_STDIN_NAME "(stdin)"
115 #define TFC_STDOUT_NAME "(stdout)"
116
117 #define TFC_TMPSIZE     (TF_BLOCK_SIZE * 4)
118
119 int xmhexdump(int to, const void *data, size_t szdata, int hgroup, int hexstr, int newline);
120 #define mhexdump(data, szdata, group, newline) xmhexdump(1, data, szdata, group, do_full_hexdump, newline)
121 #define mehexdump(data, szdata, group, newline) xmhexdump(2, data, szdata, group, do_full_hexdump, newline)
122
123 size_t xstrlcpy(char *dst, const char *src, size_t size);
124 size_t xstrlcat(char *dst, const char *src, size_t size);
125
126 extern size_t nr_turns;
127 extern int ctr_mode;
128 extern size_t macbits;
129 extern size_t tfc_saltsz;
130 extern tfc_byte tfc_salt[TFC_MAX_SALT];
131 extern tfc_yesno do_full_key;
132
133 extern char *progname;
134 extern int exitcode;
135 extern pid_t progpid;
136 extern tfc_byte key[TF_KEY_SIZE], ctr[TF_BLOCK_SIZE], xtskey[TF_KEY_SIZE], mackey[TF_FROM_BITS(TF_MAX_BITS)], tweak[TF_TWEAK_SIZE];
137 extern struct skein sk;
138 extern struct tfe_stream tfe;
139 extern tfc_byte srcblk[TFC_BLKSIZE], dstblk[TFC_BLKSIZE], *pblk;
140 extern tfc_byte macvrfy[SKEIN_DIGEST_SIZE], macresult[SKEIN_DIGEST_SIZE];
141 extern tfc_byte tmpdata[TFC_TMPSIZE];
142 extern char *randsource;
143 extern tfc_fsize iseek_blocks, iseek, oseek, maxlen, ftrunc_dfd;
144 extern tfc_fsize total_processed_src, total_processed_dst, total_written_dst;
145 extern tfc_fsize delta_processed;
146 extern tfc_fsize genrandom_nr_bytes, genzero_nr_bytes;
147 extern tfc_fsize rdpos;
148 extern tfc_fsize maxkeylen, keyoffset;
149 extern int sfd, kfd, dfd;
150 extern struct stat s_stat;
151 extern size_t blksize, xtsblocks;
152 extern char pwdask[512], pwdagain[512];
153 extern size_t lio, lrem, ldone, lblock;
154 extern size_t ctrsz;
155 extern struct sigaction sigact;
156 extern size_t sksum_turns;
157 extern int do_edcrypt, do_stop, quiet, error_action;
158 extern int counter_opt, mackey_opt, do_mac, do_outfmt, rawkey;
159 extern int idx, write_flags;
160 extern tfc_yesno catch_all_errors, ignore_seek_errors, password, overwrite_source, do_fsync, do_pad, do_ftrunc;
161 extern tfc_yesno do_preserve_time, do_stats_in_gibs, do_statline_dynamic, do_less_stats, show_pid, read_only;
162 extern tfc_yesno no_repeat, do_full_hexdump, verbose, statline_was_shown, show_secrets, show_when_done;
163 extern char *srcfname, *dstfname, *do_mac_file, *counter_file, *sksum_hashlist_file;
164 extern char *saltf, *genkeyf, *mackeyf, *tweakf;
165 extern char *pw_prompt, *mac_pw_prompt;
166 extern tfc_useconds status_timer, bench_timer;
167 extern tfc_useconds total_time, current_time, delta_time;
168 extern struct getpasswd_state getps;
169
170 size_t xread(int fd, void *data, size_t szdata);
171 size_t xwrite(int fd, const void *data, size_t szdata);
172
173 void xerror(tfc_yesno noexit, tfc_yesno noerrno, tfc_yesno nostats, const char *fmt, ...);
174 void xexit(int status);
175 void usage(void);
176
177 void tfc_vfsay(FILE *where, tfc_yesno addnl, const char *fmt, va_list ap);
178 void tfc_nfsay(FILE *where, const char *fmt, ...);
179 void tfc_esay(const char *fmt, ...);
180 void tfc_say(const char *fmt, ...);
181
182 void tfc_printbase64(FILE *where, const void *p, size_t n, tfc_yesno nl);
183 void tfc_data_to_words64(void *data, size_t szdata);
184 tfc_fsize tfc_humanfsize(const char *s, char **stoi);
185 const char *tfc_getscale(int scale);
186 void tfc_describescale(tfc_fsize num, double *w, int *scale);
187 size_t blk_len_adj(tfc_fsize filelen, tfc_fsize read_already, size_t blklen);
188 tfc_yesno xor_shrink(void *dst, size_t szdst, const void *src, size_t szsrc);
189 tfc_yesno str_empty(const char *str);
190 int xxopen(tfc_yesno noerr, const char *pathname, int flags);
191 int xopen(const char *pathname, int flags);
192 void xclose(int fd);
193 const char *tfc_modename(int mode);
194 tfc_yesno tfc_is_freestream(int mode);
195 void tfc_getcurtime(tfc_useconds *tx);
196 char *tfc_format_time(tfc_useconds t);
197 char *tfc_format_pid(const char *str);
198 tfc_fsize tfc_fdsize(int fd);
199 tfc_fsize tfc_fdgetpos(int fd);
200 tfc_fsize tfc_fnamesize(char *fname, tfc_yesno noexit);
201 tfc_fsize tfc_modifysize(tfc_fsize szmodify, const char *szspec);
202 void fcopy_matime(int fd, const struct stat *st);
203 tfc_yesno xfgets(char *s, size_t n, FILE *f);
204 tfc_yesno isbase64(const char *s);
205 void hex2bin(void *d, const char *s);
206 void tfc_finirandom(void);
207 void tfc_getrandom(void *buf, size_t sz);
208 void exit_sigterm(int signal);
209 void handle_sigtstp(int signal);
210 void print_crypt_status(int signal);
211 void change_status_width(int signal);
212 void change_status_timer(int signal);
213 void setup_next_alarm(tfc_useconds useconds);
214 void skein(void *hash, size_t bits, const void *key, const void *data, size_t szdata);
215 tfc_yesno skeinfd(void *hash, size_t bits, const void *key, int fd, tfc_fsize offset, tfc_fsize readto);
216
217 void read_defaults(const char *path, tfc_yesno noerr);
218 void hash_defaults(char *uhash, size_t szuhash);
219
220 void gen_write_bytes(const char *foutname, tfc_fsize offset, tfc_fsize nrbytes);
221 void do_edbase64(char **fargv);
222 void do_sksum(char *spec, char **fargv);
223 void do_benchmark(tfc_useconds useconds, double dseconds);
224
225 enum { NO, YES };
226
227 enum { TFC_ERRACT_EXIT, TFC_ERRACT_CONT, TFC_ERRACT_SYNC, TFC_ERRACT_LSYNC };
228 enum { TFC_DO_PLAIN, TFC_DO_ENCRYPT, TFC_DO_DECRYPT };
229 enum { TFC_MAC_DROP2 = -2, TFC_MAC_DROP = -1, TFC_MAC_SIGN = 1, TFC_MAC_VRFY, TFC_MAC_JUST_VRFY, TFC_MAC_JUST_VRFY2 };
230 enum { TFC_MACKEY_RAWKEY = 1, TFC_MACKEY_PASSWORD, TFC_MACKEY_FILE };
231 enum { TFC_RAWKEY_KEYFILE = 1, TFC_RAWKEY_ASKSTR, TFC_RAWKEY_ASKHEX };
232 enum { TFC_OUTFMT_HEX = 1, TFC_OUTFMT_B64, TFC_OUTFMT_RAW };
233 enum {
234         TFC_MODE_SKSUM = -3, TFC_MODE_XOR = -2, TFC_MODE_PLAIN = -1, TFC_MODE_CTR = 1,
235         TFC_MODE_STREAM, TFC_MODE_XTS, TFC_MODE_ECB, TFC_MODE_CBC, TFC_MODE_PCBC
236 };
237 enum { TFC_CTR_SHOW = 1, TFC_CTR_HEAD, TFC_CTR_RAND, TFC_CTR_ZERO, TFC_CTR_SSET };
238 enum { TFC_NO_FTRUNC, TFC_DO_FTRUNC, TFC_FTRUNC_TAIL };
239 enum { TFC_SIGLAST = -2, TFC_SIGERR = -1, TFC_SIGSTAT = 0 };
240
241 #endif