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#include <linux/string.h>
27#include "skein_api.h"
28
29int skein_ctx_prepare(struct skein_ctx *ctx, enum skein_size size)
30{
31 skein_assert_ret(ctx && size, SKEIN_FAIL);
32
33 memset(ctx, 0, sizeof(struct skein_ctx));
34 ctx->skein_size = size;
35
36 return SKEIN_SUCCESS;
37}
38
39int skein_init(struct skein_ctx *ctx, size_t hash_bit_len)
40{
41 int ret = SKEIN_FAIL;
42 size_t x_len = 0;
43 u64 *x = NULL;
44 u64 tree_info = SKEIN_CFG_TREE_INFO_SEQUENTIAL;
45
46 skein_assert_ret(ctx, SKEIN_FAIL);
47
48
49
50
51
52 x = ctx->m.s256.x;
53 x_len = ctx->skein_size / 8;
54
55
56
57
58 switch (ctx->skein_size) {
59 case SKEIN_256:
60 ret = skein_256_init_ext(&ctx->m.s256, hash_bit_len,
61 tree_info, NULL, 0);
62 break;
63 case SKEIN_512:
64 ret = skein_512_init_ext(&ctx->m.s512, hash_bit_len,
65 tree_info, NULL, 0);
66 break;
67 case SKEIN_1024:
68 ret = skein_1024_init_ext(&ctx->m.s1024, hash_bit_len,
69 tree_info, NULL, 0);
70 break;
71 }
72
73 if (ret == SKEIN_SUCCESS) {
74
75
76
77
78 memcpy(ctx->x_save, x, x_len);
79 }
80 return ret;
81}
82
83int skein_mac_init(struct skein_ctx *ctx, const u8 *key, size_t key_len,
84 size_t hash_bit_len)
85{
86 int ret = SKEIN_FAIL;
87 u64 *x = NULL;
88 size_t x_len = 0;
89 u64 tree_info = SKEIN_CFG_TREE_INFO_SEQUENTIAL;
90
91 skein_assert_ret(ctx, SKEIN_FAIL);
92
93 x = ctx->m.s256.x;
94 x_len = ctx->skein_size / 8;
95
96 skein_assert_ret(hash_bit_len, SKEIN_BAD_HASHLEN);
97
98 switch (ctx->skein_size) {
99 case SKEIN_256:
100 ret = skein_256_init_ext(&ctx->m.s256, hash_bit_len,
101 tree_info,
102 (const u8 *)key, key_len);
103
104 break;
105 case SKEIN_512:
106 ret = skein_512_init_ext(&ctx->m.s512, hash_bit_len,
107 tree_info,
108 (const u8 *)key, key_len);
109 break;
110 case SKEIN_1024:
111 ret = skein_1024_init_ext(&ctx->m.s1024, hash_bit_len,
112 tree_info,
113 (const u8 *)key, key_len);
114
115 break;
116 }
117 if (ret == SKEIN_SUCCESS) {
118
119
120
121
122 memcpy(ctx->x_save, x, x_len);
123 }
124 return ret;
125}
126
127void skein_reset(struct skein_ctx *ctx)
128{
129 size_t x_len = 0;
130 u64 *x;
131
132
133
134
135
136
137 x = ctx->m.s256.x;
138 x_len = ctx->skein_size / 8;
139
140 memcpy(x, ctx->x_save, x_len);
141
142
143 skein_start_new_type(&ctx->m, MSG);
144}
145
146int skein_update(struct skein_ctx *ctx, const u8 *msg,
147 size_t msg_byte_cnt)
148{
149 int ret = SKEIN_FAIL;
150
151 skein_assert_ret(ctx, SKEIN_FAIL);
152
153 switch (ctx->skein_size) {
154 case SKEIN_256:
155 ret = skein_256_update(&ctx->m.s256, (const u8 *)msg,
156 msg_byte_cnt);
157 break;
158 case SKEIN_512:
159 ret = skein_512_update(&ctx->m.s512, (const u8 *)msg,
160 msg_byte_cnt);
161 break;
162 case SKEIN_1024:
163 ret = skein_1024_update(&ctx->m.s1024, (const u8 *)msg,
164 msg_byte_cnt);
165 break;
166 }
167 return ret;
168}
169
170int skein_update_bits(struct skein_ctx *ctx, const u8 *msg,
171 size_t msg_bit_cnt)
172{
173
174
175
176
177
178 size_t length;
179 u8 mask;
180 u8 *up;
181
182
183
184
185
186 skein_assert_ret((ctx->m.h.T[1] & SKEIN_T1_FLAG_BIT_PAD) == 0 ||
187 msg_bit_cnt == 0, SKEIN_FAIL);
188
189
190 if ((msg_bit_cnt & 0x7) == 0)
191 return skein_update(ctx, msg, msg_bit_cnt >> 3);
192
193 skein_update(ctx, msg, (msg_bit_cnt >> 3) + 1);
194
195
196
197
198
199
200
201 up = (u8 *)ctx->m.s256.x + ctx->skein_size / 8;
202
203
204 skein_set_bit_pad_flag(ctx->m.h);
205
206
207
208 length = ctx->m.h.b_cnt;
209
210 skein_assert(length != 0);
211
212 mask = (u8)(1u << (7 - (msg_bit_cnt & 7)));
213
214 up[length - 1] = (u8)((up[length - 1] & (0 - mask)) | mask);
215
216 return SKEIN_SUCCESS;
217}
218
219int skein_final(struct skein_ctx *ctx, u8 *hash)
220{
221 int ret = SKEIN_FAIL;
222
223 skein_assert_ret(ctx, SKEIN_FAIL);
224
225 switch (ctx->skein_size) {
226 case SKEIN_256:
227 ret = skein_256_final(&ctx->m.s256, (u8 *)hash);
228 break;
229 case SKEIN_512:
230 ret = skein_512_final(&ctx->m.s512, (u8 *)hash);
231 break;
232 case SKEIN_1024:
233 ret = skein_1024_final(&ctx->m.s1024, (u8 *)hash);
234 break;
235 }
236 return ret;
237}
238