user: What would the C source look like for the assembly code provided here:

```asm
<test_check_user_token>:
  endbr64
  push   %r14
  lea    D111(%rip),%r14
  push   %r13
  lea    D188(%rip),%r13
  push   %r12
  push   %rbp
  sub    $0x28,%rsp
  movdqa D224(%rip),%xmm0
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  mov    %rsp,%rbp
  movl   $0x585858,0x10(%rsp)
  mov    %rbp,%rdi
  movaps %xmm0,(%rsp)
  call   <mkstemp@plt>
  xor    %edi,%edi
  cmp    $0xffffffff,%eax
  mov    %eax,%r12d
  setne  %dil
  call   <assert@plt>
  mov    %r12d,%edi
  lea    D99(%rip),%rsi
  call   <fdopen@plt>
  lea    D81(%rip),%rsi
  mov    %rax,%r12
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    %r12,%rdi
  lea    D233(%rip),%rsi
  call   <fprintf@plt>
  mov    %r12,%rdi
  lea    D230(%rip),%rsi
  call   <fprintf@plt>
  mov    %r12,%rdi
  lea    D131(%rip),%rsi
  call   <fprintf@plt>
  mov    %r12,%rdi
  lea    D3(%rip),%rsi
  call   <fprintf@plt>
  mov    %r12,%rdi
  lea    D85(%rip),%rsi
  call   <fprintf@plt>
  mov    %r12,%rdi
  lea    D178(%rip),%rsi
  call   <fprintf@plt>
  lea    D225(%rip),%rsi
  mov    %r12,%rdi
  call   <fprintf@plt>
  mov    %r12,%rdi
  lea    D237(%rip),%r12
  call   <fclose@plt>
  mov    %r12,%rsi
  mov    $0x1,%ecx
  mov    %rbp,%rdi
  lea    D126(%rip),%rdx
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0x1,%eax
  sete   %dil
  call   <assert@plt>
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    $0x1,%ecx
  mov    %rbp,%rdi
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0x1,%eax
  sete   %dil
  call   <assert@plt>
  mov    %r12,%rsi
  mov    $0x1,%ecx
  mov    %rbp,%rdi
  lea    D98(%rip),%rdx
  lea    D74(%rip),%r12
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0xffffffff,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1,%ecx
  lea    D26(%rip),%rdx
  mov    %rbp,%rdi
  lea    D124(%rip),%rsi
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0x1,%eax
  sete   %dil
  call   <assert@plt>
  mov    %r13,%rdx
  mov    $0x1,%ecx
  mov    %rbp,%rdi
  lea    D16(%rip),%rsi
  lea    D63(%rip),%r13
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0x1,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  lea    D32(%rip),%rdx
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0xfffffffe,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  lea    D96(%rip),%rdx
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0x1,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  lea    D35(%rip),%rdx
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0x1,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  lea    D190(%rip),%rdx
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0xffffffff,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    %r14,%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0xffffffff,%eax
  sete   %dil
  call   <assert@plt>
  mov    $0x1,%ecx
  mov    %r14,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <check_user_token@plt>
  xor    %edi,%edi
  cmp    $0xfffffffe,%eax
  sete   %dil
  call   <assert@plt>
  mov    %rbp,%rdi
  call   <remove@plt>
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L1
  add    $0x28,%rsp
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L1:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: label: D111
type_infered: string
name: unpack_data
arguments: label: D188
type_infered: string
name: unpack_data
arguments: label: D224
type_infered: byte[16]
name: unpack_data
arguments: label: D99
type_infered: string
name: unpack_data
arguments: label: D81
type_infered: string
name: unpack_data
arguments: label: D233
type_infered: string
name: unpack_data
arguments: label: D230
type_infered: string
name: unpack_data
arguments: label: D131
type_infered: string
name: unpack_data
arguments: label: D3
type_infered: string
name: unpack_data
arguments: label: D85
type_infered: string
name: unpack_data
arguments: label: D178
type_infered: string
name: unpack_data
arguments: label: D225
type_infered: string
name: unpack_data
arguments: label: D237
type_infered: string
name: unpack_data
arguments: label: D126
type_infered: string
name: unpack_data
arguments: label: D98
type_infered: string
name: unpack_data
arguments: label: D74
type_infered: string
name: unpack_data
arguments: label: D26
type_infered: string
name: unpack_data
arguments: label: D124
type_infered: string
name: unpack_data
arguments: label: D16
type_infered: string
name: unpack_data
arguments: label: D63
type_infered: string
name: unpack_data
arguments: label: D32
type_infered: string
name: unpack_data
arguments: label: D96
type_infered: string
name: unpack_data
arguments: label: D35
type_infered: string
name: unpack_data
arguments: label: D190
type_infered: string

tool: 

tool: D188: hnhbhnhbhnhb

tool: {"D224": [0x2f,0x74,0x6d,0x70,0x2f,0x70,0x61,0x6d,0x74,0x65,0x73,0x74,0x2e,0x58,0x58,0x58]}

tool: D99: w

tool: D81: # This is a comment containing foobar:foobar


tool: D233: foobar:hhhvhvhdhbid:hnhbhnhbhnhb:


tool: D230: # This is a comment in the middle


tool: D131: kaka:hdhrhbhjhvhu:hihbhdhrhbhj


tool: D3: # foo2 is a user showing up twice in the file


tool: D85: foo2:vvvvvvvvvvvv


tool: D178: bar:hnhbhnhbhnhb


tool: D225: foo2:cccccccccccc


tool: D237: foobar

tool: D126: hhhvhvhdhbid

tool: D98: hnhbhnhbhnhc

tool: D74: foo2

tool: D26: hihbhdhrhbhj

tool: D124: kaka

tool: D16: bar

tool: D63: foo

tool: D32: hdhrhbhjhvhu

tool: D96: cccccccccccc

tool: D35: vvvvvvvvvvvv

tool: D190: vvvvvvvvvvcc

assistant: ```c
void test_check_user_token(void) {
  char file[] = "/tmp/pamtest.XXXXXX";
  int fd = mkstemp(file);
  FILE *handle;
  int ret;
  assert(fd != -1);
  handle = fdopen(fd, "w");
  fprintf(handle, "# This is a comment containing foobar:foobar\n");
  fprintf(handle, "foobar:hhhvhvhdhbid:hnhbhnhbhnhb:\n");
  fprintf(handle, "# This is a comment in the middle\n");
  fprintf(handle, "kaka:hdhrhbhjhvhu:hihbhdhrhbhj\n");
  fprintf(handle, "# foo2 is a user showing up twice in the file\n");
  fprintf(handle, "foo2:vvvvvvvvvvvv\n");
  fprintf(handle, "bar:hnhbhnhbhnhb\n");
  fprintf(handle, "foo2:cccccccccccc\n");
  fclose(handle);
  ret = check_user_token(file, "foobar", "hhhvhvhdhbid", 1);
  assert(ret == 1);
  ret = check_user_token(file, "foobar", "hnhbhnhbhnhb", 1);
  assert(ret == 1);
  ret = check_user_token(file, "foobar", "hnhbhnhbhnhc", 1);
  assert(ret == -1);
  ret = check_user_token(file, "kaka", "hihbhdhrhbhj", 1);
  assert(ret == 1);
  ret = check_user_token(file, "bar", "hnhbhnhbhnhb", 1);
  assert(ret == 1);
  ret = check_user_token(file, "foo", "hdhrhbhjhvhu", 1);
  assert(ret == -2);
  ret = check_user_token(file, "foo2", "cccccccccccc", 1);
  assert(ret == 1);
  ret = check_user_token(file, "foo2", "vvvvvvvvvvvv", 1);
  assert(ret == 1);
  ret = check_user_token(file, "foo2", "vvvvvvvvvvcc", 1);
  assert(ret == -1);
  ret = check_user_token(file, "foo2", "", 1);
  assert(ret == -1);
  ret = check_user_token(file, "foo", "", 1);
  assert(ret == -2);
  remove(file);
}
```