bf_cbc.S revision 1.6 1 /* $NetBSD: bf_cbc.S,v 1.6 2007/12/11 23:13:57 lukem Exp $ */
2
3 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
4 * All rights reserved.
5 *
6 * This package is an SSL implementation written
7 * by Eric Young (eay (at) cryptsoft.com).
8 * The implementation was written so as to conform with Netscapes SSL.
9 *
10 * This library is free for commercial and non-commercial use as long as
11 * the following conditions are aheared to. The following conditions
12 * apply to all code found in this distribution, be it the RC4, RSA,
13 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
14 * included with this distribution is covered by the same copyright terms
15 * except that the holder is Tim Hudson (tjh (at) cryptsoft.com).
16 *
17 * Copyright remains Eric Young's, and as such any Copyright notices in
18 * the code are not to be removed.
19 * If this package is used in a product, Eric Young should be given attribution
20 * as the author of the parts of the library used.
21 * This can be in the form of a textual message at program startup or
22 * in documentation (online or textual) provided with the package.
23 *
24 * Redistribution and use in source and binary forms, with or without
25 * modification, are permitted provided that the following conditions
26 * are met:
27 * 1. Redistributions of source code must retain the copyright
28 * notice, this list of conditions and the following disclaimer.
29 * 2. Redistributions in binary form must reproduce the above copyright
30 * notice, this list of conditions and the following disclaimer in the
31 * documentation and/or other materials provided with the distribution.
32 * 3. All advertising materials mentioning features or use of this software
33 * must display the following acknowledgement:
34 * "This product includes cryptographic software written by
35 * Eric Young (eay (at) cryptsoft.com)"
36 * The word 'cryptographic' can be left out if the rouines from the library
37 * being used are not cryptographic related :-).
38 * 4. If you include any Windows specific code (or a derivative thereof) from
39 * the apps directory (application code) you must include an acknowledgement:
40 * "This product includes software written by Tim Hudson (tjh (at) cryptsoft.com)"
41 *
42 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
43 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
46 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52 * SUCH DAMAGE.
53 *
54 * The licence and distribution terms for any publically available version or
55 * derivative of this code cannot be changed. i.e. this code cannot simply be
56 * copied and put under another distribution licence
57 * [including the GNU Public Licence.]
58 */
59
60 /*
61 * Modified from the output of `perl bf-686.pl elf' by
62 * Thor Lancelot Simon <tls (at) NetBSD.org>
63 */
64
65 #include <i386/include/asm.h>
66 __KERNEL_RCSID(0, "$NetBSD: bf_cbc.S,v 1.6 2007/12/11 23:13:57 lukem Exp $");
67
68 ENTRY(BF_cbc_encrypt)
69
70 pushl %ebp
71 pushl %ebx
72 pushl %esi
73 pushl %edi
74 movl 28(%esp), %ebp
75 # getting iv ptr from parameter 4
76 movl 36(%esp), %ebx
77 movl (%ebx), %esi
78 movl 4(%ebx), %edi
79 pushl %edi
80 pushl %esi
81 pushl %edi
82 pushl %esi
83 movl %esp, %ebx
84 movl 36(%esp), %esi
85 movl 40(%esp), %edi
86 # getting encrypt flag from parameter 5
87 movl 56(%esp), %ecx
88 # get and push parameter 3
89 movl 48(%esp), %eax
90 pushl %eax
91 pushl %ebx
92 cmpl $0, %ecx
93 jz .L000decrypt
94 andl $4294967288, %ebp
95 movl 8(%esp), %eax
96 movl 12(%esp), %ebx
97 jz .L001encrypt_finish
98 .L002encrypt_loop:
99 movl (%esi), %ecx
100 movl 4(%esi), %edx
101 xorl %ecx, %eax
102 xorl %edx, %ebx
103 .byte 15
104 .byte 200 # bswapl %eax
105 .byte 15
106 .byte 203 # bswapl %ebx
107 movl %eax, 8(%esp)
108 movl %ebx, 12(%esp)
109 call _C_LABEL(BF_encrypt)
110 movl 8(%esp), %eax
111 movl 12(%esp), %ebx
112 .byte 15
113 .byte 200 # bswapl %eax
114 .byte 15
115 .byte 203 # bswapl %ebx
116 movl %eax, (%edi)
117 movl %ebx, 4(%edi)
118 addl $8, %esi
119 addl $8, %edi
120 subl $8, %ebp
121 jnz .L002encrypt_loop
122 .L001encrypt_finish:
123 movl 52(%esp), %ebp
124 andl $7, %ebp
125 jz .L003finish
126 xorl %ecx, %ecx
127 xorl %edx, %edx
128 movl .L004cbc_enc_jmp_table(,%ebp,4),%ebp
129 jmp *%ebp
130 .L005ej7:
131 movb 6(%esi), %dh
132 sall $8, %edx
133 .L006ej6:
134 movb 5(%esi), %dh
135 .L007ej5:
136 movb 4(%esi), %dl
137 .L008ej4:
138 movl (%esi), %ecx
139 jmp .L009ejend
140 .L010ej3:
141 movb 2(%esi), %ch
142 sall $8, %ecx
143 .L011ej2:
144 movb 1(%esi), %ch
145 .L012ej1:
146 movb (%esi), %cl
147 .L009ejend:
148 xorl %ecx, %eax
149 xorl %edx, %ebx
150 .byte 15
151 .byte 200 # bswapl %eax
152 .byte 15
153 .byte 203 # bswapl %ebx
154 movl %eax, 8(%esp)
155 movl %ebx, 12(%esp)
156 call _C_LABEL(BF_encrypt)
157 movl 8(%esp), %eax
158 movl 12(%esp), %ebx
159 .byte 15
160 .byte 200 # bswapl %eax
161 .byte 15
162 .byte 203 # bswapl %ebx
163 movl %eax, (%edi)
164 movl %ebx, 4(%edi)
165 jmp .L003finish
166 #ifdef __ELF__
167 .align 16
168 #else
169 .align 4
170 #endif
171 .L000decrypt:
172 andl $4294967288, %ebp
173 movl 16(%esp), %eax
174 movl 20(%esp), %ebx
175 jz .L013decrypt_finish
176 .L014decrypt_loop:
177 movl (%esi), %eax
178 movl 4(%esi), %ebx
179 .byte 15
180 .byte 200 # bswapl %eax
181 .byte 15
182 .byte 203 # bswapl %ebx
183 movl %eax, 8(%esp)
184 movl %ebx, 12(%esp)
185 call _C_LABEL(BF_decrypt)
186 movl 8(%esp), %eax
187 movl 12(%esp), %ebx
188 .byte 15
189 .byte 200 # bswapl %eax
190 .byte 15
191 .byte 203 # bswapl %ebx
192 movl 16(%esp), %ecx
193 movl 20(%esp), %edx
194 xorl %eax, %ecx
195 xorl %ebx, %edx
196 movl (%esi), %eax
197 movl 4(%esi), %ebx
198 movl %ecx, (%edi)
199 movl %edx, 4(%edi)
200 movl %eax, 16(%esp)
201 movl %ebx, 20(%esp)
202 addl $8, %esi
203 addl $8, %edi
204 subl $8, %ebp
205 jnz .L014decrypt_loop
206 .L013decrypt_finish:
207 movl 52(%esp), %ebp
208 andl $7, %ebp
209 jz .L003finish
210 movl (%esi), %eax
211 movl 4(%esi), %ebx
212 .byte 15
213 .byte 200 # bswapl %eax
214 .byte 15
215 .byte 203 # bswapl %ebx
216 movl %eax, 8(%esp)
217 movl %ebx, 12(%esp)
218 call _C_LABEL(BF_decrypt)
219 movl 8(%esp), %eax
220 movl 12(%esp), %ebx
221 .byte 15
222 .byte 200 # bswapl %eax
223 .byte 15
224 .byte 203 # bswapl %ebx
225 movl 16(%esp), %ecx
226 movl 20(%esp), %edx
227 xorl %eax, %ecx
228 xorl %ebx, %edx
229 movl (%esi), %eax
230 movl 4(%esi), %ebx
231 .L015dj7:
232 rorl $16, %edx
233 movb %dl, 6(%edi)
234 shrl $16, %edx
235 .L016dj6:
236 movb %dh, 5(%edi)
237 .L017dj5:
238 movb %dl, 4(%edi)
239 .L018dj4:
240 movl %ecx, (%edi)
241 jmp .L019djend
242 .L020dj3:
243 rorl $16, %ecx
244 movb %cl, 2(%edi)
245 sall $16, %ecx
246 .L021dj2:
247 movb %ch, 1(%esi)
248 .L022dj1:
249 movb %cl, (%esi)
250 .L019djend:
251 jmp .L003finish
252 #ifdef __ELF__
253 .align 16
254 #else
255 .align 4
256 #endif
257 .L003finish:
258 movl 60(%esp), %ecx
259 addl $24, %esp
260 movl %eax, (%ecx)
261 movl %ebx, 4(%ecx)
262 popl %edi
263 popl %esi
264 popl %ebx
265 popl %ebp
266 ret
267 #ifdef __ELF__
268 .align 16
269 #else
270 .align 4
271 #endif
272 .L004cbc_enc_jmp_table:
273 .long 0
274 .long .L012ej1
275 .long .L011ej2
276 .long .L010ej3
277 .long .L008ej4
278 .long .L007ej5
279 .long .L006ej6
280 .long .L005ej7
281 #ifdef __ELF__
282 .align 16
283 #else
284 .align 4
285 #endif
286 .L023cbc_dec_jmp_table:
287 .long 0
288 .long .L022dj1
289 .long .L021dj2
290 .long .L020dj3
291 .long .L018dj4
292 .long .L017dj5
293 .long .L016dj6
294 .long .L015dj7
295 .L_BF_cbc_encrypt_end:
296 .size _C_LABEL(BF_cbc_encrypt),.L_BF_cbc_encrypt_end-_C_LABEL(BF_cbc_encrypt)
297