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
169 /******************************************************************************/
171 #define X(a) (((uint64_t*)data)[(a)])
172 void permute_8(void* data){
183 void add_key_8(void* data, const threefish512_ctx_t* ctx, uint8_t s){
186 X(i) += ctx->k[(s+i)%9];
188 X(5) += ctx->k[(s+5)%9] + ctx->t[s%3];
189 X(6) += ctx->k[(s+6)%9] + ctx->t[(s+1)%3];
190 X(7) += ctx->k[(s+7)%9] + s;
192 void threefish512_enc(void* data, const threefish512_ctx_t* ctx){
194 uint8_t r0[8] = {38, 48, 34, 26, 33, 39, 29, 33};
195 uint8_t r1[8] = {30, 20, 14, 12, 49, 27, 26, 51};
196 uint8_t r2[8] = {50, 43, 15, 58, 8, 41, 11, 39};
197 uint8_t r3[8] = {53, 31, 27, 7, 42, 14, 9, 35};
200 add_key_8(data, ctx, s);
203 threefish_mix((uint8_t*)data + 0, r0[i%8]);
204 threefish_mix((uint8_t*)data + 16, r1[i%8]);
205 threefish_mix((uint8_t*)data + 32, r2[i%8]);
206 threefish_mix((uint8_t*)data + 48, r3[i%8]);
210 add_key_8(data, ctx, s);
229 * param data: r24:r25
232 .global threefish512_enc
247 ldi r30, lo8(threefish512_slut9)
248 ldi r31, hi8(threefish512_slut9)
293 /* now the remaining key */
295 ldi r30, lo8(threefish512_slut3)
296 ldi r31, hi8(threefish512_slut3)
302 adiw r30, 7*8 /* make Z pointing to (extended tweak) */
347 ldi r30, lo8(threefish512_rc0)
348 ldi r31, hi8(threefish512_rc0)
363 call threefish_mix_asm /* no rcall? */
367 call threefish_mix_asm /* no rcall? */
372 call threefish_mix_asm /* no rcall? */
376 call threefish_mix_asm /* no rcall? */
377 /* now the permutation */
400 .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38
401 .byte 0x40, 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30
402 .byte 0x38, 0x40, 0x00, 0x08, 0x10, 0x18, 0x20, 0x28
403 .byte 0x30, 0x38, 0x40
405 .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
406 .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00
407 .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
409 /* old round constants
410 threefish512_rc0: .byte 0x5a, 0x60, 0x42, 0x32, 0x41, 0x59, 0x4b, 0x41
411 threefish512_rc1: .byte 0x4a, 0x24, 0x2a, 0x14, 0x61, 0x33, 0x32, 0x63
412 threefish512_rc2: .byte 0x62, 0x53, 0x29, 0x72, 0x10, 0x51, 0x13, 0x59
413 threefish512_rc3: .byte 0x7b, 0x49, 0x33, 0x19, 0x52, 0x2a, 0x11, 0x43
415 threefish512_rc0: .byte 0x6a, 0x41, 0x21, 0x54, 0x59, 0x2b, 0x31, 0x10
416 threefish512_rc1: .byte 0x44, 0x33, 0x61, 0x11, 0x4a, 0x62, 0x4b, 0x43
417 threefish512_rc2: .byte 0x23, 0x2a, 0x44, 0x7a, 0x42, 0x12, 0x59, 0x70
418 threefish512_rc3: .byte 0x5b, 0x52, 0x59, 0x70, 0x30, 0x21, 0x53, 0x3a