]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - sys/crypto/aesni/aesencdec_i386.S
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / sys / crypto / aesni / aesencdec_i386.S
1 /*-
2  * Copyright (c) 2010 Konstantin Belousov <kib@FreeBSD.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
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.
13  *
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
24  * SUCH DAMAGE.
25  */
26
27 #include <machine/asmacros.h>
28
29 ENTRY(aesni_enc)
30         .cfi_startproc
31         pushl   %ebp
32         .cfi_adjust_cfa_offset 4
33         movl    %esp,%ebp
34         movl    8(%ebp),%ecx    /* rounds */
35         movl    16(%ebp),%edx
36         movdqu  (%edx),%xmm0    /* from */
37         movl    24(%ebp),%eax   /* iv */
38         cmpl    $0,%eax
39         je      1f
40         movdqu  (%eax),%xmm1
41         pxor    %xmm1,%xmm0
42 1:
43         movl    12(%ebp),%eax   /* key */
44         pxor    (%eax),%xmm0
45 2:
46         addl    $0x10,%eax
47 //      aesenc  (%eax),%xmm0
48         .byte   0x66,0x0f,0x38,0xdc,0x00
49         loopne  2b
50         addl    $0x10,%eax
51 //      aesenclast (%eax),%xmm0
52         .byte   0x66,0x0f,0x38,0xdd,0x00
53         movl    20(%ebp),%eax
54         movdqu  %xmm0,(%eax)    /* to */
55         leave
56         .cfi_adjust_cfa_offset -4
57         retl
58         .cfi_endproc
59 END(aesni_enc)
60
61 ENTRY(aesni_dec)
62         .cfi_startproc
63         pushl   %ebp
64         .cfi_adjust_cfa_offset 4
65         movl    %esp,%ebp
66         movl    8(%ebp),%ecx    /* rounds */
67         movl    16(%ebp),%edx
68         movdqu  (%edx),%xmm0    /* from */
69         movl    12(%ebp),%eax   /* key */
70         pxor    (%eax),%xmm0
71 1:
72         addl    $0x10,%eax
73 //      aesdec  (%eax),%xmm0
74         .byte   0x66,0x0f,0x38,0xde,0x00
75         loopne  1b
76         addl    $0x10,%eax
77 //      aesdeclast (%eax),%xmm0
78         .byte   0x66,0x0f,0x38,0xdf,0x00
79         movl    24(%ebp),%eax
80         cmpl    $0,%eax         /* iv */
81         je      2f
82         movdqu  (%eax),%xmm1
83         pxor    %xmm1,%xmm0
84 2:
85         movl    20(%ebp),%eax
86         movdqu  %xmm0,(%eax)    /* to */
87         leave
88         .cfi_adjust_cfa_offset -4
89         retl
90         .cfi_endproc
91 END(aesni_dec)
92
93 ENTRY(aesni_decrypt_cbc)
94         .cfi_startproc
95         pushl   %ebp
96         .cfi_adjust_cfa_offset 4
97         movl    %esp,%ebp
98         pushl   %ebx
99         pushl   %esi
100         movl    12(%ebp),%eax   /* key */
101         movl    16(%ebp),%ecx   /* length */
102         shrl    $4,%ecx
103         movl    20(%ebp),%ebx   /* buf */
104         movl    24(%ebp),%esi
105         movdqu  (%esi),%xmm1    /* iv */
106         movl    8(%ebp),%esi    /* rounds */
107 1:
108         movdqu  (%ebx),%xmm0
109         movdqa  %xmm0,%xmm2
110         pxor    (%eax),%xmm0
111         cmpl    $12,%esi
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
130         jge     2f
131 //      aesdeclast 0xa0(%eax),%xmm0
132         .byte   0x66,0x0f,0x38,0xdf,0x80,0xa0,0x00,0x00,0x00
133         jmp     4f
134 2:
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
139         jg      3f
140 //      aesdeclast 0xc0(%eax),%xmm0
141         .byte   0x66,0x0f,0x38,0xdf,0x80,0xc0,0x00,0x00,0x00
142         jmp     4f
143 3:
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
150 4:
151         pxor    %xmm1,%xmm0
152         movdqu  %xmm0,(%ebx)
153         movdqa  %xmm2,%xmm1
154         addl    $0x10,%ebx
155         decl    %ecx
156         jne     1b
157
158         popl    %esi
159         popl    %ebx
160         leave
161         .cfi_adjust_cfa_offset -4
162         retl
163         .cfi_endproc
164 END(aesni_decrypt_cbc)
165
166         .ident  "$FreeBSD$"