user: 请从给定的汇编指令推导出C源代码：

```asm
<crypto_aead_decrypt>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x170,%rsp
  mov    %rdi,-0x138(%rbp)
  mov    %rsi,-0x140(%rbp)
  mov    %rdx,-0x148(%rbp)
  mov    %rcx,-0x150(%rbp)
  mov    %r8,-0x158(%rbp)
  mov    %r9,-0x160(%rbp)
  mov    0x18(%rbp),%rax
  mov    %rax,-0x168(%rbp)
  mov    0x20(%rbp),%rax
  mov    %rax,-0x170(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movq   $0x0,-0x118(%rbp)
  jmp    L109
L694:
  mov    -0x170(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  lea    -0xb0(%rbp),%rcx
  mov    -0x118(%rbp),%rdx
  add    %rcx,%rdx
  mov    %al,(%rdx)
  addq   $0x1,-0x118(%rbp)
L109:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L694
  lea    -0xb0(%rbp),%rax
  mov    $0xa,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <keyschedule@plt>
  movq   $0x0,-0x118(%rbp)
  jmp    L207
L316:
  lea    -0x30(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0x118(%rbp)
L207:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L316
  lea    -0x110(%rbp),%rdx
  lea    -0x30(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <AES128Enc@plt>
  movq   $0x0,-0x120(%rbp)
  jmp    L149
L614:
  mov    -0x120(%rbp),%rax
  add    $0x1,%rax
  lea    -0x110(%rbp),%rdx
  shl    $0x4,%rax
  add    %rax,%rdx
  lea    -0x110(%rbp),%rcx
  mov    -0x120(%rbp),%rax
  shl    $0x4,%rax
  add    %rcx,%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <Times2@plt>
  addq   $0x1,-0x120(%rbp)
L149:
  cmpq   $0x1,-0x120(%rbp)
  jbe    L614
  lea    -0x50(%rbp),%rax
  lea    -0x110(%rbp),%rdx
  add    $0x20,%rdx
  mov    %rax,%rsi
  mov    %rdx,%rdi
  mov    $0x0,%eax
  call   <Times2@plt>
  cmpq   $0x0,0x10(%rbp)
  jne    L722
  movq   $0x0,-0x118(%rbp)
  jmp    L318
L565:
  lea    -0xc0(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0x118(%rbp)
L318:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L565
  jmp    L484
L722:
  mov    0x10(%rbp),%rax
  and    $0xf,%eax
  test   %rax,%rax
  jne    L305
  mov    0x10(%rbp),%rax
  shr    $0x4,%rax
  mov    %rax,-0x130(%rbp)
  jmp    L370
L305:
  mov    0x10(%rbp),%rax
  shr    $0x4,%rax
  add    $0x1,%rax
  mov    %rax,-0x130(%rbp)
L370:
  movq   $0x0,-0x118(%rbp)
  jmp    L768
L489:
  lea    -0xe0(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0x118(%rbp)
L768:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L489
  movq   $0x0,-0x120(%rbp)
  jmp    L728
L760:
  movq   $0x0,-0x118(%rbp)
  jmp    L159
L295:
  mov    -0x120(%rbp),%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x118(%rbp),%rax
  add    %rax,%rdx
  mov    -0x160(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  lea    -0x50(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  xor    %eax,%edx
  lea    -0x30(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x118(%rbp)
L159:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L295
  lea    -0x20(%rbp),%rdx
  lea    -0x30(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <AES128Enc@plt>
  movq   $0x0,-0x118(%rbp)
  jmp    L337
L24:
  lea    -0xe0(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  lea    -0x20(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  xor    %eax,%edx
  lea    -0xe0(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x118(%rbp)
L337:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L24
  lea    -0xa0(%rbp),%rdx
  lea    -0x50(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <Times2@plt>
  movq   $0x0,-0x118(%rbp)
  jmp    L379
L192:
  lea    -0xa0(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  lea    -0x50(%rbp),%rcx
  mov    -0x118(%rbp),%rdx
  add    %rcx,%rdx
  mov    %al,(%rdx)
  addq   $0x1,-0x118(%rbp)
L379:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L192
  addq   $0x1,-0x120(%rbp)
L728:
  mov    -0x130(%rbp),%rax
  sub    $0x1,%rax
  cmp    %rax,-0x120(%rbp)
  jb     L760
  mov    0x10(%rbp),%rax
  and    $0xf,%eax
  test   %rax,%rax
  je     L235
  movq   $0x0,-0x118(%rbp)
  jmp    L605
L296:
  mov    -0x130(%rbp),%rax
  sub    $0x1,%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x118(%rbp),%rax
  add    %rax,%rdx
  mov    -0x160(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  lea    -0xd0(%rbp),%rcx
  mov    -0x118(%rbp),%rdx
  add    %rcx,%rdx
  mov    %al,(%rdx)
  addq   $0x1,-0x118(%rbp)
L605:
  mov    0x10(%rbp),%rax
  and    $0xf,%eax
  cmp    %rax,-0x118(%rbp)
  jb     L296
  mov    0x10(%rbp),%rax
  and    $0xf,%eax
  movb   $0x80,-0xd0(%rbp,%rax,1)
  mov    0x10(%rbp),%rax
  and    $0xf,%eax
  add    $0x1,%rax
  mov    %rax,-0x118(%rbp)
  jmp    L769
L771:
  lea    -0xd0(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0x118(%rbp)
L769:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L771
  movq   $0x0,-0x118(%rbp)
  jmp    L206
L441:
  lea    -0xe0(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  lea    -0xd0(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  mov    %edx,%ecx
  xor    %eax,%ecx
  lea    -0x100(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  xor    %eax,%ecx
  mov    %ecx,%edx
  lea    -0x30(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x118(%rbp)
L206:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L441
  jmp    L264
L235:
  movq   $0x0,-0x118(%rbp)
  jmp    L764
L233:
  lea    -0xe0(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x130(%rbp),%rax
  sub    $0x1,%rax
  shl    $0x4,%rax
  mov    %rax,%rcx
  mov    -0x118(%rbp),%rax
  add    %rax,%rcx
  mov    -0x160(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  mov    %edx,%ecx
  xor    %eax,%ecx
  lea    -0xf0(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  xor    %eax,%ecx
  mov    %ecx,%edx
  lea    -0x30(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x118(%rbp)
L764:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L233
L264:
  lea    -0xc0(%rbp),%rdx
  lea    -0x30(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <AES128Enc@plt>
L484:
  cmpq   $0xf,-0x158(%rbp)
  ja     L491
  mov    $0xfffffffe,%eax
  jmp    L409
L491:
  mov    -0x158(%rbp),%rax
  lea    -0x10(%rax),%rdx
  mov    -0x140(%rbp),%rax
  mov    %rdx,(%rax)
  movq   $0x0,-0x118(%rbp)
  jmp    L304
L11:
  mov    -0x168(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  lea    -0x90(%rbp),%rcx
  mov    -0x118(%rbp),%rdx
  add    %rcx,%rdx
  mov    %al,(%rdx)
  addq   $0x1,-0x118(%rbp)
L304:
  cmpq   $0xc,-0x118(%rbp)
  jbe    L11
  movb   $0x80,-0x83(%rbp)
  movq   $0xe,-0x118(%rbp)
  jmp    L3
L573:
  lea    -0x90(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0x118(%rbp)
L3:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L573
  lea    -0x40(%rbp),%rdx
  lea    -0x90(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <AES128Enc@plt>
  cmpq   $0x10,-0x158(%rbp)
  jne    L674
  movq   $0x0,-0x118(%rbp)
  jmp    L32
L481:
  lea    -0xf0(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  lea    -0x40(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  xor    %eax,%edx
  lea    -0x30(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x118(%rbp)
L32:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L481
  lea    -0x20(%rbp),%rdx
  lea    -0x30(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <AES128Enc@plt>
  movq   $0x0,-0x118(%rbp)
  jmp    L477
L536:
  mov    -0x150(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  lea    -0x20(%rbp),%rcx
  mov    -0x118(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rdx),%ecx
  lea    -0xc0(%rbp),%rsi
  mov    -0x118(%rbp),%rdx
  add    %rsi,%rdx
  movzbl (%rdx),%edx
  xor    %ecx,%edx
  cmp    %dl,%al
  je     L134
  mov    $0xffffffff,%eax
  jmp    L409
L134:
  addq   $0x1,-0x118(%rbp)
L477:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L536
  jmp    L757
L674:
  mov    -0x158(%rbp),%rax
  shr    $0x4,%rax
  sub    $0x1,%rax
  mov    %rax,-0x128(%rbp)
  mov    -0x158(%rbp),%rax
  and    $0xf,%eax
  test   %rax,%rax
  je     L118
  addq   $0x1,-0x128(%rbp)
  movq   $0x0,-0x118(%rbp)
  jmp    L741
L660:
  mov    -0x128(%rbp),%rax
  sub    $0x1,%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x118(%rbp),%rax
  add    %rax,%rdx
  mov    -0x150(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  lea    -0x80(%rbp),%rcx
  mov    -0x118(%rbp),%rdx
  add    %rcx,%rdx
  mov    %al,(%rdx)
  lea    -0x70(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0x118(%rbp)
L741:
  mov    -0x158(%rbp),%rax
  and    $0xf,%eax
  cmp    %rax,-0x118(%rbp)
  jb     L660
  mov    -0x158(%rbp),%rax
  and    $0xf,%eax
  movb   $0x0,-0x80(%rbp,%rax,1)
  mov    -0x158(%rbp),%rax
  and    $0xf,%eax
  movb   $0x80,-0x70(%rbp,%rax,1)
  mov    -0x158(%rbp),%rax
  and    $0xf,%eax
  add    $0x1,%rax
  mov    %rax,-0x118(%rbp)
  jmp    L700
L763:
  lea    -0x80(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  lea    -0x70(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0x118(%rbp)
L700:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L763
  jmp    L746
L118:
  movq   $0x0,-0x118(%rbp)
  jmp    L457
L570:
  mov    -0x128(%rbp),%rax
  sub    $0x1,%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x118(%rbp),%rax
  add    %rax,%rdx
  mov    -0x150(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  lea    -0x80(%rbp),%rcx
  mov    -0x118(%rbp),%rdx
  add    %rcx,%rdx
  mov    %al,(%rdx)
  lea    -0x70(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0x118(%rbp)
L457:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L570
L746:
  lea    -0x50(%rbp),%rax
  lea    -0x110(%rbp),%rdx
  add    $0x20,%rdx
  mov    %rax,%rsi
  mov    %rdx,%rdi
  mov    $0x0,%eax
  call   <Times2@plt>
  movq   $0x0,-0x118(%rbp)
  jmp    L776
L479:
  lea    -0x50(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  lea    -0x40(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  xor    %eax,%edx
  lea    -0x30(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x118(%rbp)
L776:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L479
  lea    -0x20(%rbp),%rdx
  lea    -0x30(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <AES128Enc@plt>
  movq   $0x0,-0x120(%rbp)
  jmp    L64
L363:
  lea    -0xa0(%rbp),%rdx
  lea    -0x50(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <Times2@plt>
  movq   $0x0,-0x118(%rbp)
  jmp    L272
L398:
  lea    -0x20(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x120(%rbp),%rax
  shl    $0x4,%rax
  mov    %rax,%rcx
  mov    -0x118(%rbp),%rax
  add    %rax,%rcx
  mov    -0x150(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  xor    %eax,%edx
  lea    -0x30(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  lea    -0x30(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  lea    -0xa0(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  mov    %edx,%ecx
  xor    %eax,%ecx
  lea    -0x40(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x120(%rbp),%rax
  shl    $0x4,%rax
  mov    %rax,%rsi
  mov    -0x118(%rbp),%rax
  add    %rax,%rsi
  mov    -0x138(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %dl,(%rax)
  lea    -0xa0(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  lea    -0x50(%rbp),%rcx
  mov    -0x118(%rbp),%rdx
  add    %rcx,%rdx
  mov    %al,(%rdx)
  addq   $0x1,-0x118(%rbp)
L272:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L398
  lea    -0x20(%rbp),%rdx
  lea    -0x30(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <AES128Enc@plt>
  addq   $0x1,-0x120(%rbp)
L64:
  mov    -0x128(%rbp),%rax
  sub    $0x1,%rax
  cmp    %rax,-0x120(%rbp)
  jb     L363
  mov    -0x158(%rbp),%rax
  and    $0xf,%eax
  test   %rax,%rax
  je     L713
  movq   $0x0,-0x118(%rbp)
  jmp    L378
L416:
  lea    -0x20(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%ecx
  mov    -0x128(%rbp),%rax
  sub    $0x1,%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x118(%rbp),%rax
  add    %rax,%rdx
  mov    -0x150(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x128(%rbp),%rax
  sub    $0x1,%rax
  shl    $0x4,%rax
  mov    %rax,%rsi
  mov    -0x118(%rbp),%rax
  add    %rax,%rsi
  mov    -0x138(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %dl,(%rax)
  lea    -0x60(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0x118(%rbp)
L378:
  mov    -0x158(%rbp),%rax
  and    $0xf,%eax
  cmp    %rax,-0x118(%rbp)
  jb     L416
  mov    -0x158(%rbp),%rax
  and    $0xf,%eax
  mov    %rax,-0x118(%rbp)
  jmp    L413
L592:
  lea    -0x20(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  lea    -0x70(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  xor    %eax,%edx
  lea    -0x60(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x118(%rbp)
L413:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L592
  jmp    L142
L713:
  movq   $0x0,-0x118(%rbp)
  jmp    L372
L328:
  lea    -0x20(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%ecx
  mov    -0x128(%rbp),%rax
  sub    $0x1,%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x118(%rbp),%rax
  add    %rax,%rdx
  mov    -0x150(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x128(%rbp),%rax
  sub    $0x1,%rax
  shl    $0x4,%rax
  mov    %rax,%rsi
  mov    -0x118(%rbp),%rax
  add    %rax,%rsi
  mov    -0x138(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %dl,(%rax)
  lea    -0x60(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0x118(%rbp)
L372:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L328
L142:
  mov    -0x158(%rbp),%rax
  and    $0xf,%eax
  test   %rax,%rax
  je     L406
  movq   $0x0,-0x118(%rbp)
  jmp    L209
L290:
  mov    -0x128(%rbp),%rax
  sub    $0x1,%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x118(%rbp),%rax
  add    %rax,%rdx
  mov    -0x138(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  lea    -0x100(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  mov    %edx,%ecx
  xor    %eax,%ecx
  lea    -0x40(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  xor    %eax,%ecx
  mov    %ecx,%edx
  lea    -0x30(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x118(%rbp)
L209:
  mov    -0x158(%rbp),%rax
  and    $0xf,%eax
  cmp    %rax,-0x118(%rbp)
  jb     L290
  mov    -0x158(%rbp),%rax
  and    $0xf,%eax
  mov    %rax,-0x118(%rbp)
  jmp    L483
L758:
  lea    -0x60(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  lea    -0x100(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  mov    %edx,%ecx
  xor    %eax,%ecx
  lea    -0x40(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  xor    %eax,%ecx
  mov    %ecx,%edx
  lea    -0x30(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x118(%rbp)
L483:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L758
  lea    -0x20(%rbp),%rdx
  lea    -0x30(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <AES128Enc@plt>
  movq   $0x0,-0x118(%rbp)
  jmp    L802
L411:
  mov    -0x128(%rbp),%rax
  sub    $0x1,%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x158(%rbp),%rax
  and    $0xf,%eax
  add    %rax,%rdx
  mov    -0x118(%rbp),%rax
  add    %rax,%rdx
  mov    -0x150(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  lea    -0x20(%rbp),%rcx
  mov    -0x118(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rdx),%ecx
  lea    -0xc0(%rbp),%rsi
  mov    -0x118(%rbp),%rdx
  add    %rsi,%rdx
  movzbl (%rdx),%edx
  xor    %ecx,%edx
  cmp    %dl,%al
  je     L170
  mov    $0xffffffff,%eax
  jmp    L409
L170:
  addq   $0x1,-0x118(%rbp)
L802:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L411
  jmp    L757
L406:
  movq   $0x0,-0x118(%rbp)
  jmp    L39
L499:
  mov    -0x128(%rbp),%rax
  sub    $0x1,%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x118(%rbp),%rax
  add    %rax,%rdx
  mov    -0x138(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  lea    -0xf0(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  mov    %edx,%ecx
  xor    %eax,%ecx
  lea    -0x40(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  xor    %eax,%ecx
  mov    %ecx,%edx
  lea    -0x30(%rbp),%rcx
  mov    -0x118(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x118(%rbp)
L39:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L499
  lea    -0x20(%rbp),%rdx
  lea    -0x30(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <AES128Enc@plt>
  movq   $0x0,-0x118(%rbp)
  jmp    L275
L527:
  mov    -0x128(%rbp),%rax
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x118(%rbp),%rax
  add    %rax,%rdx
  mov    -0x150(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  lea    -0x20(%rbp),%rcx
  mov    -0x118(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rdx),%ecx
  lea    -0xc0(%rbp),%rsi
  mov    -0x118(%rbp),%rdx
  add    %rsi,%rdx
  movzbl (%rdx),%edx
  xor    %ecx,%edx
  cmp    %dl,%al
  je     L34
  mov    $0xffffffff,%eax
  jmp    L409
L34:
  addq   $0x1,-0x118(%rbp)
L275:
  cmpq   $0xf,-0x118(%rbp)
  jbe    L527
L757:
  mov    $0x0,%eax
L409:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L834
  call   <__stack_chk_fail@plt>
L834:
  leave
  ret
```

assistant: ```c
int crypto_aead_decrypt(unsigned char *m, unsigned long long *mlen, unsigned char *nsec, const unsigned char *c, unsigned long long clen, const unsigned char *ad, unsigned long long adlen, const unsigned char *npub, const unsigned char *k) {
  unsigned char SumB[16], LastABlock[16], MacAESTag[16], Key[16], Double[16];
  unsigned long long a;
  unsigned char PaddedPMN[16];
  unsigned char LastCiphertextBlock[16], PaddedBlock[16];
  unsigned long long l;
  unsigned char StolenR[16];
  unsigned char Z[3][16], NextZ[16], U[16];
  unsigned char AESInputBlock[16], AESOutputBlock[16];
  unsigned long long i, j;
  for (j = 0; j < 16; j++)
    Key[j] = k[j];
  keyschedule(Key, 10);
  for (j = 0; j < 16; j++)
    AESInputBlock[j] = 0x0;
  AES128Enc(AESInputBlock, Z[0]);
  for (i = 0; i < 2; i++)
    Times2(Z[i], Z[i + 1]);
  Times2(Z[2], NextZ);
  if (adlen == 0) {
    for (j = 0; j < 16; j++)
      MacAESTag[j] = 0x0;
  } else {
    if (adlen % 16 == 0)
      a = adlen / 16;
    else
      a = adlen / 16 + 1;
    for (j = 0; j < 16; j++)
      SumB[j] = 0x0;
    for (i = 0; i < a - 1; i++) {
      for (j = 0; j < 16; j++)
        AESInputBlock[j] = ad[i * 16 + j] ^ NextZ[j];
      AES128Enc(AESInputBlock, AESOutputBlock);
      for (j = 0; j < 16; j++)
        SumB[j] = SumB[j] ^ AESOutputBlock[j];
      Times2(NextZ, Double);
      for (j = 0; j < 16; j++)
        NextZ[j] = Double[j];
    }
    if (adlen % 16 != 0) {
      for (j = 0; j < adlen % 16; j++)
        LastABlock[j] = ad[(a - 1) * 16 + j];
      LastABlock[adlen % 16] = 0x80;
      for (j = adlen % 16 + 1; j < 16; j++)
        LastABlock[j] = 0x0;
      for (j = 0; j < 16; j++)
        AESInputBlock[j] = SumB[j] ^ LastABlock[j] ^ Z[1][j];
    } else {
      for (j = 0; j < 16; j++)
        AESInputBlock[j] = SumB[j] ^ ad[(a - 1) * 16 + j] ^ Z[2][j];
    }
    AES128Enc(AESInputBlock, MacAESTag);
  }
  if (clen < 16)
    return -2;
  *mlen = clen - 16;
  for (j = 0; j < 13; j++)
    PaddedPMN[j] = npub[j];
  PaddedPMN[13] = 0x80;
  for (j = 13 + 1; j < 16; j++)
    PaddedPMN[j] = 0x0;
  AES128Enc(PaddedPMN, U);
  if (clen == 16) {
    for (j = 0; j < 16; j++)
      AESInputBlock[j] = Z[2][j] ^ U[j];
    AES128Enc(AESInputBlock, AESOutputBlock);
    for (j = 0; j < 16; j++) {
      if (c[j] != (AESOutputBlock[j] ^ MacAESTag[j]))
        return -1;
    }
  } else {
    l = clen / 16 - 1;
    if (clen % 16 != 0) {
      l = l + 1;
      for (j = 0; j < clen % 16; j++) {
        LastCiphertextBlock[j] = c[(l - 1) * 16 + j];
        PaddedBlock[j] = 0x0;
      }
      LastCiphertextBlock[clen % 16] = 0x0;
      PaddedBlock[clen % 16] = 0x80;
      for (j = clen % 16 + 1; j < 16; j++) {
        LastCiphertextBlock[j] = 0x0;
        PaddedBlock[j] = 0x0;
      }
    } else {
      for (j = 0; j < 16; j++) {
        LastCiphertextBlock[j] = c[(l - 1) * 16 + j];
        PaddedBlock[j] = 0x0;
      }
    }
    Times2(Z[2], NextZ);
    for (j = 0; j < 16; j++)
      AESInputBlock[j] = NextZ[j] ^ U[j];
    AES128Enc(AESInputBlock, AESOutputBlock);
    for (i = 0; i < l - 1; i++) {
      Times2(NextZ, Double);
      for (j = 0; j < 16; j++) {
        AESInputBlock[j] = AESOutputBlock[j] ^ c[i * 16 + j];
        m[i * 16 + j] = AESInputBlock[j] ^ Double[j] ^ U[j];
        NextZ[j] = Double[j];
      }
      AES128Enc(AESInputBlock, AESOutputBlock);
    }
    if (clen % 16 != 0) {
      for (j = 0; j < clen % 16; j++) {
        m[(l - 1) * 16 + j] = AESOutputBlock[j] ^ c[(l - 1) * 16 + j];
        StolenR[j] = 0x0;
      }
      for (j = (clen % 16); j < 16; j++)
        StolenR[j] = AESOutputBlock[j] ^ PaddedBlock[j];
    } else {
      for (j = 0; j < 16; j++) {
        m[(l - 1) * 16 + j] = AESOutputBlock[j] ^ c[(l - 1) * 16 + j];
        StolenR[j] = 0x0;
      }
    }
    if (clen % 16 != 0) {
      for (j = 0; j < (clen % 16); j++)
        AESInputBlock[j] = m[(l - 1) * 16 + j] ^ Z[1][j] ^ U[j];
      for (j = (clen % 16); j < 16; j++)
        AESInputBlock[j] = StolenR[j] ^ Z[1][j] ^ U[j];
      AES128Enc(AESInputBlock, AESOutputBlock);
      for (j = 0; j < 16; j++) {
        if (c[(l - 1) * 16 + clen % 16 + j] != (AESOutputBlock[j] ^ MacAESTag[j]))
          return -1;
      }
    } else {
      for (j = 0; j < 16; j++)
        AESInputBlock[j] = m[(l - 1) * 16 + j] ^ Z[2][j] ^ U[j];
      AES128Enc(AESInputBlock, AESOutputBlock);
      for (j = 0; j < 16; j++) {
        if (c[l * 16 + j] != (AESOutputBlock[j] ^ MacAESTag[j]))
          return -1;
      }
    }
  }
  return 0;
}
```