summaryrefslogtreecommitdiffstats
path: root/drivers/staging/skein/include/threefishApi.h
blob: 85afd72fe98780f05b9038f92c31a0f293486d81 (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
159
160
161
162
163
164
165
166
167

#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
    ThreefishKey_t keyCtx;

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

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

#include <skein.h>
#include <stdint.h>

#define KeyScheduleConst 0x1BD11BDAA9FC1A22L

#ifdef __cplusplus
extern "C"
{
#endif

    /**
     * Which Threefish size to use
     */
    typedef enum ThreefishSize {
        Threefish256 = 256,     /*!< Skein with 256 bit state */
        Threefish512 = 512,     /*!< Skein with 512 bit state */
        Threefish1024 = 1024    /*!< Skein with 1024 bit state */
    } ThreefishSize_t;
    
    /**
     * 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.
     */
    typedef struct ThreefishKey {
        u64b_t stateSize;
        u64b_t key[SKEIN_MAX_STATE_WORDS+1];   /* max number of key words*/
        u64b_t tweak[3];
    } ThreefishKey_t;

    /**
     * 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(ThreefishKey_t* keyCtx, ThreefishSize_t stateSize, uint64_t* keyData, uint64_t* 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(ThreefishKey_t* keyCtx, uint8_t* in, uint8_t* 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(ThreefishKey_t* keyCtx, uint64_t* in, uint64_t* 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(ThreefishKey_t* keyCtx, uint8_t* in, uint8_t* 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(ThreefishKey_t* keyCtx, uint64_t* in, uint64_t* out);

    void threefishEncrypt256(ThreefishKey_t* keyCtx, uint64_t* input, uint64_t* output);
    void threefishEncrypt512(ThreefishKey_t* keyCtx, uint64_t* input, uint64_t* output);
    void threefishEncrypt1024(ThreefishKey_t* keyCtx, uint64_t* input, uint64_t* output);
    void threefishDecrypt256(ThreefishKey_t* keyCtx, uint64_t* input, uint64_t* output);
    void threefishDecrypt512(ThreefishKey_t* keyCtx, uint64_t* input, uint64_t* output);
    void threefishDecrypt1024(ThreefishKey_t* keyCtx, uint64_t* input, uint64_t* output);
#ifdef __cplusplus
}
#endif

/**
 * @}
 */
#endif