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 /******************************************************************************/
30 #define X(a) (((uint64_t*)data)[(a)])
34 void permute_inv8(void* data){
47 void add_key_8(void* data, const threefish512_ctx_t* ctx, uint8_t s){
50 X(i) -= ctx->k[(s+i)%9];
52 X(5) -= ctx->k[(s+5)%9] + ctx->t[s%3];
53 X(6) -= ctx->k[(s+6)%9] + ctx->t[(s+1)%3];
54 X(7) -= ctx->k[(s+7)%9] + s;
57 void threefish512_dec(void* data, const threefish512_ctx_t* ctx){
59 uint8_t r0[8] = {0x41, 0x4b, 0x59, 0x41, 0x32, 0x42, 0x60, 0x5a};
60 uint8_t r1[8] = {0x63, 0x32, 0x33, 0x61, 0x14, 0x2a, 0x24, 0x4a};
61 uint8_t r2[8] = {0x59, 0x13, 0x51, 0x10, 0x72, 0x29, 0x53, 0x62};
62 uint8_t r3[8] = {0x43, 0x11, 0x2a, 0x52, 0x19, 0x33, 0x49, 0x7b};
65 add_key_8(data, ctx, s);
69 threefish_invmix((uint8_t*)data + 0, r0[i%8]);
70 threefish_invmix((uint8_t*)data + 16, r1[i%8]);
71 threefish_invmix((uint8_t*)data + 32, r2[i%8]);
72 threefish_invmix((uint8_t*)data + 48, r3[i%8]);
75 add_key_8(data, ctx, s);
96 .global threefish512_dec
112 ldi r30, lo8(threefish512_slut9)
113 ldi r31, hi8(threefish512_slut9)
158 /* now the remaining key */
160 ldi r30, lo8(threefish512_slut3)
161 ldi r31, hi8(threefish512_slut3)
167 adiw r30, 7*8 /* make Z pointing to (extended tweak) */
211 /* now the permutation */
232 ldi r30, lo8(threefish512_rc0)
233 ldi r31, hi8(threefish512_rc0)
248 call threefish_invmix_asm /* no rcall? */
252 call threefish_invmix_asm /* no rcall? */
257 call threefish_invmix_asm /* no rcall? */
261 call threefish_invmix_asm /* no rcall? */
266 .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38
267 .byte 0x40, 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30
268 .byte 0x38, 0x40, 0x00, 0x08, 0x10, 0x18, 0x20, 0x28
269 .byte 0x30, 0x38, 0x40
271 .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
272 .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00
273 .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
275 /* old round constants
276 threefish512_rc0: .byte 0x41, 0x4b, 0x59, 0x41, 0x32, 0x42, 0x60, 0x5a
277 threefish512_rc1: .byte 0x63, 0x32, 0x33, 0x61, 0x14, 0x2a, 0x24, 0x4a
278 threefish512_rc2: .byte 0x59, 0x13, 0x51, 0x10, 0x72, 0x29, 0x53, 0x62
279 threefish512_rc3: .byte 0x43, 0x11, 0x2a, 0x52, 0x19, 0x33, 0x49, 0x7b
281 threefish512_rc0: .byte 0x10, 0x31, 0x2b, 0x59, 0x54, 0x21, 0x41, 0x6a
282 threefish512_rc1: .byte 0x43, 0x4b, 0x62, 0x4a, 0x11, 0x61, 0x33, 0x44
283 threefish512_rc2: .byte 0x70, 0x59, 0x12, 0x42, 0x7a, 0x44, 0x2a, 0x23
284 threefish512_rc3: .byte 0x3a, 0x53, 0x21, 0x30, 0x70, 0x59, 0x52, 0x5b