Commit | Line | Data |
---|---|---|
b2441318 | 1 | // SPDX-License-Identifier: GPL-2.0 |
c2c7426b | 2 | #include <linux/string.h> |
85dfd522 | 3 | #include "threefish_api.h" |
449bb812 | 4 | |
95f1840a AS |
5 | void threefish_set_key(struct threefish_key *key_ctx, |
6 | enum threefish_size state_size, | |
7 | u64 *key_data, u64 *tweak) | |
449bb812 | 8 | { |
95f1840a | 9 | int key_words = state_size / 64; |
39bd42b0 | 10 | int i; |
0264b7b7 | 11 | u64 parity = KEY_SCHEDULE_CONST; |
449bb812 | 12 | |
95f1840a AS |
13 | key_ctx->tweak[0] = tweak[0]; |
14 | key_ctx->tweak[1] = tweak[1]; | |
15 | key_ctx->tweak[2] = tweak[0] ^ tweak[1]; | |
449bb812 | 16 | |
95f1840a AS |
17 | for (i = 0; i < key_words; i++) { |
18 | key_ctx->key[i] = key_data[i]; | |
19 | parity ^= key_data[i]; | |
39bd42b0 | 20 | } |
95f1840a AS |
21 | key_ctx->key[i] = parity; |
22 | key_ctx->state_size = state_size; | |
449bb812 JC |
23 | } |
24 | ||
95f1840a | 25 | void threefish_encrypt_block_bytes(struct threefish_key *key_ctx, u8 *in, |
68ace624 | 26 | u8 *out) |
449bb812 | 27 | { |
39bd42b0 JC |
28 | u64 plain[SKEIN_MAX_STATE_WORDS]; /* max number of words*/ |
29 | u64 cipher[SKEIN_MAX_STATE_WORDS]; | |
30 | ||
0264b7b7 | 31 | skein_get64_lsb_first(plain, in, key_ctx->state_size / 64); |
95f1840a | 32 | threefish_encrypt_block_words(key_ctx, plain, cipher); |
0264b7b7 | 33 | skein_put64_lsb_first(out, cipher, key_ctx->state_size / 8); |
449bb812 JC |
34 | } |
35 | ||
95f1840a | 36 | void threefish_encrypt_block_words(struct threefish_key *key_ctx, u64 *in, |
68ace624 | 37 | u64 *out) |
449bb812 | 38 | { |
95f1840a | 39 | switch (key_ctx->state_size) { |
9435d3ac | 40 | case THREEFISH_256: |
95f1840a | 41 | threefish_encrypt_256(key_ctx, in, out); |
39bd42b0 | 42 | break; |
9435d3ac | 43 | case THREEFISH_512: |
95f1840a | 44 | threefish_encrypt_512(key_ctx, in, out); |
39bd42b0 | 45 | break; |
9435d3ac | 46 | case THREEFISH_1024: |
95f1840a | 47 | threefish_encrypt_1024(key_ctx, in, out); |
39bd42b0 JC |
48 | break; |
49 | } | |
449bb812 JC |
50 | } |
51 | ||
95f1840a | 52 | void threefish_decrypt_block_bytes(struct threefish_key *key_ctx, u8 *in, |
68ace624 | 53 | u8 *out) |
449bb812 | 54 | { |
39bd42b0 JC |
55 | u64 plain[SKEIN_MAX_STATE_WORDS]; /* max number of words*/ |
56 | u64 cipher[SKEIN_MAX_STATE_WORDS]; | |
57 | ||
0264b7b7 | 58 | skein_get64_lsb_first(cipher, in, key_ctx->state_size / 64); |
95f1840a | 59 | threefish_decrypt_block_words(key_ctx, cipher, plain); |
0264b7b7 | 60 | skein_put64_lsb_first(out, plain, key_ctx->state_size / 8); |
449bb812 JC |
61 | } |
62 | ||
95f1840a | 63 | void threefish_decrypt_block_words(struct threefish_key *key_ctx, u64 *in, |
68ace624 | 64 | u64 *out) |
449bb812 | 65 | { |
95f1840a | 66 | switch (key_ctx->state_size) { |
9435d3ac | 67 | case THREEFISH_256: |
95f1840a | 68 | threefish_decrypt_256(key_ctx, in, out); |
39bd42b0 | 69 | break; |
9435d3ac | 70 | case THREEFISH_512: |
95f1840a | 71 | threefish_decrypt_512(key_ctx, in, out); |
39bd42b0 | 72 | break; |
9435d3ac | 73 | case THREEFISH_1024: |
95f1840a | 74 | threefish_decrypt_1024(key_ctx, in, out); |
39bd42b0 JC |
75 | break; |
76 | } | |
449bb812 JC |
77 | } |
78 |