2 #include <linux/string.h>
4 #include <threefishApi.h>
7 /***************************** Skein_256 ******************************/
8 void Skein_256_Process_Block(struct skein_256_ctx *ctx, const u8 *blkPtr,
9 size_t blkCnt, size_t byteCntAdd)
11 struct threefish_key key;
14 u64 w[SKEIN_256_STATE_WORDS]; /* local copy of input block */
17 Skein_assert(blkCnt != 0); /* never call with blkCnt == 0! */
18 tweak[0] = ctx->h.T[0];
19 tweak[1] = ctx->h.T[1];
22 u64 carry = byteCntAdd;
24 words[0] = tweak[0] & 0xffffffffL;
25 words[1] = ((tweak[0] >> 32) & 0xffffffffL);
26 words[2] = (tweak[1] & 0xffffffffL);
28 for (i = 0; i < 3; i++) {
33 tweak[0] = words[0] & 0xffffffffL;
34 tweak[0] |= (words[1] & 0xffffffffL) << 32;
35 tweak[1] |= words[2] & 0xffffffffL;
37 threefishSetKey(&key, Threefish256, ctx->X, tweak);
39 /* get input block in little-endian format */
40 Skein_Get64_LSB_First(w, blkPtr, SKEIN_256_STATE_WORDS);
42 threefishEncryptBlockWords(&key, w, ctx->X);
44 blkPtr += SKEIN_256_BLOCK_BYTES;
46 /* do the final "feedforward" xor, update ctx chaining vars */
47 ctx->X[0] = ctx->X[0] ^ w[0];
48 ctx->X[1] = ctx->X[1] ^ w[1];
49 ctx->X[2] = ctx->X[2] ^ w[2];
50 ctx->X[3] = ctx->X[3] ^ w[3];
52 tweak[1] &= ~SKEIN_T1_FLAG_FIRST;
55 ctx->h.T[0] = tweak[0];
56 ctx->h.T[1] = tweak[1];
59 void Skein_512_Process_Block(struct skein_512_ctx *ctx, const u8 *blkPtr,
60 size_t blkCnt, size_t byteCntAdd)
62 struct threefish_key key;
66 u64 w[SKEIN_512_STATE_WORDS]; /* local copy of input block */
68 Skein_assert(blkCnt != 0); /* never call with blkCnt == 0! */
69 tweak[0] = ctx->h.T[0];
70 tweak[1] = ctx->h.T[1];
73 u64 carry = byteCntAdd;
75 words[0] = tweak[0] & 0xffffffffL;
76 words[1] = ((tweak[0] >> 32) & 0xffffffffL);
77 words[2] = (tweak[1] & 0xffffffffL);
79 for (i = 0; i < 3; i++) {
84 tweak[0] = words[0] & 0xffffffffL;
85 tweak[0] |= (words[1] & 0xffffffffL) << 32;
86 tweak[1] |= words[2] & 0xffffffffL;
88 threefishSetKey(&key, Threefish512, ctx->X, tweak);
90 /* get input block in little-endian format */
91 Skein_Get64_LSB_First(w, blkPtr, SKEIN_512_STATE_WORDS);
93 threefishEncryptBlockWords(&key, w, ctx->X);
95 blkPtr += SKEIN_512_BLOCK_BYTES;
97 /* do the final "feedforward" xor, update ctx chaining vars */
98 ctx->X[0] = ctx->X[0] ^ w[0];
99 ctx->X[1] = ctx->X[1] ^ w[1];
100 ctx->X[2] = ctx->X[2] ^ w[2];
101 ctx->X[3] = ctx->X[3] ^ w[3];
102 ctx->X[4] = ctx->X[4] ^ w[4];
103 ctx->X[5] = ctx->X[5] ^ w[5];
104 ctx->X[6] = ctx->X[6] ^ w[6];
105 ctx->X[7] = ctx->X[7] ^ w[7];
107 tweak[1] &= ~SKEIN_T1_FLAG_FIRST;
110 ctx->h.T[0] = tweak[0];
111 ctx->h.T[1] = tweak[1];
114 void Skein1024_Process_Block(struct skein1024_ctx *ctx, const u8 *blkPtr,
115 size_t blkCnt, size_t byteCntAdd)
117 struct threefish_key key;
121 u64 w[SKEIN1024_STATE_WORDS]; /* local copy of input block */
123 Skein_assert(blkCnt != 0); /* never call with blkCnt == 0! */
124 tweak[0] = ctx->h.T[0];
125 tweak[1] = ctx->h.T[1];
128 u64 carry = byteCntAdd;
130 words[0] = tweak[0] & 0xffffffffL;
131 words[1] = ((tweak[0] >> 32) & 0xffffffffL);
132 words[2] = (tweak[1] & 0xffffffffL);
134 for (i = 0; i < 3; i++) {
139 tweak[0] = words[0] & 0xffffffffL;
140 tweak[0] |= (words[1] & 0xffffffffL) << 32;
141 tweak[1] |= words[2] & 0xffffffffL;
143 threefishSetKey(&key, Threefish1024, ctx->X, tweak);
145 /* get input block in little-endian format */
146 Skein_Get64_LSB_First(w, blkPtr, SKEIN1024_STATE_WORDS);
148 threefishEncryptBlockWords(&key, w, ctx->X);
150 blkPtr += SKEIN1024_BLOCK_BYTES;
152 /* do the final "feedforward" xor, update ctx chaining vars */
153 ctx->X[0] = ctx->X[0] ^ w[0];
154 ctx->X[1] = ctx->X[1] ^ w[1];
155 ctx->X[2] = ctx->X[2] ^ w[2];
156 ctx->X[3] = ctx->X[3] ^ w[3];
157 ctx->X[4] = ctx->X[4] ^ w[4];
158 ctx->X[5] = ctx->X[5] ^ w[5];
159 ctx->X[6] = ctx->X[6] ^ w[6];
160 ctx->X[7] = ctx->X[7] ^ w[7];
161 ctx->X[8] = ctx->X[8] ^ w[8];
162 ctx->X[9] = ctx->X[9] ^ w[9];
163 ctx->X[10] = ctx->X[10] ^ w[10];
164 ctx->X[11] = ctx->X[11] ^ w[11];
165 ctx->X[12] = ctx->X[12] ^ w[12];
166 ctx->X[13] = ctx->X[13] ^ w[13];
167 ctx->X[14] = ctx->X[14] ^ w[14];
168 ctx->X[15] = ctx->X[15] ^ w[15];
170 tweak[1] &= ~SKEIN_T1_FLAG_FIRST;
173 ctx->h.T[0] = tweak[0];
174 ctx->h.T[1] = tweak[1];