1/* 2 * This file is part of the openHiTLS project. 3 * 4 * openHiTLS is licensed under the Mulan PSL v2. 5 * You can use this software according to the terms and conditions of the Mulan PSL v2. 6 * You may obtain a copy of Mulan PSL v2 at: 7 * 8 * http://license.coscl.org.cn/MulanPSL2 9 * 10 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13 * See the Mulan PSL v2 for more details. 14 */ 15#include "hitls_build.h" 16#if defined(HITLS_CRYPTO_AES) && defined(HITLS_CRYPTO_GCM) 17 18#include "aes_gcm_96block_x86_64.S" 19.text 20 21.balign 16 22g_byteSwapMask: 23.byte 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08 24.byte 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 25.size g_byteSwapMask, .-g_byteSwapMask 26.balign 16 27g_oneHigh: 28.byte 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 29.byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 30.size g_oneHigh, .-g_oneHigh 31.balign 16 32g_oneLow: 33.byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 34.byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 35.size g_oneLow, .-g_oneLow 36.balign 16 37g_poly: 38.byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 39.byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2 40.size g_poly, .-g_poly 41 42/* 43 * uint32_t AES_GCM_EncryptBlockAsm(MODES_GCM_Ctx *ctx, const uint8_t *in, 44 * uint8_t *out, uint32_t len, void *key); 45 * ctx %rdi 46 * in %rsi 47 * out %rdx 48 * len %rcx 49 * key %r8 50 */ 51.globl AES_GCM_EncryptBlockAsm 52.type AES_GCM_EncryptBlockAsm, @function 53.balign 32 54AES_GCM_EncryptBlockAsm: 55.cfi_startproc 56 push %r12 57 push %r13 58 leaq g_byteSwapMask(%rip), %r11 59 mov 240(%r8), %r9d // rounds 60 shrl $4, %ecx 61 movl 12(%rdi), %r12d // counter r12d(32bit) 62 mov %ecx, %eax 63 lea 0x80(%r8), %r8 64 shl $4, %eax 65 cmp $6, %ecx 66 jb .Lm64_enc_pass // If the number of data blocks is less than six, the data is skipped. 67 call AES_GCM_Encrypt96BlockAsm // Invoke six parallel processing parts. 68.Lm64_enc_pass: 69 cmp $4, %ecx // If the remaining data is less than four blocks, 70 // the function is returned. 71 jb .Lm64_enc_return 72 vmovdqu (%rdi), %xmm0 // iv 73 and $0b11, %ecx 74 lea -2(%r9d), %r13d 75 addl $0x4000000, %r12d // ctr inc 76 jc .Lm64_enc_ctr_carry 77 mov %r12d, 12(%rdi) // out iv 78 vmovdqa 0x20(%r11), %xmm14 // Lone_low 79 lea -0x70(%r8), %r10 80 vpaddb %xmm14, %xmm0, %xmm1 81 vmovdqu -0x80(%r8), %xmm4 // key0 82 vpaddb %xmm14, %xmm1, %xmm2 83 vpxor %xmm4, %xmm0, %xmm0 84 vpxor %xmm4, %xmm1, %xmm1 85 vpaddb %xmm14, %xmm2, %xmm3 86 vpxor %xmm4, %xmm2, %xmm2 87 vpxor %xmm4, %xmm3, %xmm3 88 jmp .Lm64_enc_aes 89.Lm64_enc_ctr_carry: 90 vmovdqa 0x10(%r11), %xmm14 // Lone_high 91 bswap %r12d 92 vmovdqa (%r11), %xmm15 93 addl $0x100, %r12d // add carry bit 94 vpshufb %xmm15, %xmm0, %xmm0 95 bswap %r12d 96 vpaddd %xmm14, %xmm0, %xmm1 97 vpshufb %xmm15, %xmm0, %xmm0 98 mov %r12d, 12(%rdi) // out iv 99 vpaddd %xmm14, %xmm1, %xmm2 100 lea -0x70(%r8), %r10 101 vpshufb %xmm15, %xmm1, %xmm1 102 vmovdqu -0x80(%r8), %xmm4 // key0 103 vpaddd %xmm14, %xmm2, %xmm3 104 vpxor %xmm4, %xmm0, %xmm0 105 vpshufb %xmm15, %xmm2, %xmm2 106 vpxor %xmm4, %xmm1, %xmm1 107 vpshufb %xmm15, %xmm3, %xmm3 108 vpxor %xmm4, %xmm2, %xmm2 109 vpxor %xmm4, %xmm3, %xmm3 110 jmp .Lm64_enc_aes 111.balign 16 112.Lm64_enc_aes: 113 vmovdqu (%r10), %xmm4 // key1-8/10/12 114 vaesenc %xmm4, %xmm0, %xmm0 115 vaesenc %xmm4, %xmm1, %xmm1 116 vaesenc %xmm4, %xmm2, %xmm2 117 vaesenc %xmm4, %xmm3, %xmm3 118 lea 0x10(%r10), %r10 119 dec %r13d 120 jnz .Lm64_enc_aes 121 vmovdqu (%r10), %xmm4 // key9/11/13 122 vmovdqu 0x10(%r10), %xmm5 // key10/12/14 123 vaesenc %xmm4, %xmm0, %xmm0 124 vpxor (%rsi), %xmm5, %xmm6 // last key xor plaintext 125 vaesenc %xmm4, %xmm1, %xmm1 126 vpxor 0x10(%rsi), %xmm5, %xmm7 127 vaesenc %xmm4, %xmm2, %xmm2 128 vpxor 0x20(%rsi), %xmm5, %xmm8 129 vaesenc %xmm4, %xmm3, %xmm3 130 vpxor 0x30(%rsi), %xmm5, %xmm9 131 vaesenclast %xmm6, %xmm0, %xmm10 132 vmovdqu 16(%rdi), %xmm5 // ghash 133 vaesenclast %xmm7, %xmm1, %xmm11 134 vmovdqu %xmm10, (%rdx) // out ciphertext 135 vaesenclast %xmm8, %xmm2, %xmm12 136 vmovdqu %xmm11, 0x10(%rdx) 137 vaesenclast %xmm9, %xmm3, %xmm13 138 vmovdqu %xmm12, 0x20(%rdx) 139// +++++++++++++++++ ghash process +++++++++++++++++++++++++++++++++ 140 vmovdqu %xmm13, 0x30(%rdx) 141 vpxor %xmm5, %xmm10, %xmm0 // input for ghash operation 142 vmovdqu 0x20+0x40(%rdi), %xmm1 // hash key h^4 143 vpshufb (%r11), %xmm0, %xmm0 // data transform 144 vmovdqu 0x20+0x50(%rdi), %xmm2 // hash key h^3_4 145 vpalignr $8, %xmm0, %xmm0, %xmm3 146 147 vpclmulqdq $0x11, %xmm1, %xmm0, %xmm9 // Karatsuba Multiply 148 vpxor %xmm0, %xmm3, %xmm3 149 vpclmulqdq $0x00, %xmm1, %xmm0, %xmm7 150 vmovdqu 0x20+0x30(%rdi), %xmm1 // hash key h^3 151 vpclmulqdq $0x11, %xmm2, %xmm3, %xmm8 152 vpshufb (%r11), %xmm11, %xmm0 // data transform 153 vpalignr $8, %xmm0, %xmm0, %xmm3 154 155 vpclmulqdq $0x11, %xmm1, %xmm0, %xmm5 // Karatsuba Multiply 156 vpxor %xmm0, %xmm3, %xmm3 157 vpclmulqdq $0x00, %xmm1, %xmm0, %xmm0 158 vpxor %xmm5, %xmm9, %xmm9 159 vmovdqu 0x20+0x10(%rdi), %xmm1 // hash key h^2 160 vpclmulqdq $0x00, %xmm2, %xmm3, %xmm3 161 vpxor %xmm0, %xmm7, %xmm7 162 vpshufb (%r11), %xmm12, %xmm0 // data transform 163 vpxor %xmm3, %xmm8, %xmm8 164 vmovdqu 0x20+0x20(%rdi), %xmm2 // hash key h^1_2 165 vpalignr $8, %xmm0, %xmm0, %xmm3 166 167 vpclmulqdq $0x11, %xmm1, %xmm0, %xmm5 // Karatsuba Multiply 168 vpxor %xmm0, %xmm3, %xmm3 169 vpclmulqdq $0x00, %xmm1, %xmm0, %xmm0 170 vmovdqu 0x20(%rdi), %xmm1 // hash key h^1 171 vpxor %xmm5, %xmm9, %xmm9 172 vpclmulqdq $0x11, %xmm2, %xmm3, %xmm3 173 vpxor %xmm0, %xmm7, %xmm7 174 vpshufb (%r11), %xmm13, %xmm0 // data transform 175 vpxor %xmm3, %xmm8, %xmm8 176 vpalignr $8, %xmm0, %xmm0, %xmm3 177 178 vpclmulqdq $0x11, %xmm1, %xmm0, %xmm5 // Karatsuba Multiply 179 vpxor %xmm0, %xmm3, %xmm3 180 vpclmulqdq $0x00, %xmm1, %xmm0, %xmm0 181 vpxor %xmm5, %xmm9, %xmm5 182 vpclmulqdq $0x00, %xmm2, %xmm3, %xmm3 183 vpxor %xmm0, %xmm7, %xmm0 184 vpxor %xmm3, %xmm8, %xmm3 185 vpxor %xmm0, %xmm5, %xmm1 186 vpxor %xmm1, %xmm3, %xmm3 187 188 vpslldq $8, %xmm3, %xmm4 189 vmovdqa 0x30(%r11), %xmm14 // Lpoly 190 vpxor %xmm4, %xmm0, %xmm0 191 192 vpalignr $8, %xmm0, %xmm0, %xmm2 // 1st phase of reduction 193 vpclmulqdq $0x10, %xmm14, %xmm0, %xmm0 194 vpsrldq $8, %xmm3, %xmm3 195 vpxor %xmm2, %xmm0, %xmm0 196 197 vpalignr $8, %xmm0, %xmm0, %xmm2 // 2nd phase of reduction 198 vpxor %xmm3, %xmm5, %xmm5 199 vpclmulqdq $0x10, %xmm14, %xmm0, %xmm0 200 vpxor %xmm5, %xmm2, %xmm2 201 vpxor %xmm2, %xmm0, %xmm0 202 203 vpshufb (%r11), %xmm0, %xmm0 // results for ghash 204// ------------------- ghash complete --------------------------------- 205 vmovdqu %xmm0, 16(%rdi) // out ghash 206.Lm64_enc_return: 207 shl $4, %ecx 208 sub %ecx, %eax 209 pop %r13 210 pop %r12 211 ret 212.cfi_endproc 213.size AES_GCM_EncryptBlockAsm, .-AES_GCM_EncryptBlockAsm 214 215/* 216 * uint32_t AES_GCM_DecryptBlockAsm(MODES_GCM_Ctx *ctx, const uint8_t *in, 217 * uint8_t *out, uint32_t len, void *key); 218 * ctx %rdi 219 * in %rsi 220 * out %rdx 221 * len %rcx 222 * key %r8 223 */ 224.globl AES_GCM_DecryptBlockAsm 225.type AES_GCM_DecryptBlockAsm, @function 226.balign 32 227AES_GCM_DecryptBlockAsm: 228.cfi_startproc 229 leaq g_byteSwapMask(%rip), %r11 230 shrl $4, %ecx 231 mov %ecx, %eax 232 shll $4, %eax 233 vmovdqa (%r11), %xmm15 // g_byteSwapMask 234 mov 240(%r8), %r9d // rounds 235 cmp $6, %ecx // invoke six parallel processing parts. 236 jb .Lm64_dec_pass // if the number of data blocks is less than six, the data is skipped. 237 call AES_GCM_Decrypt96BlockAsm 238.Lm64_dec_pass: 239 cmp $4, %ecx // If the remaining data is less than four blocks, 240 // the function is returned. 241 jb .Lm64_dec_return 242.balign 16 243.Lm64_dec_loop: 244 vmovdqu (%rdi), %xmm0 // iv 245 mov 12(%rdi), %r10d // counter r10d(32bit) 246 addl $0x4000000, %r10d // ctr inc 247 jc .Lm64_dec_ctr_carry 248 vmovdqa 0x20(%r11), %xmm14 // Lone_low 249 vpaddb %xmm14, %xmm0, %xmm1 250 vpaddb %xmm14, %xmm1, %xmm2 251 vpaddb %xmm14, %xmm2, %xmm3 252 jmp .Lm64_dec_aes_cipher 253.Lm64_dec_ctr_carry: 254 vmovdqa (%r11), %xmm15 255 bswap %r10d 256 vpshufb %xmm15, %xmm0, %xmm0 257 vmovdqa 0x10(%r11), %xmm14 // Lone_high 258 addl $0x100, %r10d // add carry bit 259 vpaddd %xmm14, %xmm0, %xmm1 260 vpshufb %xmm15, %xmm0, %xmm0 261 vpaddd %xmm14, %xmm1, %xmm2 262 vpshufb %xmm15, %xmm1, %xmm1 263 vpaddd %xmm14, %xmm2, %xmm3 264 vpshufb %xmm15, %xmm2, %xmm2 265 bswap %r10d 266 vpshufb %xmm15, %xmm3, %xmm3 267 jmp .Lm64_dec_aes_cipher 268.balign 32 269.Lm64_dec_aes_cipher: 270 vmovdqu (%r8), %xmm7 271 mov %r10d, 12(%rdi) // out iv 272 lea 0x10(%r8), %r10 273 vmovdqu 0x10(%rsi), %xmm5 274 vpxor %xmm7, %xmm0, %xmm0 // key 0 275 vmovdqu 0x20(%rsi), %xmm6 276 vpxor %xmm7, %xmm1, %xmm1 277 vmovdqu 0x30(%rsi), %xmm9 278 vpxor %xmm7, %xmm2, %xmm2 279 280 vmovdqu (%r10), %xmm4 281 vpxor %xmm7, %xmm3, %xmm3 282// +++++++++++++++++ ghash process +++++++++++++++++++++++++++++++++ 283 vmovdqu 16(%rdi), %xmm11 // ghash 284 lea 0x10(%r10), %r10 285 vaesenc %xmm4, %xmm0, %xmm0 // key 1 286 vpxor (%rsi), %xmm11, %xmm10 // input for ghash operation 287 vmovdqu 0x20+0x40(%rdi), %xmm11 // hash key h^4 288 vaesenc %xmm4, %xmm1, %xmm1 289 vmovdqu 0x20+0x50(%rdi), %xmm12 // hash key h^3_4 290 vpshufb (%r11), %xmm10, %xmm10 // data transform 291 vaesenc %xmm4, %xmm2, %xmm2 292 vpalignr $8, %xmm10, %xmm10, %xmm13 293 vaesenc %xmm4, %xmm3, %xmm3 294 vmovdqu (%r10), %xmm4 295 296 vpclmulqdq $0x11, %xmm11, %xmm10, %xmm15 // Karatsuba Multiply 297 lea 0x10(%r10), %r10 298 vaesenc %xmm4, %xmm0, %xmm0 // key 2 299 vpxor %xmm10, %xmm13, %xmm13 300 vpclmulqdq $0x00, %xmm11, %xmm10, %xmm7 301 vaesenc %xmm4, %xmm1, %xmm1 302 vmovdqu 0x20+0x30(%rdi), %xmm11 // hash key h^3 303 vpclmulqdq $0x11, %xmm12, %xmm13, %xmm8 304 vaesenc %xmm4, %xmm2, %xmm2 305 vpshufb (%r11), %xmm5, %xmm10 // data transform 306 vaesenc %xmm4, %xmm3, %xmm3 307 vmovdqu (%r10), %xmm4 308 309 vpalignr $8, %xmm10, %xmm10, %xmm13 310 lea 0x10(%r10), %r10 311 vaesenc %xmm4, %xmm0, %xmm0 // key 3 312 vpclmulqdq $0x11, %xmm11, %xmm10, %xmm14 // Karatsuba Multiply 313 vaesenc %xmm4, %xmm1, %xmm1 314 vpxor %xmm10, %xmm13, %xmm13 315 vpclmulqdq $0x00, %xmm11, %xmm10, %xmm10 316 vaesenc %xmm4, %xmm2, %xmm2 317 vpxor %xmm14, %xmm15, %xmm15 318 vpclmulqdq $0x00, %xmm12, %xmm13, %xmm13 319 vaesenc %xmm4, %xmm3, %xmm3 320 vmovdqu (%r10), %xmm4 321 322 vpxor %xmm10, %xmm7, %xmm7 323 lea 0x10(%r10), %r10 324 vaesenc %xmm4, %xmm0, %xmm0 // key 4 325 vpxor %xmm13, %xmm8, %xmm8 326 vaesenc %xmm4, %xmm1, %xmm1 327 vmovdqu 0x20+0x10(%rdi), %xmm11 // hash key h^2 328 vmovdqu 0x20+0x20(%rdi), %xmm12 // hash key h^1_2 329 vaesenc %xmm4, %xmm2, %xmm2 330 vpshufb (%r11), %xmm6, %xmm10 // data transform 331 vaesenc %xmm4, %xmm3, %xmm3 332 vmovdqu (%r10), %xmm4 333 vpalignr $8, %xmm10, %xmm10, %xmm13 334 vpclmulqdq $0x11, %xmm11, %xmm10, %xmm14 // Karatsuba Multiply 335 336 lea 0x10(%r10), %r10 337 vaesenc %xmm4, %xmm0, %xmm0 // key 5 338 vpxor %xmm10, %xmm13, %xmm13 339 vpclmulqdq $0x00, %xmm11, %xmm10, %xmm10 340 vaesenc %xmm4, %xmm1, %xmm1 341 vpxor %xmm14, %xmm15, %xmm15 342 vpclmulqdq $0x11, %xmm12, %xmm13, %xmm13 343 vaesenc %xmm4, %xmm2, %xmm2 344 vpxor %xmm10, %xmm7, %xmm7 345 vaesenc %xmm4, %xmm3, %xmm3 346 vmovdqu (%r10), %xmm4 347 348 vpxor %xmm13, %xmm8, %xmm8 349 lea 0x10(%r10), %r10 350 vaesenc %xmm4, %xmm0, %xmm0 // key 6 351 vmovdqu 0x20(%rdi), %xmm11 // hash key h^1 352 vpshufb (%r11), %xmm9, %xmm10 // data transform 353 vpalignr $8, %xmm10, %xmm10, %xmm13 354 vaesenc %xmm4, %xmm1, %xmm1 355 vpclmulqdq $0x11, %xmm11, %xmm10, %xmm14 // Karatsuba Multiply 356 vpxor %xmm10, %xmm13, %xmm13 357 vaesenc %xmm4, %xmm2, %xmm2 358 vpclmulqdq $0x00, %xmm11, %xmm10, %xmm10 359 vpxor %xmm14, %xmm15, %xmm14 360 vaesenc %xmm4, %xmm3, %xmm3 361 vmovdqu (%r10), %xmm4 362 vpclmulqdq $0x00, %xmm12, %xmm13, %xmm13 363 vpxor %xmm10, %xmm7, %xmm10 364 vpxor %xmm13, %xmm8, %xmm13 365 366 lea 0x10(%r10), %r10 367 vaesenc %xmm4, %xmm0, %xmm0 // key 7 368 vpxor %xmm10, %xmm14, %xmm11 369 vaesenc %xmm4, %xmm1, %xmm1 370 vpxor %xmm11, %xmm13, %xmm13 371 vpslldq $8, %xmm13, %xmm11 372 vaesenc %xmm4, %xmm2, %xmm2 373 vpsrldq $8, %xmm13, %xmm13 374 vpxor %xmm13, %xmm14, %xmm14 375 vaesenc %xmm4, %xmm3, %xmm3 376 vmovdqu (%r10), %xmm4 377 378 vpxor %xmm11, %xmm10, %xmm10 379 lea 0x10(%r10), %r10 380 vaesenc %xmm4, %xmm0, %xmm0 // key 8 381 vmovdqa 0x30(%r11), %xmm13 // Lpoly 382 vaesenc %xmm4, %xmm1, %xmm1 383 vpalignr $8, %xmm10, %xmm10, %xmm12 // 1st phase of reduction 384 vpclmulqdq $0x10, %xmm13, %xmm10, %xmm10 385 vpxor %xmm12, %xmm10, %xmm10 386 vaesenc %xmm4, %xmm2, %xmm2 387 vpalignr $8, %xmm10, %xmm10, %xmm12 // 2nd phase of reduction 388 vaesenc %xmm4, %xmm3, %xmm3 389 vmovdqu (%r10), %xmm4 390 391 vpclmulqdq $0x10, %xmm13, %xmm10, %xmm10 392 vpxor %xmm14, %xmm12, %xmm12 393 vaesenc %xmm4, %xmm0, %xmm0 // key 9 394 vpxor %xmm12, %xmm10, %xmm10 395 vaesenc %xmm4, %xmm1, %xmm1 396 lea 0x10(%r10), %r10 397 vaesenc %xmm4, %xmm2, %xmm2 398 vpshufb (%r11), %xmm10, %xmm10 399// ------------------- ghash complete --------------------------------- 400 vaesenc %xmm4, %xmm3, %xmm3 401 vmovdqu %xmm10, 16(%rdi) // out ghash 402 403 cmp $12, %r9d 404 jb .Lm64_dec_ending 405 406 vmovdqu (%r10), %xmm4 407 vmovdqu 0x10(%r10), %xmm5 408 vaesenc %xmm4, %xmm0, %xmm0 // key 10 409 vaesenc %xmm4, %xmm1, %xmm1 410 vaesenc %xmm4, %xmm2, %xmm2 411 vaesenc %xmm4, %xmm3, %xmm3 412 413 lea 0x20(%r10), %r10 414 vaesenc %xmm5, %xmm0, %xmm0 // key 11 415 vaesenc %xmm5, %xmm1, %xmm1 416 vaesenc %xmm5, %xmm2, %xmm2 417 vaesenc %xmm5, %xmm3, %xmm3 418 419 je .Lm64_dec_ending 420 421 vmovdqu (%r10), %xmm4 422 vmovdqu 0x10(%r10), %xmm5 423 vaesenc %xmm4, %xmm0, %xmm0 // key 12 424 vaesenc %xmm4, %xmm1, %xmm1 425 vaesenc %xmm4, %xmm2, %xmm2 426 vaesenc %xmm4, %xmm3, %xmm3 427 428 lea 0x20(%r10), %r10 429 vaesenc %xmm5, %xmm0, %xmm0 // key 13 430 vaesenc %xmm5, %xmm1, %xmm1 431 vaesenc %xmm5, %xmm2, %xmm2 432 vaesenc %xmm5, %xmm3, %xmm3 433 434 jmp .Lm64_dec_ending 435.Lm64_dec_ending: 436 vmovdqu (%r10), %xmm4 // key10/12/14 437 vpxor (%rsi), %xmm4, %xmm5 // last key xor plaintext 438 vpxor 0x10(%rsi), %xmm4, %xmm6 439 vaesenclast %xmm5, %xmm0, %xmm0 440 vpxor 0x20(%rsi), %xmm4, %xmm7 441 vaesenclast %xmm6, %xmm1, %xmm1 442 vpxor 0x30(%rsi), %xmm4, %xmm8 443 vmovdqu %xmm0, (%rdx) // out ciphertext 444 vaesenclast %xmm7, %xmm2, %xmm2 445 vmovdqu %xmm1, 0x10(%rdx) 446 vaesenclast %xmm8, %xmm3, %xmm3 447 vmovdqu %xmm2, 0x20(%rdx) 448 and $0b11, %ecx 449 vmovdqu %xmm3, 0x30(%rdx) 450.Lm64_dec_return: 451 shl $4, %ecx 452 sub %ecx, %eax 453 ret 454.cfi_endproc 455.size AES_GCM_DecryptBlockAsm, .-AES_GCM_DecryptBlockAsm 456#endif