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 /******************************************************************************/
30 void permute_4(void *data){
36 void add_key_4(void *data, const threefish256_ctx_t *ctx, uint8_t s){
37 X(0) -= ctx->k[(s+0)%5];
38 X(1) -= ctx->k[(s+1)%5] + ctx->t[s%3];
39 X(2) -= ctx->k[(s+2)%5] + ctx->t[(s+1)%3];
40 X(3) -= ctx->k[(s+3)%5] + s;
42 void threefish256_dec(void *data, const threefish256_ctx_t *ctx){
44 uint8_t r0[8] = {0x73, 0x13, 0x7b, 0x32, 0x72, 0x2b, 0x44, 0x1b};
45 uint8_t r1[8] = {0x62, 0x52, 0x43, 0x24, 0x54, 0x6a, 0x34, 0x70};
48 add_key_4(data, ctx, s);
52 threefish_invmix(data, r0[i%8]);
53 threefish_invmix((uint8_t*)data + 16, r1[i%8]);
56 add_key_4(data, ctx, s);
73 .global threefish256_dec
89 ldi r30, lo8(threefish256_slut5)
90 ldi r31, hi8(threefish256_slut5)
115 /* now the remaining key */
117 ldi r30, lo8(threefish256_slut3)
118 ldi r31, hi8(threefish256_slut3)
167 /* now the permutation */
205 ldi r30, lo8(threefish256_rc0)
206 ldi r31, hi8(threefish256_rc0)
215 call threefish_invmix_asm /* no rcall? */
219 call threefish_invmix_asm /* no rcall? */
224 .byte 0x00, 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
225 .byte 0x18, 0x20, 0x00, 0x08, 0x10, 0x18, 0x20, 0x00
226 .byte 0x08, 0x10, 0x18, 0x20, 0x00, 0x08, 0x10
228 .byte 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
229 .byte 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00
230 .byte 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08
231 /* old round constants
232 threefish256_rc0: .byte 0x73, 0x13, 0x7b, 0x32, 0x72, 0x2b, 0x44, 0x1b
233 threefish256_rc1: .byte 0x62, 0x52, 0x43, 0x24, 0x54, 0x6a, 0x34, 0x70
235 threefish256_rc0: .byte 0x40, 0x72, 0x6a, 0x31, 0x1b, 0x39, 0x64, 0x2a
236 threefish256_rc1: .byte 0x40, 0x3a, 0x14, 0x41, 0x5b, 0x50, 0x71, 0x20