hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

ni.s (9703B)


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