#include <machine/asmacros.h>
.text
ENTRY(_key_expansion_128)
_key_expansion_256a:
.cfi_startproc
pshufd $0b11111111,%xmm1,%xmm1
shufps $0b00010000,%xmm0,%xmm4
pxor %xmm4,%xmm0
shufps $0b10001100,%xmm0,%xmm4
pxor %xmm4,%xmm0
pxor %xmm1,%xmm0
movaps %xmm0,(%edx)
addl $0x10,%edx
retl
.cfi_endproc
END(_key_expansion_128)
ENTRY(_key_expansion_192a)
.cfi_startproc
pshufd $0b01010101,%xmm1,%xmm1
shufps $0b00010000,%xmm0,%xmm4
pxor %xmm4,%xmm0
shufps $0b10001100,%xmm0,%xmm4
pxor %xmm4,%xmm0
pxor %xmm1,%xmm0
movaps %xmm2,%xmm5
movaps %xmm2,%xmm6
pslldq $4,%xmm5
pshufd $0b11111111,%xmm0,%xmm3
pxor %xmm3,%xmm2
pxor %xmm5,%xmm2
movaps %xmm0,%xmm1
shufps $0b01000100,%xmm0,%xmm6
movaps %xmm6,(%edx)
shufps $0b01001110,%xmm2,%xmm1
movaps %xmm1,0x10(%edx)
addl $0x20,%edx
retl
.cfi_endproc
END(_key_expansion_192a)
ENTRY(_key_expansion_192b)
.cfi_startproc
pshufd $0b01010101,%xmm1,%xmm1
shufps $0b00010000,%xmm0,%xmm4
pxor %xmm4,%xmm0
shufps $0b10001100,%xmm0,%xmm4
pxor %xmm4,%xmm0
pxor %xmm1,%xmm0
movaps %xmm2,%xmm5
pslldq $4,%xmm5
pshufd $0b11111111,%xmm0,%xmm3
pxor %xmm3,%xmm2
pxor %xmm5,%xmm2
movaps %xmm0,(%edx)
addl $0x10,%edx
retl
.cfi_endproc
END(_key_expansion_192b)
ENTRY(_key_expansion_256b)
.cfi_startproc
pshufd $0b10101010,%xmm1,%xmm1
shufps $0b00010000,%xmm2,%xmm4
pxor %xmm4,%xmm2
shufps $0b10001100,%xmm2,%xmm4
pxor %xmm4,%xmm2
pxor %xmm1,%xmm2
movaps %xmm2,(%edx)
addl $0x10,%edx
retl
.cfi_endproc
END(_key_expansion_256b)
ENTRY(aesni_set_enckey)
.cfi_startproc
pushl %ebp
.cfi_adjust_cfa_offset 4
movl %esp,%ebp
movl 8(%ebp),%ecx
movl 12(%ebp),%edx
movups (%ecx),%xmm0 # user key (first 16 bytes)
movaps %xmm0,(%edx)
addl $0x10,%edx # key addr
pxor %xmm4,%xmm4 # xmm4 is assumed 0 in _key_expansion_x
cmpl $12,16(%ebp) # rounds
jb .Lenc_key128
je .Lenc_key192
movups 0x10(%ecx),%xmm2 # other user key
movaps %xmm2,(%edx)
addl $0x10,%edx
.byte 0x66,0x0f,0x3a,0xdf,0xca,0x01
call _key_expansion_256a
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x01
call _key_expansion_256b
.byte 0x66,0x0f,0x3a,0xdf,0xca,0x02
call _key_expansion_256a
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x02
call _key_expansion_256b
.byte 0x66,0x0f,0x3a,0xdf,0xca,0x04
call _key_expansion_256a
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x04
call _key_expansion_256b
.byte 0x66,0x0f,0x3a,0xdf,0xca,0x08
call _key_expansion_256a
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x08
call _key_expansion_256b
.byte 0x66,0x0f,0x3a,0xdf,0xca,0x10
call _key_expansion_256a
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x10
call _key_expansion_256b
.byte 0x66,0x0f,0x3a,0xdf,0xca,0x20
call _key_expansion_256a
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x20
call _key_expansion_256b
.byte 0x66,0x0f,0x3a,0xdf,0xca,0x40
call _key_expansion_256a
.cfi_adjust_cfa_offset -4
leave
retl
.Lenc_key192:
movq 0x10(%ecx),%xmm2 # other user key
.byte 0x66,0x0f,0x3a,0xdf,0xca,0x01
call _key_expansion_192a
.byte 0x66,0x0f,0x3a,0xdf,0xca,0x02
call _key_expansion_192b
.byte 0x66,0x0f,0x3a,0xdf,0xca,0x04
call _key_expansion_192a
.byte 0x66,0x0f,0x3a,0xdf,0xca,0x08
call _key_expansion_192b
.byte 0x66,0x0f,0x3a,0xdf,0xca,0x10
call _key_expansion_192a
.byte 0x66,0x0f,0x3a,0xdf,0xca,0x20
call _key_expansion_192b
.byte 0x66,0x0f,0x3a,0xdf,0xca,0x40
call _key_expansion_192a
.byte 0x66,0x0f,0x3a,0xdf,0xca,0x80
call _key_expansion_192b
leave
.cfi_adjust_cfa_offset -4
retl
.Lenc_key128:
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x01
call _key_expansion_128
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x02
call _key_expansion_128
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x04
call _key_expansion_128
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x08
call _key_expansion_128
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x10
call _key_expansion_128
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x20
call _key_expansion_128
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x40
call _key_expansion_128
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x80
call _key_expansion_128
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x1b
call _key_expansion_128
.byte 0x66,0x0f,0x3a,0xdf,0xc8,0x36
call _key_expansion_128
leave
.cfi_adjust_cfa_offset -4
retl
.cfi_endproc
END(aesni_set_enckey)
ENTRY(aesni_set_deckey)
.cfi_startproc
pushl %ebp
.cfi_adjust_cfa_offset 4
movl %esp,%ebp
movl 16(%ebp),%eax
movl %eax,%ecx
shll $4,%ecx
addl 8(%ebp),%ecx
movl 12(%ebp),%edx
movdqa (%ecx),%xmm0
movdqa %xmm0,(%edx)
decl %eax
1:
addl $0x10,%edx
subl $0x10,%ecx
.byte 0x66,0x0f,0x38,0xdb,0x09
movdqa %xmm1,(%edx)
decl %eax
jne 1b
addl $0x10,%edx
subl $0x10,%ecx
movdqa (%ecx),%xmm0
movdqa %xmm0,(%edx)
leave
.cfi_adjust_cfa_offset -4
retl
.cfi_endproc
END(aesni_set_deckey)