user: Translate the below assembly code into C programming language:

```asm
<test_check_user_token>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movabs $0x6d61702f706d742f,%rax
  movabs $0x5858582e74736574,%rdx
  mov    %rax,-0x20(%rbp)
  mov    %rdx,-0x18(%rbp)
  movl   $0x585858,-0x10(%rbp)
  lea    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <mkstemp@plt>
  mov    %eax,-0x30(%rbp)
  cmpl   $0xffffffff,-0x30(%rbp)
  setne  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x30(%rbp),%eax
  lea    D259(%rip),%rdx
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <fdopen@plt>
  mov    %rax,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  lea    D140(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x28(%rbp),%rax
  lea    D201(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x28(%rbp),%rax
  lea    D206(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x28(%rbp),%rax
  lea    D284(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x28(%rbp),%rax
  lea    D14(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x28(%rbp),%rax
  lea    D290(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x28(%rbp),%rax
  lea    D3(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x28(%rbp),%rax
  lea    D134(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <fclose@plt>
  lea    -0x20(%rbp),%rax
  mov    $0x1,%ecx
  lea    D45(%rip),%rdx
  lea    D270(%rip),%rsi
  mov    %rax,%rdi
  call   <check_user_token@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x1,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x20(%rbp),%rax
  mov    $0x1,%ecx
  lea    D110(%rip),%rdx
  lea    D270(%rip),%rsi
  mov    %rax,%rdi
  call   <check_user_token@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x1,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x20(%rbp),%rax
  mov    $0x1,%ecx
  lea    D46(%rip),%rdx
  lea    D270(%rip),%rsi
  mov    %rax,%rdi
  call   <check_user_token@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0xffffffff,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x20(%rbp),%rax
  mov    $0x1,%ecx
  lea    D139(%rip),%rdx
  lea    D120(%rip),%rsi
  mov    %rax,%rdi
  call   <check_user_token@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x1,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x20(%rbp),%rax
  mov    $0x1,%ecx
  lea    D110(%rip),%rdx
  lea    D26(%rip),%rsi
  mov    %rax,%rdi
  call   <check_user_token@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x1,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x20(%rbp),%rax
  mov    $0x1,%ecx
  lea    D309(%rip),%rdx
  lea    D267(%rip),%rsi
  mov    %rax,%rdi
  call   <check_user_token@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0xfffffffe,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x20(%rbp),%rax
  mov    $0x1,%ecx
  lea    D252(%rip),%rdx
  lea    D17(%rip),%rsi
  mov    %rax,%rdi
  call   <check_user_token@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x1,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x20(%rbp),%rax
  mov    $0x1,%ecx
  lea    D168(%rip),%rdx
  lea    D17(%rip),%rsi
  mov    %rax,%rdi
  call   <check_user_token@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x1,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x20(%rbp),%rax
  mov    $0x1,%ecx
  lea    D277(%rip),%rdx
  lea    D17(%rip),%rsi
  mov    %rax,%rdi
  call   <check_user_token@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0xffffffff,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x20(%rbp),%rax
  mov    $0x1,%ecx
  lea    D196(%rip),%rdx
  lea    D17(%rip),%rsi
  mov    %rax,%rdi
  call   <check_user_token@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0xffffffff,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x20(%rbp),%rax
  mov    $0x1,%ecx
  lea    D196(%rip),%rdx
  lea    D267(%rip),%rsi
  mov    %rax,%rdi
  call   <check_user_token@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0xfffffffe,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <remove@plt>
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L6
  call   <__stack_chk_fail@plt>
L6:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: label: D259
type: string
name: disassemble_data
arguments: label: D140
type: string
name: disassemble_data
arguments: label: D201
type: string
name: disassemble_data
arguments: label: D206
type: string
name: disassemble_data
arguments: label: D284
type: string
name: disassemble_data
arguments: label: D14
type: string
name: disassemble_data
arguments: label: D290
type: string
name: disassemble_data
arguments: label: D3
type: string
name: disassemble_data
arguments: label: D134
type: string
name: disassemble_data
arguments: label: D45
type: string
name: disassemble_data
arguments: label: D270
type: string
name: disassemble_data
arguments: label: D110
type: string
name: disassemble_data
arguments: label: D46
type: string
name: disassemble_data
arguments: label: D139
type: string
name: disassemble_data
arguments: label: D120
type: string
name: disassemble_data
arguments: label: D26
type: string
name: disassemble_data
arguments: label: D309
type: string
name: disassemble_data
arguments: label: D267
type: string
name: disassemble_data
arguments: label: D252
type: string
name: disassemble_data
arguments: label: D17
type: string
name: disassemble_data
arguments: label: D168
type: string
name: disassemble_data
arguments: label: D277
type: string
name: disassemble_data
arguments: label: D196
type: string

tool: D259: w

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


tool: D201: foobar:hhhvhvhdhbid:hnhbhnhbhnhb:


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


tool: D284: kaka:hdhrhbhjhvhu:hihbhdhrhbhj


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


tool: D290: foo2:vvvvvvvvvvvv


tool: D3: bar:hnhbhnhbhnhb


tool: D134: foo2:cccccccccccc


tool: D45: hhhvhvhdhbid

tool: D270: foobar

tool: D110: hnhbhnhbhnhb

tool: D46: hnhbhnhbhnhc

tool: D139: hihbhdhrhbhj

tool: D120: kaka

tool: D26: bar

tool: D309: hdhrhbhjhvhu

tool: D267: foo

tool: D252: cccccccccccc

tool: D17: foo2

tool: D168: vvvvvvvvvvvv

tool: D277: vvvvvvvvvvcc

tool: 

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);
}
```