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
70 ldi A6, 0x22 ; 0x1BD1.1BDA.A9FC.1A22
179 /******************************************************************************/
181 #define X(a) (((uint64_t*)data)[(a)])
182 void permute_4(void* data){
188 void add_key_4(void* data, threefish256_ctx_t* ctx, uint8_t s){ / * s: 0..19 * /
189 X(0) += ctx->k[(s+0)%5];
190 X(1) += ctx->k[(s+1)%5] + ctx->t[s%3];
191 X(2) += ctx->k[(s+2)%5] + ctx->t[(s+1)%3];
192 X(3) += ctx->k[(s+3)%5] + s;
194 void threefish256_enc(void* data, threefish256_ctx_t* ctx){
196 uint8_t r0[8] = { 5, 36, 13, 58, 26, 53, 11, 59};
197 uint8_t r1[8] = {56, 28, 46, 44, 20, 35, 42, 50};
200 add_key_4(data, ctx, s);
203 threefish_mix(data, r0[i%8]);
204 threefish_mix((uint8_t*)data + 16, r1[i%8]);
208 add_key_4(data, ctx, s);
222 * param data: r24:r25
225 .global threefish256_enc
240 ldi r30, lo8(threefish256_slut5)
241 ldi r31, hi8(threefish256_slut5)
267 /* now the remaining key */
269 ldi r30, lo8(threefish256_slut3)
270 ldi r31, hi8(threefish256_slut3)
306 ldi r30, lo8(threefish256_rc0)
307 ldi r31, hi8(threefish256_rc0)
316 call threefish_mix_asm /* no rcall? */
320 call threefish_mix_asm /* no rcall? */
321 /* now the permutation */
337 .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
338 .byte 0x18, 0x20, 0x00, 0x08, 0x10, 0x18, 0x20, 0x00
339 .byte 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
341 .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
342 .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00
343 .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
344 /* old round contants
345 threefish256_rc0: .byte 0x1b, 0x44, 0x2b, 0x72, 0x32, 0x7b, 0x13, 0x73
346 threefish256_rc1: .byte 0x70, 0x34, 0x6a, 0x54, 0x24, 0x43, 0x52, 0x62
348 threefish256_rc0: .byte 0x2a, 0x64, 0x39, 0x1b, 0x31, 0x6a, 0x72, 0x40
349 threefish256_rc1: .byte 0x20, 0x71, 0x50, 0x5b, 0x41, 0x14, 0x3a, 0x40