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@cryptsoft.com)
4 * All rights reserved.
5 *
6 * This package is an SSL implementation written
7 * by Eric Young (eay@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@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@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@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@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
68ENTRY(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