avr-crypto-lib/xtea/xtea-asm.S

247 lines
3.2 KiB
ArmAsm

/* xtea-asm.S */
/*
This file is part of the AVR-Crypto-Lib.
Copyright (C) 2006-2011 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 <http://www.gnu.org/licenses/>.
*/
#include "avr-asm-macros.S"
B0 = 4
B1 = 5
B2 = 6
B3 = 7
A0 = 8
A1 = 9
A2 = 10
A3 = 11
V00 = 12
V01 = 13
V02 = 14
V03 = 15
V10 = 16
V11 = 17
V12 = 18
V13 = 19
S0 = 20
S1 = 21
S2 = 22
S3 = 23
xchg_V0V1:
movw r26, V10
movw V10, V00
movw V00, r26
movw r26, V12
movw V12, V02
movw V02, r26
ret
eor_AB:
eor A0, B0
eor A1, B1
eor A2, B2
eor A3, B3
ret
g_func:
movw A0, V10
movw A2, V12
movw B0, V10
movw B2, V12
ldi r24, 4
10:
lsl A0
rol A1
rol A2
rol A3
dec r24
brne 10b
ldi r24, 5
10:
lsr B3
ror B2
ror B1
ror B0
dec r24
brne 10b
rcall eor_AB
add A0, V10
adc A1, V11
adc A2, V12
adc A3, V13
ret
sum_plus_k:
andi r24, (3<<2)
movw r26, r30
add r26, r24
adc r27, r1
ld B0, X+
ld B1, X+
ld B2, X+
ld B3, X+
add B0, S0
adc B1, S1
adc B2, S2
adc B3, S3
rcall eor_AB
brtc 20f
add V00, A0
adc V01, A1
adc V02, A2
adc V03, A3
ret
20: sub V00, A0
sbc V01, A1
sbc V02, A2
sbc V03, A3
ret
main1:
rcall g_func
mov r24, S0
lsl r24
lsl r24
20:
rcall sum_plus_k
ret
main2:
rcall xchg_V0V1
rcall g_func
mov r24, S1
lsr r24
rcall xchg_V0V1
rjmp 20b
.global xtea_enc
xtea_enc:
set
xtea_intro:
clr r27
ldi r26, 4
ldi r30, 14
10:
ld r0, X+
push r0
dec r30
brne 10b
push r24
push r25
movw r30, r20
/* load block */
movw r26, r22
ld V00, X+
ld V01, X+
ld V02, X+
ld V03, X+
ld V10, X+
ld V11, X+
ld V12, X+
ld V13, X+
ldi r24, 32
mov r0, r24
brtc xtea_dec_start
clr S0
clr S1
movw S2, S0
10:
rcall main1
subi S0, 0x47
sbci S1, 0x86
sbci S2, 0xC8
sbci S3, 0x61
rcall main2
dec r0
brne 10b
/* store back */
xtea_enc_exit:
pop r27
pop r26
/*
st X+, V00
st X+, V01
st X+, V02
st X+, V03
st X+, V10
st X+, V11
st X+, V12
st X+, V13
*/
clr r31
ldi r30, V00
ldi r24, 8
10:
ld r0, Z+
st X+, r0
dec r24
brne 10b
; clr r31
ldi r30, 18
ldi r24, 14
10:
pop r0
st -Z, r0
dec r24
brne 10b
ret
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
.global xtea_dec
xtea_dec:
clt
rjmp xtea_intro
xtea_dec_start:
ldi S0, 0x20 /* sum = 0xC6EF3720 */
ldi S1, 0x37
ldi S2, 0xEF
ldi S3, 0xC6
10:
rcall main2
subi S0, 0xB9
sbci S1, 0x79
sbci S2, 0x37
sbci S3, 0x9E
rcall main1
dec r0
brne 10b
/* store back */
rjmp xtea_enc_exit