finished asm version of serpent (may be optimized later)

This commit is contained in:
bg 2008-08-12 16:20:37 +00:00
parent a15d02c94b
commit 3b6caf79ac
5 changed files with 110 additions and 22 deletions

View File

@ -5,7 +5,7 @@ ALGO_NAME := SERPENT_BITSLICE
BLOCK_CIPHERS += $(ALGO_NAME)
$(ALGO_NAME)_OBJ := serpent.o serpent-sboxes-bitslice.o memxor.o
$(ALGO_NAME)_OBJ := serpent-asm.o serpent-sboxes-bitslice.o memxor.o
$(ALGO_NAME)_TEST_BIN := main-serpent-test.o debug.o uart.o serial-tools.o \
nessie_bc_test.o nessie_common.o cli.o performance_test.o
$(ALGO_NAME)_NESSIE_TEST := "nessie"

View File

@ -5,7 +5,7 @@ ALGO_NAME := SERPENT_ASM_FAST
BLOCK_CIPHERS += $(ALGO_NAME)
$(ALGO_NAME)_OBJ := serpent.o serpent-sboxes-fast.o memxor.o
$(ALGO_NAME)_OBJ := serpent-asm.o serpent-sboxes-fast.o memxor.o
$(ALGO_NAME)_TEST_BIN := main-serpent-test.o debug.o uart.o serial-tools.o \
nessie_bc_test.o nessie_common.o cli.o performance_test.o
$(ALGO_NAME)_NESSIE_TEST := "nessie"

View File

@ -5,7 +5,7 @@ ALGO_NAME := SERPENT_ASM_SMALL
BLOCK_CIPHERS += $(ALGO_NAME)
$(ALGO_NAME)_OBJ := serpent.o serpent-asm.o serpent-sboxes-small.o memxor.o
$(ALGO_NAME)_OBJ := serpent-asm.o serpent-sboxes-small.o memxor.o
$(ALGO_NAME)_TEST_BIN := main-serpent-test.o debug.o uart.o serial-tools.o \
nessie_bc_test.o nessie_common.o cli.o performance_test.o
$(ALGO_NAME)_NESSIE_TEST := "nessie"

View File

@ -123,7 +123,6 @@ T1 = 21
T2 = 22
T3 = 23
.global serpent_lt
serpent_lt:
push_range 4, 17
movw r26, r24
@ -278,8 +277,8 @@ serpent_lt:
pop_range 4, 17
ret
#endif
T0 = 22
T1 = 23
T2 = 24
@ -339,7 +338,6 @@ memeor32:
brne 1b
ret
.global serpent_lt
serpent_lt:
/* X0 := X0 <<< 13 */
movw r26, r24
@ -432,7 +430,6 @@ serpent_lt:
rcall memrotr32
ret
.global serpent_inv_lt
serpent_inv_lt:
/* X0 := X0 >>> 5 */
movw r26, r24
@ -541,7 +538,6 @@ static uint32_t serpent_gen_w(uint32_t * b, uint8_t i){
/* trashes:
* r20-r25, r30-r31
*/
.global serpent_gen_w
serpent_gen_w:
movw r30, r24
/* ^i^b[0]*/
@ -694,7 +690,111 @@ serpent_init:
stack_free 32
ret
/*
* void serpent_enc(void* buffer, const serpent_ctx_t* ctx){
*/
/*
* param buffer is passed in r24:r25
* param ctx is passed in r22:r23
*/
.global serpent_enc
serpent_enc:
push_ r12, r13, r14, r15, r16
clr r16
movw r14, r24
movw r12, r22
1:
movw r24, r14
movw r22, r12
ldi r20, 16
add r12, r20
adc r13, r1
clr r21
rcall memxor
movw r24, r14
mov r22, r16
rcall sbox128
movw r24, r14
rcall serpent_lt
inc r16
cpi r16, 31
brne 1b
movw r24, r14
movw r22, r12
ldi r20, 16
add r12, r20
adc r13, r1
clr r21
rcall memxor
movw r24, r14
mov r22, r16
rcall sbox128
inc r16
movw r24, r14
movw r22, r12
ldi r20, 16
clr r21
pop_ r16, r15, r14, r13, r12
rjmp memxor
/*
* void serpent_dec(void* buffer, const serpent_ctx_t* ctx){
*/
/*
* param buffer is passed in r24:r25
* param ctx is passed in r22:r23
*/
.global serpent_dec
serpent_dec:
push_ r12, r13, r14, r15, r16
movw r14, r24
// ldi r16, lo8(32*16)
// add r22, r16
ldi r16, hi8(32*16)
add r23, r16
movw r12, r22
ldi r20, 16
clr r21
rcall memxor
movw r24, r14
ldi r22, 31
rcall inv_sbox128
movw r24, r14
ldi r20, 16
sub r12, r20
sbc r13, r1
movw r22, r12
clr r21
rcall memxor
ldi r16, 31
1:
dec r16
movw r24, r14
rcall serpent_inv_lt
movw r24, r14
mov r22, r16
rcall inv_sbox128
movw r24, r14
ldi r20, 16
sub r12, r20
sbc r13, r1
movw r22, r12
clr r21
rcall memxor
tst r16
brne 1b
pop_ r16, r15, r14, r13, r12
ret

View File

@ -47,8 +47,6 @@ uint32_t rotr32(uint32_t a, uint8_t n){
#define X2 (((uint32_t*)b)[2])
#define X3 (((uint32_t*)b)[3])
void serpent_lt(uint8_t *b);
/*
static void serpent_lt(uint8_t *b){
X0 = rotl32(X0, 13);
X2 = rotl32(X2, 3);
@ -61,11 +59,7 @@ static void serpent_lt(uint8_t *b){
X0 = rotl32(X0, 5);
X2 = rotr32(X2, 10);
}
*/
static void serpent_inv_lt(uint8_t *b);
/*
static void serpent_inv_lt(uint8_t *b){
X2 = rotl32(X2, 10);
X0 = rotr32(X0, 5);
@ -78,10 +72,7 @@ static void serpent_inv_lt(uint8_t *b){
X2 = rotr32(X2, 3);
X0 = rotr32(X0, 13);
}
*/
uint32_t serpent_gen_w(uint32_t * b, uint8_t i);
/*
#define GOLDEN_RATIO 0x9e3779b9l
static uint32_t serpent_gen_w(uint32_t * b, uint8_t i){
@ -90,8 +81,7 @@ static uint32_t serpent_gen_w(uint32_t * b, uint8_t i){
ret = rotl32(ret, 11);
return ret;
}
*/
#if 0
void serpent_init(const void* key, uint16_t keysize_b, serpent_ctx_t* ctx){
uint32_t buffer[8];
uint8_t i,j;
@ -115,7 +105,6 @@ void serpent_init(const void* key, uint16_t keysize_b, serpent_ctx_t* ctx){
sbox128(ctx->k[i],3-i);
}
}
#endif
void serpent_enc(void* buffer, const serpent_ctx_t* ctx){
uint8_t i;
@ -149,4 +138,3 @@ void serpent_dec(void* buffer, const serpent_ctx_t* ctx){