51 broke -E logic completely, rewise it
[tfcrypt.git] / tfdef.h
1 #ifndef _THREEFISH_CIPHER_DEFINITIONS_HEADER
2 #define _THREEFISH_CIPHER_DEFINITIONS_HEADER
3
4 #ifndef _DEFAULT_SOURCE
5 #define _DEFAULT_SOURCE
6 #endif
7
8 #ifndef _BSD_SOURCE
9 #define _BSD_SOURCE
10 #endif
11
12 /* config block */
13 /* #define TF_256BITS */
14 /* #define TF_512BITS */
15 #define TF_1024BITS
16 /* #define TF_NO_ENDIAN */
17 /* #define TF_BIG_ENDIAN */
18
19 #include <stddef.h>
20 #include <stdint.h>
21 #ifndef TF_NO_ENDIAN
22 #include <sys/param.h>
23 #else
24 #undef TF_BIG_ENDIAN
25 #endif
26
27 #define TF_UNIT_TYPE uint64_t
28
29 #ifdef TF_BIG_ENDIAN
30 #define TF_SWAP_FUNC htobe64
31 #else
32 #define TF_SWAP_FUNC htole64
33 #endif
34
35 #if defined(TF_256BITS)
36 #define TF_NR_BLOCK_BITS 256
37 #define TF_NR_KEY_BITS 512
38 #define TF_NR_BLOCK_UNITS 4
39 #define TF_NR_KEY_UNITS 8
40 #define IRR_POLY_CONST 0x425
41 #elif defined(TF_512BITS)
42 #define TF_NR_BLOCK_BITS 512
43 #define TF_NR_KEY_BITS 768
44 #define TF_NR_BLOCK_UNITS 8
45 #define TF_NR_KEY_UNITS 12
46 #define IRR_POLY_CONST 0x125
47 #elif defined(TF_1024BITS)
48 #define TF_NR_BLOCK_BITS 1024
49 #define TF_NR_KEY_BITS 1280
50 #define TF_NR_BLOCK_UNITS 16
51 #define TF_NR_KEY_UNITS 20
52 #define IRR_POLY_CONST 0x80043
53 #else
54 #error Please edit tfdef.h include file and select at least one cipher!
55 #endif
56
57 #define TF_BYTE_TYPE uint8_t
58 #define TF_SIZE_UNIT (sizeof(TF_UNIT_TYPE))
59 #define TF_BLOCK_SIZE (TF_SIZE_UNIT * TF_NR_BLOCK_UNITS)
60 #define TF_KEY_SIZE (TF_SIZE_UNIT * TF_NR_KEY_UNITS)
61
62 #define TF_NR_TWEAK_UNITS 2
63 #define TF_NR_TWEAK_BITS 128
64 #define TF_TWEAK_SIZE (TF_SIZE_UNIT * TF_NR_TWEAK_UNITS)
65 #define TF_TWEAKEY_SIZE (TF_KEY_SIZE - (2 * TF_TWEAK_SIZE))
66 #define TF_NR_TWEAKEY_BITS (TF_NR_KEY_BITS - (2 * TF_NR_TWEAK_BITS))
67 #define TF_TWEAK_WORD1 (TF_NR_KEY_UNITS-3)
68 #define TF_TWEAK_WORD2 (TF_NR_KEY_UNITS-2)
69 #define TF_TWEAK_WORD3 (TF_NR_KEY_UNITS-1)
70
71 #define TF_TO_BITS(x) ((x) * 8)
72 #define TF_FROM_BITS(x) ((x) / 8)
73 #define TF_MAX_BITS TF_NR_BLOCK_BITS
74 #define TF_UNIT_BITS (TF_SIZE_UNIT * 8)
75
76 #define TF_TO_BLOCKS(x) ((x) / TF_BLOCK_SIZE)
77 #define TF_FROM_BLOCKS(x) ((x) * TF_BLOCK_SIZE)
78 #define TF_BLOCKS_TO_BYTES(x) TF_FROM_BLOCKS(x)
79 #define TF_BLOCKS_FROM_BYTES(x) TF_TO_BLOCKS(x)
80
81 static inline void data_to_words(void *p, size_t l)
82 {
83 #ifndef TF_NO_ENDIAN
84         size_t idx;
85         TF_UNIT_TYPE *P = p;
86         TF_UNIT_TYPE t;
87
88         for (idx = 0; idx < (l/sizeof(TF_UNIT_TYPE)); idx++) {
89                 t = TF_SWAP_FUNC(P[idx]);
90                 P[idx] = t;
91         }
92 #endif
93 }
94
95 static inline void xor_block(void *dst, const void *src, size_t sz)
96 {
97         const size_t *sx = (const size_t *)src;
98         const TF_BYTE_TYPE *usx = (const TF_BYTE_TYPE *)src;
99         size_t *dx = (size_t *)dst;
100         TF_BYTE_TYPE *udx = (TF_BYTE_TYPE *)dst;
101         size_t sl = sz;
102
103         for (sl = 0; sl < (sz / sizeof(size_t)); sl++) dx[sl] ^= sx[sl];
104         if (sz - (sl * sizeof(size_t))) for (sl *= sizeof(size_t); sl < sz; sl++) udx[sl] ^= usx[sl];
105 }
106
107 static inline void ctr_inc(TF_UNIT_TYPE *x, size_t xl)
108 {
109         size_t z;
110
111         for (z = 0; z < xl; z++) {
112                 x[z] = ((x[z] + (TF_UNIT_TYPE)1) & ((TF_UNIT_TYPE)~0));
113                 if (x[z]) break;
114         }
115 }
116
117 static inline void ctr_add(TF_UNIT_TYPE *x, size_t xl, const TF_UNIT_TYPE *y, size_t yl)
118 {
119         size_t z, cf;
120         TF_UNIT_TYPE t;
121
122         for (z = 0, cf = 0; z < xl; z++) {
123                 t = x[z] + (z >= yl ? (TF_UNIT_TYPE)0 : y[z]) + cf;
124                 if (cf) cf = (x[z] >= t ? 1 : 0);
125                 else cf = (x[z] > t ? 1 : 0);
126                 x[z] = t;
127         }
128 }
129
130 struct tfe_stream;
131
132 #define tf_convkey(k) do { data_to_words(k, TF_KEY_SIZE); } while (0)
133
134 void tf_encrypt_rawblk(TF_UNIT_TYPE *O, const TF_UNIT_TYPE *I, const TF_UNIT_TYPE *K);
135 void tf_decrypt_rawblk(TF_UNIT_TYPE *O, const TF_UNIT_TYPE *I, const TF_UNIT_TYPE *K);
136
137 void tf_encrypt_block(const void *key, void *out, const void *in);
138 void tf_decrypt_block(const void *key, void *out, const void *in);
139
140 void tf_ctr_set(void *ctr, const void *sctr, size_t sctrsz);
141 void tf_ctr_crypt(const void *key, void *ctr, void *out, const void *in, size_t sz);
142
143 void tf_tweak_set(void *key, const void *tweak);
144
145 void tf_stream_crypt(struct tfe_stream *tfe, void *out, const void *in, size_t sz);
146 void tf_ecb_encrypt(const void *key, void *out, const void *in, size_t sz);
147 void tf_ecb_decrypt(const void *key, void *out, const void *in, size_t sz);
148 void tf_cbc_encrypt(const void *key, void *iv, void *out, const void *in, size_t sz);
149 void tf_cbc_decrypt(const void *key, void *iv, void *out, const void *in, size_t sz);
150 void tf_pcbc_encrypt(const void *key, void *iv, void *out, const void *in, size_t sz);
151 void tf_pcbc_decrypt(const void *key, void *iv, void *out, const void *in, size_t sz);
152 void tf_xts_encrypt(const void *keyx, const void *keyz, void *ctr, void *out, const void *in, size_t sz, size_t bpi);
153 void tf_xts_decrypt(const void *keyx, const void *keyz, void *ctr, void *out, const void *in, size_t sz, size_t bpi);
154
155 #endif