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
69 ldi A6, 0x22 ; 0x1BD1.1BDA.A9FC.1A22
178 /******************************************************************************/
180 #define X(a) (((uint64_t*)data)[(a)])
181 void permute_8(void* data){
192 void add_key_8(void* data, const threefish512_ctx_t* ctx, uint8_t s){
195 X(i) += ctx->k[(s+i)%9];
197 X(5) += ctx->k[(s+5)%9] + ctx->t[s%3];
198 X(6) += ctx->k[(s+6)%9] + ctx->t[(s+1)%3];
199 X(7) += ctx->k[(s+7)%9] + s;
201 void threefish512_enc(void* data, const threefish512_ctx_t* ctx){
203 uint8_t r0[8] = {38, 48, 34, 26, 33, 39, 29, 33};
204 uint8_t r1[8] = {30, 20, 14, 12, 49, 27, 26, 51};
205 uint8_t r2[8] = {50, 43, 15, 58, 8, 41, 11, 39};
206 uint8_t r3[8] = {53, 31, 27, 7, 42, 14, 9, 35};
209 add_key_8(data, ctx, s);
212 threefish_mix((uint8_t*)data + 0, r0[i%8]);
213 threefish_mix((uint8_t*)data + 16, r1[i%8]);
214 threefish_mix((uint8_t*)data + 32, r2[i%8]);
215 threefish_mix((uint8_t*)data + 48, r3[i%8]);
219 add_key_8(data, ctx, s);
238 * param data: r24:r25
241 .global threefish512_enc
256 ldi r30, lo8(threefish512_slut9)
257 ldi r31, hi8(threefish512_slut9)
302 /* now the remaining key */
304 ldi r30, lo8(threefish512_slut3)
305 ldi r31, hi8(threefish512_slut3)
311 adiw r30, 7*8 /* make Z pointing to (extended tweak) */
356 ldi r30, lo8(threefish512_rc0)
357 ldi r31, hi8(threefish512_rc0)
372 call threefish_mix_asm /* no rcall? */
376 call threefish_mix_asm /* no rcall? */
381 call threefish_mix_asm /* no rcall? */
385 call threefish_mix_asm /* no rcall? */
386 /* now the permutation */
409 .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38
410 .byte 0x40, 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30
411 .byte 0x38, 0x40, 0x00, 0x08, 0x10, 0x18, 0x20, 0x28
412 .byte 0x30, 0x38, 0x40
414 .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
415 .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00
416 .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
418 /* old round constants
419 threefish512_rc0: .byte 0x5a, 0x60, 0x42, 0x32, 0x41, 0x59, 0x4b, 0x41
420 threefish512_rc1: .byte 0x4a, 0x24, 0x2a, 0x14, 0x61, 0x33, 0x32, 0x63
421 threefish512_rc2: .byte 0x62, 0x53, 0x29, 0x72, 0x10, 0x51, 0x13, 0x59
422 threefish512_rc3: .byte 0x7b, 0x49, 0x33, 0x19, 0x52, 0x2a, 0x11, 0x43
424 threefish512_rc0: .byte 0x6a, 0x41, 0x21, 0x54, 0x59, 0x2b, 0x31, 0x10
425 threefish512_rc1: .byte 0x44, 0x33, 0x61, 0x11, 0x4a, 0x62, 0x4b, 0x43
426 threefish512_rc2: .byte 0x23, 0x2a, 0x44, 0x7a, 0x42, 0x12, 0x59, 0x70
427 threefish512_rc3: .byte 0x5b, 0x52, 0x59, 0x70, 0x30, 0x21, 0x53, 0x3a