3 This file is part of the AVR-Crypto-Lib.
4 Copyright (C) 2009 Daniel Otte (daniel.otte@rub.de)
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 * \email daniel.otte@rub.de
23 * \license GPLv3 or later
26 #include "avr-asm-macros.S"
28 /******************************************************************************/
38 #define THREEFISH_KEY_CONST 0x5555.5555.5555.5555.LL / * 2**64/3 * /
40 #define K(s) (((uint64_t*)key)[(s)])
41 #define T(s) (((uint64_t*)tweak)[(s)])
43 void threefish256_init(void* key, void* tweak, threefish256_ctx_t* ctx){
44 memcpy(ctx->k, key, 4*8);
45 memcpy(ctx->t, tweak, 2*8);
47 ctx->k[4] = THREEFISH_KEY_CONST;
51 ctx->t[2] = T(0) ^ T(1);
56 * param tweak: r22:r23
59 .global threefish256_init
170 /******************************************************************************/
172 #define X(a) (((uint64_t*)data)[(a)])
173 void permute_4(void* data){
179 void add_key_4(void* data, threefish256_ctx_t* ctx, uint8_t s){ / * s: 0..19 * /
180 X(0) += ctx->k[(s+0)%5];
181 X(1) += ctx->k[(s+1)%5] + ctx->t[s%3];
182 X(2) += ctx->k[(s+2)%5] + ctx->t[(s+1)%3];
183 X(3) += ctx->k[(s+3)%5] + s;
185 void threefish256_enc(void* data, threefish256_ctx_t* ctx){
187 uint8_t r0[8] = { 5, 36, 13, 58, 26, 53, 11, 59};
188 uint8_t r1[8] = {56, 28, 46, 44, 20, 35, 42, 50};
191 add_key_4(data, ctx, s);
194 threefish_mix(data, r0[i%8]);
195 threefish_mix((uint8_t*)data + 16, r1[i%8]);
199 add_key_4(data, ctx, s);
213 * param data: r24:r25
216 .global threefish256_enc
231 ldi r30, lo8(threefish256_slut5)
232 ldi r31, hi8(threefish256_slut5)
258 /* now the remaining key */
260 ldi r30, lo8(threefish256_slut3)
261 ldi r31, hi8(threefish256_slut3)
297 ldi r30, lo8(threefish256_rc0)
298 ldi r31, hi8(threefish256_rc0)
307 call threefish_mix_asm /* no rcall? */
311 call threefish_mix_asm /* no rcall? */
312 /* now the permutation */
328 .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
329 .byte 0x18, 0x20, 0x00, 0x08, 0x10, 0x18, 0x20, 0x00
330 .byte 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
332 .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
333 .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00
334 .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
335 /* old round contants
336 threefish256_rc0: .byte 0x1b, 0x44, 0x2b, 0x72, 0x32, 0x7b, 0x13, 0x73
337 threefish256_rc1: .byte 0x70, 0x34, 0x6a, 0x54, 0x24, 0x43, 0x52, 0x62
339 threefish256_rc0: .byte 0x2a, 0x64, 0x39, 0x1b, 0x31, 0x6a, 0x72, 0x40
340 threefish256_rc1: .byte 0x20, 0x71, 0x50, 0x5b, 0x41, 0x14, 0x3a, 0x40