more ASM fun
This commit is contained in:
parent
5ac75cfae2
commit
e9d9457ed0
254
md5-asm.S
254
md5-asm.S
|
@ -22,7 +22,8 @@
|
||||||
* Date: 2008-11-15
|
* Date: 2008-11-15
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.include "avr-asm-macros.S"
|
|
||||||
|
#include "avr-asm-macros.S"
|
||||||
|
|
||||||
;###########################################################
|
;###########################################################
|
||||||
; S-BOX
|
; S-BOX
|
||||||
|
@ -495,23 +496,252 @@ void md5_nextBlock(md5_ctx_t *state, void* block){
|
||||||
state->counter++;
|
state->counter++;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
shift_table:
|
|
||||||
.byte 7,12,17,22
|
|
||||||
.byte 5, 9,14,20
|
|
||||||
.byte 4,11,16,23
|
|
||||||
.byte 6,10,15,21
|
|
||||||
|
|
||||||
|
shift_table_1: .byte 7,12,17,22
|
||||||
|
shift_table_2: .byte 5, 9,14,20
|
||||||
|
shift_table_3: .byte 4,11,16,23
|
||||||
|
shift_table_4: .byte 6,10,15,21
|
||||||
|
|
||||||
|
index_table_r2:
|
||||||
|
;(1+m*4+n*5)&0xf:
|
||||||
|
.byte 0x04, 0x18, 0x2c, 0x00
|
||||||
|
.byte 0x14, 0x28, 0x3c, 0x10
|
||||||
|
.byte 0x24, 0x38, 0x0c, 0x20
|
||||||
|
.byte 0x34, 0x08, 0x1c, 0x30
|
||||||
|
|
||||||
|
index_table_r3:
|
||||||
|
;(5-m*4+n*3)&0xf:
|
||||||
|
.byte 0x14, 0x20, 0x2c, 0x38
|
||||||
|
.byte 0x04, 0x10, 0x1c, 0x28
|
||||||
|
.byte 0x34, 0x00, 0x0c, 0x18
|
||||||
|
.byte 0x24, 0x30, 0x3c, 0x08
|
||||||
|
|
||||||
|
index_table_r4:
|
||||||
|
;(0-m*4+n*7)&0xf:
|
||||||
|
.byte 0x00, 0x1c, 0x38, 0x14
|
||||||
|
.byte 0x30, 0x0c, 0x28, 0x04
|
||||||
|
.byte 0x20, 0x3c, 0x18, 0x34
|
||||||
|
.byte 0x10, 0x2c, 0x08, 0x24
|
||||||
|
|
||||||
|
APTR_REG = 2
|
||||||
|
BPTR_REG = 4
|
||||||
|
N_REG = 6
|
||||||
|
M_REG = 7
|
||||||
|
I_REG = 8
|
||||||
|
.global md5_nextBlock
|
||||||
md5_nextBlock:
|
md5_nextBlock:
|
||||||
stack_alloc 4*4
|
stack_alloc 16
|
||||||
|
push_range 2, 8
|
||||||
|
push r16
|
||||||
|
push r17
|
||||||
|
push r24
|
||||||
|
push r25
|
||||||
|
adiw r30, 1 /* Z now points to the beginning of the allocated memory */
|
||||||
|
movw r2, r30
|
||||||
|
movw r4, r22
|
||||||
|
movw r26, r24
|
||||||
|
ldi r20, 16
|
||||||
|
1:
|
||||||
|
ld r0, X+
|
||||||
|
st Z+, r0
|
||||||
|
dec r20
|
||||||
|
brne 1b
|
||||||
|
/* state now copied to stack memory */
|
||||||
|
clr I_REG
|
||||||
|
/* Round 1 */
|
||||||
|
clr M_REG
|
||||||
|
ldi r17, 4
|
||||||
|
1:
|
||||||
|
clr N_REG
|
||||||
|
ldi r16, 4
|
||||||
|
2:
|
||||||
|
movw r24, APTR_REG
|
||||||
|
movw r22, BPTR_REG
|
||||||
|
mov r0, M_REG
|
||||||
|
lsl r0
|
||||||
|
lsl r0
|
||||||
|
add r0, N_REG
|
||||||
|
lsl r0
|
||||||
|
lsl r0
|
||||||
|
add r22, r0
|
||||||
|
adc r23, r1
|
||||||
|
mov r21, r16
|
||||||
|
ldi r30, lo8(shift_table_1)
|
||||||
|
ldi r31, hi8(shift_table_1)
|
||||||
|
add r30, N_REG
|
||||||
|
adc r31, r1
|
||||||
|
lpm r20, Z
|
||||||
|
mov r19, I_REG
|
||||||
|
ldi r18, 0
|
||||||
|
rcall md5_core_asm
|
||||||
|
inc I_REG
|
||||||
|
inc N_REG
|
||||||
|
dec r16
|
||||||
|
brne 2b
|
||||||
|
inc M_REG
|
||||||
|
dec r17
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
/* Round 2 */
|
||||||
|
clr M_REG
|
||||||
|
ldi r17, 4
|
||||||
|
1:
|
||||||
|
clr N_REG
|
||||||
|
ldi r16, 4
|
||||||
|
2:
|
||||||
|
movw r24, APTR_REG
|
||||||
|
movw r22, BPTR_REG
|
||||||
|
ldi r30, lo8(index_table_r2)
|
||||||
|
ldi r31, hi8(index_table_r2)
|
||||||
|
mov r0, M_REG
|
||||||
|
lsl r0
|
||||||
|
lsl r0
|
||||||
|
add r0, N_REG
|
||||||
|
add r30, r0
|
||||||
|
adc r31, r1
|
||||||
|
lpm r0, Z
|
||||||
|
add r22, r0
|
||||||
|
adc r23, r1
|
||||||
|
mov r21, r16
|
||||||
|
ldi r30, lo8(shift_table_2)
|
||||||
|
ldi r31, hi8(shift_table_2)
|
||||||
|
add r30, N_REG
|
||||||
|
adc r31, r1
|
||||||
|
lpm r20, Z
|
||||||
|
mov r19, I_REG
|
||||||
|
ldi r18, 1
|
||||||
|
rcall md5_core_asm
|
||||||
|
inc I_REG
|
||||||
|
inc N_REG
|
||||||
|
dec r16
|
||||||
|
brne 2b
|
||||||
|
inc M_REG
|
||||||
|
dec r17
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
/* Round 3 */
|
||||||
|
clr M_REG
|
||||||
|
ldi r17, 4
|
||||||
|
1:
|
||||||
|
clr N_REG
|
||||||
|
ldi r16, 4
|
||||||
|
2:
|
||||||
|
movw r24, APTR_REG
|
||||||
|
movw r22, BPTR_REG
|
||||||
|
ldi r30, lo8(index_table_r3)
|
||||||
|
ldi r31, hi8(index_table_r3)
|
||||||
|
mov r0, M_REG
|
||||||
|
lsl r0
|
||||||
|
lsl r0
|
||||||
|
add r0, N_REG
|
||||||
|
add r30, r0
|
||||||
|
adc r31, r1
|
||||||
|
lpm r0, Z
|
||||||
|
add r22, r0
|
||||||
|
adc r23, r1
|
||||||
|
mov r21, r16
|
||||||
|
ldi r30, lo8(shift_table_3)
|
||||||
|
ldi r31, hi8(shift_table_3)
|
||||||
|
add r30, N_REG
|
||||||
|
adc r31, r1
|
||||||
|
lpm r20, Z
|
||||||
|
mov r19, I_REG
|
||||||
|
ldi r18, 2
|
||||||
|
rcall md5_core_asm
|
||||||
|
inc I_REG
|
||||||
|
inc N_REG
|
||||||
|
dec r16
|
||||||
|
brne 2b
|
||||||
|
inc M_REG
|
||||||
|
dec r17
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
/* Round 4 */
|
||||||
|
clr M_REG
|
||||||
|
ldi r17, 4
|
||||||
|
1:
|
||||||
|
clr N_REG
|
||||||
|
ldi r16, 4
|
||||||
|
2:
|
||||||
|
movw r24, APTR_REG
|
||||||
|
movw r22, BPTR_REG
|
||||||
|
ldi r30, lo8(index_table_r4)
|
||||||
|
ldi r31, hi8(index_table_r4)
|
||||||
|
mov r0, M_REG
|
||||||
|
lsl r0
|
||||||
|
lsl r0
|
||||||
|
add r0, N_REG
|
||||||
|
add r30, r0
|
||||||
|
adc r31, r1
|
||||||
|
lpm r0, Z
|
||||||
|
add r22, r0
|
||||||
|
adc r23, r1
|
||||||
|
mov r21, r16
|
||||||
|
ldi r30, lo8(shift_table_4)
|
||||||
|
ldi r31, hi8(shift_table_4)
|
||||||
|
add r30, N_REG
|
||||||
|
adc r31, r1
|
||||||
|
lpm r20, Z
|
||||||
|
mov r19, I_REG
|
||||||
|
ldi r18, 3
|
||||||
|
rcall md5_core_asm
|
||||||
|
inc I_REG
|
||||||
|
inc N_REG
|
||||||
|
dec r16
|
||||||
|
brne 2b
|
||||||
|
inc M_REG
|
||||||
|
dec r17
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
|
||||||
|
pop r27
|
||||||
|
pop r26 /* X now points to the context */
|
||||||
|
movw r30, APTR_REG
|
||||||
|
ldi r16, 4
|
||||||
|
1:
|
||||||
|
ld r0, X
|
||||||
|
ld r2, Z+
|
||||||
|
add r0, r2
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
ld r2, Z+
|
||||||
|
adc r0, r2
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
ld r2, Z+
|
||||||
|
adc r0, r2
|
||||||
|
st X+, r0
|
||||||
|
ld r0, X
|
||||||
|
ld r2, Z+
|
||||||
|
adc r0, r2
|
||||||
|
st X+, r0
|
||||||
|
dec r16
|
||||||
|
brne 1b
|
||||||
|
|
||||||
|
ld r0, X
|
||||||
|
inc r0
|
||||||
|
st X+, r0
|
||||||
|
brne 2f
|
||||||
|
ld r0, X
|
||||||
|
inc r0
|
||||||
|
st X+, r0
|
||||||
|
brne 2f
|
||||||
|
ld r0, X
|
||||||
|
inc r0
|
||||||
|
st X+, r0
|
||||||
|
brne 2f
|
||||||
|
ld r0, X
|
||||||
|
inc r0
|
||||||
|
st X+, r0
|
||||||
|
2:
|
||||||
|
|
||||||
|
pop r17
|
||||||
|
pop r16
|
||||||
|
pop_range 2, 8
|
||||||
|
stack_free 16
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
stack_free 4*4
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ void md5_core(uint32_t* a, void* block, uint8_t as, uint8_t s, uint8_t i, uint8_
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if 0
|
||||||
void md5_nextBlock(md5_ctx_t *state, void* block){
|
void md5_nextBlock(md5_ctx_t *state, void* block){
|
||||||
uint32_t a[4];
|
uint32_t a[4];
|
||||||
uint8_t m,n,i=0;
|
uint8_t m,n,i=0;
|
||||||
|
@ -101,6 +101,7 @@ void md5_nextBlock(md5_ctx_t *state, void* block){
|
||||||
state->a[3] += a[3];
|
state->a[3] += a[3];
|
||||||
state->counter++;
|
state->counter++;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void md5_lastBlock(md5_ctx_t *state, void* block, uint16_t length_b){
|
void md5_lastBlock(md5_ctx_t *state, void* block, uint16_t length_b){
|
||||||
uint16_t l;
|
uint16_t l;
|
||||||
|
|
Loading…
Reference in New Issue