blob: 2b649abb78c795628cda1f1b48b8fd9d9e5cf6b6 [file] [log] [blame]
Jason Cooperc2c74262014-03-24 02:32:49 +00001#include <linux/string.h>
Jake Edge85dfd522014-05-19 17:48:24 -06002#include "threefish_api.h"
Jason Cooper449bb812014-03-24 01:48:58 +00003
Anton Saraev95f1840a2014-05-19 12:09:55 +04004void threefish_set_key(struct threefish_key *key_ctx,
5 enum threefish_size state_size,
6 u64 *key_data, u64 *tweak)
Jason Cooper449bb812014-03-24 01:48:58 +00007{
Anton Saraev95f1840a2014-05-19 12:09:55 +04008 int key_words = state_size / 64;
Jason Cooper39bd42b2014-03-24 01:49:09 +00009 int i;
Anton Saraev0264b7b2014-05-19 12:09:58 +040010 u64 parity = KEY_SCHEDULE_CONST;
Jason Cooper449bb812014-03-24 01:48:58 +000011
Anton Saraev95f1840a2014-05-19 12:09:55 +040012 key_ctx->tweak[0] = tweak[0];
13 key_ctx->tweak[1] = tweak[1];
14 key_ctx->tweak[2] = tweak[0] ^ tweak[1];
Jason Cooper449bb812014-03-24 01:48:58 +000015
Anton Saraev95f1840a2014-05-19 12:09:55 +040016 for (i = 0; i < key_words; i++) {
17 key_ctx->key[i] = key_data[i];
18 parity ^= key_data[i];
Jason Cooper39bd42b2014-03-24 01:49:09 +000019 }
Anton Saraev95f1840a2014-05-19 12:09:55 +040020 key_ctx->key[i] = parity;
21 key_ctx->state_size = state_size;
Jason Cooper449bb812014-03-24 01:48:58 +000022}
23
Anton Saraev95f1840a2014-05-19 12:09:55 +040024void threefish_encrypt_block_bytes(struct threefish_key *key_ctx, u8 *in,
Anton Saraev68ace622014-05-19 12:09:54 +040025 u8 *out)
Jason Cooper449bb812014-03-24 01:48:58 +000026{
Jason Cooper39bd42b2014-03-24 01:49:09 +000027 u64 plain[SKEIN_MAX_STATE_WORDS]; /* max number of words*/
28 u64 cipher[SKEIN_MAX_STATE_WORDS];
29
Anton Saraev0264b7b2014-05-19 12:09:58 +040030 skein_get64_lsb_first(plain, in, key_ctx->state_size / 64);
Anton Saraev95f1840a2014-05-19 12:09:55 +040031 threefish_encrypt_block_words(key_ctx, plain, cipher);
Anton Saraev0264b7b2014-05-19 12:09:58 +040032 skein_put64_lsb_first(out, cipher, key_ctx->state_size / 8);
Jason Cooper449bb812014-03-24 01:48:58 +000033}
34
Anton Saraev95f1840a2014-05-19 12:09:55 +040035void threefish_encrypt_block_words(struct threefish_key *key_ctx, u64 *in,
Anton Saraev68ace622014-05-19 12:09:54 +040036 u64 *out)
Jason Cooper449bb812014-03-24 01:48:58 +000037{
Anton Saraev95f1840a2014-05-19 12:09:55 +040038 switch (key_ctx->state_size) {
Anton Saraev9435d3a2014-05-19 12:09:57 +040039 case THREEFISH_256:
Anton Saraev95f1840a2014-05-19 12:09:55 +040040 threefish_encrypt_256(key_ctx, in, out);
Jason Cooper39bd42b2014-03-24 01:49:09 +000041 break;
Anton Saraev9435d3a2014-05-19 12:09:57 +040042 case THREEFISH_512:
Anton Saraev95f1840a2014-05-19 12:09:55 +040043 threefish_encrypt_512(key_ctx, in, out);
Jason Cooper39bd42b2014-03-24 01:49:09 +000044 break;
Anton Saraev9435d3a2014-05-19 12:09:57 +040045 case THREEFISH_1024:
Anton Saraev95f1840a2014-05-19 12:09:55 +040046 threefish_encrypt_1024(key_ctx, in, out);
Jason Cooper39bd42b2014-03-24 01:49:09 +000047 break;
48 }
Jason Cooper449bb812014-03-24 01:48:58 +000049}
50
Anton Saraev95f1840a2014-05-19 12:09:55 +040051void threefish_decrypt_block_bytes(struct threefish_key *key_ctx, u8 *in,
Anton Saraev68ace622014-05-19 12:09:54 +040052 u8 *out)
Jason Cooper449bb812014-03-24 01:48:58 +000053{
Jason Cooper39bd42b2014-03-24 01:49:09 +000054 u64 plain[SKEIN_MAX_STATE_WORDS]; /* max number of words*/
55 u64 cipher[SKEIN_MAX_STATE_WORDS];
56
Anton Saraev0264b7b2014-05-19 12:09:58 +040057 skein_get64_lsb_first(cipher, in, key_ctx->state_size / 64);
Anton Saraev95f1840a2014-05-19 12:09:55 +040058 threefish_decrypt_block_words(key_ctx, cipher, plain);
Anton Saraev0264b7b2014-05-19 12:09:58 +040059 skein_put64_lsb_first(out, plain, key_ctx->state_size / 8);
Jason Cooper449bb812014-03-24 01:48:58 +000060}
61
Anton Saraev95f1840a2014-05-19 12:09:55 +040062void threefish_decrypt_block_words(struct threefish_key *key_ctx, u64 *in,
Anton Saraev68ace622014-05-19 12:09:54 +040063 u64 *out)
Jason Cooper449bb812014-03-24 01:48:58 +000064{
Anton Saraev95f1840a2014-05-19 12:09:55 +040065 switch (key_ctx->state_size) {
Anton Saraev9435d3a2014-05-19 12:09:57 +040066 case THREEFISH_256:
Anton Saraev95f1840a2014-05-19 12:09:55 +040067 threefish_decrypt_256(key_ctx, in, out);
Jason Cooper39bd42b2014-03-24 01:49:09 +000068 break;
Anton Saraev9435d3a2014-05-19 12:09:57 +040069 case THREEFISH_512:
Anton Saraev95f1840a2014-05-19 12:09:55 +040070 threefish_decrypt_512(key_ctx, in, out);
Jason Cooper39bd42b2014-03-24 01:49:09 +000071 break;
Anton Saraev9435d3a2014-05-19 12:09:57 +040072 case THREEFISH_1024:
Anton Saraev95f1840a2014-05-19 12:09:55 +040073 threefish_decrypt_1024(key_ctx, in, out);
Jason Cooper39bd42b2014-03-24 01:49:09 +000074 break;
75 }
Jason Cooper449bb812014-03-24 01:48:58 +000076}
77