user: What is the c source code of the assembly code below?

```asm
<main>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x6d0,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x6c8(%rsp)
  xor    %eax,%eax
  movl   $0x0,(%rsp)
  movl   $0x1,0x4(%rsp)
  movl   $0x2,0x8(%rsp)
  movl   $0x3,0xc(%rsp)
  movl   $0x4,0x10(%rsp)
  movl   $0x5,0x14(%rsp)
  movl   $0x6,0x18(%rsp)
  movl   $0x7,0x1c(%rsp)
  movl   $0x8,0x20(%rsp)
  movl   $0x9,0x24(%rsp)
  movl   $0xa,0x28(%rsp)
  movl   $0xb,0x2c(%rsp)
  movl   $0xc,0x30(%rsp)
  movl   $0xd,0x34(%rsp)
  movl   $0xe,0x38(%rsp)
  movl   $0xf,0x3c(%rsp)
  movl   $0x0,0x40(%rsp)
  movl   $0x11,0x44(%rsp)
  movl   $0x22,0x48(%rsp)
  movl   $0x33,0x4c(%rsp)
  movl   $0x44,0x50(%rsp)
  movl   $0x55,0x54(%rsp)
  movl   $0x66,0x58(%rsp)
  movl   $0x77,0x5c(%rsp)
  movl   $0x88,0x60(%rsp)
  movl   $0x99,0x64(%rsp)
  movl   $0xaa,0x68(%rsp)
  movl   $0xbb,0x6c(%rsp)
  movl   $0xcc,0x70(%rsp)
  movl   $0xdd,0x74(%rsp)
  movl   $0xee,0x78(%rsp)
  movl   $0xff,0x7c(%rsp)
  movl   $0x69,0x80(%rsp)
  movl   $0xc4,0x84(%rsp)
  movl   $0xe0,0x88(%rsp)
  movl   $0xd8,0x8c(%rsp)
  movl   $0x6a,0x90(%rsp)
  movl   $0x7b,0x94(%rsp)
  movl   $0x4,0x98(%rsp)
  movl   $0x30,0x9c(%rsp)
  movl   $0xd8,0xa0(%rsp)
  movl   $0xcd,0xa4(%rsp)
  movl   $0xb7,0xa8(%rsp)
  movl   $0x80,0xac(%rsp)
  movl   $0x70,0xb0(%rsp)
  movl   $0xb4,0xb4(%rsp)
  movl   $0xc5,0xb8(%rsp)
  movl   $0x5a,0xbc(%rsp)
  movq   $0x0,0xc0(%rsp)
  movq   $0x0,0xc8(%rsp)
  movq   $0x0,0xd0(%rsp)
  movq   $0x0,0xd8(%rsp)
  movq   $0x0,0xe0(%rsp)
  movq   $0x0,0xe8(%rsp)
  movq   $0x0,0xf0(%rsp)
  movq   $0x0,0xf8(%rsp)
  movq   $0x0,0x100(%rsp)
  movq   $0x0,0x108(%rsp)
  movq   $0x0,0x110(%rsp)
  movq   $0x0,0x118(%rsp)
  movq   $0x0,0x120(%rsp)
  movq   $0x0,0x128(%rsp)
  movq   $0x0,0x130(%rsp)
  movq   $0x0,0x138(%rsp)
  lea    0x140(%rsp),%rdi
  mov    $0x58,%ecx
  rep stos %rax,%es:(%rdi)
  lea    0x400(%rsp),%rdi
  mov    $0x58,%ecx
  rep stos %rax,%es:(%rdi)
  call   <AES_128_generate_tables@plt>
  lea    0x140(%rsp),%rbp
  mov    %rsp,%rdi
  mov    %rbp,%rsi
  call   <AES_128_key_exp_enc_asm@plt>
  lea    0xc0(%rsp),%rbx
  lea    0x40(%rsp),%rdi
  mov    %rbp,%rdx
  mov    %rbx,%rsi
  call   <AES_128_encrypt_asm@plt>
  lea    0x80(%rsp),%rsi
  mov    $0x40,%edx
  mov    %rbx,%rdi
  call   <memcmp@plt>
  test   %rax,%rax
  jne    L39
  lea    D68(%rip),%rdi
  call   <printf@plt>
L27:
  lea    0xc0(%rsp),%rdi
  mov    $0x10,%esi
  call   <printx@plt>
  lea    D32(%rip),%rdi
  call   <printf@plt>
  lea    0x80(%rsp),%rbp
  mov    $0x10,%esi
  mov    %rbp,%rdi
  call   <printx@plt>
  lea    D1(%rip),%rdi
  call   <printf@plt>
  lea    0x400(%rsp),%r12
  mov    %rsp,%rdi
  mov    %r12,%rsi
  call   <AES_128_key_exp_dec_asm@plt>
  lea    0x100(%rsp),%rbx
  mov    %r12,%rdx
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  call   <AES_128_decrypt_asm@plt>
  lea    0x40(%rsp),%rsi
  mov    $0x40,%edx
  mov    %rbx,%rdi
  call   <memcmp@plt>
  test   %rax,%rax
  jne    L6
  lea    D71(%rip),%rdi
  call   <printf@plt>
L18:
  lea    0x100(%rsp),%rdi
  mov    $0x10,%esi
  call   <printx@plt>
  lea    D32(%rip),%rdi
  call   <printf@plt>
  lea    0x40(%rsp),%rdi
  mov    $0x10,%esi
  call   <printx@plt>
  lea    D1(%rip),%rdi
  call   <printf@plt>
  mov    0x6c8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L5
  mov    $0x0,%eax
  add    $0x6d0,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L39:
  lea    D17(%rip),%rdi
  call   <printf@plt>
  jmp    L27
L6:
  lea    D59(%rip),%rdi
  call   <printf@plt>
  jmp    L18
L5:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: data_label: D68
datatype: string
name: retrieve_data
arguments: data_label: D32
datatype: string
name: retrieve_data
arguments: data_label: D1
datatype: string
name: retrieve_data
arguments: data_label: D71
datatype: string
name: retrieve_data
arguments: data_label: D17
datatype: string
name: retrieve_data
arguments: data_label: D59
datatype: string

tool: D68: ENCRYPT TEST PASSED: 

tool: D32:  vs. 

tool: D1: 


tool: D71: DECRYPT TEST PASSED: 

tool: D17: ENCRYPT TEST FAILED: 

tool: D59: DECRYPT TEST FAILED: 

assistant: ```c
int main(int argc, char *argv[]) {
  (void)argc;
  (void)argv;
  uint8_t key[(128 / 8)] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
  uint8_t pt[(128 / 8)] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF};
  uint8_t ct[(128 / 8)] = {0x69, 0xC4, 0xE0, 0xD8, 0x6A, 0x7B, 0x04, 0x30, 0xD8, 0xCD, 0xB7, 0x80, 0x70, 0xB4, 0xC5, 0x5A};
  uint8_t oute[(128 / 8)] = {0x00};
  uint8_t outd[(128 / 8)] = {0x00};
  uint8_t kxe[(11 * 16)] = {0x00};
  uint8_t kxd[(11 * 16)] = {0x00};
  AES_128_generate_tables();
  AES_128_key_exp_enc_asm(key, kxe);
  AES_128_encrypt_asm(pt, oute, kxe);
  if (memcmp(oute, ct, sizeof(ct)) == 0) {
    printf("ENCRYPT TEST PASSED: ");
  } else {
    printf("ENCRYPT TEST FAILED: ");
  }
  printx(oute, (128 / 8));
  printf(" vs. ");
  printx(ct, (128 / 8));
  printf("\r\n");
  AES_128_key_exp_dec_asm(key, kxd);
  AES_128_decrypt_asm(ct, outd, kxd);
  if (memcmp(outd, pt, sizeof(pt)) == 0) {
    printf("DECRYPT TEST PASSED: ");
  } else {
    printf("DECRYPT TEST FAILED: ");
  }
  printx(outd, (128 / 8));
  printf(" vs. ");
  printx(pt, (128 / 8));
  printf("\r\n");
  return 0;
}
```