1/* $NetBSD: des_cbc.S,v 1.5 2005/12/11 12:20:52 christos 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$");
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