summaryrefslogtreecommitdiffstats
path: root/drivers/staging/skein/include/threefishApi.h
blob: 199257e3781314b111a6a72379dfc0e10d0fc37a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158

#ifndef THREEFISHAPI_H
#define THREEFISHAPI_H

/**
 * @file threefishApi.h
 * @brief A Threefish cipher API and its functions.
 * @{
 *
 * This API and the functions that implement this API simplify the usage
 * of the Threefish cipher. The design and the way to use the functions 
 * follow the openSSL design but at the same time take care of some Threefish
 * specific behaviour and possibilities.
 *
 * These are the low level functions that deal with Threefisch blocks only.
 * Implementations for cipher modes such as ECB, CFB, or CBC may use these 
 * functions.
 * 
@code
    // Threefish cipher context data
    struct threefish_key keyCtx;

    // Initialize the context
    threefishSetKey(&keyCtx, Threefish512, key, tweak);

    // Encrypt
    threefishEncryptBlockBytes(&keyCtx, input, cipher);
@endcode
 */

#include <linux/types.h>
#include <skein.h>

#define KeyScheduleConst 0x1BD11BDAA9FC1A22L

/**
 * Which Threefish size to use
 */
enum threefish_size {
	Threefish256 = 256,     /*!< Skein with 256 bit state */
	Threefish512 = 512,     /*!< Skein with 512 bit state */
	Threefish1024 = 1024    /*!< Skein with 1024 bit state */
};

/**
 * Context for Threefish key and tweak words.
 * 
 * This structure was setup with some know-how of the internal
 * Skein structures, in particular ordering of header and size dependent
 * variables. If Skein implementation changes this, the adapt these
 * structures as well.
 */
struct threefish_key {
	u64 stateSize;
	u64 key[SKEIN_MAX_STATE_WORDS+1];   /* max number of key words*/
	u64 tweak[3];
};

/**
 * Set Threefish key and tweak data.
 * 
 * This function sets the key and tweak data for the Threefish cipher of
 * the given size. The key data must have the same length (number of bits)
 * as the state size 
 *
 * @param keyCtx
 *     Pointer to a Threefish key structure.
 * @param size
 *     Which Skein size to use.
 * @param keyData
 *     Pointer to the key words (word has 64 bits).
 * @param tweak
 *     Pointer to the two tweak words (word has 64 bits).
 */
void threefishSetKey(struct threefish_key *keyCtx, enum threefish_size stateSize, u64 *keyData, u64 *tweak);

/**
 * Encrypt Threefisch block (bytes).
 * 
 * The buffer must have at least the same length (number of bits) aas the 
 * state size for this key. The function uses the first @c stateSize bits
 * of the input buffer, encrypts them and stores the result in the output
 * buffer.
 * 
 * @param keyCtx
 *     Pointer to a Threefish key structure.
 * @param in
 *     Poionter to plaintext data buffer.
 * @param out
 *     Pointer to cipher buffer.
 */
void threefishEncryptBlockBytes(struct threefish_key *keyCtx, u8 *in, u8 *out);

/**
 * Encrypt Threefisch block (words).
 * 
 * The buffer must have at least the same length (number of bits) aas the 
 * state size for this key. The function uses the first @c stateSize bits
 * of the input buffer, encrypts them and stores the result in the output
 * buffer.
 * 
 * The wordsize ist set to 64 bits.
 * 
 * @param keyCtx
 *     Pointer to a Threefish key structure.
 * @param in
 *     Poionter to plaintext data buffer.
 * @param out
 *     Pointer to cipher buffer.
 */
void threefishEncryptBlockWords(struct threefish_key *keyCtx, u64 *in, u64 *out);

/**
 * Decrypt Threefisch block (bytes).
 * 
 * The buffer must have at least the same length (number of bits) aas the 
 * state size for this key. The function uses the first @c stateSize bits
 * of the input buffer, decrypts them and stores the result in the output
 * buffer
 * 
 * @param keyCtx
 *     Pointer to a Threefish key structure.
 * @param in
 *     Poionter to cipher data buffer.
 * @param out
 *     Pointer to plaintext buffer.
 */
void threefishDecryptBlockBytes(struct threefish_key *keyCtx, u8 *in, u8 *out);

/**
 * Decrypt Threefisch block (words).
 * 
 * The buffer must have at least the same length (number of bits) aas the 
 * state size for this key. The function uses the first @c stateSize bits
 * of the input buffer, encrypts them and stores the result in the output
 * buffer.
 * 
 * The wordsize ist set to 64 bits.
 * 
 * @param keyCtx
 *     Pointer to a Threefish key structure.
 * @param in
 *     Poionter to cipher data buffer.
 * @param out
 *     Pointer to plaintext buffer.
 */
void threefishDecryptBlockWords(struct threefish_key *keyCtx, u64 *in, u64 *out);

void threefishEncrypt256(struct threefish_key *keyCtx, u64 *input, u64 *output);
void threefishEncrypt512(struct threefish_key *keyCtx, u64 *input, u64 *output);
void threefishEncrypt1024(struct threefish_key *keyCtx, u64 *input, u64 *output);
void threefishDecrypt256(struct threefish_key *keyCtx, u64 *input, u64 *output);
void threefishDecrypt512(struct threefish_key *keyCtx, u64 *input, u64 *output);
void threefishDecrypt1024(struct threefish_key *keyCtx, u64 *input, u64 *output);
/**
 * @}
 */
#endif