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