Jason Cooper | 449bb81 | 2014-03-24 01:48:58 +0000 | [diff] [blame] | 1 | |
| 2 | |
Jason Cooper | c2c7426 | 2014-03-24 02:32:49 +0000 | [diff] [blame] | 3 | #include <linux/string.h> |
Jason Cooper | 449bb81 | 2014-03-24 01:48:58 +0000 | [diff] [blame] | 4 | #include <threefishApi.h> |
Jason Cooper | 449bb81 | 2014-03-24 01:48:58 +0000 | [diff] [blame] | 5 | |
Jason Cooper | cd4811a | 2014-03-24 01:49:06 +0000 | [diff] [blame] | 6 | void threefishSetKey(struct threefish_key *keyCtx, enum threefish_size stateSize, |
Jason Cooper | 39bd42b | 2014-03-24 01:49:09 +0000 | [diff] [blame^] | 7 | u64 *keyData, u64 *tweak) |
Jason Cooper | 449bb81 | 2014-03-24 01:48:58 +0000 | [diff] [blame] | 8 | { |
Jason Cooper | 39bd42b | 2014-03-24 01:49:09 +0000 | [diff] [blame^] | 9 | int keyWords = stateSize / 64; |
| 10 | int i; |
| 11 | u64 parity = KeyScheduleConst; |
Jason Cooper | 449bb81 | 2014-03-24 01:48:58 +0000 | [diff] [blame] | 12 | |
Jason Cooper | 39bd42b | 2014-03-24 01:49:09 +0000 | [diff] [blame^] | 13 | keyCtx->tweak[0] = tweak[0]; |
| 14 | keyCtx->tweak[1] = tweak[1]; |
| 15 | keyCtx->tweak[2] = tweak[0] ^ tweak[1]; |
Jason Cooper | 449bb81 | 2014-03-24 01:48:58 +0000 | [diff] [blame] | 16 | |
Jason Cooper | 39bd42b | 2014-03-24 01:49:09 +0000 | [diff] [blame^] | 17 | for (i = 0; i < keyWords; i++) { |
| 18 | keyCtx->key[i] = keyData[i]; |
| 19 | parity ^= keyData[i]; |
| 20 | } |
| 21 | keyCtx->key[i] = parity; |
| 22 | keyCtx->stateSize = stateSize; |
Jason Cooper | 449bb81 | 2014-03-24 01:48:58 +0000 | [diff] [blame] | 23 | } |
| 24 | |
Jason Cooper | cd4811a | 2014-03-24 01:49:06 +0000 | [diff] [blame] | 25 | void threefishEncryptBlockBytes(struct threefish_key *keyCtx, u8 *in, |
Jason Cooper | 39bd42b | 2014-03-24 01:49:09 +0000 | [diff] [blame^] | 26 | u8 *out) |
Jason Cooper | 449bb81 | 2014-03-24 01:48:58 +0000 | [diff] [blame] | 27 | { |
Jason Cooper | 39bd42b | 2014-03-24 01:49:09 +0000 | [diff] [blame^] | 28 | u64 plain[SKEIN_MAX_STATE_WORDS]; /* max number of words*/ |
| 29 | u64 cipher[SKEIN_MAX_STATE_WORDS]; |
| 30 | |
| 31 | Skein_Get64_LSB_First(plain, in, keyCtx->stateSize / 64); /* bytes to words */ |
| 32 | threefishEncryptBlockWords(keyCtx, plain, cipher); |
| 33 | Skein_Put64_LSB_First(out, cipher, keyCtx->stateSize / 8); /* words to bytes */ |
Jason Cooper | 449bb81 | 2014-03-24 01:48:58 +0000 | [diff] [blame] | 34 | } |
| 35 | |
Jason Cooper | cd4811a | 2014-03-24 01:49:06 +0000 | [diff] [blame] | 36 | void threefishEncryptBlockWords(struct threefish_key *keyCtx, u64 *in, |
Jason Cooper | 39bd42b | 2014-03-24 01:49:09 +0000 | [diff] [blame^] | 37 | u64 *out) |
Jason Cooper | 449bb81 | 2014-03-24 01:48:58 +0000 | [diff] [blame] | 38 | { |
Jason Cooper | 39bd42b | 2014-03-24 01:49:09 +0000 | [diff] [blame^] | 39 | switch (keyCtx->stateSize) { |
| 40 | case Threefish256: |
| 41 | threefishEncrypt256(keyCtx, in, out); |
| 42 | break; |
| 43 | case Threefish512: |
| 44 | threefishEncrypt512(keyCtx, in, out); |
| 45 | break; |
| 46 | case Threefish1024: |
| 47 | threefishEncrypt1024(keyCtx, in, out); |
| 48 | break; |
| 49 | } |
Jason Cooper | 449bb81 | 2014-03-24 01:48:58 +0000 | [diff] [blame] | 50 | } |
| 51 | |
Jason Cooper | cd4811a | 2014-03-24 01:49:06 +0000 | [diff] [blame] | 52 | void threefishDecryptBlockBytes(struct threefish_key *keyCtx, u8 *in, |
Jason Cooper | 39bd42b | 2014-03-24 01:49:09 +0000 | [diff] [blame^] | 53 | u8 *out) |
Jason Cooper | 449bb81 | 2014-03-24 01:48:58 +0000 | [diff] [blame] | 54 | { |
Jason Cooper | 39bd42b | 2014-03-24 01:49:09 +0000 | [diff] [blame^] | 55 | u64 plain[SKEIN_MAX_STATE_WORDS]; /* max number of words*/ |
| 56 | u64 cipher[SKEIN_MAX_STATE_WORDS]; |
| 57 | |
| 58 | Skein_Get64_LSB_First(cipher, in, keyCtx->stateSize / 64); /* bytes to words */ |
| 59 | threefishDecryptBlockWords(keyCtx, cipher, plain); |
| 60 | Skein_Put64_LSB_First(out, plain, keyCtx->stateSize / 8); /* words to bytes */ |
Jason Cooper | 449bb81 | 2014-03-24 01:48:58 +0000 | [diff] [blame] | 61 | } |
| 62 | |
Jason Cooper | cd4811a | 2014-03-24 01:49:06 +0000 | [diff] [blame] | 63 | void threefishDecryptBlockWords(struct threefish_key *keyCtx, u64 *in, |
Jason Cooper | 39bd42b | 2014-03-24 01:49:09 +0000 | [diff] [blame^] | 64 | u64 *out) |
Jason Cooper | 449bb81 | 2014-03-24 01:48:58 +0000 | [diff] [blame] | 65 | { |
Jason Cooper | 39bd42b | 2014-03-24 01:49:09 +0000 | [diff] [blame^] | 66 | switch (keyCtx->stateSize) { |
| 67 | case Threefish256: |
| 68 | threefishDecrypt256(keyCtx, in, out); |
| 69 | break; |
| 70 | case Threefish512: |
| 71 | threefishDecrypt512(keyCtx, in, out); |
| 72 | break; |
| 73 | case Threefish1024: |
| 74 | threefishDecrypt1024(keyCtx, in, out); |
| 75 | break; |
| 76 | } |
Jason Cooper | 449bb81 | 2014-03-24 01:48:58 +0000 | [diff] [blame] | 77 | } |
| 78 | |