447 lines
12 KiB
ArmAsm
Executable File
447 lines
12 KiB
ArmAsm
Executable File
@ The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
|
|
@ Michaël Peeters and Gilles Van Assche. For more information, feedback or
|
|
@ questions, please refer to our website: http://keccak.noekeon.org/
|
|
@
|
|
@ Implementation by Ronny Van Keer, hereby denoted as "the implementer".
|
|
@
|
|
@ To the extent possible under law, the implementer has waived all copyright
|
|
@ and related or neighboring rights to the source code in this file.
|
|
@ http://creativecommons.org/publicdomain/zero/1.0/
|
|
|
|
@ This file was created from a .asm file
|
|
@ using the ads2gas.pl script.
|
|
.equ DO1STROUNDING, 0
|
|
|
|
@ PRESERVE8
|
|
.text
|
|
|
|
@// --- offsets in state
|
|
.equ Aba, 0*8
|
|
.equ Aga, 1*8
|
|
.equ Aka, 2*8
|
|
.equ Ama, 3*8
|
|
.equ Asa, 4*8
|
|
|
|
@// --- macros
|
|
|
|
.macro KeccakThetaRhoPiChiIota argA1, argA2, argA3, argA4, argA5
|
|
|
|
@Prepare Theta
|
|
@Ca = Aba^Aga^Aka^Ama^Asa@
|
|
@Ce = Abe^Age^Ake^Ame^Ase@
|
|
@Ci = Abi^Agi^Aki^Ami^Asi@
|
|
@Co = Abo^Ago^Ako^Amo^Aso@
|
|
@Cu = Abu^Agu^Aku^Amu^Asu@
|
|
@De = Ca^ROL64(Ci, 1)@
|
|
@Di = Ce^ROL64(Co, 1)@
|
|
@Do = Ci^ROL64(Cu, 1)@
|
|
@Du = Co^ROL64(Ca, 1)@
|
|
@Da = Cu^ROL64(Ce, 1)@
|
|
|
|
veor.64 q4, q6, q7
|
|
veor.64 q5, q9, q10
|
|
veor.64 d8, d8, d9
|
|
veor.64 d10, d10, d11
|
|
veor.64 d1, d8, d16
|
|
veor.64 d2, d10, d17
|
|
|
|
veor.64 q4, q11, q12
|
|
veor.64 q5, q14, q15
|
|
veor.64 d8, d8, d9
|
|
veor.64 d10, d10, d11
|
|
veor.64 d3, d8, d26
|
|
|
|
vadd.u64 q4, q1, q1
|
|
veor.64 d4, d10, d27
|
|
vmov.64 d0, d5
|
|
vsri.64 q4, q1, #63
|
|
|
|
vadd.u64 q5, q2, q2
|
|
veor.64 q4, q4, q0
|
|
vsri.64 q5, q2, #63
|
|
vadd.u64 d7, d1, d1
|
|
veor.64 \argA2, \argA2, d8
|
|
veor.64 q5, q5, q1
|
|
|
|
vsri.64 d7, d1, #63
|
|
vshl.u64 d1, \argA2, #44
|
|
veor.64 \argA3, \argA3, d9
|
|
veor.64 d7, d7, d4
|
|
|
|
@Ba = argA1^Da@
|
|
@Be = ROL64((argA2^De), 44)@
|
|
@Bi = ROL64((argA3^Di), 43)@
|
|
@Bo = ROL64((argA4^Do), 21)@
|
|
@Bu = ROL64((argA5^Du), 14)@
|
|
@argA2 = Be ^((~Bi)& Bo )@
|
|
@argA3 = Bi ^((~Bo)& Bu )@
|
|
@argA4 = Bo ^((~Bu)& Ba )@
|
|
@argA5 = Bu ^((~Ba)& Be )@
|
|
@argA1 = Ba ^((~Be)& Bi )@ argA1 ^= KeccakF1600RoundConstants[i+round]@
|
|
vsri.64 d1, \argA2, #64-44
|
|
vshl.u64 d2, \argA3, #43
|
|
vldr.64 d0, [sp, #\argA1]
|
|
veor.64 \argA4, \argA4, d10
|
|
vsri.64 d2, \argA3, #64-43
|
|
vshl.u64 d3, \argA4, #21
|
|
veor.64 \argA5, \argA5, d11
|
|
veor.64 d0, d0, d7
|
|
vsri.64 d3, \argA4, #64-21
|
|
vbic.64 d5, d2, d1
|
|
vshl.u64 d4, \argA5, #14
|
|
vbic.64 \argA2, d3, d2
|
|
vld1.64 d6, [r3]!
|
|
veor.64 d5, d0
|
|
vsri.64 d4, \argA5, #64-14
|
|
veor.64 d5, d6
|
|
vbic.64 \argA5, d1, d0
|
|
vbic.64 \argA3, d4, d3
|
|
vbic.64 \argA4, d0, d4
|
|
veor.64 \argA2, d1
|
|
vstr.64 d5, [sp, #\argA1]
|
|
veor.64 \argA3, d2
|
|
veor.64 \argA4, d3
|
|
veor.64 \argA5, d4
|
|
|
|
.endm
|
|
|
|
.macro KeccakThetaRhoPiChi1 argA1, argA2, argA3, argA4, argA5
|
|
|
|
@d2 = ROL64((argA1^Da), 3)@
|
|
@d3 = ROL64((argA2^De), 45)@
|
|
@d4 = ROL64((argA3^Di), 61)@
|
|
@d0 = ROL64((argA4^Do), 28)@
|
|
@d1 = ROL64((argA5^Du), 20)@
|
|
@argA1 = Ba ^((~Be)& Bi )@ Ca ^= argA1@
|
|
@argA2 = Be ^((~Bi)& Bo )@
|
|
@argA3 = Bi ^((~Bo)& Bu )@
|
|
@argA4 = Bo ^((~Bu)& Ba )@
|
|
@argA5 = Bu ^((~Ba)& Be )@
|
|
|
|
veor.64 \argA2, \argA2, d8
|
|
veor.64 \argA3, \argA3, d9
|
|
vshl.u64 d3, \argA2, #45
|
|
vldr.64 d6, [sp, #\argA1]
|
|
vshl.u64 d4, \argA3, #61
|
|
veor.64 \argA4, \argA4, d10
|
|
vsri.64 d3, \argA2, #64-45
|
|
veor.64 \argA5, \argA5, d11
|
|
vsri.64 d4, \argA3, #64-61
|
|
vshl.u64 d0, \argA4, #28
|
|
veor.64 d6, d6, d7
|
|
vshl.u64 d1, \argA5, #20
|
|
vbic.64 \argA3, d4, d3
|
|
vsri.64 d0, \argA4, #64-28
|
|
vbic.64 \argA4, d0, d4
|
|
vshl.u64 d2, d6, #3
|
|
vsri.64 d1, \argA5, #64-20
|
|
veor.64 \argA4, d3
|
|
vsri.64 d2, d6, #64-3
|
|
vbic.64 \argA5, d1, d0
|
|
vbic.64 d6, d2, d1
|
|
vbic.64 \argA2, d3, d2
|
|
veor.64 d6, d0
|
|
veor.64 \argA2, d1
|
|
vstr.64 d6, [sp, #\argA1]
|
|
veor.64 \argA3, d2
|
|
veor.64 d5, d6
|
|
veor.64 \argA5, d4
|
|
|
|
.endm
|
|
|
|
.macro KeccakThetaRhoPiChi2 argA1, argA2, argA3, argA4, argA5
|
|
|
|
@d4 = ROL64((argA1^Da), 18)@
|
|
@d0 = ROL64((argA2^De), 1)@
|
|
@d1 = ROL64((argA3^Di), 6)@
|
|
@d2 = ROL64((argA4^Do), 25)@
|
|
@d3 = ROL64((argA5^Du), 8)@
|
|
@argA1 = Ba ^((~Be)& Bi )@ Ca ^= argA1@
|
|
@argA2 = Be ^((~Bi)& Bo )@
|
|
@argA3 = Bi ^((~Bo)& Bu )@
|
|
@argA4 = Bo ^((~Bu)& Ba )@
|
|
@argA5 = Bu ^((~Ba)& Be )@
|
|
|
|
veor.64 \argA3, \argA3, d9
|
|
veor.64 \argA4, \argA4, d10
|
|
vshl.u64 d1, \argA3, #6
|
|
vldr.64 d6, [sp, #\argA1]
|
|
vshl.u64 d2, \argA4, #25
|
|
veor.64 \argA5, \argA5, d11
|
|
vsri.64 d1, \argA3, #64-6
|
|
veor.64 \argA2, \argA2, d8
|
|
vsri.64 d2, \argA4, #64-25
|
|
vext.8 d3, \argA5, \argA5, #7
|
|
veor.64 d6, d6, d7
|
|
vbic.64 \argA3, d2, d1
|
|
vadd.u64 d0, \argA2, \argA2
|
|
vbic.64 \argA4, d3, d2
|
|
vsri.64 d0, \argA2, #64-1
|
|
vshl.u64 d4, d6, #18
|
|
veor.64 \argA2, d1, \argA4
|
|
veor.64 \argA3, d0
|
|
vsri.64 d4, d6, #64-18
|
|
vstr.64 \argA3, [sp, #\argA1]
|
|
veor.64 d5, \argA3
|
|
vbic.64 \argA5, d1, d0
|
|
vbic.64 \argA3, d4, d3
|
|
vbic.64 \argA4, d0, d4
|
|
veor.64 \argA3, d2
|
|
veor.64 \argA4, d3
|
|
veor.64 \argA5, d4
|
|
|
|
.endm
|
|
|
|
.macro KeccakThetaRhoPiChi3 argA1, argA2, argA3, argA4, argA5
|
|
|
|
@d1 = ROL64((argA1^Da), 36)@
|
|
@d2 = ROL64((argA2^De), 10)@
|
|
@d3 = ROL64((argA3^Di), 15)@
|
|
@d4 = ROL64((argA4^Do), 56)@
|
|
@d0 = ROL64((argA5^Du), 27)@
|
|
@argA1 = Ba ^((~Be)& Bi )@ Ca ^= argA1@
|
|
@argA2 = Be ^((~Bi)& Bo )@
|
|
@argA3 = Bi ^((~Bo)& Bu )@
|
|
@argA4 = Bo ^((~Bu)& Ba )@
|
|
@argA5 = Bu ^((~Ba)& Be )@
|
|
|
|
veor.64 \argA2, \argA2, d8
|
|
veor.64 \argA3, \argA3, d9
|
|
vshl.u64 d2, \argA2, #10
|
|
vldr.64 d6, [sp, #\argA1]
|
|
vshl.u64 d3, \argA3, #15
|
|
veor.64 \argA4, \argA4, d10
|
|
vsri.64 d2, \argA2, #64-10
|
|
vsri.64 d3, \argA3, #64-15
|
|
veor.64 \argA5, \argA5, d11
|
|
vext.8 d4, \argA4, \argA4, #1
|
|
vbic.64 \argA2, d3, d2
|
|
vshl.u64 d0, \argA5, #27
|
|
veor.64 d6, d6, d7
|
|
vbic.64 \argA3, d4, d3
|
|
vsri.64 d0, \argA5, #64-27
|
|
vshl.u64 d1, d6, #36
|
|
veor.64 \argA3, d2
|
|
vbic.64 \argA4, d0, d4
|
|
vsri.64 d1, d6, #64-36
|
|
|
|
veor.64 \argA4, d3
|
|
vbic.64 d6, d2, d1
|
|
vbic.64 \argA5, d1, d0
|
|
veor.64 d6, d0
|
|
veor.64 \argA2, d1
|
|
vstr.64 d6, [sp, #\argA1]
|
|
veor.64 d5, d6
|
|
veor.64 \argA5, d4
|
|
|
|
.endm
|
|
|
|
.macro KeccakThetaRhoPiChi4 argA1, argA2, argA3, argA4, argA5
|
|
|
|
@d3 = ROL64((argA1^Da), 41)@
|
|
@d4 = ROL64((argA2^De), 2)@
|
|
@d0 = ROL64((argA3^Di), 62)@
|
|
@d1 = ROL64((argA4^Do), 55)@
|
|
@d2 = ROL64((argA5^Du), 39)@
|
|
@argA1 = Ba ^((~Be)& Bi )@ Ca ^= argA1@
|
|
@argA2 = Be ^((~Bi)& Bo )@
|
|
@argA3 = Bi ^((~Bo)& Bu )@
|
|
@argA4 = Bo ^((~Bu)& Ba )@
|
|
@argA5 = Bu ^((~Ba)& Be )@
|
|
|
|
veor.64 \argA2, \argA2, d8
|
|
veor.64 \argA3, \argA3, d9
|
|
vshl.u64 d4, \argA2, #2
|
|
veor.64 \argA5, \argA5, d11
|
|
vshl.u64 d0, \argA3, #62
|
|
vldr.64 d6, [sp, #\argA1]
|
|
vsri.64 d4, \argA2, #64-2
|
|
veor.64 \argA4, \argA4, d10
|
|
vsri.64 d0, \argA3, #64-62
|
|
|
|
vshl.u64 d1, \argA4, #55
|
|
veor.64 d6, d6, d7
|
|
vshl.u64 d2, \argA5, #39
|
|
vsri.64 d1, \argA4, #64-55
|
|
vbic.64 \argA4, d0, d4
|
|
vsri.64 d2, \argA5, #64-39
|
|
vbic.64 \argA2, d1, d0
|
|
vshl.u64 d3, d6, #41
|
|
veor.64 \argA5, d4, \argA2
|
|
vbic.64 \argA2, d2, d1
|
|
vsri.64 d3, d6, #64-41
|
|
veor.64 d6, d0, \argA2
|
|
|
|
vbic.64 \argA2, d3, d2
|
|
vbic.64 \argA3, d4, d3
|
|
veor.64 \argA2, d1
|
|
vstr.64 d6, [sp, #\argA1]
|
|
veor.64 d5, d6
|
|
veor.64 \argA3, d2
|
|
veor.64 \argA4, d3
|
|
|
|
.endm
|
|
|
|
@// --- constants
|
|
|
|
|
|
.align 8
|
|
.ltorg
|
|
KeccakF1600RoundConstantsWithTerminator:
|
|
.quad 0x0000000000000001
|
|
.quad 0x0000000000008082
|
|
.quad 0x800000000000808a
|
|
.quad 0x8000000080008000
|
|
.quad 0x000000000000808b
|
|
.quad 0x0000000080000001
|
|
.quad 0x8000000080008081
|
|
.quad 0x8000000000008009
|
|
.quad 0x000000000000008a
|
|
.quad 0x0000000000000088
|
|
.quad 0x0000000080008009
|
|
.quad 0x000000008000000a
|
|
.quad 0x000000008000808b
|
|
.quad 0x800000000000008b
|
|
.quad 0x8000000000008089
|
|
.quad 0x8000000000008003
|
|
.quad 0x8000000000008002
|
|
.quad 0x8000000000000080
|
|
.quad 0x000000000000800a
|
|
.quad 0x800000008000000a
|
|
.quad 0x8000000080008081
|
|
.quad 0x8000000000008080
|
|
.quad 0x0000000080000001
|
|
.quad 0x8000000080008008
|
|
.quad 0xFFFFFFFFFFFFFFFF @//terminator
|
|
|
|
.align 8
|
|
|
|
@// --- code
|
|
|
|
@not callable from C!
|
|
.global KeccakF_armv7a_neon_asm
|
|
KeccakF_armv7a_neon_asm: @
|
|
|
|
adr r3, KeccakF1600RoundConstantsWithTerminator
|
|
roundLoop:
|
|
|
|
KeccakThetaRhoPiChiIota Aba, d13, d19, d25, d31
|
|
KeccakThetaRhoPiChi1 Aka, d15, d21, d22, d28
|
|
KeccakThetaRhoPiChi2 Asa, d12, d18, d24, d30
|
|
KeccakThetaRhoPiChi3 Aga, d14, d20, d26, d27
|
|
KeccakThetaRhoPiChi4 Ama, d16, d17, d23, d29
|
|
|
|
KeccakThetaRhoPiChiIota Aba, d15, d18, d26, d29
|
|
KeccakThetaRhoPiChi1 Asa, d14, d17, d25, d28
|
|
KeccakThetaRhoPiChi2 Ama, d13, d21, d24, d27
|
|
KeccakThetaRhoPiChi3 Aka, d12, d20, d23, d31
|
|
KeccakThetaRhoPiChi4 Aga, d16, d19, d22, d30
|
|
|
|
KeccakThetaRhoPiChiIota Aba, d14, d21, d23, d30
|
|
KeccakThetaRhoPiChi1 Ama, d12, d19, d26, d28
|
|
KeccakThetaRhoPiChi2 Aga, d15, d17, d24, d31
|
|
KeccakThetaRhoPiChi3 Asa, d13, d20, d22, d29
|
|
KeccakThetaRhoPiChi4 Aka, d16, d18, d25, d27
|
|
|
|
KeccakThetaRhoPiChiIota Aba, d12, d17, d22, d27
|
|
KeccakThetaRhoPiChi1 Aga, d13, d18, d23, d28
|
|
KeccakThetaRhoPiChi2 Aka, d14, d19, d24, d29
|
|
ldr r0, [r3]
|
|
KeccakThetaRhoPiChi3 Ama, d15, d20, d25, d30
|
|
cmp r0, #0xFFFFFFFF
|
|
KeccakThetaRhoPiChi4 Asa, d16, d21, d26, d31
|
|
|
|
bne roundLoop
|
|
bx lr
|
|
|
|
@
|
|
.align 8
|
|
|
|
@//void KeccakF_armv7a( tKeccakLane * state ) callable from C
|
|
.global KeccakF_armv7a_neon
|
|
KeccakF_armv7a_neon: @
|
|
|
|
vpush {q4-q7}
|
|
sub sp,sp, #5*8
|
|
|
|
vldr.64 d0, [r0, #0*8]
|
|
vldr.64 d12, [r0, #1*8]
|
|
vldr.64 d17, [r0, #2*8]
|
|
vldr.64 d22, [r0, #3*8]
|
|
vldr.64 d27, [r0, #4*8]
|
|
|
|
vldr.64 d1, [r0, #5*8]
|
|
vldr.64 d13, [r0, #6*8]
|
|
vldr.64 d18, [r0, #7*8]
|
|
vldr.64 d23, [r0, #8*8]
|
|
vldr.64 d28, [r0, #9*8]
|
|
|
|
vldr.64 d2, [r0, #10*8]
|
|
vldr.64 d14, [r0, #11*8]
|
|
vldr.64 d19, [r0, #12*8]
|
|
vldr.64 d24, [r0, #13*8]
|
|
vldr.64 d29, [r0, #14*8]
|
|
|
|
vldr.64 d3, [r0, #15*8]
|
|
vldr.64 d15, [r0, #16*8]
|
|
vldr.64 d20, [r0, #17*8]
|
|
vldr.64 d25, [r0, #18*8]
|
|
vldr.64 d30, [r0, #19*8]
|
|
|
|
vldr.64 d4, [r0, #20*8]
|
|
vldr.64 d16, [r0, #21*8]
|
|
vldr.64 d21, [r0, #22*8]
|
|
vldr.64 d26, [r0, #23*8]
|
|
vldr.64 d31, [r0, #24*8]
|
|
|
|
vstr.64 d0, [sp, #Aba]
|
|
mov r2, lr
|
|
vstr.64 d1, [sp, #Aga]
|
|
veor.64 q0, q0, q1
|
|
vstr.64 d2, [sp, #Aka]
|
|
veor.64 d5, d0, d1
|
|
vstr.64 d3, [sp, #Ama]
|
|
mov r1, r0
|
|
vstr.64 d4, [sp, #Asa]
|
|
veor.64 d5, d5, d4
|
|
|
|
bl KeccakF_armv7a_neon_asm
|
|
|
|
vpop.64 { d0- d4 }
|
|
|
|
vstr.64 d0, [r1, #0*8]
|
|
vstr.64 d12, [r1, #1*8]
|
|
vstr.64 d17, [r1, #2*8]
|
|
vstr.64 d22, [r1, #3*8]
|
|
vstr.64 d27, [r1, #4*8]
|
|
|
|
vstr.64 d1, [r1, #5*8]
|
|
vstr.64 d13, [r1, #6*8]
|
|
vstr.64 d18, [r1, #7*8]
|
|
vstr.64 d23, [r1, #8*8]
|
|
vstr.64 d28, [r1, #9*8]
|
|
|
|
vstr.64 d2, [r1, #10*8]
|
|
vstr.64 d14, [r1, #11*8]
|
|
vstr.64 d19, [r1, #12*8]
|
|
vstr.64 d24, [r1, #13*8]
|
|
vstr.64 d29, [r1, #14*8]
|
|
|
|
vstr.64 d3, [r1, #15*8]
|
|
vstr.64 d15, [r1, #16*8]
|
|
vstr.64 d20, [r1, #17*8]
|
|
vstr.64 d25, [r1, #18*8]
|
|
vstr.64 d30, [r1, #19*8]
|
|
|
|
vstr.64 d4, [r1, #20*8]
|
|
vstr.64 d16, [r1, #21*8]
|
|
vstr.64 d21, [r1, #22*8]
|
|
vstr.64 d26, [r1, #23*8]
|
|
vstr.64 d31, [r1, #24*8]
|
|
|
|
vpop {q4-q7}
|
|
bx r2
|
|
|
|
@
|
|
|