.text
ENTRY(sha_transform)
stmfd sp!, {r4 - r8, lr}
@ for (i = 0; i < 16; i++)
@ W[i] = be32_to_cpu(in[i]);
mov r4, r0
mov r0, r2
mov r2,
bl memcpy
mov r2, r0
mov r0, r4
mov r3, r2
mov lr,
1: ldrb r4, [r1],
ldrb r5, [r1],
ldrb r6, [r1],
ldrb r7, [r1],
subs lr, lr,
orr r5, r5, r4, lsl
orr r6, r6, r5, lsl
orr r7, r7, r6, lsl
str r7, [r3],
bne 1b
@ for (i = 0; i < 64; i++)
@ W[i+16] = ror(W[i+13] ^ W[i+8] ^ W[i+2] ^ W[i], 31);
sub r3, r2,
mov lr,
2: ldr r4, [r3,
subs lr, lr,
ldr r5, [r3,
ldr r6, [r3,
ldr r7, [r3,
eor r4, r4, r5
eor r4, r4, r6
eor r4, r4, r7
mov r4, r4, ror
str r4, [r3,
bne 2b
.macro sha_f1, A, B, C, D, E
ldr r3, [r2],
eor ip, \C, \D
add \E, r1, \E, ror
and ip, \B, ip, ror
add \E, \E, \A, ror
eor ip, ip, \D, ror
add \E, \E, r3
add \E, \E, ip
.endm
.macro sha_f2, A, B, C, D, E
ldr r3, [r2],
add \E, r1, \E, ror
eor ip, \B, \C, ror
add \E, \E, \A, ror
eor ip, ip, \D, ror
add \E, \E, r3
add \E, \E, ip
.endm
.macro sha_f3, A, B, C, D, E
ldr r3, [r2],
add \E, r1, \E, ror
orr ip, \B, \C, ror
add \E, \E, \A, ror
and ip, ip, \D, ror
add \E, \E, r3
and r3, \B, \C, ror
orr ip, ip, r3
add \E, \E, ip
.endm
ldmia r0, {r4 - r8}
mov lr,
ldr r1, .L_sha_K + 0
mov r6, r6, ror
mov r7, r7, ror
mov r8, r8, ror
3: subs lr, lr,
sha_f1 r4, r5, r6, r7, r8
sha_f1 r8, r4, r5, r6, r7
sha_f1 r7, r8, r4, r5, r6
sha_f1 r6, r7, r8, r4, r5
sha_f1 r5, r6, r7, r8, r4
bne 3b
ldr r1, .L_sha_K + 4
mov lr,
4: subs lr, lr,
sha_f2 r4, r5, r6, r7, r8
sha_f2 r8, r4, r5, r6, r7
sha_f2 r7, r8, r4, r5, r6
sha_f2 r6, r7, r8, r4, r5
sha_f2 r5, r6, r7, r8, r4
bne 4b
ldr r1, .L_sha_K + 8
mov lr,
5: subs lr, lr,
sha_f3 r4, r5, r6, r7, r8
sha_f3 r8, r4, r5, r6, r7
sha_f3 r7, r8, r4, r5, r6
sha_f3 r6, r7, r8, r4, r5
sha_f3 r5, r6, r7, r8, r4
bne 5b
ldr r1, .L_sha_K + 12
mov lr,
6: subs lr, lr,
sha_f2 r4, r5, r6, r7, r8
sha_f2 r8, r4, r5, r6, r7
sha_f2 r7, r8, r4, r5, r6
sha_f2 r6, r7, r8, r4, r5
sha_f2 r5, r6, r7, r8, r4
bne 6b
ldmia r0, {r1, r2, r3, ip, lr}
add r4, r1, r4
add r5, r2, r5
add r6, r3, r6, ror
add r7, ip, r7, ror
add r8, lr, r8, ror
stmia r0, {r4 - r8}
ldmfd sp!, {r4 - r8, pc}
ENDPROC(sha_transform)
.align 2
.L_sha_K:
.word 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6
.align 2
.L_sha_initial_digest:
.word 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0
ENTRY(sha_init)
str lr, [sp,
adr r1, .L_sha_initial_digest
ldmia r1, {r1, r2, r3, ip, lr}
stmia r0, {r1, r2, r3, ip, lr}
ldr pc, [sp],
ENDPROC(sha_init)