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