2 * Copyright (c) 2010 Konstantin Belousov <kib@FreeBSD.org>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 #include <machine/asmacros.h>
32 .cfi_adjust_cfa_offset 4
34 movl 8(%ebp),%ecx /* rounds */
36 movdqu (%edx),%xmm0 /* from */
37 movl 24(%ebp),%eax /* iv */
43 movl 12(%ebp),%eax /* key */
47 // aesenc (%eax),%xmm0
48 .byte 0x66,0x0f,0x38,0xdc,0x00
51 // aesenclast (%eax),%xmm0
52 .byte 0x66,0x0f,0x38,0xdd,0x00
54 movdqu %xmm0,(%eax) /* to */
56 .cfi_adjust_cfa_offset -4
64 .cfi_adjust_cfa_offset 4
66 movl 8(%ebp),%ecx /* rounds */
68 movdqu (%edx),%xmm0 /* from */
69 movl 12(%ebp),%eax /* key */
73 // aesdec (%eax),%xmm0
74 .byte 0x66,0x0f,0x38,0xde,0x00
77 // aesdeclast (%eax),%xmm0
78 .byte 0x66,0x0f,0x38,0xdf,0x00
86 movdqu %xmm0,(%eax) /* to */
88 .cfi_adjust_cfa_offset -4
93 ENTRY(aesni_decrypt_cbc)
96 .cfi_adjust_cfa_offset 4
100 movl 12(%ebp),%eax /* key */
101 movl 16(%ebp),%ecx /* length */
103 movl 20(%ebp),%ebx /* buf */
105 movdqu (%esi),%xmm1 /* iv */
106 movl 8(%ebp),%esi /* rounds */
112 // aesdec 0x10(%eax),%xmm0
113 .byte 0x66,0x0f,0x38,0xde,0x40,0x10
114 // aesdec 0x20(%eax),%xmm0
115 .byte 0x66,0x0f,0x38,0xde,0x40,0x20
116 // aesdec 0x30(%eax),%xmm0
117 .byte 0x66,0x0f,0x38,0xde,0x40,0x30
118 // aesdec 0x40(%eax),%xmm0
119 .byte 0x66,0x0f,0x38,0xde,0x40,0x40
120 // aesdec 0x50(%eax),%xmm0
121 .byte 0x66,0x0f,0x38,0xde,0x40,0x50
122 // aesdec 0x60(%eax),%xmm0
123 .byte 0x66,0x0f,0x38,0xde,0x40,0x60
124 // aesdec 0x70(%eax),%xmm0
125 .byte 0x66,0x0f,0x38,0xde,0x40,0x70
126 // aesdec 0x80(%eax),%xmm0
127 .byte 0x66,0x0f,0x38,0xde,0x80,0x80,0x00,0x00,0x00
128 // aesdec 0x90(%eax),%xmm0
129 .byte 0x66,0x0f,0x38,0xde,0x80,0x90,0x00,0x00,0x00
131 // aesdeclast 0xa0(%eax),%xmm0
132 .byte 0x66,0x0f,0x38,0xdf,0x80,0xa0,0x00,0x00,0x00
135 // aesdec 0xa0(%eax),%xmm0
136 .byte 0x66,0x0f,0x38,0xde,0x80,0xa0,0x00,0x00,0x00
137 // aesdec 0xb0(%eax),%xmm0
138 .byte 0x66,0x0f,0x38,0xde,0x80,0xb0,0x00,0x00,0x00
140 // aesdeclast 0xc0(%eax),%xmm0
141 .byte 0x66,0x0f,0x38,0xdf,0x80,0xc0,0x00,0x00,0x00
144 // aesdec 0xc0(%eax),%xmm0
145 .byte 0x66,0x0f,0x38,0xde,0x80,0xc0,0x00,0x00,0x00
146 // aesdec 0xd0(%eax),%xmm0
147 .byte 0x66,0x0f,0x38,0xde,0x80,0xd0,0x00,0x00,0x00
148 // aesdeclast 0xe0(%eax),%xmm0
149 .byte 0x66,0x0f,0x38,0xdf,0x80,0xe0,0x00,0x00,0x00
161 .cfi_adjust_cfa_offset -4
164 END(aesni_decrypt_cbc)