blob: 67ba9a6e4b12fb3b4d2f5013dc9e0db5d5aed160 [file] [log] [blame]
Jason Cooper449bb812014-03-24 01:48:58 +00001
2
Jason Cooperc2c74262014-03-24 02:32:49 +00003#include <linux/string.h>
Jason Cooper449bb812014-03-24 01:48:58 +00004#include <threefishApi.h>
Jason Cooper449bb812014-03-24 01:48:58 +00005
Anton Saraev95f1840a2014-05-19 12:09:55 +04006void threefish_set_key(struct threefish_key *key_ctx,
7 enum threefish_size state_size,
8 u64 *key_data, u64 *tweak)
Jason Cooper449bb812014-03-24 01:48:58 +00009{
Anton Saraev95f1840a2014-05-19 12:09:55 +040010 int key_words = state_size / 64;
Jason Cooper39bd42b2014-03-24 01:49:09 +000011 int i;
12 u64 parity = KeyScheduleConst;
Jason Cooper449bb812014-03-24 01:48:58 +000013
Anton Saraev95f1840a2014-05-19 12:09:55 +040014 key_ctx->tweak[0] = tweak[0];
15 key_ctx->tweak[1] = tweak[1];
16 key_ctx->tweak[2] = tweak[0] ^ tweak[1];
Jason Cooper449bb812014-03-24 01:48:58 +000017
Anton Saraev95f1840a2014-05-19 12:09:55 +040018 for (i = 0; i < key_words; i++) {
19 key_ctx->key[i] = key_data[i];
20 parity ^= key_data[i];
Jason Cooper39bd42b2014-03-24 01:49:09 +000021 }
Anton Saraev95f1840a2014-05-19 12:09:55 +040022 key_ctx->key[i] = parity;
23 key_ctx->state_size = state_size;
Jason Cooper449bb812014-03-24 01:48:58 +000024}
25
Anton Saraev95f1840a2014-05-19 12:09:55 +040026void threefish_encrypt_block_bytes(struct threefish_key *key_ctx, u8 *in,
Anton Saraev68ace622014-05-19 12:09:54 +040027 u8 *out)
Jason Cooper449bb812014-03-24 01:48:58 +000028{
Jason Cooper39bd42b2014-03-24 01:49:09 +000029 u64 plain[SKEIN_MAX_STATE_WORDS]; /* max number of words*/
30 u64 cipher[SKEIN_MAX_STATE_WORDS];
31
Anton Saraev95f1840a2014-05-19 12:09:55 +040032 Skein_Get64_LSB_First(plain, in, key_ctx->state_size / 64);
33 threefish_encrypt_block_words(key_ctx, plain, cipher);
34 Skein_Put64_LSB_First(out, cipher, key_ctx->state_size / 8);
Jason Cooper449bb812014-03-24 01:48:58 +000035}
36
Anton Saraev95f1840a2014-05-19 12:09:55 +040037void threefish_encrypt_block_words(struct threefish_key *key_ctx, u64 *in,
Anton Saraev68ace622014-05-19 12:09:54 +040038 u64 *out)
Jason Cooper449bb812014-03-24 01:48:58 +000039{
Anton Saraev95f1840a2014-05-19 12:09:55 +040040 switch (key_ctx->state_size) {
Jason Cooper39bd42b2014-03-24 01:49:09 +000041 case Threefish256:
Anton Saraev95f1840a2014-05-19 12:09:55 +040042 threefish_encrypt_256(key_ctx, in, out);
Jason Cooper39bd42b2014-03-24 01:49:09 +000043 break;
44 case Threefish512:
Anton Saraev95f1840a2014-05-19 12:09:55 +040045 threefish_encrypt_512(key_ctx, in, out);
Jason Cooper39bd42b2014-03-24 01:49:09 +000046 break;
47 case Threefish1024:
Anton Saraev95f1840a2014-05-19 12:09:55 +040048 threefish_encrypt_1024(key_ctx, in, out);
Jason Cooper39bd42b2014-03-24 01:49:09 +000049 break;
50 }
Jason Cooper449bb812014-03-24 01:48:58 +000051}
52
Anton Saraev95f1840a2014-05-19 12:09:55 +040053void threefish_decrypt_block_bytes(struct threefish_key *key_ctx, u8 *in,
Anton Saraev68ace622014-05-19 12:09:54 +040054 u8 *out)
Jason Cooper449bb812014-03-24 01:48:58 +000055{
Jason Cooper39bd42b2014-03-24 01:49:09 +000056 u64 plain[SKEIN_MAX_STATE_WORDS]; /* max number of words*/
57 u64 cipher[SKEIN_MAX_STATE_WORDS];
58
Anton Saraev95f1840a2014-05-19 12:09:55 +040059 Skein_Get64_LSB_First(cipher, in, key_ctx->state_size / 64);
60 threefish_decrypt_block_words(key_ctx, cipher, plain);
61 Skein_Put64_LSB_First(out, plain, key_ctx->state_size / 8);
Jason Cooper449bb812014-03-24 01:48:58 +000062}
63
Anton Saraev95f1840a2014-05-19 12:09:55 +040064void threefish_decrypt_block_words(struct threefish_key *key_ctx, u64 *in,
Anton Saraev68ace622014-05-19 12:09:54 +040065 u64 *out)
Jason Cooper449bb812014-03-24 01:48:58 +000066{
Anton Saraev95f1840a2014-05-19 12:09:55 +040067 switch (key_ctx->state_size) {
Jason Cooper39bd42b2014-03-24 01:49:09 +000068 case Threefish256:
Anton Saraev95f1840a2014-05-19 12:09:55 +040069 threefish_decrypt_256(key_ctx, in, out);
Jason Cooper39bd42b2014-03-24 01:49:09 +000070 break;
71 case Threefish512:
Anton Saraev95f1840a2014-05-19 12:09:55 +040072 threefish_decrypt_512(key_ctx, in, out);
Jason Cooper39bd42b2014-03-24 01:49:09 +000073 break;
74 case Threefish1024:
Anton Saraev95f1840a2014-05-19 12:09:55 +040075 threefish_decrypt_1024(key_ctx, in, out);
Jason Cooper39bd42b2014-03-24 01:49:09 +000076 break;
77 }
Jason Cooper449bb812014-03-24 01:48:58 +000078}
79