1/* $NetBSD: des_cbc.S,v 1.6 2007/12/11 23:31:07 lukem Exp $ */
2
3/* Copyright (C) 1995-1997 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 des686.pl elf' by
62 * Thor Lancelot Simon <tls@NetBSD.org>
63 */
64
65#include <i386/include/asm.h>
66__KERNEL_RCSID(0, "$NetBSD: des_cbc.S,v 1.6 2007/12/11 23:31:07 lukem Exp $");
67
68ENTRY(des_ncbc_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 5
89          pushl     %ecx
90          # get and push parameter 3
91          movl      52(%esp), %eax
92          pushl     %eax
93          pushl     %ebx
94          cmpl      $0,                 %ecx
95          jz        .L004decrypt
96          andl      $4294967288,        %ebp
97          movl      12(%esp), %eax
98          movl      16(%esp), %ebx
99          jz        .L005encrypt_finish
100.L006encrypt_loop:
101          movl      (%esi),             %ecx
102          movl      4(%esi),  %edx
103          xorl      %ecx,               %eax
104          xorl      %edx,               %ebx
105          movl      %eax,               12(%esp)
106          movl      %ebx,               16(%esp)
107          call      _C_LABEL(des_encrypt1)
108          movl      12(%esp), %eax
109          movl      16(%esp), %ebx
110          movl      %eax,               (%edi)
111          movl      %ebx,               4(%edi)
112          addl      $8,                 %esi
113          addl      $8,                 %edi
114          subl      $8,                 %ebp
115          jnz       .L006encrypt_loop
116.L005encrypt_finish:
117          movl      56(%esp), %ebp
118          andl      $7,                 %ebp
119          jz        .L007finish
120          xorl      %ecx,               %ecx
121          xorl      %edx,               %edx
122          movl      .L008cbc_enc_jmp_table(,%ebp,4),%ebp
123          jmp       *%ebp
124.L009ej7:
125          movb      6(%esi),  %dh
126          sall      $8,                 %edx
127.L010ej6:
128          movb      5(%esi),  %dh
129.L011ej5:
130          movb      4(%esi),  %dl
131.L012ej4:
132          movl      (%esi),             %ecx
133          jmp       .L013ejend
134.L014ej3:
135          movb      2(%esi),  %ch
136          sall      $8,                 %ecx
137.L015ej2:
138          movb      1(%esi),  %ch
139.L016ej1:
140          movb      (%esi),             %cl
141.L013ejend:
142          xorl      %ecx,               %eax
143          xorl      %edx,               %ebx
144          movl      %eax,               12(%esp)
145          movl      %ebx,               16(%esp)
146          call      _C_LABEL(des_encrypt1)
147          movl      12(%esp), %eax
148          movl      16(%esp), %ebx
149          movl      %eax,               (%edi)
150          movl      %ebx,               4(%edi)
151          jmp       .L007finish
152#ifdef __ELF__
153.align 16
154#else
155.align 4
156#endif
157.L004decrypt:
158          andl      $4294967288,        %ebp
159          movl      20(%esp), %eax
160          movl      24(%esp), %ebx
161          jz        .L017decrypt_finish
162.L018decrypt_loop:
163          movl      (%esi),             %eax
164          movl      4(%esi),  %ebx
165          movl      %eax,               12(%esp)
166          movl      %ebx,               16(%esp)
167          call      _C_LABEL(des_encrypt1)
168          movl      12(%esp), %eax
169          movl      16(%esp), %ebx
170          movl      20(%esp), %ecx
171          movl      24(%esp), %edx
172          xorl      %eax,               %ecx
173          xorl      %ebx,               %edx
174          movl      (%esi),             %eax
175          movl      4(%esi),  %ebx
176          movl      %ecx,               (%edi)
177          movl      %edx,               4(%edi)
178          movl      %eax,               20(%esp)
179          movl      %ebx,               24(%esp)
180          addl      $8,                 %esi
181          addl      $8,                 %edi
182          subl      $8,                 %ebp
183          jnz       .L018decrypt_loop
184.L017decrypt_finish:
185          movl      56(%esp), %ebp
186          andl      $7,                 %ebp
187          jz        .L007finish
188          movl      (%esi),             %eax
189          movl      4(%esi),  %ebx
190          movl      %eax,               12(%esp)
191          movl      %ebx,               16(%esp)
192          call      _C_LABEL(des_encrypt1)
193          movl      12(%esp), %eax
194          movl      16(%esp), %ebx
195          movl      20(%esp), %ecx
196          movl      24(%esp), %edx
197          xorl      %eax,               %ecx
198          xorl      %ebx,               %edx
199          movl      (%esi),             %eax
200          movl      4(%esi),  %ebx
201.L019dj7:
202          rorl      $16,                %edx
203          movb      %dl,                6(%edi)
204          shrl      $16,                %edx
205.L020dj6:
206          movb      %dh,                5(%edi)
207.L021dj5:
208          movb      %dl,                4(%edi)
209.L022dj4:
210          movl      %ecx,               (%edi)
211          jmp       .L023djend
212.L024dj3:
213          rorl      $16,                %ecx
214          movb      %cl,                2(%edi)
215          sall      $16,                %ecx
216.L025dj2:
217          movb      %ch,                1(%esi)
218.L026dj1:
219          movb      %cl,                (%esi)
220.L023djend:
221          jmp       .L007finish
222#ifdef __ELF__
223.align 16
224#else
225.align 4
226#endif
227.L007finish:
228          movl      64(%esp), %ecx
229          addl      $28,                %esp
230          movl      %eax,               (%ecx)
231          movl      %ebx,               4(%ecx)
232          popl      %edi
233          popl      %esi
234          popl      %ebx
235          popl      %ebp
236          ret
237#ifdef __ELF__
238.align 16
239#else
240.align 4
241#endif
242.L008cbc_enc_jmp_table:
243          .long 0
244          .long .L016ej1
245          .long .L015ej2
246          .long .L014ej3
247          .long .L012ej4
248          .long .L011ej5
249          .long .L010ej6
250          .long .L009ej7
251#ifdef __ELF__
252.align 16
253#else
254.align 4
255#endif
256.L027cbc_dec_jmp_table:
257          .long 0
258          .long .L026dj1
259          .long .L025dj2
260          .long .L024dj3
261          .long .L022dj4
262          .long .L021dj5
263          .long .L020dj6
264          .long .L019dj7
265.L_des_ncbc_encrypt_end:
266          .size     _C_LABEL(des_ncbc_encrypt),.L_des_ncbc_encrypt_end-_C_LABEL(des_ncbc_encrypt)
267
268ENTRY(des_ede3_cbc_encrypt)
269
270          pushl     %ebp
271          pushl     %ebx
272          pushl     %esi
273          pushl     %edi
274          movl      28(%esp), %ebp
275          # getting iv ptr from parameter 6
276          movl      44(%esp), %ebx
277          movl      (%ebx),             %esi
278          movl      4(%ebx),  %edi
279          pushl     %edi
280          pushl     %esi
281          pushl     %edi
282          pushl     %esi
283          movl      %esp,               %ebx
284          movl      36(%esp), %esi
285          movl      40(%esp), %edi
286          # getting encrypt flag from parameter 7
287          movl      64(%esp), %ecx
288          # get and push parameter 5
289          movl      56(%esp), %eax
290          pushl     %eax
291          # get and push parameter 4
292          movl      56(%esp), %eax
293          pushl     %eax
294          # get and push parameter 3
295          movl      56(%esp), %eax
296          pushl     %eax
297          pushl     %ebx
298          cmpl      $0,                 %ecx
299          jz        .L028decrypt
300          andl      $4294967288,        %ebp
301          movl      16(%esp), %eax
302          movl      20(%esp), %ebx
303          jz        .L029encrypt_finish
304.L030encrypt_loop:
305          movl      (%esi),             %ecx
306          movl      4(%esi),  %edx
307          xorl      %ecx,               %eax
308          xorl      %edx,               %ebx
309          movl      %eax,               16(%esp)
310          movl      %ebx,               20(%esp)
311          call      _C_LABEL(des_encrypt3)
312          movl      16(%esp), %eax
313          movl      20(%esp), %ebx
314          movl      %eax,               (%edi)
315          movl      %ebx,               4(%edi)
316          addl      $8,                 %esi
317          addl      $8,                 %edi
318          subl      $8,                 %ebp
319          jnz       .L030encrypt_loop
320.L029encrypt_finish:
321          movl      60(%esp), %ebp
322          andl      $7,                 %ebp
323          jz        .L031finish
324          xorl      %ecx,               %ecx
325          xorl      %edx,               %edx
326          movl      .L032cbc_enc_jmp_table(,%ebp,4),%ebp
327          jmp       *%ebp
328.L033ej7:
329          movb      6(%esi),  %dh
330          sall      $8,                 %edx
331.L034ej6:
332          movb      5(%esi),  %dh
333.L035ej5:
334          movb      4(%esi),  %dl
335.L036ej4:
336          movl      (%esi),             %ecx
337          jmp       .L037ejend
338.L038ej3:
339          movb      2(%esi),  %ch
340          sall      $8,                 %ecx
341.L039ej2:
342          movb      1(%esi),  %ch
343.L040ej1:
344          movb      (%esi),             %cl
345.L037ejend:
346          xorl      %ecx,               %eax
347          xorl      %edx,               %ebx
348          movl      %eax,               16(%esp)
349          movl      %ebx,               20(%esp)
350          call      _C_LABEL(des_encrypt3)
351          movl      16(%esp), %eax
352          movl      20(%esp), %ebx
353          movl      %eax,               (%edi)
354          movl      %ebx,               4(%edi)
355          jmp       .L031finish
356#ifdef __ELF__
357.align 16
358#else
359.align 4
360#endif
361.L028decrypt:
362          andl      $4294967288,        %ebp
363          movl      24(%esp), %eax
364          movl      28(%esp), %ebx
365          jz        .L041decrypt_finish
366.L042decrypt_loop:
367          movl      (%esi),             %eax
368          movl      4(%esi),  %ebx
369          movl      %eax,               16(%esp)
370          movl      %ebx,               20(%esp)
371          call      _C_LABEL(des_decrypt3)
372          movl      16(%esp), %eax
373          movl      20(%esp), %ebx
374          movl      24(%esp), %ecx
375          movl      28(%esp), %edx
376          xorl      %eax,               %ecx
377          xorl      %ebx,               %edx
378          movl      (%esi),             %eax
379          movl      4(%esi),  %ebx
380          movl      %ecx,               (%edi)
381          movl      %edx,               4(%edi)
382          movl      %eax,               24(%esp)
383          movl      %ebx,               28(%esp)
384          addl      $8,                 %esi
385          addl      $8,                 %edi
386          subl      $8,                 %ebp
387          jnz       .L042decrypt_loop
388.L041decrypt_finish:
389          movl      60(%esp), %ebp
390          andl      $7,                 %ebp
391          jz        .L031finish
392          movl      (%esi),             %eax
393          movl      4(%esi),  %ebx
394          movl      %eax,               16(%esp)
395          movl      %ebx,               20(%esp)
396          call      _C_LABEL(des_decrypt3)
397          movl      16(%esp), %eax
398          movl      20(%esp), %ebx
399          movl      24(%esp), %ecx
400          movl      28(%esp), %edx
401          xorl      %eax,               %ecx
402          xorl      %ebx,               %edx
403          movl      (%esi),             %eax
404          movl      4(%esi),  %ebx
405.L043dj7:
406          rorl      $16,                %edx
407          movb      %dl,                6(%edi)
408          shrl      $16,                %edx
409.L044dj6:
410          movb      %dh,                5(%edi)
411.L045dj5:
412          movb      %dl,                4(%edi)
413.L046dj4:
414          movl      %ecx,               (%edi)
415          jmp       .L047djend
416.L048dj3:
417          rorl      $16,                %ecx
418          movb      %cl,                2(%edi)
419          sall      $16,                %ecx
420.L049dj2:
421          movb      %ch,                1(%esi)
422.L050dj1:
423          movb      %cl,                (%esi)
424.L047djend:
425          jmp       .L031finish
426#ifdef __ELF__
427.align 16
428#else
429.align 4
430#endif
431.L031finish:
432          movl      76(%esp), %ecx
433          addl      $32,                %esp
434          movl      %eax,               (%ecx)
435          movl      %ebx,               4(%ecx)
436          popl      %edi
437          popl      %esi
438          popl      %ebx
439          popl      %ebp
440          ret
441#ifdef __ELF__
442.align 16
443#else
444.align 4
445#endif
446.L032cbc_enc_jmp_table:
447          .long 0
448          .long .L040ej1
449          .long .L039ej2
450          .long .L038ej3
451          .long .L036ej4
452          .long .L035ej5
453          .long .L034ej6
454          .long .L033ej7
455#ifdef __ELF__
456.align 16
457#else
458.align 4
459#endif
460.L051cbc_dec_jmp_table:
461          .long 0
462          .long .L050dj1
463          .long .L049dj2
464          .long .L048dj3
465          .long .L046dj4
466          .long .L045dj5
467          .long .L044dj6
468          .long .L043dj7
469.L_des_ede3_cbc_encrypt_end:
470          .size     _C_LABEL(des_ede3_cbc_encrypt),.L_des_ede3_cbc_encrypt_end-_C_LABEL(des_ede3_cbc_encrypt)
471