1 #ifndef _THREEFISH_CIPHER_DEFINITIONS_HEADER
2 #define _THREEFISH_CIPHER_DEFINITIONS_HEADER
9 /* #define TF_256BITS */
10 /* #define TF_512BITS */
12 /* #define TF_NO_ENDIAN */
13 /* #define TF_BIG_ENDIAN */
18 #include <sys/param.h>
23 #define TF_UNIT_TYPE uint64_t
26 #define TF_SWAP_FUNC htobe64
28 #define TF_SWAP_FUNC htole64
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
50 #error Please edit tfdef.h include file and select at least one cipher!
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)
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)
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)
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)
72 static inline void data_to_words(void *p, size_t l)
79 for (idx = 0; idx < (l/sizeof(TF_UNIT_TYPE)); idx++) {
80 t = TF_SWAP_FUNC(P[idx]);
86 static inline void ctr_inc(TF_UNIT_TYPE *x, size_t l)
90 for (i = 0; i < l; i++) {
91 x[i] = ((x[i] + (TF_UNIT_TYPE)1) & ((TF_UNIT_TYPE)~0));
96 static inline void ctr_add(TF_UNIT_TYPE *x, const TF_UNIT_TYPE *y, size_t l)
101 for (i = 0; i < l; i++) {
103 x[i] += y[i]; x[i] &= ((TF_UNIT_TYPE)~0);
108 if (x[f-i] < t) goto _again;
116 #define tf_convkey(k) do { data_to_words(k, TF_KEY_SIZE); } while (0)
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);
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);
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);