even more serpent in asm

This commit is contained in:
bg 2008-08-12 13:25:31 +00:00
parent 981c5b71dd
commit a15d02c94b
4 changed files with 141 additions and 7 deletions

View File

@ -538,6 +538,9 @@ static uint32_t serpent_gen_w(uint32_t * b, uint8_t i){
* param i is passed in r22
* return value is returned in r22.r23.r24.r25
*/
/* trashes:
* r20-r25, r30-r31
*/
.global serpent_gen_w
serpent_gen_w:
movw r30, r24
@ -589,3 +592,120 @@ serpent_gen_w:
brne 1b
ret
/*
* void serpent_init(const void* key, uint16_t keysize_b, serpent_ctx_t* ctx)
*/
/*
* param key is passed in r24:r25
* param keysize is passed in r22:r23
* param ctx is passed in r20:r21
*/
.global serpent_init
serpent_init:
stack_alloc 32
adiw r30, 1
push_ r30, r31
movw r26, r22
adiw r26, 7
tst r27
breq 1f
ldi r26, 32
rjmp 2f
1:
lsr r26
lsr r26
lsr r26
2:
mov r22, r26
bst r22, 5 /* store in T if we have to do the "append 1 thing"*/
ldi r27, 32
3: /* set buffer to zero */
st Z+, r1
dec r27
brne 3b
movw r26, r24 /* X points to the key */
sbiw r30, 32
tst r22
breq 5f /* if keylength_b==0 */
4: /* copy keybytes to buffer */
ld r19, X+
st Z+, r19
dec r22
brne 4b
5:
brts 7f /* if keylength_b == 256 */
ldi r18, 0x01
andi r22, 0x07
brne 6f
st Z, r18
rjmp 7f
6: /* shift the one to the right position */
lsl r18
dec r22
brne 6b
or r18, r19
st -Z, r18
7: /* post "appending 1 thing" buffer is ready for subkey generation */
movw r26, r20 /* X points to the context */
pop_ r19, r18 /* r18:r19 points to the buffer */
push r16
clr r16
8:
movw r24, r18
mov r22, r16
rcall serpent_gen_w
movw r30, r18
ldi r20, 7*4
1: /* the memmove */
ldd r0, Z+4
st Z+, r0
dec r20
brne 1b
/* store new word in buffer and context */
st Z+, r22
st Z+, r23
st Z+, r24
st Z+, r25
st X+, r22
st X+, r23
st X+, r24
st X+, r25
inc r16
cpi r16, 132
brne 8b
push_ r28, r29
movw r28, r26
subi r28, lo8(132*4)
sbci r29, hi8(132*4)
ldi r16, 33
2:
movw r24, r28
adiw r28, 16
ldi r22, 2
add r22, r16
rcall sbox128
dec r16
brne 2b
pop_ r29, r28, r16
stack_free 32
ret

View File

@ -91,14 +91,15 @@ static uint32_t serpent_gen_w(uint32_t * b, uint8_t i){
return ret;
}
*/
void serpent_init(const void* key, uint16_t keysize, serpent_ctx_t* ctx){
#if 0
void serpent_init(const void* key, uint16_t keysize_b, serpent_ctx_t* ctx){
uint32_t buffer[8];
uint8_t i,j;
if(keysize<256){
if(keysize_b<256){
/* keysize is less than 256 bit, padding needed */
memset(buffer, 0, 32);
memcpy(buffer, key, (keysize+7)/8);
((uint8_t*)buffer)[keysize/8] |= 1<<(keysize%8);
memcpy(buffer, key, (keysize_b+7)/8);
((uint8_t*)buffer)[keysize_b/8] |= 1<<(keysize_b%8);
} else {
/* keysize is 256 bit */
memcpy(buffer, key, 32);
@ -114,7 +115,7 @@ void serpent_init(const void* key, uint16_t keysize, serpent_ctx_t* ctx){
sbox128(ctx->k[i],3-i);
}
}
#endif
void serpent_enc(void* buffer, const serpent_ctx_t* ctx){
uint8_t i;

View File

@ -39,7 +39,7 @@ typedef struct serpent_ctx_st {
/* key must be 256bit (32 byte) large! */
void serpent_init(const void* key, uint16_t keysize, serpent_ctx_t* ctx);
void serpent_init(const void* key, uint16_t keysize_b, serpent_ctx_t* ctx);
void serpent_enc(void* buffer, const serpent_ctx_t* ctx);
void serpent_dec(void* buffer, const serpent_ctx_t* ctx);

View File

@ -62,6 +62,19 @@ void testrun_nessie_serpent(void){
nessie_bc_run();
}
void testrun_test_serpent(void){
uint8_t key[32];
serpent_ctx_t ctx;
uint8_t i;
memset(key, 0, 16);
serpent_init(key, 128, &ctx);
for(i=0; i<33; ++i){
uart_putstr_P(PSTR("\r\n subkekey "));
uart_hexdump(&i, 1);
uart_putstr_P(PSTR(" : "));
uart_hexdump(ctx.k[i], 16);
}
}
void testrun_performance_serpent(void){
uint64_t t;
@ -114,7 +127,7 @@ int main (void){
uart_putstr_P(PSTR(")\r\nloaded and running\r\n"));
PGM_P u = PSTR("nessie\0test\0performance\0");
void_fpt v[] = {testrun_nessie_serpent, testrun_nessie_serpent, testrun_performance_serpent};
void_fpt v[] = {testrun_nessie_serpent, testrun_test_serpent, testrun_performance_serpent};
while(1){
if (!getnextwordn(str,20)){DEBUG_S("DBG: W1\r\n"); goto error;}