58 lines
1.3 KiB
ArmAsm
58 lines
1.3 KiB
ArmAsm
// The AES-NI, SHA and carry-less multiply round instructions as GOROOT's
|
|
// crypto kernels spell them. Every result is folded back so no instruction
|
|
// is dead.
|
|
|
|
#include "textflag.h"
|
|
|
|
// func aesround(blk, rk *byte)
|
|
TEXT ·aesround(SB), NOSPLIT, $0-16
|
|
MOVQ blk+0(FP), SI
|
|
MOVQ rk+8(FP), DI
|
|
MOVOU (SI), X0
|
|
MOVOU (DI), X1
|
|
AESENC X1, X0
|
|
AESENCLAST X1, X0
|
|
AESDEC X1, X0
|
|
AESDECLAST X1, X0
|
|
AESIMC X1, X2
|
|
AESKEYGENASSIST $1, X1, X3
|
|
MOVOU X0, (SI)
|
|
MOVOU X2, (DI)
|
|
RET
|
|
|
|
// func sha1block(p *byte, n int, h *[5]uint32)
|
|
TEXT ·sha1block(SB), NOSPLIT, $0-24
|
|
MOVQ p+0(FP), SI
|
|
MOVQ h+16(FP), DI
|
|
MOVOU (SI), X0
|
|
MOVOU 16(SI), X1
|
|
SHA1RNDS4 $0, X1, X0
|
|
SHA1NEXTE X1, X0
|
|
SHA1MSG1 X1, X2
|
|
SHA1MSG2 X1, X2
|
|
MOVOU X0, (DI)
|
|
RET
|
|
|
|
// func sha256block(p *byte, n int, h *[8]uint32)
|
|
TEXT ·sha256block(SB), NOSPLIT, $0-24
|
|
MOVQ p+0(FP), SI
|
|
MOVQ h+16(FP), DI
|
|
MOVOU (SI), X0
|
|
MOVOU 16(SI), X1
|
|
SHA256RNDS2 X0, X1, X0
|
|
SHA256MSG1 X1, X2
|
|
SHA256MSG2 X1, X2
|
|
MOVOU X0, (DI)
|
|
RET
|
|
|
|
// func pclmul(a, b *byte)
|
|
TEXT ·pclmul(SB), NOSPLIT, $0-16
|
|
MOVQ a+0(FP), SI
|
|
MOVQ b+8(FP), DI
|
|
MOVOU (SI), X0
|
|
MOVOU (DI), X1
|
|
PCLMULQDQ $0, X1, X0
|
|
PCLMULQDQ $17, (DI), X0
|
|
MOVOU X0, (SI)
|
|
RET
|