1 /* threefish256_enc_asm.S */
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
180 /******************************************************************************/
182 #define X(a) (((uint64_t*)data)[(a)])
183 void permute_4(void* data){
189 void add_key_4(void* data, threefish256_ctx_t* ctx, uint8_t s){ / * s: 0..19 * /
190 X(0) += ctx->k[(s+0)%5];
191 X(1) += ctx->k[(s+1)%5] + ctx->t[s%3];
192 X(2) += ctx->k[(s+2)%5] + ctx->t[(s+1)%3];
193 X(3) += ctx->k[(s+3)%5] + s;
195 void threefish256_enc(void* data, threefish256_ctx_t* ctx){
197 uint8_t r0[8] = { 5, 36, 13, 58, 26, 53, 11, 59};
198 uint8_t r1[8] = {56, 28, 46, 44, 20, 35, 42, 50};
201 add_key_4(data, ctx, s);
204 threefish_mix(data, r0[i%8]);
205 threefish_mix((uint8_t*)data + 16, r1[i%8]);
209 add_key_4(data, ctx, s);
223 * param data: r24:r25
226 .global threefish256_enc
241 ldi r30, lo8(threefish256_slut5)
242 ldi r31, hi8(threefish256_slut5)
267 /* now the remaining key */
269 ldi r30, lo8(threefish256_slut3)
270 ldi r31, hi8(threefish256_slut3)
320 ldi r30, lo8(threefish256_rc0)
321 ldi r31, hi8(threefish256_rc0)
330 call threefish_mix_asm /* no rcall? */
334 call threefish_mix_asm /* no rcall? */
335 /* now the permutation */
376 .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
377 .byte 0x18, 0x20, 0x00, 0x08, 0x10, 0x18, 0x20, 0x00
378 .byte 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
380 .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
381 .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00
382 .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
383 ;threefish256_rc0: .byte 5, 36, 13, 58, 26, 53, 11, 59
384 ;threefish256_rc1: .byte 56, 28, 46, 44, 20, 35, 42, 50
385 /* old round constants
386 threefish256_rc0: .byte 0x1b, 0x44, 0x2b, 0x72, 0x32, 0x7b, 0x13, 0x73
387 threefish256_rc1: .byte 0x70, 0x34, 0x6a, 0x54, 0x24, 0x43, 0x52, 0x62
389 threefish256_rc0: .byte 0x2a, 0x64, 0x39, 0x1b, 0x31, 0x6a, 0x72, 0x40
390 threefish256_rc1: .byte 0x20, 0x71, 0x50, 0x5b, 0x41, 0x14, 0x3a, 0x40