ni.s (9703B)
1 .section ".text.crypto.aes.x86ni_keyexp","ax" 2 .global crypto.aes.x86ni_keyexp 3 .type crypto.aes.x86ni_keyexp,@function 4 crypto.aes.x86ni_keyexp: 5 pushq %rbp 6 mov %rsp, %rbp 7 8 pushq %rbx 9 pushq %rcx 10 pushq %rdx 11 12 movq 0x10(%rbp), %rbx # &key 13 movq 0x18(%rbp), %rax # keylen 14 15 movq 0x28(%rbp), %rcx # &enk_rk 16 17 mov $0x18, %rdx 18 cmp %rax, %rdx 19 je enc_key_192 20 jle enc_key_256 21 22 enc_key_128: 23 movdqu (%rbx), %xmm1 24 movdqu %xmm1, (%rcx) 25 aeskeygenassist $0x1, %xmm1, %xmm2 26 call key_expand_128 27 movdqu %xmm1, 0x10(%rcx) 28 aeskeygenassist $0x2, %xmm1, %xmm2 29 call key_expand_128 30 movdqu %xmm1, 0x20(%rcx) 31 aeskeygenassist $0x4, %xmm1, %xmm2 32 call key_expand_128 33 movdqu %xmm1, 0x30(%rcx) 34 aeskeygenassist $0x8, %xmm1, %xmm2 35 call key_expand_128 36 movdqu %xmm1, 0x40(%rcx) 37 aeskeygenassist $0x10, %xmm1, %xmm2 38 call key_expand_128 39 movdqu %xmm1, 0x50(%rcx) 40 aeskeygenassist $0x20, %xmm1, %xmm2 41 call key_expand_128 42 movdqu %xmm1, 0x60(%rcx) 43 aeskeygenassist $0x40, %xmm1, %xmm2 44 call key_expand_128 45 movdqu %xmm1, 0x70(%rcx) 46 aeskeygenassist $0x80, %xmm1, %xmm2 47 call key_expand_128 48 movdqu %xmm1, 0x80(%rcx) 49 aeskeygenassist $0x1b, %xmm1, %xmm2 50 call key_expand_128 51 movdqu %xmm1, 0x90(%rcx) 52 aeskeygenassist $0x36, %xmm1, %xmm2 53 call key_expand_128 54 movdqu %xmm1, 0xa0(%rcx) 55 56 # return rklen 57 mov $176, %rax 58 59 jmp dec_key 60 key_expand_128: 61 vpslldq $0x4, %xmm1, %xmm3 62 pxor %xmm3, %xmm1 63 vpslldq $0x4, %xmm1, %xmm3 64 pxor %xmm3, %xmm1 65 vpslldq $0x4, %xmm1, %xmm3 66 pxor %xmm3, %xmm1 67 68 pshufd $0xff, %xmm2, %xmm2 69 pxor %xmm2, %xmm1 70 ret 71 72 enc_key_192: 73 movdqu (%rbx), %xmm1 74 movdqu 0x10(%rbx), %xmm3 75 76 movdqu %xmm1, (%rcx) 77 movdqu %xmm3, %xmm5 78 79 aeskeygenassist $0x1, %xmm3, %xmm2 80 call key_expand_192 81 shufpd $0, %xmm1, %xmm5 82 movdqu %xmm5, 0x10(%rcx) 83 movdqu %xmm1, %xmm6 84 shufpd $1, %xmm3, %xmm6 85 movdqu %xmm6, 0x20(%rcx) 86 87 aeskeygenassist $0x2, %xmm3, %xmm2 88 call key_expand_192 89 movdqu %xmm1, 0x30(%rcx) 90 movdqu %xmm3, %xmm5 91 92 aeskeygenassist $0x4, %xmm3, %xmm2 93 call key_expand_192 94 shufpd $0, %xmm1, %xmm5 95 movdqu %xmm5, 0x40(%rcx) 96 movdqu %xmm1, %xmm6 97 shufpd $1, %xmm3, %xmm6 98 movdqu %xmm6, 0x50(%rcx) 99 100 aeskeygenassist $0x8, %xmm3, %xmm2 101 call key_expand_192 102 movdqu %xmm1, 0x60(%rcx) 103 movdqu %xmm3, %xmm5 104 105 aeskeygenassist $0x10, %xmm3, %xmm2 106 call key_expand_192 107 shufpd $0, %xmm1, %xmm5 108 movdqu %xmm5, 0x70(%rcx) 109 movdqu %xmm1, %xmm6 110 shufpd $1, %xmm3, %xmm6 111 movdqu %xmm6, 0x80(%rcx) 112 113 aeskeygenassist $0x20, %xmm3, %xmm2 114 call key_expand_192 115 movdqu %xmm1, 0x90(%rcx) 116 movdqu %xmm3, %xmm5 117 118 aeskeygenassist $0x40, %xmm3, %xmm2 119 call key_expand_192 120 shufpd $0, %xmm1, %xmm5 121 movdqu %xmm5, 0xa0(%rcx) 122 movdqu %xmm1, %xmm6 123 shufpd $1, %xmm3, %xmm6 124 movdqu %xmm6, 0xb0(%rcx) 125 126 aeskeygenassist $0x80, %xmm3, %xmm2 127 call key_expand_192 128 movdqu %xmm1, 0xc0(%rcx) 129 movdqu %xmm3, %xmm5 130 131 # return rklen 132 mov $208, %rax 133 134 jmp dec_key 135 136 key_expand_192: 137 vpslldq $0x4, %xmm1, %xmm4 138 pxor %xmm4, %xmm1 139 vpslldq $0x4, %xmm1, %xmm4 140 pxor %xmm4, %xmm1 141 vpslldq $0x4, %xmm1, %xmm4 142 pxor %xmm4, %xmm1 143 144 pshufd $0x55, %xmm2, %xmm2 145 pxor %xmm2, %xmm1 146 147 pshufd $0xff, %xmm1, %xmm2 148 vpslldq $0x4, %xmm3, %xmm4 149 150 pxor %xmm4, %xmm3 151 pxor %xmm2, %xmm3 152 153 ret 154 155 enc_key_256: 156 movdqu (%rbx), %xmm1 157 movdqu 0x10(%rbx), %xmm3 158 159 movdqu %xmm1, (%rcx) 160 movdqu %xmm3, 0x10(%rcx) 161 162 aeskeygenassist $0x1, %xmm3, %xmm2 163 call key_expand_256_a 164 movdqu %xmm1, 0x20(%rcx) 165 aeskeygenassist $0x0, %xmm1, %xmm2 166 call key_expand_256_b 167 movdqu %xmm3, 0x30(%rcx) 168 aeskeygenassist $0x2, %xmm3, %xmm2 169 call key_expand_256_a 170 movdqu %xmm1, 0x40(%rcx) 171 aeskeygenassist $0x0, %xmm1, %xmm2 172 call key_expand_256_b 173 movdqu %xmm3, 0x50(%rcx) 174 aeskeygenassist $0x4, %xmm3, %xmm2 175 call key_expand_256_a 176 movdqu %xmm1, 0x60(%rcx) 177 aeskeygenassist $0x0, %xmm1, %xmm2 178 call key_expand_256_b 179 movdqu %xmm3, 0x70(%rcx) 180 aeskeygenassist $0x8, %xmm3, %xmm2 181 call key_expand_256_a 182 movdqu %xmm1, 0x80(%rcx) 183 aeskeygenassist $0x0, %xmm1, %xmm2 184 call key_expand_256_b 185 movdqu %xmm3, 0x90(%rcx) 186 aeskeygenassist $0x10, %xmm3, %xmm2 187 call key_expand_256_a 188 movdqu %xmm1, 0xa0(%rcx) 189 aeskeygenassist $0x0, %xmm1, %xmm2 190 call key_expand_256_b 191 movdqu %xmm3, 0xb0(%rcx) 192 aeskeygenassist $0x20, %xmm3, %xmm2 193 call key_expand_256_a 194 movdqu %xmm1, 0xc0(%rcx) 195 aeskeygenassist $0x0, %xmm1, %xmm2 196 call key_expand_256_b 197 movdqu %xmm3, 0xd0(%rcx) 198 aeskeygenassist $0x40, %xmm3, %xmm2 199 call key_expand_256_a 200 movdqu %xmm1, 0xe0(%rcx) 201 202 # return rklen 203 mov $240, %rax 204 205 jmp dec_key 206 207 key_expand_256_a: 208 movdqa %xmm1, %xmm4 209 pslldq $4, %xmm4 210 pxor %xmm4, %xmm1 211 pslldq $4, %xmm4 212 pxor %xmm4, %xmm1 213 pslldq $4, %xmm4 214 pxor %xmm4, %xmm1 215 216 pshufd $0xff, %xmm2, %xmm2 217 pxor %xmm2, %xmm1 218 219 ret 220 221 key_expand_256_b: 222 movdqa %xmm3, %xmm4 223 pslldq $4, %xmm4 224 pxor %xmm4, %xmm3 225 pslldq $4, %xmm4 226 pxor %xmm4, %xmm3 227 pslldq $4, %xmm4 228 pxor %xmm4, %xmm3 229 230 pshufd $0xaa, %xmm2, %xmm2 231 pxor %xmm2, %xmm3 232 233 ret 234 235 dec_key: 236 movq 0x40(%rbp), %rdx # &dec_rk 237 238 # store key in reverse order, therefore add offset to last rk item 239 add %rax, %rdx 240 sub $16, %rdx 241 242 243 dec_key_start: 244 movdqu 0x0(%rcx), %xmm1 245 movdqu %xmm1, 0x0(%rdx) 246 247 movdqu 0x10(%rcx), %xmm1 248 aesimc %xmm1, %xmm1 249 movdqu %xmm1, -0x10(%rdx) 250 movdqu 0x20(%rcx), %xmm1 251 aesimc %xmm1, %xmm1 252 movdqu %xmm1, -0x20(%rdx) 253 movdqu 0x30(%rcx), %xmm1 254 aesimc %xmm1, %xmm1 255 movdqu %xmm1, -0x30(%rdx) 256 movdqu 0x40(%rcx), %xmm1 257 aesimc %xmm1, %xmm1 258 movdqu %xmm1, -0x40(%rdx) 259 movdqu 0x50(%rcx), %xmm1 260 aesimc %xmm1, %xmm1 261 movdqu %xmm1, -0x50(%rdx) 262 movdqu 0x60(%rcx), %xmm1 263 aesimc %xmm1, %xmm1 264 movdqu %xmm1, -0x60(%rdx) 265 movdqu 0x70(%rcx), %xmm1 266 aesimc %xmm1, %xmm1 267 movdqu %xmm1, -0x70(%rdx) 268 movdqu 0x80(%rcx), %xmm1 269 aesimc %xmm1, %xmm1 270 movdqu %xmm1, -0x80(%rdx) 271 movdqu 0x90(%rcx), %xmm1 272 aesimc %xmm1, %xmm1 273 movdqu %xmm1, -0x90(%rdx) 274 275 mov $208, %rbx 276 cmp %rax, %rbx 277 je dec_key_192 278 jle dec_key_256 279 280 movdqu 0xa0(%rcx), %xmm1 281 movdqu %xmm1, -0xa0(%rdx) 282 283 jmp key_exp_end 284 285 dec_key_192: 286 movdqu 0xa0(%rcx), %xmm1 287 aesimc %xmm1, %xmm1 288 movdqu %xmm1, -0xa0(%rdx) 289 movdqu 0xb0(%rcx), %xmm1 290 aesimc %xmm1, %xmm1 291 movdqu %xmm1, -0xb0(%rdx) 292 293 294 movdqu 0xc0(%rcx), %xmm1 295 movdqu %xmm1, -0xc0(%rdx) 296 297 jmp key_exp_end 298 dec_key_256: 299 movdqu 0xa0(%rcx), %xmm1 300 aesimc %xmm1, %xmm1 301 movdqu %xmm1, -0xa0(%rdx) 302 movdqu 0xb0(%rcx), %xmm1 303 aesimc %xmm1, %xmm1 304 movdqu %xmm1, -0xb0(%rdx) 305 movdqu 0xc0(%rcx), %xmm1 306 aesimc %xmm1, %xmm1 307 movdqu %xmm1, -0xc0(%rdx) 308 movdqu 0xd0(%rcx), %xmm1 309 aesimc %xmm1, %xmm1 310 movdqu %xmm1, -0xd0(%rdx) 311 312 313 movdqu 0xe0(%rcx), %xmm1 314 movdqu %xmm1, -0xe0(%rdx) 315 316 key_exp_end: 317 pxor %xmm0, %xmm0 318 pxor %xmm1, %xmm1 319 pxor %xmm2, %xmm2 320 pxor %xmm3, %xmm3 321 pxor %xmm4, %xmm4 322 pxor %xmm5, %xmm5 323 pxor %xmm6, %xmm6 324 325 popq %rdx 326 popq %rcx 327 popq %rbx 328 329 leave 330 ret 331 332 .section ".text.crypto.aes.x86ni_asencrypt","ax" 333 .global crypto.aes.x86ni_asencrypt 334 .type crypto.aes.x86ni_asencrypt,@function 335 crypto.aes.x86ni_asencrypt: 336 pushq %rbp 337 mov %rsp, %rbp 338 pushq %rbx 339 pushq %rcx 340 pushq %rdx 341 342 movq 0x10(%rbp), %rbx # &rk 343 movq 0x18(%rbp), %rax # rklen 344 345 movq 0x28(%rbp), %rcx # &dest 346 movq 0x40(%rbp), %rdx # &src 347 348 movdqu (%rdx), %xmm0 349 movdqu (%rbx), %xmm1 350 pxor %xmm1, %xmm0 351 352 movdqu 0x10(%rbx), %xmm1 353 aesenc %xmm1, %xmm0 354 movdqu 0x20(%rbx), %xmm1 355 aesenc %xmm1, %xmm0 356 movdqu 0x30(%rbx), %xmm1 357 aesenc %xmm1, %xmm0 358 movdqu 0x40(%rbx), %xmm1 359 aesenc %xmm1, %xmm0 360 movdqu 0x50(%rbx), %xmm1 361 aesenc %xmm1, %xmm0 362 movdqu 0x60(%rbx), %xmm1 363 aesenc %xmm1, %xmm0 364 movdqu 0x70(%rbx), %xmm1 365 aesenc %xmm1, %xmm0 366 movdqu 0x80(%rbx), %xmm1 367 aesenc %xmm1, %xmm0 368 movdqu 0x90(%rbx), %xmm1 369 aesenc %xmm1, %xmm0 370 371 mov $208, %rdx 372 cmp %rax, %rdx 373 jl encrypt_256 374 je encrypt_192 375 376 movdqu 0xa0(%rbx), %xmm1 377 aesenclast %xmm1, %xmm0 378 jmp encrypt_end 379 380 encrypt_192: 381 movdqu 0xa0(%rbx), %xmm1 382 aesenc %xmm1, %xmm0 383 movdqu 0xb0(%rbx), %xmm1 384 aesenc %xmm1, %xmm0 385 movdqu 0xc0(%rbx), %xmm1 386 aesenclast %xmm1, %xmm0 387 jmp encrypt_end 388 389 encrypt_256: 390 movdqu 0xa0(%rbx), %xmm1 391 aesenc %xmm1, %xmm0 392 movdqu 0xb0(%rbx), %xmm1 393 aesenc %xmm1, %xmm0 394 movdqu 0xc0(%rbx), %xmm1 395 aesenc %xmm1, %xmm0 396 movdqu 0xd0(%rbx), %xmm1 397 aesenc %xmm1, %xmm0 398 movdqu 0xe0(%rbx), %xmm1 399 aesenclast %xmm1, %xmm0 400 jmp encrypt_end 401 402 encrypt_end: 403 404 movdqu %xmm0, (%rcx) 405 406 pxor %xmm0, %xmm0 407 pxor %xmm1, %xmm1 408 409 popq %rdx 410 popq %rcx 411 popq %rbx 412 413 leave 414 ret 415 416 .section ".text.crypto.aes.x86ni_asdescrypt","ax" 417 .global crypto.aes.x86ni_asdecrypt 418 .type crypto.aes.x86ni_asdecrypt,@function 419 crypto.aes.x86ni_asdecrypt: 420 pushq %rbp 421 mov %rsp, %rbp 422 423 pushq %rbx 424 pushq %rcx 425 pushq %rdx 426 427 movq 0x10(%rbp), %rbx # &rk 428 movq 0x18(%rbp), %rax # rklen 429 430 movq 0x28(%rbp), %rcx # &dest 431 movq 0x40(%rbp), %rdx # &src 432 433 movdqu (%rdx), %xmm0 434 movdqu (%rbx), %xmm1 435 pxor %xmm1, %xmm0 436 437 movdqu 0x10(%rbx), %xmm1 438 aesdec %xmm1, %xmm0 439 movdqu 0x20(%rbx), %xmm1 440 aesdec %xmm1, %xmm0 441 movdqu 0x30(%rbx), %xmm1 442 aesdec %xmm1, %xmm0 443 movdqu 0x40(%rbx), %xmm1 444 aesdec %xmm1, %xmm0 445 movdqu 0x50(%rbx), %xmm1 446 aesdec %xmm1, %xmm0 447 movdqu 0x60(%rbx), %xmm1 448 aesdec %xmm1, %xmm0 449 movdqu 0x70(%rbx), %xmm1 450 aesdec %xmm1, %xmm0 451 movdqu 0x80(%rbx), %xmm1 452 aesdec %xmm1, %xmm0 453 movdqu 0x90(%rbx), %xmm1 454 aesdec %xmm1, %xmm0 455 456 mov $208, %rdx 457 cmp %rax, %rdx 458 je decrypt_192 459 jl decrypt_256 460 461 movdqu 0xa0(%rbx), %xmm1 462 aesdeclast %xmm1, %xmm0 463 jmp decrypt_end 464 465 decrypt_192: 466 movdqu 0xa0(%rbx), %xmm1 467 aesdec %xmm1, %xmm0 468 movdqu 0xb0(%rbx), %xmm1 469 aesdec %xmm1, %xmm0 470 movdqu 0xc0(%rbx), %xmm1 471 aesdeclast %xmm1, %xmm0 472 jmp decrypt_end 473 474 decrypt_256: 475 movdqu 0xa0(%rbx), %xmm1 476 aesdec %xmm1, %xmm0 477 movdqu 0xb0(%rbx), %xmm1 478 aesdec %xmm1, %xmm0 479 movdqu 0xc0(%rbx), %xmm1 480 aesdec %xmm1, %xmm0 481 movdqu 0xd0(%rbx), %xmm1 482 aesdec %xmm1, %xmm0 483 movdqu 0xe0(%rbx), %xmm1 484 aesdeclast %xmm1, %xmm0 485 jmp decrypt_end 486 487 decrypt_end: 488 movdqu %xmm0, (%rcx) 489 490 pxor %xmm0, %xmm0 491 pxor %xmm1, %xmm1 492 493 popq %rdx 494 popq %rcx 495 popq %rbx 496 497 leave 498 ret 499