1
2
3
4
5
6
7
8
9
10
11#include <linux/string.h>
12#include <linux/export.h>
13#include "skein_base.h"
14#include "skein_iv.h"
15#include "skein_block.h"
16
17
18
19
20
21
22
23int skein_256_init(struct skein_256_ctx *ctx, size_t hash_bit_len)
24{
25 union {
26 u8 b[SKEIN_256_STATE_BYTES];
27 u64 w[SKEIN_256_STATE_WORDS];
28 } cfg;
29
30 skein_assert_ret(hash_bit_len > 0, SKEIN_BAD_HASHLEN);
31 ctx->h.hash_bit_len = hash_bit_len;
32
33 switch (hash_bit_len) {
34 case 256:
35 memcpy(ctx->x, SKEIN_256_IV_256, sizeof(ctx->x));
36 break;
37 case 224:
38 memcpy(ctx->x, SKEIN_256_IV_224, sizeof(ctx->x));
39 break;
40 case 160:
41 memcpy(ctx->x, SKEIN_256_IV_160, sizeof(ctx->x));
42 break;
43 case 128:
44 memcpy(ctx->x, SKEIN_256_IV_128, sizeof(ctx->x));
45 break;
46 default:
47
48
49
50
51
52
53 skein_start_new_type(ctx, CFG_FINAL);
54
55
56 cfg.w[0] = skein_swap64(SKEIN_SCHEMA_VER);
57
58 cfg.w[1] = skein_swap64(hash_bit_len);
59 cfg.w[2] = skein_swap64(SKEIN_CFG_TREE_INFO_SEQUENTIAL);
60
61 memset(&cfg.w[3], 0, sizeof(cfg) - 3 * sizeof(cfg.w[0]));
62
63
64
65 memset(ctx->x, 0, sizeof(ctx->x));
66 skein_256_process_block(ctx, cfg.b, 1, SKEIN_CFG_STR_LEN);
67 break;
68 }
69
70
71 skein_start_new_type(ctx, MSG);
72
73 return SKEIN_SUCCESS;
74}
75
76
77
78
79
80
81
82int skein_256_init_ext(struct skein_256_ctx *ctx, size_t hash_bit_len,
83 u64 tree_info, const u8 *key, size_t key_bytes)
84{
85 union {
86 u8 b[SKEIN_256_STATE_BYTES];
87 u64 w[SKEIN_256_STATE_WORDS];
88 } cfg;
89
90 skein_assert_ret(hash_bit_len > 0, SKEIN_BAD_HASHLEN);
91 skein_assert_ret(key_bytes == 0 || key, SKEIN_FAIL);
92
93
94 if (key_bytes == 0) {
95
96 memset(ctx->x, 0, sizeof(ctx->x));
97 } else {
98 skein_assert(sizeof(cfg.b) >= sizeof(ctx->x));
99
100
101 ctx->h.hash_bit_len = 8 * sizeof(ctx->x);
102
103 skein_start_new_type(ctx, KEY);
104
105 memset(ctx->x, 0, sizeof(ctx->x));
106
107 skein_256_update(ctx, key, key_bytes);
108
109 skein_256_final_pad(ctx, cfg.b);
110
111 memcpy(ctx->x, cfg.b, sizeof(cfg.b));
112 }
113
114
115
116
117
118 ctx->h.hash_bit_len = hash_bit_len;
119 skein_start_new_type(ctx, CFG_FINAL);
120
121
122 memset(&cfg.w, 0, sizeof(cfg.w));
123 cfg.w[0] = skein_swap64(SKEIN_SCHEMA_VER);
124
125 cfg.w[1] = skein_swap64(hash_bit_len);
126
127 cfg.w[2] = skein_swap64(tree_info);
128
129
130 skein_256_process_block(ctx, cfg.b, 1, SKEIN_CFG_STR_LEN);
131
132
133
134 skein_start_new_type(ctx, MSG);
135
136 return SKEIN_SUCCESS;
137}
138
139
140
141int skein_256_update(struct skein_256_ctx *ctx, const u8 *msg,
142 size_t msg_byte_cnt)
143{
144 size_t n;
145
146
147 skein_assert_ret(ctx->h.b_cnt <= SKEIN_256_BLOCK_BYTES, SKEIN_FAIL);
148
149
150 if (msg_byte_cnt + ctx->h.b_cnt > SKEIN_256_BLOCK_BYTES) {
151
152 if (ctx->h.b_cnt) {
153
154 n = SKEIN_256_BLOCK_BYTES - ctx->h.b_cnt;
155 if (n) {
156
157 skein_assert(n < msg_byte_cnt);
158 memcpy(&ctx->b[ctx->h.b_cnt], msg, n);
159 msg_byte_cnt -= n;
160 msg += n;
161 ctx->h.b_cnt += n;
162 }
163 skein_assert(ctx->h.b_cnt == SKEIN_256_BLOCK_BYTES);
164 skein_256_process_block(ctx, ctx->b, 1,
165 SKEIN_256_BLOCK_BYTES);
166 ctx->h.b_cnt = 0;
167 }
168
169
170
171
172 if (msg_byte_cnt > SKEIN_256_BLOCK_BYTES) {
173
174 n = (msg_byte_cnt - 1) / SKEIN_256_BLOCK_BYTES;
175 skein_256_process_block(ctx, msg, n,
176 SKEIN_256_BLOCK_BYTES);
177 msg_byte_cnt -= n * SKEIN_256_BLOCK_BYTES;
178 msg += n * SKEIN_256_BLOCK_BYTES;
179 }
180 skein_assert(ctx->h.b_cnt == 0);
181 }
182
183
184 if (msg_byte_cnt) {
185 skein_assert(msg_byte_cnt + ctx->h.b_cnt <=
186 SKEIN_256_BLOCK_BYTES);
187 memcpy(&ctx->b[ctx->h.b_cnt], msg, msg_byte_cnt);
188 ctx->h.b_cnt += msg_byte_cnt;
189 }
190
191 return SKEIN_SUCCESS;
192}
193
194
195
196int skein_256_final(struct skein_256_ctx *ctx, u8 *hash_val)
197{
198 size_t i, n, byte_cnt;
199 u64 x[SKEIN_256_STATE_WORDS];
200
201 skein_assert_ret(ctx->h.b_cnt <= SKEIN_256_BLOCK_BYTES, SKEIN_FAIL);
202
203
204 ctx->h.tweak[1] |= SKEIN_T1_FLAG_FINAL;
205
206 if (ctx->h.b_cnt < SKEIN_256_BLOCK_BYTES)
207 memset(&ctx->b[ctx->h.b_cnt], 0,
208 SKEIN_256_BLOCK_BYTES - ctx->h.b_cnt);
209
210
211 skein_256_process_block(ctx, ctx->b, 1, ctx->h.b_cnt);
212
213
214
215 byte_cnt = (ctx->h.hash_bit_len + 7) >> 3;
216
217
218
219 memset(ctx->b, 0, sizeof(ctx->b));
220
221 memcpy(x, ctx->x, sizeof(x));
222 for (i = 0; i * SKEIN_256_BLOCK_BYTES < byte_cnt; i++) {
223
224 ((u64 *)ctx->b)[0] = skein_swap64((u64)i);
225 skein_start_new_type(ctx, OUT_FINAL);
226
227 skein_256_process_block(ctx, ctx->b, 1, sizeof(u64));
228
229 n = byte_cnt - i * SKEIN_256_BLOCK_BYTES;
230 if (n >= SKEIN_256_BLOCK_BYTES)
231 n = SKEIN_256_BLOCK_BYTES;
232
233 skein_put64_lsb_first(hash_val + (i * SKEIN_256_BLOCK_BYTES),
234 ctx->x, n);
235
236 memcpy(ctx->x, x, sizeof(x));
237 }
238 return SKEIN_SUCCESS;
239}
240
241
242
243
244
245
246
247int skein_512_init(struct skein_512_ctx *ctx, size_t hash_bit_len)
248{
249 union {
250 u8 b[SKEIN_512_STATE_BYTES];
251 u64 w[SKEIN_512_STATE_WORDS];
252 } cfg;
253
254 skein_assert_ret(hash_bit_len > 0, SKEIN_BAD_HASHLEN);
255 ctx->h.hash_bit_len = hash_bit_len;
256
257 switch (hash_bit_len) {
258 case 512:
259 memcpy(ctx->x, SKEIN_512_IV_512, sizeof(ctx->x));
260 break;
261 case 384:
262 memcpy(ctx->x, SKEIN_512_IV_384, sizeof(ctx->x));
263 break;
264 case 256:
265 memcpy(ctx->x, SKEIN_512_IV_256, sizeof(ctx->x));
266 break;
267 case 224:
268 memcpy(ctx->x, SKEIN_512_IV_224, sizeof(ctx->x));
269 break;
270 default:
271
272
273
274
275
276
277 skein_start_new_type(ctx, CFG_FINAL);
278
279
280 cfg.w[0] = skein_swap64(SKEIN_SCHEMA_VER);
281
282 cfg.w[1] = skein_swap64(hash_bit_len);
283 cfg.w[2] = skein_swap64(SKEIN_CFG_TREE_INFO_SEQUENTIAL);
284
285 memset(&cfg.w[3], 0, sizeof(cfg) - 3 * sizeof(cfg.w[0]));
286
287
288
289 memset(ctx->x, 0, sizeof(ctx->x));
290 skein_512_process_block(ctx, cfg.b, 1, SKEIN_CFG_STR_LEN);
291 break;
292 }
293
294
295
296
297
298
299 skein_start_new_type(ctx, MSG);
300
301 return SKEIN_SUCCESS;
302}
303
304
305
306
307
308
309
310int skein_512_init_ext(struct skein_512_ctx *ctx, size_t hash_bit_len,
311 u64 tree_info, const u8 *key, size_t key_bytes)
312{
313 union {
314 u8 b[SKEIN_512_STATE_BYTES];
315 u64 w[SKEIN_512_STATE_WORDS];
316 } cfg;
317
318 skein_assert_ret(hash_bit_len > 0, SKEIN_BAD_HASHLEN);
319 skein_assert_ret(key_bytes == 0 || key, SKEIN_FAIL);
320
321
322 if (key_bytes == 0) {
323
324 memset(ctx->x, 0, sizeof(ctx->x));
325 } else {
326 skein_assert(sizeof(cfg.b) >= sizeof(ctx->x));
327
328
329 ctx->h.hash_bit_len = 8 * sizeof(ctx->x);
330
331 skein_start_new_type(ctx, KEY);
332
333 memset(ctx->x, 0, sizeof(ctx->x));
334
335 skein_512_update(ctx, key, key_bytes);
336
337 skein_512_final_pad(ctx, cfg.b);
338
339 memcpy(ctx->x, cfg.b, sizeof(cfg.b));
340 }
341
342
343
344
345 ctx->h.hash_bit_len = hash_bit_len;
346 skein_start_new_type(ctx, CFG_FINAL);
347
348
349 memset(&cfg.w, 0, sizeof(cfg.w));
350 cfg.w[0] = skein_swap64(SKEIN_SCHEMA_VER);
351
352 cfg.w[1] = skein_swap64(hash_bit_len);
353
354 cfg.w[2] = skein_swap64(tree_info);
355
356
357 skein_512_process_block(ctx, cfg.b, 1, SKEIN_CFG_STR_LEN);
358
359
360
361 skein_start_new_type(ctx, MSG);
362
363 return SKEIN_SUCCESS;
364}
365
366
367
368int skein_512_update(struct skein_512_ctx *ctx, const u8 *msg,
369 size_t msg_byte_cnt)
370{
371 size_t n;
372
373
374 skein_assert_ret(ctx->h.b_cnt <= SKEIN_512_BLOCK_BYTES, SKEIN_FAIL);
375
376
377 if (msg_byte_cnt + ctx->h.b_cnt > SKEIN_512_BLOCK_BYTES) {
378
379 if (ctx->h.b_cnt) {
380
381 n = SKEIN_512_BLOCK_BYTES - ctx->h.b_cnt;
382 if (n) {
383
384 skein_assert(n < msg_byte_cnt);
385 memcpy(&ctx->b[ctx->h.b_cnt], msg, n);
386 msg_byte_cnt -= n;
387 msg += n;
388 ctx->h.b_cnt += n;
389 }
390 skein_assert(ctx->h.b_cnt == SKEIN_512_BLOCK_BYTES);
391 skein_512_process_block(ctx, ctx->b, 1,
392 SKEIN_512_BLOCK_BYTES);
393 ctx->h.b_cnt = 0;
394 }
395
396
397
398
399 if (msg_byte_cnt > SKEIN_512_BLOCK_BYTES) {
400
401 n = (msg_byte_cnt - 1) / SKEIN_512_BLOCK_BYTES;
402 skein_512_process_block(ctx, msg, n,
403 SKEIN_512_BLOCK_BYTES);
404 msg_byte_cnt -= n * SKEIN_512_BLOCK_BYTES;
405 msg += n * SKEIN_512_BLOCK_BYTES;
406 }
407 skein_assert(ctx->h.b_cnt == 0);
408 }
409
410
411 if (msg_byte_cnt) {
412 skein_assert(msg_byte_cnt + ctx->h.b_cnt <=
413 SKEIN_512_BLOCK_BYTES);
414 memcpy(&ctx->b[ctx->h.b_cnt], msg, msg_byte_cnt);
415 ctx->h.b_cnt += msg_byte_cnt;
416 }
417
418 return SKEIN_SUCCESS;
419}
420
421
422
423int skein_512_final(struct skein_512_ctx *ctx, u8 *hash_val)
424{
425 size_t i, n, byte_cnt;
426 u64 x[SKEIN_512_STATE_WORDS];
427
428 skein_assert_ret(ctx->h.b_cnt <= SKEIN_512_BLOCK_BYTES, SKEIN_FAIL);
429
430
431 ctx->h.tweak[1] |= SKEIN_T1_FLAG_FINAL;
432
433 if (ctx->h.b_cnt < SKEIN_512_BLOCK_BYTES)
434 memset(&ctx->b[ctx->h.b_cnt], 0,
435 SKEIN_512_BLOCK_BYTES - ctx->h.b_cnt);
436
437
438 skein_512_process_block(ctx, ctx->b, 1, ctx->h.b_cnt);
439
440
441
442 byte_cnt = (ctx->h.hash_bit_len + 7) >> 3;
443
444
445
446 memset(ctx->b, 0, sizeof(ctx->b));
447
448 memcpy(x, ctx->x, sizeof(x));
449 for (i = 0; i * SKEIN_512_BLOCK_BYTES < byte_cnt; i++) {
450
451 ((u64 *)ctx->b)[0] = skein_swap64((u64)i);
452 skein_start_new_type(ctx, OUT_FINAL);
453
454 skein_512_process_block(ctx, ctx->b, 1, sizeof(u64));
455
456 n = byte_cnt - i * SKEIN_512_BLOCK_BYTES;
457 if (n >= SKEIN_512_BLOCK_BYTES)
458 n = SKEIN_512_BLOCK_BYTES;
459
460 skein_put64_lsb_first(hash_val + (i * SKEIN_512_BLOCK_BYTES),
461 ctx->x, n);
462
463 memcpy(ctx->x, x, sizeof(x));
464 }
465 return SKEIN_SUCCESS;
466}
467
468
469
470
471
472
473
474int skein_1024_init(struct skein_1024_ctx *ctx, size_t hash_bit_len)
475{
476 union {
477 u8 b[SKEIN_1024_STATE_BYTES];
478 u64 w[SKEIN_1024_STATE_WORDS];
479 } cfg;
480
481 skein_assert_ret(hash_bit_len > 0, SKEIN_BAD_HASHLEN);
482 ctx->h.hash_bit_len = hash_bit_len;
483
484 switch (hash_bit_len) {
485 case 512:
486 memcpy(ctx->x, SKEIN_1024_IV_512, sizeof(ctx->x));
487 break;
488 case 384:
489 memcpy(ctx->x, SKEIN_1024_IV_384, sizeof(ctx->x));
490 break;
491 case 1024:
492 memcpy(ctx->x, SKEIN_1024_IV_1024, sizeof(ctx->x));
493 break;
494 default:
495
496
497
498
499
500
501 skein_start_new_type(ctx, CFG_FINAL);
502
503
504 cfg.w[0] = skein_swap64(SKEIN_SCHEMA_VER);
505
506 cfg.w[1] = skein_swap64(hash_bit_len);
507 cfg.w[2] = skein_swap64(SKEIN_CFG_TREE_INFO_SEQUENTIAL);
508
509 memset(&cfg.w[3], 0, sizeof(cfg) - 3 * sizeof(cfg.w[0]));
510
511
512
513 memset(ctx->x, 0, sizeof(ctx->x));
514 skein_1024_process_block(ctx, cfg.b, 1, SKEIN_CFG_STR_LEN);
515 break;
516 }
517
518
519
520 skein_start_new_type(ctx, MSG);
521
522 return SKEIN_SUCCESS;
523}
524
525
526
527
528
529
530
531int skein_1024_init_ext(struct skein_1024_ctx *ctx, size_t hash_bit_len,
532 u64 tree_info, const u8 *key, size_t key_bytes)
533{
534 union {
535 u8 b[SKEIN_1024_STATE_BYTES];
536 u64 w[SKEIN_1024_STATE_WORDS];
537 } cfg;
538
539 skein_assert_ret(hash_bit_len > 0, SKEIN_BAD_HASHLEN);
540 skein_assert_ret(key_bytes == 0 || key, SKEIN_FAIL);
541
542
543 if (key_bytes == 0) {
544
545 memset(ctx->x, 0, sizeof(ctx->x));
546 } else {
547 skein_assert(sizeof(cfg.b) >= sizeof(ctx->x));
548
549
550 ctx->h.hash_bit_len = 8 * sizeof(ctx->x);
551
552 skein_start_new_type(ctx, KEY);
553
554 memset(ctx->x, 0, sizeof(ctx->x));
555
556 skein_1024_update(ctx, key, key_bytes);
557
558 skein_1024_final_pad(ctx, cfg.b);
559
560 memcpy(ctx->x, cfg.b, sizeof(cfg.b));
561 }
562
563
564
565
566
567 ctx->h.hash_bit_len = hash_bit_len;
568 skein_start_new_type(ctx, CFG_FINAL);
569
570
571 memset(&cfg.w, 0, sizeof(cfg.w));
572 cfg.w[0] = skein_swap64(SKEIN_SCHEMA_VER);
573
574 cfg.w[1] = skein_swap64(hash_bit_len);
575
576 cfg.w[2] = skein_swap64(tree_info);
577
578
579 skein_1024_process_block(ctx, cfg.b, 1, SKEIN_CFG_STR_LEN);
580
581
582
583 skein_start_new_type(ctx, MSG);
584
585 return SKEIN_SUCCESS;
586}
587
588
589
590int skein_1024_update(struct skein_1024_ctx *ctx, const u8 *msg,
591 size_t msg_byte_cnt)
592{
593 size_t n;
594
595
596 skein_assert_ret(ctx->h.b_cnt <= SKEIN_1024_BLOCK_BYTES, SKEIN_FAIL);
597
598
599 if (msg_byte_cnt + ctx->h.b_cnt > SKEIN_1024_BLOCK_BYTES) {
600
601 if (ctx->h.b_cnt) {
602
603 n = SKEIN_1024_BLOCK_BYTES - ctx->h.b_cnt;
604 if (n) {
605
606 skein_assert(n < msg_byte_cnt);
607 memcpy(&ctx->b[ctx->h.b_cnt], msg, n);
608 msg_byte_cnt -= n;
609 msg += n;
610 ctx->h.b_cnt += n;
611 }
612 skein_assert(ctx->h.b_cnt == SKEIN_1024_BLOCK_BYTES);
613 skein_1024_process_block(ctx, ctx->b, 1,
614 SKEIN_1024_BLOCK_BYTES);
615 ctx->h.b_cnt = 0;
616 }
617
618
619
620
621 if (msg_byte_cnt > SKEIN_1024_BLOCK_BYTES) {
622
623 n = (msg_byte_cnt - 1) / SKEIN_1024_BLOCK_BYTES;
624 skein_1024_process_block(ctx, msg, n,
625 SKEIN_1024_BLOCK_BYTES);
626 msg_byte_cnt -= n * SKEIN_1024_BLOCK_BYTES;
627 msg += n * SKEIN_1024_BLOCK_BYTES;
628 }
629 skein_assert(ctx->h.b_cnt == 0);
630 }
631
632
633 if (msg_byte_cnt) {
634 skein_assert(msg_byte_cnt + ctx->h.b_cnt <=
635 SKEIN_1024_BLOCK_BYTES);
636 memcpy(&ctx->b[ctx->h.b_cnt], msg, msg_byte_cnt);
637 ctx->h.b_cnt += msg_byte_cnt;
638 }
639
640 return SKEIN_SUCCESS;
641}
642
643
644
645int skein_1024_final(struct skein_1024_ctx *ctx, u8 *hash_val)
646{
647 size_t i, n, byte_cnt;
648 u64 x[SKEIN_1024_STATE_WORDS];
649
650 skein_assert_ret(ctx->h.b_cnt <= SKEIN_1024_BLOCK_BYTES, SKEIN_FAIL);
651
652
653 ctx->h.tweak[1] |= SKEIN_T1_FLAG_FINAL;
654
655 if (ctx->h.b_cnt < SKEIN_1024_BLOCK_BYTES)
656 memset(&ctx->b[ctx->h.b_cnt], 0,
657 SKEIN_1024_BLOCK_BYTES - ctx->h.b_cnt);
658
659
660 skein_1024_process_block(ctx, ctx->b, 1, ctx->h.b_cnt);
661
662
663
664 byte_cnt = (ctx->h.hash_bit_len + 7) >> 3;
665
666
667
668 memset(ctx->b, 0, sizeof(ctx->b));
669
670 memcpy(x, ctx->x, sizeof(x));
671 for (i = 0; i * SKEIN_1024_BLOCK_BYTES < byte_cnt; i++) {
672
673 ((u64 *)ctx->b)[0] = skein_swap64((u64)i);
674 skein_start_new_type(ctx, OUT_FINAL);
675
676 skein_1024_process_block(ctx, ctx->b, 1, sizeof(u64));
677
678 n = byte_cnt - i * SKEIN_1024_BLOCK_BYTES;
679 if (n >= SKEIN_1024_BLOCK_BYTES)
680 n = SKEIN_1024_BLOCK_BYTES;
681
682 skein_put64_lsb_first(hash_val + (i * SKEIN_1024_BLOCK_BYTES),
683 ctx->x, n);
684
685 memcpy(ctx->x, x, sizeof(x));
686 }
687 return SKEIN_SUCCESS;
688}
689
690
691
692
693
694
695int skein_256_final_pad(struct skein_256_ctx *ctx, u8 *hash_val)
696{
697
698 skein_assert_ret(ctx->h.b_cnt <= SKEIN_256_BLOCK_BYTES, SKEIN_FAIL);
699
700
701 ctx->h.tweak[1] |= SKEIN_T1_FLAG_FINAL;
702
703 if (ctx->h.b_cnt < SKEIN_256_BLOCK_BYTES)
704 memset(&ctx->b[ctx->h.b_cnt], 0,
705 SKEIN_256_BLOCK_BYTES - ctx->h.b_cnt);
706
707 skein_256_process_block(ctx, ctx->b, 1, ctx->h.b_cnt);
708
709
710 skein_put64_lsb_first(hash_val, ctx->x, SKEIN_256_BLOCK_BYTES);
711
712 return SKEIN_SUCCESS;
713}
714
715
716
717int skein_512_final_pad(struct skein_512_ctx *ctx, u8 *hash_val)
718{
719
720 skein_assert_ret(ctx->h.b_cnt <= SKEIN_512_BLOCK_BYTES, SKEIN_FAIL);
721
722
723 ctx->h.tweak[1] |= SKEIN_T1_FLAG_FINAL;
724
725 if (ctx->h.b_cnt < SKEIN_512_BLOCK_BYTES)
726 memset(&ctx->b[ctx->h.b_cnt], 0,
727 SKEIN_512_BLOCK_BYTES - ctx->h.b_cnt);
728
729 skein_512_process_block(ctx, ctx->b, 1, ctx->h.b_cnt);
730
731
732 skein_put64_lsb_first(hash_val, ctx->x, SKEIN_512_BLOCK_BYTES);
733
734 return SKEIN_SUCCESS;
735}
736
737
738
739int skein_1024_final_pad(struct skein_1024_ctx *ctx, u8 *hash_val)
740{
741
742 skein_assert_ret(ctx->h.b_cnt <= SKEIN_1024_BLOCK_BYTES, SKEIN_FAIL);
743
744
745 ctx->h.tweak[1] |= SKEIN_T1_FLAG_FINAL;
746
747 if (ctx->h.b_cnt < SKEIN_1024_BLOCK_BYTES)
748 memset(&ctx->b[ctx->h.b_cnt], 0,
749 SKEIN_1024_BLOCK_BYTES - ctx->h.b_cnt);
750
751 skein_1024_process_block(ctx, ctx->b, 1, ctx->h.b_cnt);
752
753
754 skein_put64_lsb_first(hash_val, ctx->x, SKEIN_1024_BLOCK_BYTES);
755
756 return SKEIN_SUCCESS;
757}
758
759#if SKEIN_TREE_HASH
760
761
762int skein_256_output(struct skein_256_ctx *ctx, u8 *hash_val)
763{
764 size_t i, n, byte_cnt;
765 u64 x[SKEIN_256_STATE_WORDS];
766
767 skein_assert_ret(ctx->h.b_cnt <= SKEIN_256_BLOCK_BYTES, SKEIN_FAIL);
768
769
770
771 byte_cnt = (ctx->h.hash_bit_len + 7) >> 3;
772
773
774
775 memset(ctx->b, 0, sizeof(ctx->b));
776
777 memcpy(x, ctx->x, sizeof(x));
778 for (i = 0; i * SKEIN_256_BLOCK_BYTES < byte_cnt; i++) {
779
780 ((u64 *)ctx->b)[0] = skein_swap64((u64)i);
781 skein_start_new_type(ctx, OUT_FINAL);
782
783 skein_256_process_block(ctx, ctx->b, 1, sizeof(u64));
784
785 n = byte_cnt - i * SKEIN_256_BLOCK_BYTES;
786 if (n >= SKEIN_256_BLOCK_BYTES)
787 n = SKEIN_256_BLOCK_BYTES;
788
789 skein_put64_lsb_first(hash_val + (i * SKEIN_256_BLOCK_BYTES),
790 ctx->x, n);
791
792 memcpy(ctx->x, x, sizeof(x));
793 }
794 return SKEIN_SUCCESS;
795}
796
797
798
799int skein_512_output(struct skein_512_ctx *ctx, u8 *hash_val)
800{
801 size_t i, n, byte_cnt;
802 u64 x[SKEIN_512_STATE_WORDS];
803
804 skein_assert_ret(ctx->h.b_cnt <= SKEIN_512_BLOCK_BYTES, SKEIN_FAIL);
805
806
807
808 byte_cnt = (ctx->h.hash_bit_len + 7) >> 3;
809
810
811
812 memset(ctx->b, 0, sizeof(ctx->b));
813
814 memcpy(x, ctx->x, sizeof(x));
815 for (i = 0; i * SKEIN_512_BLOCK_BYTES < byte_cnt; i++) {
816
817 ((u64 *)ctx->b)[0] = skein_swap64((u64)i);
818 skein_start_new_type(ctx, OUT_FINAL);
819
820 skein_512_process_block(ctx, ctx->b, 1, sizeof(u64));
821
822 n = byte_cnt - i * SKEIN_512_BLOCK_BYTES;
823 if (n >= SKEIN_512_BLOCK_BYTES)
824 n = SKEIN_512_BLOCK_BYTES;
825
826 skein_put64_lsb_first(hash_val + (i * SKEIN_512_BLOCK_BYTES),
827 ctx->x, n);
828
829 memcpy(ctx->x, x, sizeof(x));
830 }
831 return SKEIN_SUCCESS;
832}
833
834
835
836int skein_1024_output(struct skein_1024_ctx *ctx, u8 *hash_val)
837{
838 size_t i, n, byte_cnt;
839 u64 x[SKEIN_1024_STATE_WORDS];
840
841 skein_assert_ret(ctx->h.b_cnt <= SKEIN_1024_BLOCK_BYTES, SKEIN_FAIL);
842
843
844
845 byte_cnt = (ctx->h.hash_bit_len + 7) >> 3;
846
847
848
849 memset(ctx->b, 0, sizeof(ctx->b));
850
851 memcpy(x, ctx->x, sizeof(x));
852 for (i = 0; i * SKEIN_1024_BLOCK_BYTES < byte_cnt; i++) {
853
854 ((u64 *)ctx->b)[0] = skein_swap64((u64)i);
855 skein_start_new_type(ctx, OUT_FINAL);
856
857 skein_1024_process_block(ctx, ctx->b, 1, sizeof(u64));
858
859 n = byte_cnt - i * SKEIN_1024_BLOCK_BYTES;
860 if (n >= SKEIN_1024_BLOCK_BYTES)
861 n = SKEIN_1024_BLOCK_BYTES;
862
863 skein_put64_lsb_first(hash_val + (i * SKEIN_1024_BLOCK_BYTES),
864 ctx->x, n);
865
866 memcpy(ctx->x, x, sizeof(x));
867 }
868 return SKEIN_SUCCESS;
869}
870#endif
871