1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2/* 3 * Implement AES algorithm in Intel AES-NI instructions. 4 * 5 * The white paper of AES-NI instructions can be downloaded from: 6 * http://softwarecommunity.intel.com/isn/downloads/intelavx/AES-Instructions-Set_WP.pdf 7 * 8 * Copyright (C) 2008, Intel Corp. 9 * Author: Huang Ying <ying.huang@intel.com> 10 * Vinodh Gopal <vinodh.gopal@intel.com> 11 * Kahraman Akdemir 12 * 13 * Added RFC4106 AES-GCM support for 128-bit keys under the AEAD 14 * interface for 64-bit kernels. 15 * Authors: Erdinc Ozturk (erdinc.ozturk@intel.com) 16 * Aidan O'Mahony (aidan.o.mahony@intel.com) 17 * Adrian Hoban <adrian.hoban@intel.com> 18 * James Guilford (james.guilford@intel.com) 19 * Gabriele Paoloni <gabriele.paoloni@intel.com> 20 * Tadeusz Struk (tadeusz.struk@intel.com) 21 * Wajdi Feghali (wajdi.k.feghali@intel.com) 22 * Copyright (c) 2010, Intel Corporation. 23 * 24 * Ported x86_64 version to x86: 25 * Author: Mathias Krause <minipli@googlemail.com> 26 */ 27 28#include <linux/linkage.h> 29#include <asm/frame.h> 30#include <asm/nospec-branch.h> 31 32/* 33 * The following macros are used to move an (un)aligned 16 byte value to/from 34 * an XMM register. This can done for either FP or integer values, for FP use 35 * movaps (move aligned packed single) or integer use movdqa (move double quad 36 * aligned). It doesn't make a performance difference which instruction is used 37 * since Nehalem (original Core i7) was released. However, the movaps is a byte 38 * shorter, so that is the one we'll use for now. (same for unaligned). 39 */ 40#define MOVADQ movaps 41#define MOVUDQ movups 42 43#ifdef __x86_64__ 44 45# constants in mergeable sections, linker can reorder and merge 46.section .rodata.cst16.POLY, "aM", @progbits, 16 47.align 16 48POLY: .octa 0xC2000000000000000000000000000001 49.section .rodata.cst16.TWOONE, "aM", @progbits, 16 50.align 16 51TWOONE: .octa 0x00000001000000000000000000000001 52 53.section .rodata.cst16.SHUF_MASK, "aM", @progbits, 16 54.align 16 55SHUF_MASK: .octa 0x000102030405060708090A0B0C0D0E0F 56.section .rodata.cst16.MASK1, "aM", @progbits, 16 57.align 16 58MASK1: .octa 0x0000000000000000ffffffffffffffff 59.section .rodata.cst16.MASK2, "aM", @progbits, 16 60.align 16 61MASK2: .octa 0xffffffffffffffff0000000000000000 62.section .rodata.cst16.ONE, "aM", @progbits, 16 63.align 16 64ONE: .octa 0x00000000000000000000000000000001 65.section .rodata.cst16.F_MIN_MASK, "aM", @progbits, 16 66.align 16 67F_MIN_MASK: .octa 0xf1f2f3f4f5f6f7f8f9fafbfcfdfeff0 68.section .rodata.cst16.dec, "aM", @progbits, 16 69.align 16 70dec: .octa 0x1 71.section .rodata.cst16.enc, "aM", @progbits, 16 72.align 16 73enc: .octa 0x2 74 75# order of these constants should not change. 76# more specifically, ALL_F should follow SHIFT_MASK, 77# and zero should follow ALL_F 78.section .rodata, "a", @progbits 79.align 16 80SHIFT_MASK: .octa 0x0f0e0d0c0b0a09080706050403020100 81ALL_F: .octa 0xffffffffffffffffffffffffffffffff 82 .octa 0x00000000000000000000000000000000 83 84.text 85 86 87#define STACK_OFFSET 8*3 88 89#define AadHash 16*0 90#define AadLen 16*1 91#define InLen (16*1)+8 92#define PBlockEncKey 16*2 93#define OrigIV 16*3 94#define CurCount 16*4 95#define PBlockLen 16*5 96#define HashKey 16*6 // store HashKey <<1 mod poly here 97#define HashKey_2 16*7 // store HashKey^2 <<1 mod poly here 98#define HashKey_3 16*8 // store HashKey^3 <<1 mod poly here 99#define HashKey_4 16*9 // store HashKey^4 <<1 mod poly here 100#define HashKey_k 16*10 // store XOR of High 64 bits and Low 64 101 // bits of HashKey <<1 mod poly here 102 //(for Karatsuba purposes) 103#define HashKey_2_k 16*11 // store XOR of High 64 bits and Low 64 104 // bits of HashKey^2 <<1 mod poly here 105 // (for Karatsuba purposes) 106#define HashKey_3_k 16*12 // store XOR of High 64 bits and Low 64 107 // bits of HashKey^3 <<1 mod poly here 108 // (for Karatsuba purposes) 109#define HashKey_4_k 16*13 // store XOR of High 64 bits and Low 64 110 // bits of HashKey^4 <<1 mod poly here 111 // (for Karatsuba purposes) 112 113#define arg1 rdi 114#define arg2 rsi 115#define arg3 rdx 116#define arg4 rcx 117#define arg5 r8 118#define arg6 r9 119#define arg7 STACK_OFFSET+8(%rsp) 120#define arg8 STACK_OFFSET+16(%rsp) 121#define arg9 STACK_OFFSET+24(%rsp) 122#define arg10 STACK_OFFSET+32(%rsp) 123#define arg11 STACK_OFFSET+40(%rsp) 124#define keysize 2*15*16(%arg1) 125#endif 126 127 128#define STATE1 %xmm0 129#define STATE2 %xmm4 130#define STATE3 %xmm5 131#define STATE4 %xmm6 132#define STATE STATE1 133#define IN1 %xmm1 134#define IN2 %xmm7 135#define IN3 %xmm8 136#define IN4 %xmm9 137#define IN IN1 138#define KEY %xmm2 139#define IV %xmm3 140 141#define BSWAP_MASK %xmm10 142#define CTR %xmm11 143#define INC %xmm12 144 145#define GF128MUL_MASK %xmm7 146 147#ifdef __x86_64__ 148#define AREG %rax 149#define KEYP %rdi 150#define OUTP %rsi 151#define UKEYP OUTP 152#define INP %rdx 153#define LEN %rcx 154#define IVP %r8 155#define KLEN %r9d 156#define T1 %r10 157#define TKEYP T1 158#define T2 %r11 159#define TCTR_LOW T2 160#else 161#define AREG %eax 162#define KEYP %edi 163#define OUTP AREG 164#define UKEYP OUTP 165#define INP %edx 166#define LEN %esi 167#define IVP %ebp 168#define KLEN %ebx 169#define T1 %ecx 170#define TKEYP T1 171#endif 172 173.macro FUNC_SAVE 174 push %r12 175 push %r13 176 push %r14 177# 178# states of %xmm registers %xmm6:%xmm15 not saved 179# all %xmm registers are clobbered 180# 181.endm 182 183 184.macro FUNC_RESTORE 185 pop %r14 186 pop %r13 187 pop %r12 188.endm 189 190# Precompute hashkeys. 191# Input: Hash subkey. 192# Output: HashKeys stored in gcm_context_data. Only needs to be called 193# once per key. 194# clobbers r12, and tmp xmm registers. 195.macro PRECOMPUTE SUBKEY TMP1 TMP2 TMP3 TMP4 TMP5 TMP6 TMP7 196 mov \SUBKEY, %r12 197 movdqu (%r12), \TMP3 198 movdqa SHUF_MASK(%rip), \TMP2 199 pshufb \TMP2, \TMP3 200 201 # precompute HashKey<<1 mod poly from the HashKey (required for GHASH) 202 203 movdqa \TMP3, \TMP2 204 psllq $1, \TMP3 205 psrlq $63, \TMP2 206 movdqa \TMP2, \TMP1 207 pslldq $8, \TMP2 208 psrldq $8, \TMP1 209 por \TMP2, \TMP3 210 211 # reduce HashKey<<1 212 213 pshufd $0x24, \TMP1, \TMP2 214 pcmpeqd TWOONE(%rip), \TMP2 215 pand POLY(%rip), \TMP2 216 pxor \TMP2, \TMP3 217 movdqu \TMP3, HashKey(%arg2) 218 219 movdqa \TMP3, \TMP5 220 pshufd $78, \TMP3, \TMP1 221 pxor \TMP3, \TMP1 222 movdqu \TMP1, HashKey_k(%arg2) 223 224 GHASH_MUL \TMP5, \TMP3, \TMP1, \TMP2, \TMP4, \TMP6, \TMP7 225# TMP5 = HashKey^2<<1 (mod poly) 226 movdqu \TMP5, HashKey_2(%arg2) 227# HashKey_2 = HashKey^2<<1 (mod poly) 228 pshufd $78, \TMP5, \TMP1 229 pxor \TMP5, \TMP1 230 movdqu \TMP1, HashKey_2_k(%arg2) 231 232 GHASH_MUL \TMP5, \TMP3, \TMP1, \TMP2, \TMP4, \TMP6, \TMP7 233# TMP5 = HashKey^3<<1 (mod poly) 234 movdqu \TMP5, HashKey_3(%arg2) 235 pshufd $78, \TMP5, \TMP1 236 pxor \TMP5, \TMP1 237 movdqu \TMP1, HashKey_3_k(%arg2) 238 239 GHASH_MUL \TMP5, \TMP3, \TMP1, \TMP2, \TMP4, \TMP6, \TMP7 240# TMP5 = HashKey^3<<1 (mod poly) 241 movdqu \TMP5, HashKey_4(%arg2) 242 pshufd $78, \TMP5, \TMP1 243 pxor \TMP5, \TMP1 244 movdqu \TMP1, HashKey_4_k(%arg2) 245.endm 246 247# GCM_INIT initializes a gcm_context struct to prepare for encoding/decoding. 248# Clobbers rax, r10-r13 and xmm0-xmm6, %xmm13 249.macro GCM_INIT Iv SUBKEY AAD AADLEN 250 mov \AADLEN, %r11 251 mov %r11, AadLen(%arg2) # ctx_data.aad_length = aad_length 252 xor %r11d, %r11d 253 mov %r11, InLen(%arg2) # ctx_data.in_length = 0 254 mov %r11, PBlockLen(%arg2) # ctx_data.partial_block_length = 0 255 mov %r11, PBlockEncKey(%arg2) # ctx_data.partial_block_enc_key = 0 256 mov \Iv, %rax 257 movdqu (%rax), %xmm0 258 movdqu %xmm0, OrigIV(%arg2) # ctx_data.orig_IV = iv 259 260 movdqa SHUF_MASK(%rip), %xmm2 261 pshufb %xmm2, %xmm0 262 movdqu %xmm0, CurCount(%arg2) # ctx_data.current_counter = iv 263 264 PRECOMPUTE \SUBKEY, %xmm1, %xmm2, %xmm3, %xmm4, %xmm5, %xmm6, %xmm7 265 movdqu HashKey(%arg2), %xmm13 266 267 CALC_AAD_HASH %xmm13, \AAD, \AADLEN, %xmm0, %xmm1, %xmm2, %xmm3, \ 268 %xmm4, %xmm5, %xmm6 269.endm 270 271# GCM_ENC_DEC Encodes/Decodes given data. Assumes that the passed gcm_context 272# struct has been initialized by GCM_INIT. 273# Requires the input data be at least 1 byte long because of READ_PARTIAL_BLOCK 274# Clobbers rax, r10-r13, and xmm0-xmm15 275.macro GCM_ENC_DEC operation 276 movdqu AadHash(%arg2), %xmm8 277 movdqu HashKey(%arg2), %xmm13 278 add %arg5, InLen(%arg2) 279 280 xor %r11d, %r11d # initialise the data pointer offset as zero 281 PARTIAL_BLOCK %arg3 %arg4 %arg5 %r11 %xmm8 \operation 282 283 sub %r11, %arg5 # sub partial block data used 284 mov %arg5, %r13 # save the number of bytes 285 286 and $-16, %r13 # %r13 = %r13 - (%r13 mod 16) 287 mov %r13, %r12 288 # Encrypt/Decrypt first few blocks 289 290 and $(3<<4), %r12 291 jz _initial_num_blocks_is_0_\@ 292 cmp $(2<<4), %r12 293 jb _initial_num_blocks_is_1_\@ 294 je _initial_num_blocks_is_2_\@ 295_initial_num_blocks_is_3_\@: 296 INITIAL_BLOCKS_ENC_DEC %xmm9, %xmm10, %xmm13, %xmm11, %xmm12, %xmm0, \ 297%xmm1, %xmm2, %xmm3, %xmm4, %xmm8, %xmm5, %xmm6, 5, 678, \operation 298 sub $48, %r13 299 jmp _initial_blocks_\@ 300_initial_num_blocks_is_2_\@: 301 INITIAL_BLOCKS_ENC_DEC %xmm9, %xmm10, %xmm13, %xmm11, %xmm12, %xmm0, \ 302%xmm1, %xmm2, %xmm3, %xmm4, %xmm8, %xmm5, %xmm6, 6, 78, \operation 303 sub $32, %r13 304 jmp _initial_blocks_\@ 305_initial_num_blocks_is_1_\@: 306 INITIAL_BLOCKS_ENC_DEC %xmm9, %xmm10, %xmm13, %xmm11, %xmm12, %xmm0, \ 307%xmm1, %xmm2, %xmm3, %xmm4, %xmm8, %xmm5, %xmm6, 7, 8, \operation 308 sub $16, %r13 309 jmp _initial_blocks_\@ 310_initial_num_blocks_is_0_\@: 311 INITIAL_BLOCKS_ENC_DEC %xmm9, %xmm10, %xmm13, %xmm11, %xmm12, %xmm0, \ 312%xmm1, %xmm2, %xmm3, %xmm4, %xmm8, %xmm5, %xmm6, 8, 0, \operation 313_initial_blocks_\@: 314 315 # Main loop - Encrypt/Decrypt remaining blocks 316 317 test %r13, %r13 318 je _zero_cipher_left_\@ 319 sub $64, %r13 320 je _four_cipher_left_\@ 321_crypt_by_4_\@: 322 GHASH_4_ENCRYPT_4_PARALLEL_\operation %xmm9, %xmm10, %xmm11, %xmm12, \ 323 %xmm13, %xmm14, %xmm0, %xmm1, %xmm2, %xmm3, %xmm4, %xmm5, %xmm6, \ 324 %xmm7, %xmm8, enc 325 add $64, %r11 326 sub $64, %r13 327 jne _crypt_by_4_\@ 328_four_cipher_left_\@: 329 GHASH_LAST_4 %xmm9, %xmm10, %xmm11, %xmm12, %xmm13, %xmm14, \ 330%xmm15, %xmm1, %xmm2, %xmm3, %xmm4, %xmm8 331_zero_cipher_left_\@: 332 movdqu %xmm8, AadHash(%arg2) 333 movdqu %xmm0, CurCount(%arg2) 334 335 mov %arg5, %r13 336 and $15, %r13 # %r13 = arg5 (mod 16) 337 je _multiple_of_16_bytes_\@ 338 339 mov %r13, PBlockLen(%arg2) 340 341 # Handle the last <16 Byte block separately 342 paddd ONE(%rip), %xmm0 # INCR CNT to get Yn 343 movdqu %xmm0, CurCount(%arg2) 344 movdqa SHUF_MASK(%rip), %xmm10 345 pshufb %xmm10, %xmm0 346 347 ENCRYPT_SINGLE_BLOCK %xmm0, %xmm1 # Encrypt(K, Yn) 348 movdqu %xmm0, PBlockEncKey(%arg2) 349 350 cmp $16, %arg5 351 jge _large_enough_update_\@ 352 353 lea (%arg4,%r11,1), %r10 354 mov %r13, %r12 355 READ_PARTIAL_BLOCK %r10 %r12 %xmm2 %xmm1 356 jmp _data_read_\@ 357 358_large_enough_update_\@: 359 sub $16, %r11 360 add %r13, %r11 361 362 # receive the last <16 Byte block 363 movdqu (%arg4, %r11, 1), %xmm1 364 365 sub %r13, %r11 366 add $16, %r11 367 368 lea SHIFT_MASK+16(%rip), %r12 369 # adjust the shuffle mask pointer to be able to shift 16-r13 bytes 370 # (r13 is the number of bytes in plaintext mod 16) 371 sub %r13, %r12 372 # get the appropriate shuffle mask 373 movdqu (%r12), %xmm2 374 # shift right 16-r13 bytes 375 pshufb %xmm2, %xmm1 376 377_data_read_\@: 378 lea ALL_F+16(%rip), %r12 379 sub %r13, %r12 380 381.ifc \operation, dec 382 movdqa %xmm1, %xmm2 383.endif 384 pxor %xmm1, %xmm0 # XOR Encrypt(K, Yn) 385 movdqu (%r12), %xmm1 386 # get the appropriate mask to mask out top 16-r13 bytes of xmm0 387 pand %xmm1, %xmm0 # mask out top 16-r13 bytes of xmm0 388.ifc \operation, dec 389 pand %xmm1, %xmm2 390 movdqa SHUF_MASK(%rip), %xmm10 391 pshufb %xmm10 ,%xmm2 392 393 pxor %xmm2, %xmm8 394.else 395 movdqa SHUF_MASK(%rip), %xmm10 396 pshufb %xmm10,%xmm0 397 398 pxor %xmm0, %xmm8 399.endif 400 401 movdqu %xmm8, AadHash(%arg2) 402.ifc \operation, enc 403 # GHASH computation for the last <16 byte block 404 movdqa SHUF_MASK(%rip), %xmm10 405 # shuffle xmm0 back to output as ciphertext 406 pshufb %xmm10, %xmm0 407.endif 408 409 # Output %r13 bytes 410 movq %xmm0, %rax 411 cmp $8, %r13 412 jle _less_than_8_bytes_left_\@ 413 mov %rax, (%arg3 , %r11, 1) 414 add $8, %r11 415 psrldq $8, %xmm0 416 movq %xmm0, %rax 417 sub $8, %r13 418_less_than_8_bytes_left_\@: 419 mov %al, (%arg3, %r11, 1) 420 add $1, %r11 421 shr $8, %rax 422 sub $1, %r13 423 jne _less_than_8_bytes_left_\@ 424_multiple_of_16_bytes_\@: 425.endm 426 427# GCM_COMPLETE Finishes update of tag of last partial block 428# Output: Authorization Tag (AUTH_TAG) 429# Clobbers rax, r10-r12, and xmm0, xmm1, xmm5-xmm15 430.macro GCM_COMPLETE AUTHTAG AUTHTAGLEN 431 movdqu AadHash(%arg2), %xmm8 432 movdqu HashKey(%arg2), %xmm13 433 434 mov PBlockLen(%arg2), %r12 435 436 test %r12, %r12 437 je _partial_done\@ 438 439 GHASH_MUL %xmm8, %xmm13, %xmm9, %xmm10, %xmm11, %xmm5, %xmm6 440 441_partial_done\@: 442 mov AadLen(%arg2), %r12 # %r13 = aadLen (number of bytes) 443 shl $3, %r12 # convert into number of bits 444 movd %r12d, %xmm15 # len(A) in %xmm15 445 mov InLen(%arg2), %r12 446 shl $3, %r12 # len(C) in bits (*128) 447 movq %r12, %xmm1 448 449 pslldq $8, %xmm15 # %xmm15 = len(A)||0x0000000000000000 450 pxor %xmm1, %xmm15 # %xmm15 = len(A)||len(C) 451 pxor %xmm15, %xmm8 452 GHASH_MUL %xmm8, %xmm13, %xmm9, %xmm10, %xmm11, %xmm5, %xmm6 453 # final GHASH computation 454 movdqa SHUF_MASK(%rip), %xmm10 455 pshufb %xmm10, %xmm8 456 457 movdqu OrigIV(%arg2), %xmm0 # %xmm0 = Y0 458 ENCRYPT_SINGLE_BLOCK %xmm0, %xmm1 # E(K, Y0) 459 pxor %xmm8, %xmm0 460_return_T_\@: 461 mov \AUTHTAG, %r10 # %r10 = authTag 462 mov \AUTHTAGLEN, %r11 # %r11 = auth_tag_len 463 cmp $16, %r11 464 je _T_16_\@ 465 cmp $8, %r11 466 jl _T_4_\@ 467_T_8_\@: 468 movq %xmm0, %rax 469 mov %rax, (%r10) 470 add $8, %r10 471 sub $8, %r11 472 psrldq $8, %xmm0 473 test %r11, %r11 474 je _return_T_done_\@ 475_T_4_\@: 476 movd %xmm0, %eax 477 mov %eax, (%r10) 478 add $4, %r10 479 sub $4, %r11 480 psrldq $4, %xmm0 481 test %r11, %r11 482 je _return_T_done_\@ 483_T_123_\@: 484 movd %xmm0, %eax 485 cmp $2, %r11 486 jl _T_1_\@ 487 mov %ax, (%r10) 488 cmp $2, %r11 489 je _return_T_done_\@ 490 add $2, %r10 491 sar $16, %eax 492_T_1_\@: 493 mov %al, (%r10) 494 jmp _return_T_done_\@ 495_T_16_\@: 496 movdqu %xmm0, (%r10) 497_return_T_done_\@: 498.endm 499 500#ifdef __x86_64__ 501/* GHASH_MUL MACRO to implement: Data*HashKey mod (128,127,126,121,0) 502* 503* 504* Input: A and B (128-bits each, bit-reflected) 505* Output: C = A*B*x mod poly, (i.e. >>1 ) 506* To compute GH = GH*HashKey mod poly, give HK = HashKey<<1 mod poly as input 507* GH = GH * HK * x mod poly which is equivalent to GH*HashKey mod poly. 508* 509*/ 510.macro GHASH_MUL GH HK TMP1 TMP2 TMP3 TMP4 TMP5 511 movdqa \GH, \TMP1 512 pshufd $78, \GH, \TMP2 513 pshufd $78, \HK, \TMP3 514 pxor \GH, \TMP2 # TMP2 = a1+a0 515 pxor \HK, \TMP3 # TMP3 = b1+b0 516 pclmulqdq $0x11, \HK, \TMP1 # TMP1 = a1*b1 517 pclmulqdq $0x00, \HK, \GH # GH = a0*b0 518 pclmulqdq $0x00, \TMP3, \TMP2 # TMP2 = (a0+a1)*(b1+b0) 519 pxor \GH, \TMP2 520 pxor \TMP1, \TMP2 # TMP2 = (a0*b0)+(a1*b0) 521 movdqa \TMP2, \TMP3 522 pslldq $8, \TMP3 # left shift TMP3 2 DWs 523 psrldq $8, \TMP2 # right shift TMP2 2 DWs 524 pxor \TMP3, \GH 525 pxor \TMP2, \TMP1 # TMP2:GH holds the result of GH*HK 526 527 # first phase of the reduction 528 529 movdqa \GH, \TMP2 530 movdqa \GH, \TMP3 531 movdqa \GH, \TMP4 # copy GH into TMP2,TMP3 and TMP4 532 # in in order to perform 533 # independent shifts 534 pslld $31, \TMP2 # packed right shift <<31 535 pslld $30, \TMP3 # packed right shift <<30 536 pslld $25, \TMP4 # packed right shift <<25 537 pxor \TMP3, \TMP2 # xor the shifted versions 538 pxor \TMP4, \TMP2 539 movdqa \TMP2, \TMP5 540 psrldq $4, \TMP5 # right shift TMP5 1 DW 541 pslldq $12, \TMP2 # left shift TMP2 3 DWs 542 pxor \TMP2, \GH 543 544 # second phase of the reduction 545 546 movdqa \GH,\TMP2 # copy GH into TMP2,TMP3 and TMP4 547 # in in order to perform 548 # independent shifts 549 movdqa \GH,\TMP3 550 movdqa \GH,\TMP4 551 psrld $1,\TMP2 # packed left shift >>1 552 psrld $2,\TMP3 # packed left shift >>2 553 psrld $7,\TMP4 # packed left shift >>7 554 pxor \TMP3,\TMP2 # xor the shifted versions 555 pxor \TMP4,\TMP2 556 pxor \TMP5, \TMP2 557 pxor \TMP2, \GH 558 pxor \TMP1, \GH # result is in TMP1 559.endm 560 561# Reads DLEN bytes starting at DPTR and stores in XMMDst 562# where 0 < DLEN < 16 563# Clobbers %rax, DLEN and XMM1 564.macro READ_PARTIAL_BLOCK DPTR DLEN XMM1 XMMDst 565 cmp $8, \DLEN 566 jl _read_lt8_\@ 567 mov (\DPTR), %rax 568 movq %rax, \XMMDst 569 sub $8, \DLEN 570 jz _done_read_partial_block_\@ 571 xor %eax, %eax 572_read_next_byte_\@: 573 shl $8, %rax 574 mov 7(\DPTR, \DLEN, 1), %al 575 dec \DLEN 576 jnz _read_next_byte_\@ 577 movq %rax, \XMM1 578 pslldq $8, \XMM1 579 por \XMM1, \XMMDst 580 jmp _done_read_partial_block_\@ 581_read_lt8_\@: 582 xor %eax, %eax 583_read_next_byte_lt8_\@: 584 shl $8, %rax 585 mov -1(\DPTR, \DLEN, 1), %al 586 dec \DLEN 587 jnz _read_next_byte_lt8_\@ 588 movq %rax, \XMMDst 589_done_read_partial_block_\@: 590.endm 591 592# CALC_AAD_HASH: Calculates the hash of the data which will not be encrypted. 593# clobbers r10-11, xmm14 594.macro CALC_AAD_HASH HASHKEY AAD AADLEN TMP1 TMP2 TMP3 TMP4 TMP5 \ 595 TMP6 TMP7 596 MOVADQ SHUF_MASK(%rip), %xmm14 597 mov \AAD, %r10 # %r10 = AAD 598 mov \AADLEN, %r11 # %r11 = aadLen 599 pxor \TMP7, \TMP7 600 pxor \TMP6, \TMP6 601 602 cmp $16, %r11 603 jl _get_AAD_rest\@ 604_get_AAD_blocks\@: 605 movdqu (%r10), \TMP7 606 pshufb %xmm14, \TMP7 # byte-reflect the AAD data 607 pxor \TMP7, \TMP6 608 GHASH_MUL \TMP6, \HASHKEY, \TMP1, \TMP2, \TMP3, \TMP4, \TMP5 609 add $16, %r10 610 sub $16, %r11 611 cmp $16, %r11 612 jge _get_AAD_blocks\@ 613 614 movdqu \TMP6, \TMP7 615 616 /* read the last <16B of AAD */ 617_get_AAD_rest\@: 618 test %r11, %r11 619 je _get_AAD_done\@ 620 621 READ_PARTIAL_BLOCK %r10, %r11, \TMP1, \TMP7 622 pshufb %xmm14, \TMP7 # byte-reflect the AAD data 623 pxor \TMP6, \TMP7 624 GHASH_MUL \TMP7, \HASHKEY, \TMP1, \TMP2, \TMP3, \TMP4, \TMP5 625 movdqu \TMP7, \TMP6 626 627_get_AAD_done\@: 628 movdqu \TMP6, AadHash(%arg2) 629.endm 630 631# PARTIAL_BLOCK: Handles encryption/decryption and the tag partial blocks 632# between update calls. 633# Requires the input data be at least 1 byte long due to READ_PARTIAL_BLOCK 634# Outputs encrypted bytes, and updates hash and partial info in gcm_data_context 635# Clobbers rax, r10, r12, r13, xmm0-6, xmm9-13 636.macro PARTIAL_BLOCK CYPH_PLAIN_OUT PLAIN_CYPH_IN PLAIN_CYPH_LEN DATA_OFFSET \ 637 AAD_HASH operation 638 mov PBlockLen(%arg2), %r13 639 test %r13, %r13 640 je _partial_block_done_\@ # Leave Macro if no partial blocks 641 # Read in input data without over reading 642 cmp $16, \PLAIN_CYPH_LEN 643 jl _fewer_than_16_bytes_\@ 644 movups (\PLAIN_CYPH_IN), %xmm1 # If more than 16 bytes, just fill xmm 645 jmp _data_read_\@ 646 647_fewer_than_16_bytes_\@: 648 lea (\PLAIN_CYPH_IN, \DATA_OFFSET, 1), %r10 649 mov \PLAIN_CYPH_LEN, %r12 650 READ_PARTIAL_BLOCK %r10 %r12 %xmm0 %xmm1 651 652 mov PBlockLen(%arg2), %r13 653 654_data_read_\@: # Finished reading in data 655 656 movdqu PBlockEncKey(%arg2), %xmm9 657 movdqu HashKey(%arg2), %xmm13 658 659 lea SHIFT_MASK(%rip), %r12 660 661 # adjust the shuffle mask pointer to be able to shift r13 bytes 662 # r16-r13 is the number of bytes in plaintext mod 16) 663 add %r13, %r12 664 movdqu (%r12), %xmm2 # get the appropriate shuffle mask 665 pshufb %xmm2, %xmm9 # shift right r13 bytes 666 667.ifc \operation, dec 668 movdqa %xmm1, %xmm3 669 pxor %xmm1, %xmm9 # Cyphertext XOR E(K, Yn) 670 671 mov \PLAIN_CYPH_LEN, %r10 672 add %r13, %r10 673 # Set r10 to be the amount of data left in CYPH_PLAIN_IN after filling 674 sub $16, %r10 675 # Determine if if partial block is not being filled and 676 # shift mask accordingly 677 jge _no_extra_mask_1_\@ 678 sub %r10, %r12 679_no_extra_mask_1_\@: 680 681 movdqu ALL_F-SHIFT_MASK(%r12), %xmm1 682 # get the appropriate mask to mask out bottom r13 bytes of xmm9 683 pand %xmm1, %xmm9 # mask out bottom r13 bytes of xmm9 684 685 pand %xmm1, %xmm3 686 movdqa SHUF_MASK(%rip), %xmm10 687 pshufb %xmm10, %xmm3 688 pshufb %xmm2, %xmm3 689 pxor %xmm3, \AAD_HASH 690 691 test %r10, %r10 692 jl _partial_incomplete_1_\@ 693 694 # GHASH computation for the last <16 Byte block 695 GHASH_MUL \AAD_HASH, %xmm13, %xmm0, %xmm10, %xmm11, %xmm5, %xmm6 696 xor %eax, %eax 697 698 mov %rax, PBlockLen(%arg2) 699 jmp _dec_done_\@ 700_partial_incomplete_1_\@: 701 add \PLAIN_CYPH_LEN, PBlockLen(%arg2) 702_dec_done_\@: 703 movdqu \AAD_HASH, AadHash(%arg2) 704.else 705 pxor %xmm1, %xmm9 # Plaintext XOR E(K, Yn) 706 707 mov \PLAIN_CYPH_LEN, %r10 708 add %r13, %r10 709 # Set r10 to be the amount of data left in CYPH_PLAIN_IN after filling 710 sub $16, %r10 711 # Determine if if partial block is not being filled and 712 # shift mask accordingly 713 jge _no_extra_mask_2_\@ 714 sub %r10, %r12 715_no_extra_mask_2_\@: 716 717 movdqu ALL_F-SHIFT_MASK(%r12), %xmm1 718 # get the appropriate mask to mask out bottom r13 bytes of xmm9 719 pand %xmm1, %xmm9 720 721 movdqa SHUF_MASK(%rip), %xmm1 722 pshufb %xmm1, %xmm9 723 pshufb %xmm2, %xmm9 724 pxor %xmm9, \AAD_HASH 725 726 test %r10, %r10 727 jl _partial_incomplete_2_\@ 728 729 # GHASH computation for the last <16 Byte block 730 GHASH_MUL \AAD_HASH, %xmm13, %xmm0, %xmm10, %xmm11, %xmm5, %xmm6 731 xor %eax, %eax 732 733 mov %rax, PBlockLen(%arg2) 734 jmp _encode_done_\@ 735_partial_incomplete_2_\@: 736 add \PLAIN_CYPH_LEN, PBlockLen(%arg2) 737_encode_done_\@: 738 movdqu \AAD_HASH, AadHash(%arg2) 739 740 movdqa SHUF_MASK(%rip), %xmm10 741 # shuffle xmm9 back to output as ciphertext 742 pshufb %xmm10, %xmm9 743 pshufb %xmm2, %xmm9 744.endif 745 # output encrypted Bytes 746 test %r10, %r10 747 jl _partial_fill_\@ 748 mov %r13, %r12 749 mov $16, %r13 750 # Set r13 to be the number of bytes to write out 751 sub %r12, %r13 752 jmp _count_set_\@ 753_partial_fill_\@: 754 mov \PLAIN_CYPH_LEN, %r13 755_count_set_\@: 756 movdqa %xmm9, %xmm0 757 movq %xmm0, %rax 758 cmp $8, %r13 759 jle _less_than_8_bytes_left_\@ 760 761 mov %rax, (\CYPH_PLAIN_OUT, \DATA_OFFSET, 1) 762 add $8, \DATA_OFFSET 763 psrldq $8, %xmm0 764 movq %xmm0, %rax 765 sub $8, %r13 766_less_than_8_bytes_left_\@: 767 movb %al, (\CYPH_PLAIN_OUT, \DATA_OFFSET, 1) 768 add $1, \DATA_OFFSET 769 shr $8, %rax 770 sub $1, %r13 771 jne _less_than_8_bytes_left_\@ 772_partial_block_done_\@: 773.endm # PARTIAL_BLOCK 774 775/* 776* if a = number of total plaintext bytes 777* b = floor(a/16) 778* num_initial_blocks = b mod 4 779* encrypt the initial num_initial_blocks blocks and apply ghash on 780* the ciphertext 781* %r10, %r11, %r12, %rax, %xmm5, %xmm6, %xmm7, %xmm8, %xmm9 registers 782* are clobbered 783* arg1, %arg2, %arg3 are used as a pointer only, not modified 784*/ 785 786 787.macro INITIAL_BLOCKS_ENC_DEC TMP1 TMP2 TMP3 TMP4 TMP5 XMM0 XMM1 \ 788 XMM2 XMM3 XMM4 XMMDst TMP6 TMP7 i i_seq operation 789 MOVADQ SHUF_MASK(%rip), %xmm14 790 791 movdqu AadHash(%arg2), %xmm\i # XMM0 = Y0 792 793 # start AES for num_initial_blocks blocks 794 795 movdqu CurCount(%arg2), \XMM0 # XMM0 = Y0 796 797.if (\i == 5) || (\i == 6) || (\i == 7) 798 799 MOVADQ ONE(%RIP),\TMP1 800 MOVADQ 0(%arg1),\TMP2 801.irpc index, \i_seq 802 paddd \TMP1, \XMM0 # INCR Y0 803.ifc \operation, dec 804 movdqa \XMM0, %xmm\index 805.else 806 MOVADQ \XMM0, %xmm\index 807.endif 808 pshufb %xmm14, %xmm\index # perform a 16 byte swap 809 pxor \TMP2, %xmm\index 810.endr 811 lea 0x10(%arg1),%r10 812 mov keysize,%eax 813 shr $2,%eax # 128->4, 192->6, 256->8 814 add $5,%eax # 128->9, 192->11, 256->13 815 816aes_loop_initial_\@: 817 MOVADQ (%r10),\TMP1 818.irpc index, \i_seq 819 aesenc \TMP1, %xmm\index 820.endr 821 add $16,%r10 822 sub $1,%eax 823 jnz aes_loop_initial_\@ 824 825 MOVADQ (%r10), \TMP1 826.irpc index, \i_seq 827 aesenclast \TMP1, %xmm\index # Last Round 828.endr 829.irpc index, \i_seq 830 movdqu (%arg4 , %r11, 1), \TMP1 831 pxor \TMP1, %xmm\index 832 movdqu %xmm\index, (%arg3 , %r11, 1) 833 # write back plaintext/ciphertext for num_initial_blocks 834 add $16, %r11 835 836.ifc \operation, dec 837 movdqa \TMP1, %xmm\index 838.endif 839 pshufb %xmm14, %xmm\index 840 841 # prepare plaintext/ciphertext for GHASH computation 842.endr 843.endif 844 845 # apply GHASH on num_initial_blocks blocks 846 847.if \i == 5 848 pxor %xmm5, %xmm6 849 GHASH_MUL %xmm6, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1 850 pxor %xmm6, %xmm7 851 GHASH_MUL %xmm7, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1 852 pxor %xmm7, %xmm8 853 GHASH_MUL %xmm8, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1 854.elseif \i == 6 855 pxor %xmm6, %xmm7 856 GHASH_MUL %xmm7, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1 857 pxor %xmm7, %xmm8 858 GHASH_MUL %xmm8, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1 859.elseif \i == 7 860 pxor %xmm7, %xmm8 861 GHASH_MUL %xmm8, \TMP3, \TMP1, \TMP2, \TMP4, \TMP5, \XMM1 862.endif 863 cmp $64, %r13 864 jl _initial_blocks_done\@ 865 # no need for precomputed values 866/* 867* 868* Precomputations for HashKey parallel with encryption of first 4 blocks. 869* Haskey_i_k holds XORed values of the low and high parts of the Haskey_i 870*/ 871 MOVADQ ONE(%RIP),\TMP1 872 paddd \TMP1, \XMM0 # INCR Y0 873 MOVADQ \XMM0, \XMM1 874 pshufb %xmm14, \XMM1 # perform a 16 byte swap 875 876 paddd \TMP1, \XMM0 # INCR Y0 877 MOVADQ \XMM0, \XMM2 878 pshufb %xmm14, \XMM2 # perform a 16 byte swap 879 880 paddd \TMP1, \XMM0 # INCR Y0 881 MOVADQ \XMM0, \XMM3 882 pshufb %xmm14, \XMM3 # perform a 16 byte swap 883 884 paddd \TMP1, \XMM0 # INCR Y0 885 MOVADQ \XMM0, \XMM4 886 pshufb %xmm14, \XMM4 # perform a 16 byte swap 887 888 MOVADQ 0(%arg1),\TMP1 889 pxor \TMP1, \XMM1 890 pxor \TMP1, \XMM2 891 pxor \TMP1, \XMM3 892 pxor \TMP1, \XMM4 893.irpc index, 1234 # do 4 rounds 894 movaps 0x10*\index(%arg1), \TMP1 895 aesenc \TMP1, \XMM1 896 aesenc \TMP1, \XMM2 897 aesenc \TMP1, \XMM3 898 aesenc \TMP1, \XMM4 899.endr 900.irpc index, 56789 # do next 5 rounds 901 movaps 0x10*\index(%arg1), \TMP1 902 aesenc \TMP1, \XMM1 903 aesenc \TMP1, \XMM2 904 aesenc \TMP1, \XMM3 905 aesenc \TMP1, \XMM4 906.endr 907 lea 0xa0(%arg1),%r10 908 mov keysize,%eax 909 shr $2,%eax # 128->4, 192->6, 256->8 910 sub $4,%eax # 128->0, 192->2, 256->4 911 jz aes_loop_pre_done\@ 912 913aes_loop_pre_\@: 914 MOVADQ (%r10),\TMP2 915.irpc index, 1234 916 aesenc \TMP2, %xmm\index 917.endr 918 add $16,%r10 919 sub $1,%eax 920 jnz aes_loop_pre_\@ 921 922aes_loop_pre_done\@: 923 MOVADQ (%r10), \TMP2 924 aesenclast \TMP2, \XMM1 925 aesenclast \TMP2, \XMM2 926 aesenclast \TMP2, \XMM3 927 aesenclast \TMP2, \XMM4 928 movdqu 16*0(%arg4 , %r11 , 1), \TMP1 929 pxor \TMP1, \XMM1 930.ifc \operation, dec 931 movdqu \XMM1, 16*0(%arg3 , %r11 , 1) 932 movdqa \TMP1, \XMM1 933.endif 934 movdqu 16*1(%arg4 , %r11 , 1), \TMP1 935 pxor \TMP1, \XMM2 936.ifc \operation, dec 937 movdqu \XMM2, 16*1(%arg3 , %r11 , 1) 938 movdqa \TMP1, \XMM2 939.endif 940 movdqu 16*2(%arg4 , %r11 , 1), \TMP1 941 pxor \TMP1, \XMM3 942.ifc \operation, dec 943 movdqu \XMM3, 16*2(%arg3 , %r11 , 1) 944 movdqa \TMP1, \XMM3 945.endif 946 movdqu 16*3(%arg4 , %r11 , 1), \TMP1 947 pxor \TMP1, \XMM4 948.ifc \operation, dec 949 movdqu \XMM4, 16*3(%arg3 , %r11 , 1) 950 movdqa \TMP1, \XMM4 951.else 952 movdqu \XMM1, 16*0(%arg3 , %r11 , 1) 953 movdqu \XMM2, 16*1(%arg3 , %r11 , 1) 954 movdqu \XMM3, 16*2(%arg3 , %r11 , 1) 955 movdqu \XMM4, 16*3(%arg3 , %r11 , 1) 956.endif 957 958 add $64, %r11 959 pshufb %xmm14, \XMM1 # perform a 16 byte swap 960 pxor \XMMDst, \XMM1 961# combine GHASHed value with the corresponding ciphertext 962 pshufb %xmm14, \XMM2 # perform a 16 byte swap 963 pshufb %xmm14, \XMM3 # perform a 16 byte swap 964 pshufb %xmm14, \XMM4 # perform a 16 byte swap 965 966_initial_blocks_done\@: 967 968.endm 969 970/* 971* encrypt 4 blocks at a time 972* ghash the 4 previously encrypted ciphertext blocks 973* arg1, %arg3, %arg4 are used as pointers only, not modified 974* %r11 is the data offset value 975*/ 976.macro GHASH_4_ENCRYPT_4_PARALLEL_enc TMP1 TMP2 TMP3 TMP4 TMP5 \ 977TMP6 XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 XMM8 operation 978 979 movdqa \XMM1, \XMM5 980 movdqa \XMM2, \XMM6 981 movdqa \XMM3, \XMM7 982 movdqa \XMM4, \XMM8 983 984 movdqa SHUF_MASK(%rip), %xmm15 985 # multiply TMP5 * HashKey using karatsuba 986 987 movdqa \XMM5, \TMP4 988 pshufd $78, \XMM5, \TMP6 989 pxor \XMM5, \TMP6 990 paddd ONE(%rip), \XMM0 # INCR CNT 991 movdqu HashKey_4(%arg2), \TMP5 992 pclmulqdq $0x11, \TMP5, \TMP4 # TMP4 = a1*b1 993 movdqa \XMM0, \XMM1 994 paddd ONE(%rip), \XMM0 # INCR CNT 995 movdqa \XMM0, \XMM2 996 paddd ONE(%rip), \XMM0 # INCR CNT 997 movdqa \XMM0, \XMM3 998 paddd ONE(%rip), \XMM0 # INCR CNT 999 movdqa \XMM0, \XMM4 1000 pshufb %xmm15, \XMM1 # perform a 16 byte swap 1001 pclmulqdq $0x00, \TMP5, \XMM5 # XMM5 = a0*b0 1002 pshufb %xmm15, \XMM2 # perform a 16 byte swap 1003 pshufb %xmm15, \XMM3 # perform a 16 byte swap 1004 pshufb %xmm15, \XMM4 # perform a 16 byte swap 1005 1006 pxor (%arg1), \XMM1 1007 pxor (%arg1), \XMM2 1008 pxor (%arg1), \XMM3 1009 pxor (%arg1), \XMM4 1010 movdqu HashKey_4_k(%arg2), \TMP5 1011 pclmulqdq $0x00, \TMP5, \TMP6 # TMP6 = (a1+a0)*(b1+b0) 1012 movaps 0x10(%arg1), \TMP1 1013 aesenc \TMP1, \XMM1 # Round 1 1014 aesenc \TMP1, \XMM2 1015 aesenc \TMP1, \XMM3 1016 aesenc \TMP1, \XMM4 1017 movaps 0x20(%arg1), \TMP1 1018 aesenc \TMP1, \XMM1 # Round 2 1019 aesenc \TMP1, \XMM2 1020 aesenc \TMP1, \XMM3 1021 aesenc \TMP1, \XMM4 1022 movdqa \XMM6, \TMP1 1023 pshufd $78, \XMM6, \TMP2 1024 pxor \XMM6, \TMP2 1025 movdqu HashKey_3(%arg2), \TMP5 1026 pclmulqdq $0x11, \TMP5, \TMP1 # TMP1 = a1 * b1 1027 movaps 0x30(%arg1), \TMP3 1028 aesenc \TMP3, \XMM1 # Round 3 1029 aesenc \TMP3, \XMM2 1030 aesenc \TMP3, \XMM3 1031 aesenc \TMP3, \XMM4 1032 pclmulqdq $0x00, \TMP5, \XMM6 # XMM6 = a0*b0 1033 movaps 0x40(%arg1), \TMP3 1034 aesenc \TMP3, \XMM1 # Round 4 1035 aesenc \TMP3, \XMM2 1036 aesenc \TMP3, \XMM3 1037 aesenc \TMP3, \XMM4 1038 movdqu HashKey_3_k(%arg2), \TMP5 1039 pclmulqdq $0x00, \TMP5, \TMP2 # TMP2 = (a1+a0)*(b1+b0) 1040 movaps 0x50(%arg1), \TMP3 1041 aesenc \TMP3, \XMM1 # Round 5 1042 aesenc \TMP3, \XMM2 1043 aesenc \TMP3, \XMM3 1044 aesenc \TMP3, \XMM4 1045 pxor \TMP1, \TMP4 1046# accumulate the results in TMP4:XMM5, TMP6 holds the middle part 1047 pxor \XMM6, \XMM5 1048 pxor \TMP2, \TMP6 1049 movdqa \XMM7, \TMP1 1050 pshufd $78, \XMM7, \TMP2 1051 pxor \XMM7, \TMP2 1052 movdqu HashKey_2(%arg2), \TMP5 1053 1054 # Multiply TMP5 * HashKey using karatsuba 1055 1056 pclmulqdq $0x11, \TMP5, \TMP1 # TMP1 = a1*b1 1057 movaps 0x60(%arg1), \TMP3 1058 aesenc \TMP3, \XMM1 # Round 6 1059 aesenc \TMP3, \XMM2 1060 aesenc \TMP3, \XMM3 1061 aesenc \TMP3, \XMM4 1062 pclmulqdq $0x00, \TMP5, \XMM7 # XMM7 = a0*b0 1063 movaps 0x70(%arg1), \TMP3 1064 aesenc \TMP3, \XMM1 # Round 7 1065 aesenc \TMP3, \XMM2 1066 aesenc \TMP3, \XMM3 1067 aesenc \TMP3, \XMM4 1068 movdqu HashKey_2_k(%arg2), \TMP5 1069 pclmulqdq $0x00, \TMP5, \TMP2 # TMP2 = (a1+a0)*(b1+b0) 1070 movaps 0x80(%arg1), \TMP3 1071 aesenc \TMP3, \XMM1 # Round 8 1072 aesenc \TMP3, \XMM2 1073 aesenc \TMP3, \XMM3 1074 aesenc \TMP3, \XMM4 1075 pxor \TMP1, \TMP4 1076# accumulate the results in TMP4:XMM5, TMP6 holds the middle part 1077 pxor \XMM7, \XMM5 1078 pxor \TMP2, \TMP6 1079 1080 # Multiply XMM8 * HashKey 1081 # XMM8 and TMP5 hold the values for the two operands 1082 1083 movdqa \XMM8, \TMP1 1084 pshufd $78, \XMM8, \TMP2 1085 pxor \XMM8, \TMP2 1086 movdqu HashKey(%arg2), \TMP5 1087 pclmulqdq $0x11, \TMP5, \TMP1 # TMP1 = a1*b1 1088 movaps 0x90(%arg1), \TMP3 1089 aesenc \TMP3, \XMM1 # Round 9 1090 aesenc \TMP3, \XMM2 1091 aesenc \TMP3, \XMM3 1092 aesenc \TMP3, \XMM4 1093 pclmulqdq $0x00, \TMP5, \XMM8 # XMM8 = a0*b0 1094 lea 0xa0(%arg1),%r10 1095 mov keysize,%eax 1096 shr $2,%eax # 128->4, 192->6, 256->8 1097 sub $4,%eax # 128->0, 192->2, 256->4 1098 jz aes_loop_par_enc_done\@ 1099 1100aes_loop_par_enc\@: 1101 MOVADQ (%r10),\TMP3 1102.irpc index, 1234 1103 aesenc \TMP3, %xmm\index 1104.endr 1105 add $16,%r10 1106 sub $1,%eax 1107 jnz aes_loop_par_enc\@ 1108 1109aes_loop_par_enc_done\@: 1110 MOVADQ (%r10), \TMP3 1111 aesenclast \TMP3, \XMM1 # Round 10 1112 aesenclast \TMP3, \XMM2 1113 aesenclast \TMP3, \XMM3 1114 aesenclast \TMP3, \XMM4 1115 movdqu HashKey_k(%arg2), \TMP5 1116 pclmulqdq $0x00, \TMP5, \TMP2 # TMP2 = (a1+a0)*(b1+b0) 1117 movdqu (%arg4,%r11,1), \TMP3 1118 pxor \TMP3, \XMM1 # Ciphertext/Plaintext XOR EK 1119 movdqu 16(%arg4,%r11,1), \TMP3 1120 pxor \TMP3, \XMM2 # Ciphertext/Plaintext XOR EK 1121 movdqu 32(%arg4,%r11,1), \TMP3 1122 pxor \TMP3, \XMM3 # Ciphertext/Plaintext XOR EK 1123 movdqu 48(%arg4,%r11,1), \TMP3 1124 pxor \TMP3, \XMM4 # Ciphertext/Plaintext XOR EK 1125 movdqu \XMM1, (%arg3,%r11,1) # Write to the ciphertext buffer 1126 movdqu \XMM2, 16(%arg3,%r11,1) # Write to the ciphertext buffer 1127 movdqu \XMM3, 32(%arg3,%r11,1) # Write to the ciphertext buffer 1128 movdqu \XMM4, 48(%arg3,%r11,1) # Write to the ciphertext buffer 1129 pshufb %xmm15, \XMM1 # perform a 16 byte swap 1130 pshufb %xmm15, \XMM2 # perform a 16 byte swap 1131 pshufb %xmm15, \XMM3 # perform a 16 byte swap 1132 pshufb %xmm15, \XMM4 # perform a 16 byte swap 1133 1134 pxor \TMP4, \TMP1 1135 pxor \XMM8, \XMM5 1136 pxor \TMP6, \TMP2 1137 pxor \TMP1, \TMP2 1138 pxor \XMM5, \TMP2 1139 movdqa \TMP2, \TMP3 1140 pslldq $8, \TMP3 # left shift TMP3 2 DWs 1141 psrldq $8, \TMP2 # right shift TMP2 2 DWs 1142 pxor \TMP3, \XMM5 1143 pxor \TMP2, \TMP1 # accumulate the results in TMP1:XMM5 1144 1145 # first phase of reduction 1146 1147 movdqa \XMM5, \TMP2 1148 movdqa \XMM5, \TMP3 1149 movdqa \XMM5, \TMP4 1150# move XMM5 into TMP2, TMP3, TMP4 in order to perform shifts independently 1151 pslld $31, \TMP2 # packed right shift << 31 1152 pslld $30, \TMP3 # packed right shift << 30 1153 pslld $25, \TMP4 # packed right shift << 25 1154 pxor \TMP3, \TMP2 # xor the shifted versions 1155 pxor \TMP4, \TMP2 1156 movdqa \TMP2, \TMP5 1157 psrldq $4, \TMP5 # right shift T5 1 DW 1158 pslldq $12, \TMP2 # left shift T2 3 DWs 1159 pxor \TMP2, \XMM5 1160 1161 # second phase of reduction 1162 1163 movdqa \XMM5,\TMP2 # make 3 copies of XMM5 into TMP2, TMP3, TMP4 1164 movdqa \XMM5,\TMP3 1165 movdqa \XMM5,\TMP4 1166 psrld $1, \TMP2 # packed left shift >>1 1167 psrld $2, \TMP3 # packed left shift >>2 1168 psrld $7, \TMP4 # packed left shift >>7 1169 pxor \TMP3,\TMP2 # xor the shifted versions 1170 pxor \TMP4,\TMP2 1171 pxor \TMP5, \TMP2 1172 pxor \TMP2, \XMM5 1173 pxor \TMP1, \XMM5 # result is in TMP1 1174 1175 pxor \XMM5, \XMM1 1176.endm 1177 1178/* 1179* decrypt 4 blocks at a time 1180* ghash the 4 previously decrypted ciphertext blocks 1181* arg1, %arg3, %arg4 are used as pointers only, not modified 1182* %r11 is the data offset value 1183*/ 1184.macro GHASH_4_ENCRYPT_4_PARALLEL_dec TMP1 TMP2 TMP3 TMP4 TMP5 \ 1185TMP6 XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 XMM8 operation 1186 1187 movdqa \XMM1, \XMM5 1188 movdqa \XMM2, \XMM6 1189 movdqa \XMM3, \XMM7 1190 movdqa \XMM4, \XMM8 1191 1192 movdqa SHUF_MASK(%rip), %xmm15 1193 # multiply TMP5 * HashKey using karatsuba 1194 1195 movdqa \XMM5, \TMP4 1196 pshufd $78, \XMM5, \TMP6 1197 pxor \XMM5, \TMP6 1198 paddd ONE(%rip), \XMM0 # INCR CNT 1199 movdqu HashKey_4(%arg2), \TMP5 1200 pclmulqdq $0x11, \TMP5, \TMP4 # TMP4 = a1*b1 1201 movdqa \XMM0, \XMM1 1202 paddd ONE(%rip), \XMM0 # INCR CNT 1203 movdqa \XMM0, \XMM2 1204 paddd ONE(%rip), \XMM0 # INCR CNT 1205 movdqa \XMM0, \XMM3 1206 paddd ONE(%rip), \XMM0 # INCR CNT 1207 movdqa \XMM0, \XMM4 1208 pshufb %xmm15, \XMM1 # perform a 16 byte swap 1209 pclmulqdq $0x00, \TMP5, \XMM5 # XMM5 = a0*b0 1210 pshufb %xmm15, \XMM2 # perform a 16 byte swap 1211 pshufb %xmm15, \XMM3 # perform a 16 byte swap 1212 pshufb %xmm15, \XMM4 # perform a 16 byte swap 1213 1214 pxor (%arg1), \XMM1 1215 pxor (%arg1), \XMM2 1216 pxor (%arg1), \XMM3 1217 pxor (%arg1), \XMM4 1218 movdqu HashKey_4_k(%arg2), \TMP5 1219 pclmulqdq $0x00, \TMP5, \TMP6 # TMP6 = (a1+a0)*(b1+b0) 1220 movaps 0x10(%arg1), \TMP1 1221 aesenc \TMP1, \XMM1 # Round 1 1222 aesenc \TMP1, \XMM2 1223 aesenc \TMP1, \XMM3 1224 aesenc \TMP1, \XMM4 1225 movaps 0x20(%arg1), \TMP1 1226 aesenc \TMP1, \XMM1 # Round 2 1227 aesenc \TMP1, \XMM2 1228 aesenc \TMP1, \XMM3 1229 aesenc \TMP1, \XMM4 1230 movdqa \XMM6, \TMP1 1231 pshufd $78, \XMM6, \TMP2 1232 pxor \XMM6, \TMP2 1233 movdqu HashKey_3(%arg2), \TMP5 1234 pclmulqdq $0x11, \TMP5, \TMP1 # TMP1 = a1 * b1 1235 movaps 0x30(%arg1), \TMP3 1236 aesenc \TMP3, \XMM1 # Round 3 1237 aesenc \TMP3, \XMM2 1238 aesenc \TMP3, \XMM3 1239 aesenc \TMP3, \XMM4 1240 pclmulqdq $0x00, \TMP5, \XMM6 # XMM6 = a0*b0 1241 movaps 0x40(%arg1), \TMP3 1242 aesenc \TMP3, \XMM1 # Round 4 1243 aesenc \TMP3, \XMM2 1244 aesenc \TMP3, \XMM3 1245 aesenc \TMP3, \XMM4 1246 movdqu HashKey_3_k(%arg2), \TMP5 1247 pclmulqdq $0x00, \TMP5, \TMP2 # TMP2 = (a1+a0)*(b1+b0) 1248 movaps 0x50(%arg1), \TMP3 1249 aesenc \TMP3, \XMM1 # Round 5 1250 aesenc \TMP3, \XMM2 1251 aesenc \TMP3, \XMM3 1252 aesenc \TMP3, \XMM4 1253 pxor \TMP1, \TMP4 1254# accumulate the results in TMP4:XMM5, TMP6 holds the middle part 1255 pxor \XMM6, \XMM5 1256 pxor \TMP2, \TMP6 1257 movdqa \XMM7, \TMP1 1258 pshufd $78, \XMM7, \TMP2 1259 pxor \XMM7, \TMP2 1260 movdqu HashKey_2(%arg2), \TMP5 1261 1262 # Multiply TMP5 * HashKey using karatsuba 1263 1264 pclmulqdq $0x11, \TMP5, \TMP1 # TMP1 = a1*b1 1265 movaps 0x60(%arg1), \TMP3 1266 aesenc \TMP3, \XMM1 # Round 6 1267 aesenc \TMP3, \XMM2 1268 aesenc \TMP3, \XMM3 1269 aesenc \TMP3, \XMM4 1270 pclmulqdq $0x00, \TMP5, \XMM7 # XMM7 = a0*b0 1271 movaps 0x70(%arg1), \TMP3 1272 aesenc \TMP3, \XMM1 # Round 7 1273 aesenc \TMP3, \XMM2 1274 aesenc \TMP3, \XMM3 1275 aesenc \TMP3, \XMM4 1276 movdqu HashKey_2_k(%arg2), \TMP5 1277 pclmulqdq $0x00, \TMP5, \TMP2 # TMP2 = (a1+a0)*(b1+b0) 1278 movaps 0x80(%arg1), \TMP3 1279 aesenc \TMP3, \XMM1 # Round 8 1280 aesenc \TMP3, \XMM2 1281 aesenc \TMP3, \XMM3 1282 aesenc \TMP3, \XMM4 1283 pxor \TMP1, \TMP4 1284# accumulate the results in TMP4:XMM5, TMP6 holds the middle part 1285 pxor \XMM7, \XMM5 1286 pxor \TMP2, \TMP6 1287 1288 # Multiply XMM8 * HashKey 1289 # XMM8 and TMP5 hold the values for the two operands 1290 1291 movdqa \XMM8, \TMP1 1292 pshufd $78, \XMM8, \TMP2 1293 pxor \XMM8, \TMP2 1294 movdqu HashKey(%arg2), \TMP5 1295 pclmulqdq $0x11, \TMP5, \TMP1 # TMP1 = a1*b1 1296 movaps 0x90(%arg1), \TMP3 1297 aesenc \TMP3, \XMM1 # Round 9 1298 aesenc \TMP3, \XMM2 1299 aesenc \TMP3, \XMM3 1300 aesenc \TMP3, \XMM4 1301 pclmulqdq $0x00, \TMP5, \XMM8 # XMM8 = a0*b0 1302 lea 0xa0(%arg1),%r10 1303 mov keysize,%eax 1304 shr $2,%eax # 128->4, 192->6, 256->8 1305 sub $4,%eax # 128->0, 192->2, 256->4 1306 jz aes_loop_par_dec_done\@ 1307 1308aes_loop_par_dec\@: 1309 MOVADQ (%r10),\TMP3 1310.irpc index, 1234 1311 aesenc \TMP3, %xmm\index 1312.endr 1313 add $16,%r10 1314 sub $1,%eax 1315 jnz aes_loop_par_dec\@ 1316 1317aes_loop_par_dec_done\@: 1318 MOVADQ (%r10), \TMP3 1319 aesenclast \TMP3, \XMM1 # last round 1320 aesenclast \TMP3, \XMM2 1321 aesenclast \TMP3, \XMM3 1322 aesenclast \TMP3, \XMM4 1323 movdqu HashKey_k(%arg2), \TMP5 1324 pclmulqdq $0x00, \TMP5, \TMP2 # TMP2 = (a1+a0)*(b1+b0) 1325 movdqu (%arg4,%r11,1), \TMP3 1326 pxor \TMP3, \XMM1 # Ciphertext/Plaintext XOR EK 1327 movdqu \XMM1, (%arg3,%r11,1) # Write to plaintext buffer 1328 movdqa \TMP3, \XMM1 1329 movdqu 16(%arg4,%r11,1), \TMP3 1330 pxor \TMP3, \XMM2 # Ciphertext/Plaintext XOR EK 1331 movdqu \XMM2, 16(%arg3,%r11,1) # Write to plaintext buffer 1332 movdqa \TMP3, \XMM2 1333 movdqu 32(%arg4,%r11,1), \TMP3 1334 pxor \TMP3, \XMM3 # Ciphertext/Plaintext XOR EK 1335 movdqu \XMM3, 32(%arg3,%r11,1) # Write to plaintext buffer 1336 movdqa \TMP3, \XMM3 1337 movdqu 48(%arg4,%r11,1), \TMP3 1338 pxor \TMP3, \XMM4 # Ciphertext/Plaintext XOR EK 1339 movdqu \XMM4, 48(%arg3,%r11,1) # Write to plaintext buffer 1340 movdqa \TMP3, \XMM4 1341 pshufb %xmm15, \XMM1 # perform a 16 byte swap 1342 pshufb %xmm15, \XMM2 # perform a 16 byte swap 1343 pshufb %xmm15, \XMM3 # perform a 16 byte swap 1344 pshufb %xmm15, \XMM4 # perform a 16 byte swap 1345 1346 pxor \TMP4, \TMP1 1347 pxor \XMM8, \XMM5 1348 pxor \TMP6, \TMP2 1349 pxor \TMP1, \TMP2 1350 pxor \XMM5, \TMP2 1351 movdqa \TMP2, \TMP3 1352 pslldq $8, \TMP3 # left shift TMP3 2 DWs 1353 psrldq $8, \TMP2 # right shift TMP2 2 DWs 1354 pxor \TMP3, \XMM5 1355 pxor \TMP2, \TMP1 # accumulate the results in TMP1:XMM5 1356 1357 # first phase of reduction 1358 1359 movdqa \XMM5, \TMP2 1360 movdqa \XMM5, \TMP3 1361 movdqa \XMM5, \TMP4 1362# move XMM5 into TMP2, TMP3, TMP4 in order to perform shifts independently 1363 pslld $31, \TMP2 # packed right shift << 31 1364 pslld $30, \TMP3 # packed right shift << 30 1365 pslld $25, \TMP4 # packed right shift << 25 1366 pxor \TMP3, \TMP2 # xor the shifted versions 1367 pxor \TMP4, \TMP2 1368 movdqa \TMP2, \TMP5 1369 psrldq $4, \TMP5 # right shift T5 1 DW 1370 pslldq $12, \TMP2 # left shift T2 3 DWs 1371 pxor \TMP2, \XMM5 1372 1373 # second phase of reduction 1374 1375 movdqa \XMM5,\TMP2 # make 3 copies of XMM5 into TMP2, TMP3, TMP4 1376 movdqa \XMM5,\TMP3 1377 movdqa \XMM5,\TMP4 1378 psrld $1, \TMP2 # packed left shift >>1 1379 psrld $2, \TMP3 # packed left shift >>2 1380 psrld $7, \TMP4 # packed left shift >>7 1381 pxor \TMP3,\TMP2 # xor the shifted versions 1382 pxor \TMP4,\TMP2 1383 pxor \TMP5, \TMP2 1384 pxor \TMP2, \XMM5 1385 pxor \TMP1, \XMM5 # result is in TMP1 1386 1387 pxor \XMM5, \XMM1 1388.endm 1389 1390/* GHASH the last 4 ciphertext blocks. */ 1391.macro GHASH_LAST_4 TMP1 TMP2 TMP3 TMP4 TMP5 TMP6 \ 1392TMP7 XMM1 XMM2 XMM3 XMM4 XMMDst 1393 1394 # Multiply TMP6 * HashKey (using Karatsuba) 1395 1396 movdqa \XMM1, \TMP6 1397 pshufd $78, \XMM1, \TMP2 1398 pxor \XMM1, \TMP2 1399 movdqu HashKey_4(%arg2), \TMP5 1400 pclmulqdq $0x11, \TMP5, \TMP6 # TMP6 = a1*b1 1401 pclmulqdq $0x00, \TMP5, \XMM1 # XMM1 = a0*b0 1402 movdqu HashKey_4_k(%arg2), \TMP4 1403 pclmulqdq $0x00, \TMP4, \TMP2 # TMP2 = (a1+a0)*(b1+b0) 1404 movdqa \XMM1, \XMMDst 1405 movdqa \TMP2, \XMM1 # result in TMP6, XMMDst, XMM1 1406 1407 # Multiply TMP1 * HashKey (using Karatsuba) 1408 1409 movdqa \XMM2, \TMP1 1410 pshufd $78, \XMM2, \TMP2 1411 pxor \XMM2, \TMP2 1412 movdqu HashKey_3(%arg2), \TMP5 1413 pclmulqdq $0x11, \TMP5, \TMP1 # TMP1 = a1*b1 1414 pclmulqdq $0x00, \TMP5, \XMM2 # XMM2 = a0*b0 1415 movdqu HashKey_3_k(%arg2), \TMP4 1416 pclmulqdq $0x00, \TMP4, \TMP2 # TMP2 = (a1+a0)*(b1+b0) 1417 pxor \TMP1, \TMP6 1418 pxor \XMM2, \XMMDst 1419 pxor \TMP2, \XMM1 1420# results accumulated in TMP6, XMMDst, XMM1 1421 1422 # Multiply TMP1 * HashKey (using Karatsuba) 1423 1424 movdqa \XMM3, \TMP1 1425 pshufd $78, \XMM3, \TMP2 1426 pxor \XMM3, \TMP2 1427 movdqu HashKey_2(%arg2), \TMP5 1428 pclmulqdq $0x11, \TMP5, \TMP1 # TMP1 = a1*b1 1429 pclmulqdq $0x00, \TMP5, \XMM3 # XMM3 = a0*b0 1430 movdqu HashKey_2_k(%arg2), \TMP4 1431 pclmulqdq $0x00, \TMP4, \TMP2 # TMP2 = (a1+a0)*(b1+b0) 1432 pxor \TMP1, \TMP6 1433 pxor \XMM3, \XMMDst 1434 pxor \TMP2, \XMM1 # results accumulated in TMP6, XMMDst, XMM1 1435 1436 # Multiply TMP1 * HashKey (using Karatsuba) 1437 movdqa \XMM4, \TMP1 1438 pshufd $78, \XMM4, \TMP2 1439 pxor \XMM4, \TMP2 1440 movdqu HashKey(%arg2), \TMP5 1441 pclmulqdq $0x11, \TMP5, \TMP1 # TMP1 = a1*b1 1442 pclmulqdq $0x00, \TMP5, \XMM4 # XMM4 = a0*b0 1443 movdqu HashKey_k(%arg2), \TMP4 1444 pclmulqdq $0x00, \TMP4, \TMP2 # TMP2 = (a1+a0)*(b1+b0) 1445 pxor \TMP1, \TMP6 1446 pxor \XMM4, \XMMDst 1447 pxor \XMM1, \TMP2 1448 pxor \TMP6, \TMP2 1449 pxor \XMMDst, \TMP2 1450 # middle section of the temp results combined as in karatsuba algorithm 1451 movdqa \TMP2, \TMP4 1452 pslldq $8, \TMP4 # left shift TMP4 2 DWs 1453 psrldq $8, \TMP2 # right shift TMP2 2 DWs 1454 pxor \TMP4, \XMMDst 1455 pxor \TMP2, \TMP6 1456# TMP6:XMMDst holds the result of the accumulated carry-less multiplications 1457 # first phase of the reduction 1458 movdqa \XMMDst, \TMP2 1459 movdqa \XMMDst, \TMP3 1460 movdqa \XMMDst, \TMP4 1461# move XMMDst into TMP2, TMP3, TMP4 in order to perform 3 shifts independently 1462 pslld $31, \TMP2 # packed right shifting << 31 1463 pslld $30, \TMP3 # packed right shifting << 30 1464 pslld $25, \TMP4 # packed right shifting << 25 1465 pxor \TMP3, \TMP2 # xor the shifted versions 1466 pxor \TMP4, \TMP2 1467 movdqa \TMP2, \TMP7 1468 psrldq $4, \TMP7 # right shift TMP7 1 DW 1469 pslldq $12, \TMP2 # left shift TMP2 3 DWs 1470 pxor \TMP2, \XMMDst 1471 1472 # second phase of the reduction 1473 movdqa \XMMDst, \TMP2 1474 # make 3 copies of XMMDst for doing 3 shift operations 1475 movdqa \XMMDst, \TMP3 1476 movdqa \XMMDst, \TMP4 1477 psrld $1, \TMP2 # packed left shift >> 1 1478 psrld $2, \TMP3 # packed left shift >> 2 1479 psrld $7, \TMP4 # packed left shift >> 7 1480 pxor \TMP3, \TMP2 # xor the shifted versions 1481 pxor \TMP4, \TMP2 1482 pxor \TMP7, \TMP2 1483 pxor \TMP2, \XMMDst 1484 pxor \TMP6, \XMMDst # reduced result is in XMMDst 1485.endm 1486 1487 1488/* Encryption of a single block 1489* uses eax & r10 1490*/ 1491 1492.macro ENCRYPT_SINGLE_BLOCK XMM0 TMP1 1493 1494 pxor (%arg1), \XMM0 1495 mov keysize,%eax 1496 shr $2,%eax # 128->4, 192->6, 256->8 1497 add $5,%eax # 128->9, 192->11, 256->13 1498 lea 16(%arg1), %r10 # get first expanded key address 1499 1500_esb_loop_\@: 1501 MOVADQ (%r10),\TMP1 1502 aesenc \TMP1,\XMM0 1503 add $16,%r10 1504 sub $1,%eax 1505 jnz _esb_loop_\@ 1506 1507 MOVADQ (%r10),\TMP1 1508 aesenclast \TMP1,\XMM0 1509.endm 1510/***************************************************************************** 1511* void aesni_gcm_dec(void *aes_ctx, // AES Key schedule. Starts on a 16 byte boundary. 1512* struct gcm_context_data *data 1513* // Context data 1514* u8 *out, // Plaintext output. Encrypt in-place is allowed. 1515* const u8 *in, // Ciphertext input 1516* u64 plaintext_len, // Length of data in bytes for decryption. 1517* u8 *iv, // Pre-counter block j0: 4 byte salt (from Security Association) 1518* // concatenated with 8 byte Initialisation Vector (from IPSec ESP Payload) 1519* // concatenated with 0x00000001. 16-byte aligned pointer. 1520* u8 *hash_subkey, // H, the Hash sub key input. Data starts on a 16-byte boundary. 1521* const u8 *aad, // Additional Authentication Data (AAD) 1522* u64 aad_len, // Length of AAD in bytes. With RFC4106 this is going to be 8 or 12 bytes 1523* u8 *auth_tag, // Authenticated Tag output. The driver will compare this to the 1524* // given authentication tag and only return the plaintext if they match. 1525* u64 auth_tag_len); // Authenticated Tag Length in bytes. Valid values are 16 1526* // (most likely), 12 or 8. 1527* 1528* Assumptions: 1529* 1530* keys: 1531* keys are pre-expanded and aligned to 16 bytes. we are using the first 1532* set of 11 keys in the data structure void *aes_ctx 1533* 1534* iv: 1535* 0 1 2 3 1536* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1537* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1538* | Salt (From the SA) | 1539* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1540* | Initialization Vector | 1541* | (This is the sequence number from IPSec header) | 1542* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1543* | 0x1 | 1544* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1545* 1546* 1547* 1548* AAD: 1549* AAD padded to 128 bits with 0 1550* for example, assume AAD is a u32 vector 1551* 1552* if AAD is 8 bytes: 1553* AAD[3] = {A0, A1}; 1554* padded AAD in xmm register = {A1 A0 0 0} 1555* 1556* 0 1 2 3 1557* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1558* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1559* | SPI (A1) | 1560* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1561* | 32-bit Sequence Number (A0) | 1562* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1563* | 0x0 | 1564* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1565* 1566* AAD Format with 32-bit Sequence Number 1567* 1568* if AAD is 12 bytes: 1569* AAD[3] = {A0, A1, A2}; 1570* padded AAD in xmm register = {A2 A1 A0 0} 1571* 1572* 0 1 2 3 1573* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1574* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1575* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1576* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1577* | SPI (A2) | 1578* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1579* | 64-bit Extended Sequence Number {A1,A0} | 1580* | | 1581* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1582* | 0x0 | 1583* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1584* 1585* AAD Format with 64-bit Extended Sequence Number 1586* 1587* poly = x^128 + x^127 + x^126 + x^121 + 1 1588* 1589*****************************************************************************/ 1590SYM_FUNC_START(aesni_gcm_dec) 1591 FUNC_SAVE 1592 1593 GCM_INIT %arg6, arg7, arg8, arg9 1594 GCM_ENC_DEC dec 1595 GCM_COMPLETE arg10, arg11 1596 FUNC_RESTORE 1597 RET 1598SYM_FUNC_END(aesni_gcm_dec) 1599 1600 1601/***************************************************************************** 1602* void aesni_gcm_enc(void *aes_ctx, // AES Key schedule. Starts on a 16 byte boundary. 1603* struct gcm_context_data *data 1604* // Context data 1605* u8 *out, // Ciphertext output. Encrypt in-place is allowed. 1606* const u8 *in, // Plaintext input 1607* u64 plaintext_len, // Length of data in bytes for encryption. 1608* u8 *iv, // Pre-counter block j0: 4 byte salt (from Security Association) 1609* // concatenated with 8 byte Initialisation Vector (from IPSec ESP Payload) 1610* // concatenated with 0x00000001. 16-byte aligned pointer. 1611* u8 *hash_subkey, // H, the Hash sub key input. Data starts on a 16-byte boundary. 1612* const u8 *aad, // Additional Authentication Data (AAD) 1613* u64 aad_len, // Length of AAD in bytes. With RFC4106 this is going to be 8 or 12 bytes 1614* u8 *auth_tag, // Authenticated Tag output. 1615* u64 auth_tag_len); // Authenticated Tag Length in bytes. Valid values are 16 (most likely), 1616* // 12 or 8. 1617* 1618* Assumptions: 1619* 1620* keys: 1621* keys are pre-expanded and aligned to 16 bytes. we are using the 1622* first set of 11 keys in the data structure void *aes_ctx 1623* 1624* 1625* iv: 1626* 0 1 2 3 1627* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1628* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1629* | Salt (From the SA) | 1630* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1631* | Initialization Vector | 1632* | (This is the sequence number from IPSec header) | 1633* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1634* | 0x1 | 1635* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1636* 1637* 1638* 1639* AAD: 1640* AAD padded to 128 bits with 0 1641* for example, assume AAD is a u32 vector 1642* 1643* if AAD is 8 bytes: 1644* AAD[3] = {A0, A1}; 1645* padded AAD in xmm register = {A1 A0 0 0} 1646* 1647* 0 1 2 3 1648* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1649* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1650* | SPI (A1) | 1651* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1652* | 32-bit Sequence Number (A0) | 1653* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1654* | 0x0 | 1655* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1656* 1657* AAD Format with 32-bit Sequence Number 1658* 1659* if AAD is 12 bytes: 1660* AAD[3] = {A0, A1, A2}; 1661* padded AAD in xmm register = {A2 A1 A0 0} 1662* 1663* 0 1 2 3 1664* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 1665* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1666* | SPI (A2) | 1667* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1668* | 64-bit Extended Sequence Number {A1,A0} | 1669* | | 1670* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1671* | 0x0 | 1672* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1673* 1674* AAD Format with 64-bit Extended Sequence Number 1675* 1676* poly = x^128 + x^127 + x^126 + x^121 + 1 1677***************************************************************************/ 1678SYM_FUNC_START(aesni_gcm_enc) 1679 FUNC_SAVE 1680 1681 GCM_INIT %arg6, arg7, arg8, arg9 1682 GCM_ENC_DEC enc 1683 1684 GCM_COMPLETE arg10, arg11 1685 FUNC_RESTORE 1686 RET 1687SYM_FUNC_END(aesni_gcm_enc) 1688 1689/***************************************************************************** 1690* void aesni_gcm_init(void *aes_ctx, // AES Key schedule. Starts on a 16 byte boundary. 1691* struct gcm_context_data *data, 1692* // context data 1693* u8 *iv, // Pre-counter block j0: 4 byte salt (from Security Association) 1694* // concatenated with 8 byte Initialisation Vector (from IPSec ESP Payload) 1695* // concatenated with 0x00000001. 16-byte aligned pointer. 1696* u8 *hash_subkey, // H, the Hash sub key input. Data starts on a 16-byte boundary. 1697* const u8 *aad, // Additional Authentication Data (AAD) 1698* u64 aad_len) // Length of AAD in bytes. 1699*/ 1700SYM_FUNC_START(aesni_gcm_init) 1701 FUNC_SAVE 1702 GCM_INIT %arg3, %arg4,%arg5, %arg6 1703 FUNC_RESTORE 1704 RET 1705SYM_FUNC_END(aesni_gcm_init) 1706 1707/***************************************************************************** 1708* void aesni_gcm_enc_update(void *aes_ctx, // AES Key schedule. Starts on a 16 byte boundary. 1709* struct gcm_context_data *data, 1710* // context data 1711* u8 *out, // Ciphertext output. Encrypt in-place is allowed. 1712* const u8 *in, // Plaintext input 1713* u64 plaintext_len, // Length of data in bytes for encryption. 1714*/ 1715SYM_FUNC_START(aesni_gcm_enc_update) 1716 FUNC_SAVE 1717 GCM_ENC_DEC enc 1718 FUNC_RESTORE 1719 RET 1720SYM_FUNC_END(aesni_gcm_enc_update) 1721 1722/***************************************************************************** 1723* void aesni_gcm_dec_update(void *aes_ctx, // AES Key schedule. Starts on a 16 byte boundary. 1724* struct gcm_context_data *data, 1725* // context data 1726* u8 *out, // Ciphertext output. Encrypt in-place is allowed. 1727* const u8 *in, // Plaintext input 1728* u64 plaintext_len, // Length of data in bytes for encryption. 1729*/ 1730SYM_FUNC_START(aesni_gcm_dec_update) 1731 FUNC_SAVE 1732 GCM_ENC_DEC dec 1733 FUNC_RESTORE 1734 RET 1735SYM_FUNC_END(aesni_gcm_dec_update) 1736 1737/***************************************************************************** 1738* void aesni_gcm_finalize(void *aes_ctx, // AES Key schedule. Starts on a 16 byte boundary. 1739* struct gcm_context_data *data, 1740* // context data 1741* u8 *auth_tag, // Authenticated Tag output. 1742* u64 auth_tag_len); // Authenticated Tag Length in bytes. Valid values are 16 (most likely), 1743* // 12 or 8. 1744*/ 1745SYM_FUNC_START(aesni_gcm_finalize) 1746 FUNC_SAVE 1747 GCM_COMPLETE %arg3 %arg4 1748 FUNC_RESTORE 1749 RET 1750SYM_FUNC_END(aesni_gcm_finalize) 1751 1752#endif 1753 1754SYM_FUNC_START_LOCAL(_key_expansion_256a) 1755 pshufd $0b11111111, %xmm1, %xmm1 1756 shufps $0b00010000, %xmm0, %xmm4 1757 pxor %xmm4, %xmm0 1758 shufps $0b10001100, %xmm0, %xmm4 1759 pxor %xmm4, %xmm0 1760 pxor %xmm1, %xmm0 1761 movaps %xmm0, (TKEYP) 1762 add $0x10, TKEYP 1763 RET 1764SYM_FUNC_END(_key_expansion_256a) 1765SYM_FUNC_ALIAS_LOCAL(_key_expansion_128, _key_expansion_256a) 1766 1767SYM_FUNC_START_LOCAL(_key_expansion_192a) 1768 pshufd $0b01010101, %xmm1, %xmm1 1769 shufps $0b00010000, %xmm0, %xmm4 1770 pxor %xmm4, %xmm0 1771 shufps $0b10001100, %xmm0, %xmm4 1772 pxor %xmm4, %xmm0 1773 pxor %xmm1, %xmm0 1774 1775 movaps %xmm2, %xmm5 1776 movaps %xmm2, %xmm6 1777 pslldq $4, %xmm5 1778 pshufd $0b11111111, %xmm0, %xmm3 1779 pxor %xmm3, %xmm2 1780 pxor %xmm5, %xmm2 1781 1782 movaps %xmm0, %xmm1 1783 shufps $0b01000100, %xmm0, %xmm6 1784 movaps %xmm6, (TKEYP) 1785 shufps $0b01001110, %xmm2, %xmm1 1786 movaps %xmm1, 0x10(TKEYP) 1787 add $0x20, TKEYP 1788 RET 1789SYM_FUNC_END(_key_expansion_192a) 1790 1791SYM_FUNC_START_LOCAL(_key_expansion_192b) 1792 pshufd $0b01010101, %xmm1, %xmm1 1793 shufps $0b00010000, %xmm0, %xmm4 1794 pxor %xmm4, %xmm0 1795 shufps $0b10001100, %xmm0, %xmm4 1796 pxor %xmm4, %xmm0 1797 pxor %xmm1, %xmm0 1798 1799 movaps %xmm2, %xmm5 1800 pslldq $4, %xmm5 1801 pshufd $0b11111111, %xmm0, %xmm3 1802 pxor %xmm3, %xmm2 1803 pxor %xmm5, %xmm2 1804 1805 movaps %xmm0, (TKEYP) 1806 add $0x10, TKEYP 1807 RET 1808SYM_FUNC_END(_key_expansion_192b) 1809 1810SYM_FUNC_START_LOCAL(_key_expansion_256b) 1811 pshufd $0b10101010, %xmm1, %xmm1 1812 shufps $0b00010000, %xmm2, %xmm4 1813 pxor %xmm4, %xmm2 1814 shufps $0b10001100, %xmm2, %xmm4 1815 pxor %xmm4, %xmm2 1816 pxor %xmm1, %xmm2 1817 movaps %xmm2, (TKEYP) 1818 add $0x10, TKEYP 1819 RET 1820SYM_FUNC_END(_key_expansion_256b) 1821 1822/* 1823 * int aesni_set_key(struct crypto_aes_ctx *ctx, const u8 *in_key, 1824 * unsigned int key_len) 1825 */ 1826SYM_FUNC_START(aesni_set_key) 1827 FRAME_BEGIN 1828#ifndef __x86_64__ 1829 pushl KEYP 1830 movl (FRAME_OFFSET+8)(%esp), KEYP # ctx 1831 movl (FRAME_OFFSET+12)(%esp), UKEYP # in_key 1832 movl (FRAME_OFFSET+16)(%esp), %edx # key_len 1833#endif 1834 movups (UKEYP), %xmm0 # user key (first 16 bytes) 1835 movaps %xmm0, (KEYP) 1836 lea 0x10(KEYP), TKEYP # key addr 1837 movl %edx, 480(KEYP) 1838 pxor %xmm4, %xmm4 # xmm4 is assumed 0 in _key_expansion_x 1839 cmp $24, %dl 1840 jb .Lenc_key128 1841 je .Lenc_key192 1842 movups 0x10(UKEYP), %xmm2 # other user key 1843 movaps %xmm2, (TKEYP) 1844 add $0x10, TKEYP 1845 aeskeygenassist $0x1, %xmm2, %xmm1 # round 1 1846 call _key_expansion_256a 1847 aeskeygenassist $0x1, %xmm0, %xmm1 1848 call _key_expansion_256b 1849 aeskeygenassist $0x2, %xmm2, %xmm1 # round 2 1850 call _key_expansion_256a 1851 aeskeygenassist $0x2, %xmm0, %xmm1 1852 call _key_expansion_256b 1853 aeskeygenassist $0x4, %xmm2, %xmm1 # round 3 1854 call _key_expansion_256a 1855 aeskeygenassist $0x4, %xmm0, %xmm1 1856 call _key_expansion_256b 1857 aeskeygenassist $0x8, %xmm2, %xmm1 # round 4 1858 call _key_expansion_256a 1859 aeskeygenassist $0x8, %xmm0, %xmm1 1860 call _key_expansion_256b 1861 aeskeygenassist $0x10, %xmm2, %xmm1 # round 5 1862 call _key_expansion_256a 1863 aeskeygenassist $0x10, %xmm0, %xmm1 1864 call _key_expansion_256b 1865 aeskeygenassist $0x20, %xmm2, %xmm1 # round 6 1866 call _key_expansion_256a 1867 aeskeygenassist $0x20, %xmm0, %xmm1 1868 call _key_expansion_256b 1869 aeskeygenassist $0x40, %xmm2, %xmm1 # round 7 1870 call _key_expansion_256a 1871 jmp .Ldec_key 1872.Lenc_key192: 1873 movq 0x10(UKEYP), %xmm2 # other user key 1874 aeskeygenassist $0x1, %xmm2, %xmm1 # round 1 1875 call _key_expansion_192a 1876 aeskeygenassist $0x2, %xmm2, %xmm1 # round 2 1877 call _key_expansion_192b 1878 aeskeygenassist $0x4, %xmm2, %xmm1 # round 3 1879 call _key_expansion_192a 1880 aeskeygenassist $0x8, %xmm2, %xmm1 # round 4 1881 call _key_expansion_192b 1882 aeskeygenassist $0x10, %xmm2, %xmm1 # round 5 1883 call _key_expansion_192a 1884 aeskeygenassist $0x20, %xmm2, %xmm1 # round 6 1885 call _key_expansion_192b 1886 aeskeygenassist $0x40, %xmm2, %xmm1 # round 7 1887 call _key_expansion_192a 1888 aeskeygenassist $0x80, %xmm2, %xmm1 # round 8 1889 call _key_expansion_192b 1890 jmp .Ldec_key 1891.Lenc_key128: 1892 aeskeygenassist $0x1, %xmm0, %xmm1 # round 1 1893 call _key_expansion_128 1894 aeskeygenassist $0x2, %xmm0, %xmm1 # round 2 1895 call _key_expansion_128 1896 aeskeygenassist $0x4, %xmm0, %xmm1 # round 3 1897 call _key_expansion_128 1898 aeskeygenassist $0x8, %xmm0, %xmm1 # round 4 1899 call _key_expansion_128 1900 aeskeygenassist $0x10, %xmm0, %xmm1 # round 5 1901 call _key_expansion_128 1902 aeskeygenassist $0x20, %xmm0, %xmm1 # round 6 1903 call _key_expansion_128 1904 aeskeygenassist $0x40, %xmm0, %xmm1 # round 7 1905 call _key_expansion_128 1906 aeskeygenassist $0x80, %xmm0, %xmm1 # round 8 1907 call _key_expansion_128 1908 aeskeygenassist $0x1b, %xmm0, %xmm1 # round 9 1909 call _key_expansion_128 1910 aeskeygenassist $0x36, %xmm0, %xmm1 # round 10 1911 call _key_expansion_128 1912.Ldec_key: 1913 sub $0x10, TKEYP 1914 movaps (KEYP), %xmm0 1915 movaps (TKEYP), %xmm1 1916 movaps %xmm0, 240(TKEYP) 1917 movaps %xmm1, 240(KEYP) 1918 add $0x10, KEYP 1919 lea 240-16(TKEYP), UKEYP 1920.align 4 1921.Ldec_key_loop: 1922 movaps (KEYP), %xmm0 1923 aesimc %xmm0, %xmm1 1924 movaps %xmm1, (UKEYP) 1925 add $0x10, KEYP 1926 sub $0x10, UKEYP 1927 cmp TKEYP, KEYP 1928 jb .Ldec_key_loop 1929 xor AREG, AREG 1930#ifndef __x86_64__ 1931 popl KEYP 1932#endif 1933 FRAME_END 1934 RET 1935SYM_FUNC_END(aesni_set_key) 1936 1937/* 1938 * void aesni_enc(const void *ctx, u8 *dst, const u8 *src) 1939 */ 1940SYM_FUNC_START(aesni_enc) 1941 FRAME_BEGIN 1942#ifndef __x86_64__ 1943 pushl KEYP 1944 pushl KLEN 1945 movl (FRAME_OFFSET+12)(%esp), KEYP # ctx 1946 movl (FRAME_OFFSET+16)(%esp), OUTP # dst 1947 movl (FRAME_OFFSET+20)(%esp), INP # src 1948#endif 1949 movl 480(KEYP), KLEN # key length 1950 movups (INP), STATE # input 1951 call _aesni_enc1 1952 movups STATE, (OUTP) # output 1953#ifndef __x86_64__ 1954 popl KLEN 1955 popl KEYP 1956#endif 1957 FRAME_END 1958 RET 1959SYM_FUNC_END(aesni_enc) 1960 1961/* 1962 * _aesni_enc1: internal ABI 1963 * input: 1964 * KEYP: key struct pointer 1965 * KLEN: round count 1966 * STATE: initial state (input) 1967 * output: 1968 * STATE: finial state (output) 1969 * changed: 1970 * KEY 1971 * TKEYP (T1) 1972 */ 1973SYM_FUNC_START_LOCAL(_aesni_enc1) 1974 movaps (KEYP), KEY # key 1975 mov KEYP, TKEYP 1976 pxor KEY, STATE # round 0 1977 add $0x30, TKEYP 1978 cmp $24, KLEN 1979 jb .Lenc128 1980 lea 0x20(TKEYP), TKEYP 1981 je .Lenc192 1982 add $0x20, TKEYP 1983 movaps -0x60(TKEYP), KEY 1984 aesenc KEY, STATE 1985 movaps -0x50(TKEYP), KEY 1986 aesenc KEY, STATE 1987.align 4 1988.Lenc192: 1989 movaps -0x40(TKEYP), KEY 1990 aesenc KEY, STATE 1991 movaps -0x30(TKEYP), KEY 1992 aesenc KEY, STATE 1993.align 4 1994.Lenc128: 1995 movaps -0x20(TKEYP), KEY 1996 aesenc KEY, STATE 1997 movaps -0x10(TKEYP), KEY 1998 aesenc KEY, STATE 1999 movaps (TKEYP), KEY 2000 aesenc KEY, STATE 2001 movaps 0x10(TKEYP), KEY 2002 aesenc KEY, STATE 2003 movaps 0x20(TKEYP), KEY 2004 aesenc KEY, STATE 2005 movaps 0x30(TKEYP), KEY 2006 aesenc KEY, STATE 2007 movaps 0x40(TKEYP), KEY 2008 aesenc KEY, STATE 2009 movaps 0x50(TKEYP), KEY 2010 aesenc KEY, STATE 2011 movaps 0x60(TKEYP), KEY 2012 aesenc KEY, STATE 2013 movaps 0x70(TKEYP), KEY 2014 aesenclast KEY, STATE 2015 RET 2016SYM_FUNC_END(_aesni_enc1) 2017 2018/* 2019 * _aesni_enc4: internal ABI 2020 * input: 2021 * KEYP: key struct pointer 2022 * KLEN: round count 2023 * STATE1: initial state (input) 2024 * STATE2 2025 * STATE3 2026 * STATE4 2027 * output: 2028 * STATE1: finial state (output) 2029 * STATE2 2030 * STATE3 2031 * STATE4 2032 * changed: 2033 * KEY 2034 * TKEYP (T1) 2035 */ 2036SYM_FUNC_START_LOCAL(_aesni_enc4) 2037 movaps (KEYP), KEY # key 2038 mov KEYP, TKEYP 2039 pxor KEY, STATE1 # round 0 2040 pxor KEY, STATE2 2041 pxor KEY, STATE3 2042 pxor KEY, STATE4 2043 add $0x30, TKEYP 2044 cmp $24, KLEN 2045 jb .L4enc128 2046 lea 0x20(TKEYP), TKEYP 2047 je .L4enc192 2048 add $0x20, TKEYP 2049 movaps -0x60(TKEYP), KEY 2050 aesenc KEY, STATE1 2051 aesenc KEY, STATE2 2052 aesenc KEY, STATE3 2053 aesenc KEY, STATE4 2054 movaps -0x50(TKEYP), KEY 2055 aesenc KEY, STATE1 2056 aesenc KEY, STATE2 2057 aesenc KEY, STATE3 2058 aesenc KEY, STATE4 2059#.align 4 2060.L4enc192: 2061 movaps -0x40(TKEYP), KEY 2062 aesenc KEY, STATE1 2063 aesenc KEY, STATE2 2064 aesenc KEY, STATE3 2065 aesenc KEY, STATE4 2066 movaps -0x30(TKEYP), KEY 2067 aesenc KEY, STATE1 2068 aesenc KEY, STATE2 2069 aesenc KEY, STATE3 2070 aesenc KEY, STATE4 2071#.align 4 2072.L4enc128: 2073 movaps -0x20(TKEYP), KEY 2074 aesenc KEY, STATE1 2075 aesenc KEY, STATE2 2076 aesenc KEY, STATE3 2077 aesenc KEY, STATE4 2078 movaps -0x10(TKEYP), KEY 2079 aesenc KEY, STATE1 2080 aesenc KEY, STATE2 2081 aesenc KEY, STATE3 2082 aesenc KEY, STATE4 2083 movaps (TKEYP), KEY 2084 aesenc KEY, STATE1 2085 aesenc KEY, STATE2 2086 aesenc KEY, STATE3 2087 aesenc KEY, STATE4 2088 movaps 0x10(TKEYP), KEY 2089 aesenc KEY, STATE1 2090 aesenc KEY, STATE2 2091 aesenc KEY, STATE3 2092 aesenc KEY, STATE4 2093 movaps 0x20(TKEYP), KEY 2094 aesenc KEY, STATE1 2095 aesenc KEY, STATE2 2096 aesenc KEY, STATE3 2097 aesenc KEY, STATE4 2098 movaps 0x30(TKEYP), KEY 2099 aesenc KEY, STATE1 2100 aesenc KEY, STATE2 2101 aesenc KEY, STATE3 2102 aesenc KEY, STATE4 2103 movaps 0x40(TKEYP), KEY 2104 aesenc KEY, STATE1 2105 aesenc KEY, STATE2 2106 aesenc KEY, STATE3 2107 aesenc KEY, STATE4 2108 movaps 0x50(TKEYP), KEY 2109 aesenc KEY, STATE1 2110 aesenc KEY, STATE2 2111 aesenc KEY, STATE3 2112 aesenc KEY, STATE4 2113 movaps 0x60(TKEYP), KEY 2114 aesenc KEY, STATE1 2115 aesenc KEY, STATE2 2116 aesenc KEY, STATE3 2117 aesenc KEY, STATE4 2118 movaps 0x70(TKEYP), KEY 2119 aesenclast KEY, STATE1 # last round 2120 aesenclast KEY, STATE2 2121 aesenclast KEY, STATE3 2122 aesenclast KEY, STATE4 2123 RET 2124SYM_FUNC_END(_aesni_enc4) 2125 2126/* 2127 * void aesni_dec (const void *ctx, u8 *dst, const u8 *src) 2128 */ 2129SYM_FUNC_START(aesni_dec) 2130 FRAME_BEGIN 2131#ifndef __x86_64__ 2132 pushl KEYP 2133 pushl KLEN 2134 movl (FRAME_OFFSET+12)(%esp), KEYP # ctx 2135 movl (FRAME_OFFSET+16)(%esp), OUTP # dst 2136 movl (FRAME_OFFSET+20)(%esp), INP # src 2137#endif 2138 mov 480(KEYP), KLEN # key length 2139 add $240, KEYP 2140 movups (INP), STATE # input 2141 call _aesni_dec1 2142 movups STATE, (OUTP) #output 2143#ifndef __x86_64__ 2144 popl KLEN 2145 popl KEYP 2146#endif 2147 FRAME_END 2148 RET 2149SYM_FUNC_END(aesni_dec) 2150 2151/* 2152 * _aesni_dec1: internal ABI 2153 * input: 2154 * KEYP: key struct pointer 2155 * KLEN: key length 2156 * STATE: initial state (input) 2157 * output: 2158 * STATE: finial state (output) 2159 * changed: 2160 * KEY 2161 * TKEYP (T1) 2162 */ 2163SYM_FUNC_START_LOCAL(_aesni_dec1) 2164 movaps (KEYP), KEY # key 2165 mov KEYP, TKEYP 2166 pxor KEY, STATE # round 0 2167 add $0x30, TKEYP 2168 cmp $24, KLEN 2169 jb .Ldec128 2170 lea 0x20(TKEYP), TKEYP 2171 je .Ldec192 2172 add $0x20, TKEYP 2173 movaps -0x60(TKEYP), KEY 2174 aesdec KEY, STATE 2175 movaps -0x50(TKEYP), KEY 2176 aesdec KEY, STATE 2177.align 4 2178.Ldec192: 2179 movaps -0x40(TKEYP), KEY 2180 aesdec KEY, STATE 2181 movaps -0x30(TKEYP), KEY 2182 aesdec KEY, STATE 2183.align 4 2184.Ldec128: 2185 movaps -0x20(TKEYP), KEY 2186 aesdec KEY, STATE 2187 movaps -0x10(TKEYP), KEY 2188 aesdec KEY, STATE 2189 movaps (TKEYP), KEY 2190 aesdec KEY, STATE 2191 movaps 0x10(TKEYP), KEY 2192 aesdec KEY, STATE 2193 movaps 0x20(TKEYP), KEY 2194 aesdec KEY, STATE 2195 movaps 0x30(TKEYP), KEY 2196 aesdec KEY, STATE 2197 movaps 0x40(TKEYP), KEY 2198 aesdec KEY, STATE 2199 movaps 0x50(TKEYP), KEY 2200 aesdec KEY, STATE 2201 movaps 0x60(TKEYP), KEY 2202 aesdec KEY, STATE 2203 movaps 0x70(TKEYP), KEY 2204 aesdeclast KEY, STATE 2205 RET 2206SYM_FUNC_END(_aesni_dec1) 2207 2208/* 2209 * _aesni_dec4: internal ABI 2210 * input: 2211 * KEYP: key struct pointer 2212 * KLEN: key length 2213 * STATE1: initial state (input) 2214 * STATE2 2215 * STATE3 2216 * STATE4 2217 * output: 2218 * STATE1: finial state (output) 2219 * STATE2 2220 * STATE3 2221 * STATE4 2222 * changed: 2223 * KEY 2224 * TKEYP (T1) 2225 */ 2226SYM_FUNC_START_LOCAL(_aesni_dec4) 2227 movaps (KEYP), KEY # key 2228 mov KEYP, TKEYP 2229 pxor KEY, STATE1 # round 0 2230 pxor KEY, STATE2 2231 pxor KEY, STATE3 2232 pxor KEY, STATE4 2233 add $0x30, TKEYP 2234 cmp $24, KLEN 2235 jb .L4dec128 2236 lea 0x20(TKEYP), TKEYP 2237 je .L4dec192 2238 add $0x20, TKEYP 2239 movaps -0x60(TKEYP), KEY 2240 aesdec KEY, STATE1 2241 aesdec KEY, STATE2 2242 aesdec KEY, STATE3 2243 aesdec KEY, STATE4 2244 movaps -0x50(TKEYP), KEY 2245 aesdec KEY, STATE1 2246 aesdec KEY, STATE2 2247 aesdec KEY, STATE3 2248 aesdec KEY, STATE4 2249.align 4 2250.L4dec192: 2251 movaps -0x40(TKEYP), KEY 2252 aesdec KEY, STATE1 2253 aesdec KEY, STATE2 2254 aesdec KEY, STATE3 2255 aesdec KEY, STATE4 2256 movaps -0x30(TKEYP), KEY 2257 aesdec KEY, STATE1 2258 aesdec KEY, STATE2 2259 aesdec KEY, STATE3 2260 aesdec KEY, STATE4 2261.align 4 2262.L4dec128: 2263 movaps -0x20(TKEYP), KEY 2264 aesdec KEY, STATE1 2265 aesdec KEY, STATE2 2266 aesdec KEY, STATE3 2267 aesdec KEY, STATE4 2268 movaps -0x10(TKEYP), KEY 2269 aesdec KEY, STATE1 2270 aesdec KEY, STATE2 2271 aesdec KEY, STATE3 2272 aesdec KEY, STATE4 2273 movaps (TKEYP), KEY 2274 aesdec KEY, STATE1 2275 aesdec KEY, STATE2 2276 aesdec KEY, STATE3 2277 aesdec KEY, STATE4 2278 movaps 0x10(TKEYP), KEY 2279 aesdec KEY, STATE1 2280 aesdec KEY, STATE2 2281 aesdec KEY, STATE3 2282 aesdec KEY, STATE4 2283 movaps 0x20(TKEYP), KEY 2284 aesdec KEY, STATE1 2285 aesdec KEY, STATE2 2286 aesdec KEY, STATE3 2287 aesdec KEY, STATE4 2288 movaps 0x30(TKEYP), KEY 2289 aesdec KEY, STATE1 2290 aesdec KEY, STATE2 2291 aesdec KEY, STATE3 2292 aesdec KEY, STATE4 2293 movaps 0x40(TKEYP), KEY 2294 aesdec KEY, STATE1 2295 aesdec KEY, STATE2 2296 aesdec KEY, STATE3 2297 aesdec KEY, STATE4 2298 movaps 0x50(TKEYP), KEY 2299 aesdec KEY, STATE1 2300 aesdec KEY, STATE2 2301 aesdec KEY, STATE3 2302 aesdec KEY, STATE4 2303 movaps 0x60(TKEYP), KEY 2304 aesdec KEY, STATE1 2305 aesdec KEY, STATE2 2306 aesdec KEY, STATE3 2307 aesdec KEY, STATE4 2308 movaps 0x70(TKEYP), KEY 2309 aesdeclast KEY, STATE1 # last round 2310 aesdeclast KEY, STATE2 2311 aesdeclast KEY, STATE3 2312 aesdeclast KEY, STATE4 2313 RET 2314SYM_FUNC_END(_aesni_dec4) 2315 2316/* 2317 * void aesni_ecb_enc(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src, 2318 * size_t len) 2319 */ 2320SYM_FUNC_START(aesni_ecb_enc) 2321 FRAME_BEGIN 2322#ifndef __x86_64__ 2323 pushl LEN 2324 pushl KEYP 2325 pushl KLEN 2326 movl (FRAME_OFFSET+16)(%esp), KEYP # ctx 2327 movl (FRAME_OFFSET+20)(%esp), OUTP # dst 2328 movl (FRAME_OFFSET+24)(%esp), INP # src 2329 movl (FRAME_OFFSET+28)(%esp), LEN # len 2330#endif 2331 test LEN, LEN # check length 2332 jz .Lecb_enc_ret 2333 mov 480(KEYP), KLEN 2334 cmp $16, LEN 2335 jb .Lecb_enc_ret 2336 cmp $64, LEN 2337 jb .Lecb_enc_loop1 2338.align 4 2339.Lecb_enc_loop4: 2340 movups (INP), STATE1 2341 movups 0x10(INP), STATE2 2342 movups 0x20(INP), STATE3 2343 movups 0x30(INP), STATE4 2344 call _aesni_enc4 2345 movups STATE1, (OUTP) 2346 movups STATE2, 0x10(OUTP) 2347 movups STATE3, 0x20(OUTP) 2348 movups STATE4, 0x30(OUTP) 2349 sub $64, LEN 2350 add $64, INP 2351 add $64, OUTP 2352 cmp $64, LEN 2353 jge .Lecb_enc_loop4 2354 cmp $16, LEN 2355 jb .Lecb_enc_ret 2356.align 4 2357.Lecb_enc_loop1: 2358 movups (INP), STATE1 2359 call _aesni_enc1 2360 movups STATE1, (OUTP) 2361 sub $16, LEN 2362 add $16, INP 2363 add $16, OUTP 2364 cmp $16, LEN 2365 jge .Lecb_enc_loop1 2366.Lecb_enc_ret: 2367#ifndef __x86_64__ 2368 popl KLEN 2369 popl KEYP 2370 popl LEN 2371#endif 2372 FRAME_END 2373 RET 2374SYM_FUNC_END(aesni_ecb_enc) 2375 2376/* 2377 * void aesni_ecb_dec(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src, 2378 * size_t len); 2379 */ 2380SYM_FUNC_START(aesni_ecb_dec) 2381 FRAME_BEGIN 2382#ifndef __x86_64__ 2383 pushl LEN 2384 pushl KEYP 2385 pushl KLEN 2386 movl (FRAME_OFFSET+16)(%esp), KEYP # ctx 2387 movl (FRAME_OFFSET+20)(%esp), OUTP # dst 2388 movl (FRAME_OFFSET+24)(%esp), INP # src 2389 movl (FRAME_OFFSET+28)(%esp), LEN # len 2390#endif 2391 test LEN, LEN 2392 jz .Lecb_dec_ret 2393 mov 480(KEYP), KLEN 2394 add $240, KEYP 2395 cmp $16, LEN 2396 jb .Lecb_dec_ret 2397 cmp $64, LEN 2398 jb .Lecb_dec_loop1 2399.align 4 2400.Lecb_dec_loop4: 2401 movups (INP), STATE1 2402 movups 0x10(INP), STATE2 2403 movups 0x20(INP), STATE3 2404 movups 0x30(INP), STATE4 2405 call _aesni_dec4 2406 movups STATE1, (OUTP) 2407 movups STATE2, 0x10(OUTP) 2408 movups STATE3, 0x20(OUTP) 2409 movups STATE4, 0x30(OUTP) 2410 sub $64, LEN 2411 add $64, INP 2412 add $64, OUTP 2413 cmp $64, LEN 2414 jge .Lecb_dec_loop4 2415 cmp $16, LEN 2416 jb .Lecb_dec_ret 2417.align 4 2418.Lecb_dec_loop1: 2419 movups (INP), STATE1 2420 call _aesni_dec1 2421 movups STATE1, (OUTP) 2422 sub $16, LEN 2423 add $16, INP 2424 add $16, OUTP 2425 cmp $16, LEN 2426 jge .Lecb_dec_loop1 2427.Lecb_dec_ret: 2428#ifndef __x86_64__ 2429 popl KLEN 2430 popl KEYP 2431 popl LEN 2432#endif 2433 FRAME_END 2434 RET 2435SYM_FUNC_END(aesni_ecb_dec) 2436 2437/* 2438 * void aesni_cbc_enc(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src, 2439 * size_t len, u8 *iv) 2440 */ 2441SYM_FUNC_START(aesni_cbc_enc) 2442 FRAME_BEGIN 2443#ifndef __x86_64__ 2444 pushl IVP 2445 pushl LEN 2446 pushl KEYP 2447 pushl KLEN 2448 movl (FRAME_OFFSET+20)(%esp), KEYP # ctx 2449 movl (FRAME_OFFSET+24)(%esp), OUTP # dst 2450 movl (FRAME_OFFSET+28)(%esp), INP # src 2451 movl (FRAME_OFFSET+32)(%esp), LEN # len 2452 movl (FRAME_OFFSET+36)(%esp), IVP # iv 2453#endif 2454 cmp $16, LEN 2455 jb .Lcbc_enc_ret 2456 mov 480(KEYP), KLEN 2457 movups (IVP), STATE # load iv as initial state 2458.align 4 2459.Lcbc_enc_loop: 2460 movups (INP), IN # load input 2461 pxor IN, STATE 2462 call _aesni_enc1 2463 movups STATE, (OUTP) # store output 2464 sub $16, LEN 2465 add $16, INP 2466 add $16, OUTP 2467 cmp $16, LEN 2468 jge .Lcbc_enc_loop 2469 movups STATE, (IVP) 2470.Lcbc_enc_ret: 2471#ifndef __x86_64__ 2472 popl KLEN 2473 popl KEYP 2474 popl LEN 2475 popl IVP 2476#endif 2477 FRAME_END 2478 RET 2479SYM_FUNC_END(aesni_cbc_enc) 2480 2481/* 2482 * void aesni_cbc_dec(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src, 2483 * size_t len, u8 *iv) 2484 */ 2485SYM_FUNC_START(aesni_cbc_dec) 2486 FRAME_BEGIN 2487#ifndef __x86_64__ 2488 pushl IVP 2489 pushl LEN 2490 pushl KEYP 2491 pushl KLEN 2492 movl (FRAME_OFFSET+20)(%esp), KEYP # ctx 2493 movl (FRAME_OFFSET+24)(%esp), OUTP # dst 2494 movl (FRAME_OFFSET+28)(%esp), INP # src 2495 movl (FRAME_OFFSET+32)(%esp), LEN # len 2496 movl (FRAME_OFFSET+36)(%esp), IVP # iv 2497#endif 2498 cmp $16, LEN 2499 jb .Lcbc_dec_just_ret 2500 mov 480(KEYP), KLEN 2501 add $240, KEYP 2502 movups (IVP), IV 2503 cmp $64, LEN 2504 jb .Lcbc_dec_loop1 2505.align 4 2506.Lcbc_dec_loop4: 2507 movups (INP), IN1 2508 movaps IN1, STATE1 2509 movups 0x10(INP), IN2 2510 movaps IN2, STATE2 2511#ifdef __x86_64__ 2512 movups 0x20(INP), IN3 2513 movaps IN3, STATE3 2514 movups 0x30(INP), IN4 2515 movaps IN4, STATE4 2516#else 2517 movups 0x20(INP), IN1 2518 movaps IN1, STATE3 2519 movups 0x30(INP), IN2 2520 movaps IN2, STATE4 2521#endif 2522 call _aesni_dec4 2523 pxor IV, STATE1 2524#ifdef __x86_64__ 2525 pxor IN1, STATE2 2526 pxor IN2, STATE3 2527 pxor IN3, STATE4 2528 movaps IN4, IV 2529#else 2530 pxor IN1, STATE4 2531 movaps IN2, IV 2532 movups (INP), IN1 2533 pxor IN1, STATE2 2534 movups 0x10(INP), IN2 2535 pxor IN2, STATE3 2536#endif 2537 movups STATE1, (OUTP) 2538 movups STATE2, 0x10(OUTP) 2539 movups STATE3, 0x20(OUTP) 2540 movups STATE4, 0x30(OUTP) 2541 sub $64, LEN 2542 add $64, INP 2543 add $64, OUTP 2544 cmp $64, LEN 2545 jge .Lcbc_dec_loop4 2546 cmp $16, LEN 2547 jb .Lcbc_dec_ret 2548.align 4 2549.Lcbc_dec_loop1: 2550 movups (INP), IN 2551 movaps IN, STATE 2552 call _aesni_dec1 2553 pxor IV, STATE 2554 movups STATE, (OUTP) 2555 movaps IN, IV 2556 sub $16, LEN 2557 add $16, INP 2558 add $16, OUTP 2559 cmp $16, LEN 2560 jge .Lcbc_dec_loop1 2561.Lcbc_dec_ret: 2562 movups IV, (IVP) 2563.Lcbc_dec_just_ret: 2564#ifndef __x86_64__ 2565 popl KLEN 2566 popl KEYP 2567 popl LEN 2568 popl IVP 2569#endif 2570 FRAME_END 2571 RET 2572SYM_FUNC_END(aesni_cbc_dec) 2573 2574/* 2575 * void aesni_cts_cbc_enc(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src, 2576 * size_t len, u8 *iv) 2577 */ 2578SYM_FUNC_START(aesni_cts_cbc_enc) 2579 FRAME_BEGIN 2580#ifndef __x86_64__ 2581 pushl IVP 2582 pushl LEN 2583 pushl KEYP 2584 pushl KLEN 2585 movl (FRAME_OFFSET+20)(%esp), KEYP # ctx 2586 movl (FRAME_OFFSET+24)(%esp), OUTP # dst 2587 movl (FRAME_OFFSET+28)(%esp), INP # src 2588 movl (FRAME_OFFSET+32)(%esp), LEN # len 2589 movl (FRAME_OFFSET+36)(%esp), IVP # iv 2590 lea .Lcts_permute_table, T1 2591#else 2592 lea .Lcts_permute_table(%rip), T1 2593#endif 2594 mov 480(KEYP), KLEN 2595 movups (IVP), STATE 2596 sub $16, LEN 2597 mov T1, IVP 2598 add $32, IVP 2599 add LEN, T1 2600 sub LEN, IVP 2601 movups (T1), %xmm4 2602 movups (IVP), %xmm5 2603 2604 movups (INP), IN1 2605 add LEN, INP 2606 movups (INP), IN2 2607 2608 pxor IN1, STATE 2609 call _aesni_enc1 2610 2611 pshufb %xmm5, IN2 2612 pxor STATE, IN2 2613 pshufb %xmm4, STATE 2614 add OUTP, LEN 2615 movups STATE, (LEN) 2616 2617 movaps IN2, STATE 2618 call _aesni_enc1 2619 movups STATE, (OUTP) 2620 2621#ifndef __x86_64__ 2622 popl KLEN 2623 popl KEYP 2624 popl LEN 2625 popl IVP 2626#endif 2627 FRAME_END 2628 RET 2629SYM_FUNC_END(aesni_cts_cbc_enc) 2630 2631/* 2632 * void aesni_cts_cbc_dec(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src, 2633 * size_t len, u8 *iv) 2634 */ 2635SYM_FUNC_START(aesni_cts_cbc_dec) 2636 FRAME_BEGIN 2637#ifndef __x86_64__ 2638 pushl IVP 2639 pushl LEN 2640 pushl KEYP 2641 pushl KLEN 2642 movl (FRAME_OFFSET+20)(%esp), KEYP # ctx 2643 movl (FRAME_OFFSET+24)(%esp), OUTP # dst 2644 movl (FRAME_OFFSET+28)(%esp), INP # src 2645 movl (FRAME_OFFSET+32)(%esp), LEN # len 2646 movl (FRAME_OFFSET+36)(%esp), IVP # iv 2647 lea .Lcts_permute_table, T1 2648#else 2649 lea .Lcts_permute_table(%rip), T1 2650#endif 2651 mov 480(KEYP), KLEN 2652 add $240, KEYP 2653 movups (IVP), IV 2654 sub $16, LEN 2655 mov T1, IVP 2656 add $32, IVP 2657 add LEN, T1 2658 sub LEN, IVP 2659 movups (T1), %xmm4 2660 2661 movups (INP), STATE 2662 add LEN, INP 2663 movups (INP), IN1 2664 2665 call _aesni_dec1 2666 movaps STATE, IN2 2667 pshufb %xmm4, STATE 2668 pxor IN1, STATE 2669 2670 add OUTP, LEN 2671 movups STATE, (LEN) 2672 2673 movups (IVP), %xmm0 2674 pshufb %xmm0, IN1 2675 pblendvb IN2, IN1 2676 movaps IN1, STATE 2677 call _aesni_dec1 2678 2679 pxor IV, STATE 2680 movups STATE, (OUTP) 2681 2682#ifndef __x86_64__ 2683 popl KLEN 2684 popl KEYP 2685 popl LEN 2686 popl IVP 2687#endif 2688 FRAME_END 2689 RET 2690SYM_FUNC_END(aesni_cts_cbc_dec) 2691 2692.pushsection .rodata 2693.align 16 2694.Lcts_permute_table: 2695 .byte 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 2696 .byte 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 2697 .byte 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 2698 .byte 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f 2699 .byte 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 2700 .byte 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 2701#ifdef __x86_64__ 2702.Lbswap_mask: 2703 .byte 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 2704#endif 2705.popsection 2706 2707#ifdef __x86_64__ 2708/* 2709 * _aesni_inc_init: internal ABI 2710 * setup registers used by _aesni_inc 2711 * input: 2712 * IV 2713 * output: 2714 * CTR: == IV, in little endian 2715 * TCTR_LOW: == lower qword of CTR 2716 * INC: == 1, in little endian 2717 * BSWAP_MASK == endian swapping mask 2718 */ 2719SYM_FUNC_START_LOCAL(_aesni_inc_init) 2720 movaps .Lbswap_mask, BSWAP_MASK 2721 movaps IV, CTR 2722 pshufb BSWAP_MASK, CTR 2723 mov $1, TCTR_LOW 2724 movq TCTR_LOW, INC 2725 movq CTR, TCTR_LOW 2726 RET 2727SYM_FUNC_END(_aesni_inc_init) 2728 2729/* 2730 * _aesni_inc: internal ABI 2731 * Increase IV by 1, IV is in big endian 2732 * input: 2733 * IV 2734 * CTR: == IV, in little endian 2735 * TCTR_LOW: == lower qword of CTR 2736 * INC: == 1, in little endian 2737 * BSWAP_MASK == endian swapping mask 2738 * output: 2739 * IV: Increase by 1 2740 * changed: 2741 * CTR: == output IV, in little endian 2742 * TCTR_LOW: == lower qword of CTR 2743 */ 2744SYM_FUNC_START_LOCAL(_aesni_inc) 2745 paddq INC, CTR 2746 add $1, TCTR_LOW 2747 jnc .Linc_low 2748 pslldq $8, INC 2749 paddq INC, CTR 2750 psrldq $8, INC 2751.Linc_low: 2752 movaps CTR, IV 2753 pshufb BSWAP_MASK, IV 2754 RET 2755SYM_FUNC_END(_aesni_inc) 2756 2757/* 2758 * void aesni_ctr_enc(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src, 2759 * size_t len, u8 *iv) 2760 */ 2761SYM_FUNC_START(aesni_ctr_enc) 2762 FRAME_BEGIN 2763 cmp $16, LEN 2764 jb .Lctr_enc_just_ret 2765 mov 480(KEYP), KLEN 2766 movups (IVP), IV 2767 call _aesni_inc_init 2768 cmp $64, LEN 2769 jb .Lctr_enc_loop1 2770.align 4 2771.Lctr_enc_loop4: 2772 movaps IV, STATE1 2773 call _aesni_inc 2774 movups (INP), IN1 2775 movaps IV, STATE2 2776 call _aesni_inc 2777 movups 0x10(INP), IN2 2778 movaps IV, STATE3 2779 call _aesni_inc 2780 movups 0x20(INP), IN3 2781 movaps IV, STATE4 2782 call _aesni_inc 2783 movups 0x30(INP), IN4 2784 call _aesni_enc4 2785 pxor IN1, STATE1 2786 movups STATE1, (OUTP) 2787 pxor IN2, STATE2 2788 movups STATE2, 0x10(OUTP) 2789 pxor IN3, STATE3 2790 movups STATE3, 0x20(OUTP) 2791 pxor IN4, STATE4 2792 movups STATE4, 0x30(OUTP) 2793 sub $64, LEN 2794 add $64, INP 2795 add $64, OUTP 2796 cmp $64, LEN 2797 jge .Lctr_enc_loop4 2798 cmp $16, LEN 2799 jb .Lctr_enc_ret 2800.align 4 2801.Lctr_enc_loop1: 2802 movaps IV, STATE 2803 call _aesni_inc 2804 movups (INP), IN 2805 call _aesni_enc1 2806 pxor IN, STATE 2807 movups STATE, (OUTP) 2808 sub $16, LEN 2809 add $16, INP 2810 add $16, OUTP 2811 cmp $16, LEN 2812 jge .Lctr_enc_loop1 2813.Lctr_enc_ret: 2814 movups IV, (IVP) 2815.Lctr_enc_just_ret: 2816 FRAME_END 2817 RET 2818SYM_FUNC_END(aesni_ctr_enc) 2819 2820#endif 2821 2822.section .rodata.cst16.gf128mul_x_ble_mask, "aM", @progbits, 16 2823.align 16 2824.Lgf128mul_x_ble_mask: 2825 .octa 0x00000000000000010000000000000087 2826.previous 2827 2828/* 2829 * _aesni_gf128mul_x_ble: internal ABI 2830 * Multiply in GF(2^128) for XTS IVs 2831 * input: 2832 * IV: current IV 2833 * GF128MUL_MASK == mask with 0x87 and 0x01 2834 * output: 2835 * IV: next IV 2836 * changed: 2837 * CTR: == temporary value 2838 */ 2839#define _aesni_gf128mul_x_ble() \ 2840 pshufd $0x13, IV, KEY; \ 2841 paddq IV, IV; \ 2842 psrad $31, KEY; \ 2843 pand GF128MUL_MASK, KEY; \ 2844 pxor KEY, IV; 2845 2846/* 2847 * void aesni_xts_encrypt(const struct crypto_aes_ctx *ctx, u8 *dst, 2848 * const u8 *src, unsigned int len, le128 *iv) 2849 */ 2850SYM_FUNC_START(aesni_xts_encrypt) 2851 FRAME_BEGIN 2852#ifndef __x86_64__ 2853 pushl IVP 2854 pushl LEN 2855 pushl KEYP 2856 pushl KLEN 2857 movl (FRAME_OFFSET+20)(%esp), KEYP # ctx 2858 movl (FRAME_OFFSET+24)(%esp), OUTP # dst 2859 movl (FRAME_OFFSET+28)(%esp), INP # src 2860 movl (FRAME_OFFSET+32)(%esp), LEN # len 2861 movl (FRAME_OFFSET+36)(%esp), IVP # iv 2862 movdqa .Lgf128mul_x_ble_mask, GF128MUL_MASK 2863#else 2864 movdqa .Lgf128mul_x_ble_mask(%rip), GF128MUL_MASK 2865#endif 2866 movups (IVP), IV 2867 2868 mov 480(KEYP), KLEN 2869 2870.Lxts_enc_loop4: 2871 sub $64, LEN 2872 jl .Lxts_enc_1x 2873 2874 movdqa IV, STATE1 2875 movdqu 0x00(INP), IN 2876 pxor IN, STATE1 2877 movdqu IV, 0x00(OUTP) 2878 2879 _aesni_gf128mul_x_ble() 2880 movdqa IV, STATE2 2881 movdqu 0x10(INP), IN 2882 pxor IN, STATE2 2883 movdqu IV, 0x10(OUTP) 2884 2885 _aesni_gf128mul_x_ble() 2886 movdqa IV, STATE3 2887 movdqu 0x20(INP), IN 2888 pxor IN, STATE3 2889 movdqu IV, 0x20(OUTP) 2890 2891 _aesni_gf128mul_x_ble() 2892 movdqa IV, STATE4 2893 movdqu 0x30(INP), IN 2894 pxor IN, STATE4 2895 movdqu IV, 0x30(OUTP) 2896 2897 call _aesni_enc4 2898 2899 movdqu 0x00(OUTP), IN 2900 pxor IN, STATE1 2901 movdqu STATE1, 0x00(OUTP) 2902 2903 movdqu 0x10(OUTP), IN 2904 pxor IN, STATE2 2905 movdqu STATE2, 0x10(OUTP) 2906 2907 movdqu 0x20(OUTP), IN 2908 pxor IN, STATE3 2909 movdqu STATE3, 0x20(OUTP) 2910 2911 movdqu 0x30(OUTP), IN 2912 pxor IN, STATE4 2913 movdqu STATE4, 0x30(OUTP) 2914 2915 _aesni_gf128mul_x_ble() 2916 2917 add $64, INP 2918 add $64, OUTP 2919 test LEN, LEN 2920 jnz .Lxts_enc_loop4 2921 2922.Lxts_enc_ret_iv: 2923 movups IV, (IVP) 2924 2925.Lxts_enc_ret: 2926#ifndef __x86_64__ 2927 popl KLEN 2928 popl KEYP 2929 popl LEN 2930 popl IVP 2931#endif 2932 FRAME_END 2933 RET 2934 2935.Lxts_enc_1x: 2936 add $64, LEN 2937 jz .Lxts_enc_ret_iv 2938 sub $16, LEN 2939 jl .Lxts_enc_cts4 2940 2941.Lxts_enc_loop1: 2942 movdqu (INP), STATE 2943 pxor IV, STATE 2944 call _aesni_enc1 2945 pxor IV, STATE 2946 _aesni_gf128mul_x_ble() 2947 2948 test LEN, LEN 2949 jz .Lxts_enc_out 2950 2951 add $16, INP 2952 sub $16, LEN 2953 jl .Lxts_enc_cts1 2954 2955 movdqu STATE, (OUTP) 2956 add $16, OUTP 2957 jmp .Lxts_enc_loop1 2958 2959.Lxts_enc_out: 2960 movdqu STATE, (OUTP) 2961 jmp .Lxts_enc_ret_iv 2962 2963.Lxts_enc_cts4: 2964 movdqa STATE4, STATE 2965 sub $16, OUTP 2966 2967.Lxts_enc_cts1: 2968#ifndef __x86_64__ 2969 lea .Lcts_permute_table, T1 2970#else 2971 lea .Lcts_permute_table(%rip), T1 2972#endif 2973 add LEN, INP /* rewind input pointer */ 2974 add $16, LEN /* # bytes in final block */ 2975 movups (INP), IN1 2976 2977 mov T1, IVP 2978 add $32, IVP 2979 add LEN, T1 2980 sub LEN, IVP 2981 add OUTP, LEN 2982 2983 movups (T1), %xmm4 2984 movaps STATE, IN2 2985 pshufb %xmm4, STATE 2986 movups STATE, (LEN) 2987 2988 movups (IVP), %xmm0 2989 pshufb %xmm0, IN1 2990 pblendvb IN2, IN1 2991 movaps IN1, STATE 2992 2993 pxor IV, STATE 2994 call _aesni_enc1 2995 pxor IV, STATE 2996 2997 movups STATE, (OUTP) 2998 jmp .Lxts_enc_ret 2999SYM_FUNC_END(aesni_xts_encrypt) 3000 3001/* 3002 * void aesni_xts_decrypt(const struct crypto_aes_ctx *ctx, u8 *dst, 3003 * const u8 *src, unsigned int len, le128 *iv) 3004 */ 3005SYM_FUNC_START(aesni_xts_decrypt) 3006 FRAME_BEGIN 3007#ifndef __x86_64__ 3008 pushl IVP 3009 pushl LEN 3010 pushl KEYP 3011 pushl KLEN 3012 movl (FRAME_OFFSET+20)(%esp), KEYP # ctx 3013 movl (FRAME_OFFSET+24)(%esp), OUTP # dst 3014 movl (FRAME_OFFSET+28)(%esp), INP # src 3015 movl (FRAME_OFFSET+32)(%esp), LEN # len 3016 movl (FRAME_OFFSET+36)(%esp), IVP # iv 3017 movdqa .Lgf128mul_x_ble_mask, GF128MUL_MASK 3018#else 3019 movdqa .Lgf128mul_x_ble_mask(%rip), GF128MUL_MASK 3020#endif 3021 movups (IVP), IV 3022 3023 mov 480(KEYP), KLEN 3024 add $240, KEYP 3025 3026 test $15, LEN 3027 jz .Lxts_dec_loop4 3028 sub $16, LEN 3029 3030.Lxts_dec_loop4: 3031 sub $64, LEN 3032 jl .Lxts_dec_1x 3033 3034 movdqa IV, STATE1 3035 movdqu 0x00(INP), IN 3036 pxor IN, STATE1 3037 movdqu IV, 0x00(OUTP) 3038 3039 _aesni_gf128mul_x_ble() 3040 movdqa IV, STATE2 3041 movdqu 0x10(INP), IN 3042 pxor IN, STATE2 3043 movdqu IV, 0x10(OUTP) 3044 3045 _aesni_gf128mul_x_ble() 3046 movdqa IV, STATE3 3047 movdqu 0x20(INP), IN 3048 pxor IN, STATE3 3049 movdqu IV, 0x20(OUTP) 3050 3051 _aesni_gf128mul_x_ble() 3052 movdqa IV, STATE4 3053 movdqu 0x30(INP), IN 3054 pxor IN, STATE4 3055 movdqu IV, 0x30(OUTP) 3056 3057 call _aesni_dec4 3058 3059 movdqu 0x00(OUTP), IN 3060 pxor IN, STATE1 3061 movdqu STATE1, 0x00(OUTP) 3062 3063 movdqu 0x10(OUTP), IN 3064 pxor IN, STATE2 3065 movdqu STATE2, 0x10(OUTP) 3066 3067 movdqu 0x20(OUTP), IN 3068 pxor IN, STATE3 3069 movdqu STATE3, 0x20(OUTP) 3070 3071 movdqu 0x30(OUTP), IN 3072 pxor IN, STATE4 3073 movdqu STATE4, 0x30(OUTP) 3074 3075 _aesni_gf128mul_x_ble() 3076 3077 add $64, INP 3078 add $64, OUTP 3079 test LEN, LEN 3080 jnz .Lxts_dec_loop4 3081 3082.Lxts_dec_ret_iv: 3083 movups IV, (IVP) 3084 3085.Lxts_dec_ret: 3086#ifndef __x86_64__ 3087 popl KLEN 3088 popl KEYP 3089 popl LEN 3090 popl IVP 3091#endif 3092 FRAME_END 3093 RET 3094 3095.Lxts_dec_1x: 3096 add $64, LEN 3097 jz .Lxts_dec_ret_iv 3098 3099.Lxts_dec_loop1: 3100 movdqu (INP), STATE 3101 3102 add $16, INP 3103 sub $16, LEN 3104 jl .Lxts_dec_cts1 3105 3106 pxor IV, STATE 3107 call _aesni_dec1 3108 pxor IV, STATE 3109 _aesni_gf128mul_x_ble() 3110 3111 test LEN, LEN 3112 jz .Lxts_dec_out 3113 3114 movdqu STATE, (OUTP) 3115 add $16, OUTP 3116 jmp .Lxts_dec_loop1 3117 3118.Lxts_dec_out: 3119 movdqu STATE, (OUTP) 3120 jmp .Lxts_dec_ret_iv 3121 3122.Lxts_dec_cts1: 3123 movdqa IV, STATE4 3124 _aesni_gf128mul_x_ble() 3125 3126 pxor IV, STATE 3127 call _aesni_dec1 3128 pxor IV, STATE 3129 3130#ifndef __x86_64__ 3131 lea .Lcts_permute_table, T1 3132#else 3133 lea .Lcts_permute_table(%rip), T1 3134#endif 3135 add LEN, INP /* rewind input pointer */ 3136 add $16, LEN /* # bytes in final block */ 3137 movups (INP), IN1 3138 3139 mov T1, IVP 3140 add $32, IVP 3141 add LEN, T1 3142 sub LEN, IVP 3143 add OUTP, LEN 3144 3145 movups (T1), %xmm4 3146 movaps STATE, IN2 3147 pshufb %xmm4, STATE 3148 movups STATE, (LEN) 3149 3150 movups (IVP), %xmm0 3151 pshufb %xmm0, IN1 3152 pblendvb IN2, IN1 3153 movaps IN1, STATE 3154 3155 pxor STATE4, STATE 3156 call _aesni_dec1 3157 pxor STATE4, STATE 3158 3159 movups STATE, (OUTP) 3160 jmp .Lxts_dec_ret 3161SYM_FUNC_END(aesni_xts_decrypt) 3162