1 /* threefish512_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)])
42 void threefish512_init(const void* key, const void* tweak, threefish512_ctx_t* ctx){
43 memcpy(ctx->k, key, 8*8);
44 memcpy(ctx->t, tweak, 2*8);
46 ctx->k[8] = THREEFISH_KEY_CONST;
50 ctx->t[2] = T(0) ^ T(1);
55 * param tweak: r22:r23
58 .global threefish512_init
157 /******************************************************************************/
159 #define X(a) (((uint64_t*)data)[(a)])
160 void permute_8(void* data){
171 void add_key_8(void* data, const threefish512_ctx_t* ctx, uint8_t s){
174 X(i) += ctx->k[(s+i)%9];
176 X(5) += ctx->k[(s+5)%9] + ctx->t[s%3];
177 X(6) += ctx->k[(s+6)%9] + ctx->t[(s+1)%3];
178 X(7) += ctx->k[(s+7)%9] + s;
180 void threefish512_enc(void* data, const threefish512_ctx_t* ctx){
182 uint8_t r0[8] = {38, 48, 34, 26, 33, 39, 29, 33};
183 uint8_t r1[8] = {30, 20, 14, 12, 49, 27, 26, 51};
184 uint8_t r2[8] = {50, 43, 15, 58, 8, 41, 11, 39};
185 uint8_t r3[8] = {53, 31, 27, 7, 42, 14, 9, 35};
188 add_key_8(data, ctx, s);
191 threefish_mix((uint8_t*)data + 0, r0[i%8]);
192 threefish_mix((uint8_t*)data + 16, r1[i%8]);
193 threefish_mix((uint8_t*)data + 32, r2[i%8]);
194 threefish_mix((uint8_t*)data + 48, r3[i%8]);
198 add_key_8(data, ctx, s);
217 * param data: r24:r25
220 .global threefish512_enc
235 ldi r30, lo8(threefish512_slut9)
236 ldi r31, hi8(threefish512_slut9)
281 /* now the remaining key */
283 ldi r30, lo8(threefish512_slut3)
284 ldi r31, hi8(threefish512_slut3)
290 adiw r30, 7*8 /* make Z pointing to (extended tweak) */
335 ldi r30, lo8(threefish512_rc0)
336 ldi r31, hi8(threefish512_rc0)
351 call threefish_mix_asm /* no rcall? */
355 call threefish_mix_asm /* no rcall? */
360 call threefish_mix_asm /* no rcall? */
364 call threefish_mix_asm /* no rcall? */
365 /* now the permutation */
388 .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38
389 .byte 0x40, 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30
390 .byte 0x38, 0x40, 0x00, 0x08, 0x10, 0x18, 0x20, 0x28
391 .byte 0x30, 0x38, 0x40
393 .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
394 .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00
395 .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
397 threefish512_rc0: .byte 0x5a, 0x60, 0x42, 0x32, 0x41, 0x59, 0x4b, 0x41
398 threefish512_rc1: .byte 0x4a, 0x24, 0x2a, 0x14, 0x61, 0x33, 0x32, 0x63
399 threefish512_rc2: .byte 0x62, 0x53, 0x29, 0x72, 0x10, 0x51, 0x13, 0x59
400 threefish512_rc3: .byte 0x7b, 0x49, 0x33, 0x19, 0x52, 0x2a, 0x11, 0x43