X-Git-Url: https://git.cryptolib.org/?a=blobdiff_plain;f=noekeon_asm.S;h=b0a2a16f93da12843c5d39a022103f04f5781c01;hb=7eaaf2a1aa12ba270aaae25255f96bdb615e657e;hp=d880296389fdc63cdf2dd2adef5d57b77eba3792;hpb=2aee09dcaf731b4086e7cdb865ee77b2715ce751;p=avr-crypto-lib.git diff --git a/noekeon_asm.S b/noekeon_asm.S index d880296..b0a2a16 100644 --- a/noekeon_asm.S +++ b/noekeon_asm.S @@ -1,3 +1,21 @@ +/* noekeon_asm.S */ +/* + This file is part of the AVR-Crypto-Lib. + Copyright (C) 2008 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ /* * noekeon assembler implementation for avr * author: Daniel Otte @@ -26,13 +44,9 @@ push r17 push r28 push r29 - in r28, _SFR_IO_ADDR(SREG) - push r28 .endm .macro pop_all - pop r28 - out _SFR_IO_ADDR(SREG), r28 pop r29 pop r28 pop r17 @@ -54,6 +68,18 @@ clr r1 .endm +push_all_func: + pop r31 + pop r30 + push_all + ijmp + +pop_all_func: + pop r31 + pop r30 + pop_all + ijmp + .macro xchg a b eor \a, \b eor \b, \a @@ -261,14 +287,15 @@ theta: ret /******************************************************************************/ +#ifndef NOEKEON_NO_ENC ; === noekeon_enc === ; -; param1: pointer to buffer/state (r24,r25) +; param1: pointer to buffer (r24,r25) ; param2: pointer to k (r22,r23) ; .global noekeon_enc noekeon_enc: - push_all + rcall push_all_func /* load state */ movw r26, r22 ldi r28, 2 @@ -298,7 +325,7 @@ noekeon_enc: lpm r0, Z push r0 3: - call round /* pops rc2 & rc1 */ + rcall round /* pops rc2 & rc1 */ pop r22 dec r22 push r22 @@ -308,7 +335,7 @@ noekeon_enc: ldi r22, 0xD4 eor state0_3, r22 - call theta + rcall theta pop r31 pop r30 @@ -321,10 +348,13 @@ noekeon_enc: dec r22 brne 1b - pop_all + rcall pop_all_func ret +#endif /******************************************************************************/ /******************************************************************************/ +#ifndef NOEKEON_NO_DEC + ; === noekeon_dec === ; ; param1: pointer to buffer/state (r24,r25) @@ -332,7 +362,7 @@ noekeon_enc: ; .global noekeon_dec noekeon_dec: - push_all + rcall push_all_func /* allocate 16 bytes on the stack */ in r30, _SFR_IO_ADDR(SPL) in r31, _SFR_IO_ADDR(SPH) @@ -363,7 +393,7 @@ noekeon_dec: movw r26, r30 sbiw r26, 16 /* set X back to begining of stack key */ - call theta + rcall theta /* mov state to stackkey */ clr r29 @@ -405,7 +435,7 @@ noekeon_dec: push r0 push r1 3: - call round /* pops rc2 & rc1 */ + rcall round /* pops rc2 & rc1 */ pop r22 dec r22 push r22 @@ -413,7 +443,7 @@ noekeon_dec: ;---- pop r22 - call theta + rcall theta ldi r22, 0x80 eor state0_3, r22 @@ -436,26 +466,28 @@ write_state_back: adiw r30, 16 out _SFR_IO_ADDR(SPH), r31 out _SFR_IO_ADDR(SPL), r30 - pop_all + rcall pop_all_func ret +#endif /******************************************************************************/ + round: pop r24 pop r25 pop r1 eor state0_3, r1 - call theta + rcall theta pop r1 eor state0_3, r1 push r25 push r24 pi_gamma_pi: - ldi r30, lo8(bigendian_rotl32) - ldi r31, hi8(bigendian_rotl32) - call pi + ldi r30, pm_lo8(bigendian_rotl32) + ldi r31, pm_hi8(bigendian_rotl32) + rcall pi /* pi1 done; now gamma */ - call gamma_1 + rcall gamma_1 /* a[0] <-> a[3] */ xchg state0_0, state3_0 xchg state0_1, state3_1 @@ -465,24 +497,11 @@ pi_gamma_pi: op32 eor, state2, state0 op32 eor, state2, state1 op32 eor, state2, state3 -/* - eor state2_0, state0_0 - eor state2_1, state0_1 - eor state2_2, state0_2 - eor state2_3, state0_3 - eor state2_0, state1_0 - eor state2_1, state1_1 - eor state2_2, state1_2 - eor state2_3, state1_3 - eor state2_0, state3_0 - eor state2_1, state3_1 - eor state2_2, state3_2 - eor state2_3, state3_3 -*/ - call gamma_1 - ldi r30, lo8(bigendian_rotr32) - ldi r31, hi8(bigendian_rotr32) - call pi + + rcall gamma_1 + ldi r30, pm_lo8(bigendian_rotr32) + ldi r31, pm_hi8(bigendian_rotr32) + rcall pi ret gamma_1: @@ -526,8 +545,6 @@ gamma_1: ret pi: - lsr r31 - ror r30 /* a[1] <<<= 1*/ mov r22, state1_0 mov r23, state1_1 @@ -574,6 +591,9 @@ void noekeon_init(void* key, noekeon_ctx_t* ctx){ noekeon_enc(ctx, nullv); } */ + +#ifndef NOEKEON_NO_INIT + .global noekeon_init noekeon_init: ; === noekeon_init === @@ -607,7 +627,7 @@ noekeon_init: sbiw r26, 16 movw r24, r26 - call noekeon_enc + rcall noekeon_enc in r30, _SFR_IO_ADDR(SPL) in r31, _SFR_IO_ADDR(SPH) @@ -616,6 +636,6 @@ noekeon_init: out _SFR_IO_ADDR(SPL), r30 ret - +#endif