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

```asm
<authentication>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x70,%rsp
  mov    %rdi,-0x58(%rbp)
  mov    %rsi,-0x60(%rbp)
  mov    %rdx,-0x68(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movq   $0x0,-0x50(%rbp)
  lea    -0x40(%rbp),%rax
  lea    D13(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  lea    -0x40(%rbp),%rdx
  mov    -0x58(%rbp),%rax
  lea    D37(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fscanf@plt>
  lea    -0x40(%rbp),%rax
  mov    $0x3a,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  add    $0x2,%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <atol@plt>
  mov    %rax,-0x50(%rbp)
  jmp    L50
L17:
  lea    -0x40(%rbp),%rdx
  mov    -0x58(%rbp),%rax
  lea    D37(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fscanf@plt>
  lea    -0x40(%rbp),%rax
  mov    $0x3a,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  add    $0x2,%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <atol@plt>
  mov    %rax,-0x50(%rbp)
L50:
  mov    -0x60(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    -0x60(%rbp),%rcx
  lea    -0x40(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcmp@plt>
  test   %rax,%rax
  je     L69
  mov    -0x50(%rbp),%rax
  cmp    -0x68(%rbp),%rax
  je     L69
  mov    -0x58(%rbp),%rax
  mov    %rax,%rdi
  call   <feof@plt>
  test   %eax,%eax
  je     L17
L69:
  mov    -0x68(%rbp),%rax
  cmp    -0x50(%rbp),%rax
  jne    L34
  mov    -0x60(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    -0x60(%rbp),%rcx
  lea    -0x40(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcmp@plt>
  test   %rax,%rax
  jne    L34
  mov    -0x60(%rbp),%rax
  mov    %rax,%rsi
  lea    D6(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  jmp    L63
L34:
  mov    -0x60(%rbp),%rax
  mov    %rax,%rsi
  lea    D31(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L63:
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L27
  call   <__stack_chk_fail@plt>
L27:
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D13
data_type: string
name: parse_data
arguments: tag: D37
data_type: string
name: parse_data
arguments: tag: D6
data_type: string
name: parse_data
arguments: tag: D31
data_type: string

tool: 

tool: D37: %s

tool: D6: Usuario # %s # Valido


tool: D31:  #######ERROR########
 ==Usuario %s INVALIDO==


assistant: ```c
void authentication(FILE *acl, char *user, unsigned long pass_buscado) {
  char user1[50];
  char *pass_file;
  unsigned long pass1 = 0;
  strcpy(user1, "");
  fscanf(acl, "%s", user1);
  pass_file = (strpbrk(user1, ":") + 2);
  pass1 = atol(pass_file);
  while (memcmp(user1, user, strlen(user)) != 0 && pass1 != pass_buscado && !feof(acl)) {
    fscanf(acl, "%s", user1);
    pass_file = (strpbrk(user1, ":") + 2);
    pass1 = atol(pass_file);
  }
  if (pass_buscado == pass1 && memcmp(user1, user, strlen(user)) == 0) {
    printf("Usuario # %s # Valido\n", user);
  } else {
    printf(" #######ERROR########\n ==Usuario %s INVALIDO==\n", user);
  }
}
```