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

```asm
<hmac_sha1_vector>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x110,%rsp
  mov    %rdi,-0xe8(%rbp)
  mov    %rsi,-0xf0(%rbp)
  mov    %rdx,-0xf8(%rbp)
  mov    %rcx,-0x100(%rbp)
  mov    %r8,-0x108(%rbp)
  mov    %r9,-0x110(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  cmpq   $0x5,-0xf8(%rbp)
  ja     L63
  mov    -0xf0(%rbp),%rax
  cmp    $0x40,%rax
  jbe    L55
  lea    -0x70(%rbp),%rcx
  lea    -0xf0(%rbp),%rdx
  lea    -0xe8(%rbp),%rax
  mov    %rax,%rsi
  mov    $0x1,%edi
  call   <sha1_vector@plt>
  lea    -0x70(%rbp),%rax
  mov    %rax,-0xe8(%rbp)
  movq   $0x14,-0xf0(%rbp)
L55:
  lea    -0x50(%rbp),%rax
  mov    $0x40,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0xf0(%rbp),%rdx
  mov    -0xe8(%rbp),%rcx
  lea    -0x50(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  movl   $0x0,-0xd4(%rbp)
  jmp    L60
L16:
  mov    -0xd4(%rbp),%eax
  cltq
  movzbl -0x50(%rbp,%rax,1),%eax
  xor    $0x36,%eax
  mov    %eax,%edx
  mov    -0xd4(%rbp),%eax
  cltq
  mov    %dl,-0x50(%rbp,%rax,1)
  addl   $0x1,-0xd4(%rbp)
L60:
  cmpl   $0x3f,-0xd4(%rbp)
  jle    L16
  lea    -0x50(%rbp),%rax
  mov    %rax,-0xd0(%rbp)
  movq   $0x40,-0xa0(%rbp)
  movl   $0x0,-0xd4(%rbp)
  jmp    L4
L93:
  mov    -0xd4(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x100(%rbp),%rax
  add    %rdx,%rax
  mov    -0xd4(%rbp),%edx
  lea    0x1(%rdx),%ecx
  mov    (%rax),%rdx
  movslq %ecx,%rax
  mov    %rdx,-0xd0(%rbp,%rax,8)
  mov    -0xd4(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x108(%rbp),%rax
  add    %rdx,%rax
  mov    -0xd4(%rbp),%edx
  lea    0x1(%rdx),%ecx
  mov    (%rax),%rdx
  movslq %ecx,%rax
  mov    %rdx,-0xa0(%rbp,%rax,8)
  addl   $0x1,-0xd4(%rbp)
L4:
  mov    -0xd4(%rbp),%eax
  cltq
  cmp    %rax,-0xf8(%rbp)
  ja     L93
  mov    -0xf8(%rbp),%rax
  add    $0x1,%eax
  mov    %eax,%edi
  mov    -0x110(%rbp),%rcx
  lea    -0xa0(%rbp),%rdx
  lea    -0xd0(%rbp),%rax
  mov    %rax,%rsi
  call   <sha1_vector@plt>
  lea    -0x50(%rbp),%rax
  mov    $0x40,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0xf0(%rbp),%rdx
  mov    -0xe8(%rbp),%rcx
  lea    -0x50(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  movl   $0x0,-0xd4(%rbp)
  jmp    L5
L25:
  mov    -0xd4(%rbp),%eax
  cltq
  movzbl -0x50(%rbp,%rax,1),%eax
  xor    $0x5c,%eax
  mov    %eax,%edx
  mov    -0xd4(%rbp),%eax
  cltq
  mov    %dl,-0x50(%rbp,%rax,1)
  addl   $0x1,-0xd4(%rbp)
L5:
  cmpl   $0x3f,-0xd4(%rbp)
  jle    L25
  lea    -0x50(%rbp),%rax
  mov    %rax,-0xd0(%rbp)
  movq   $0x40,-0xa0(%rbp)
  mov    -0x110(%rbp),%rax
  mov    %rax,-0xc8(%rbp)
  movq   $0x14,-0x98(%rbp)
  mov    -0x110(%rbp),%rcx
  lea    -0xa0(%rbp),%rdx
  lea    -0xd0(%rbp),%rax
  mov    %rax,%rsi
  mov    $0x2,%edi
  call   <sha1_vector@plt>
  jmp    L46
L63:
  nop
L46:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L34
  call   <__stack_chk_fail@plt>
L34:
  leave
  ret
```

assistant: ```c
void hmac_sha1_vector(const uint8_t *key, size_t key_len, size_t num_elem, const uint8_t *addr[], const size_t *len, uint8_t *mac) {
  unsigned char k_pad[64];
  unsigned char tk[20];
  int i;
  const uint8_t *_addr[6];
  size_t _len[6];
  if (num_elem > 5) {
    return;
  }
  if (key_len > 64) {
    sha1_vector(1, &key, &key_len, tk);
    key = tk;
    key_len = 20;
  }
  memset(k_pad, 0, sizeof(k_pad));
  memcpy((uint8_t *)k_pad, (uint8_t *)key, key_len);
  for (i = 0; i < 64; i++)
    k_pad[i] ^= 0x36;
  _addr[0] = k_pad;
  _len[0] = 64;
  for (i = 0; i < num_elem; i++) {
    _addr[i + 1] = addr[i];
    _len[i + 1] = len[i];
  }
  sha1_vector(1 + num_elem, _addr, _len, mac);
  memset(k_pad, 0, sizeof(k_pad));
  memcpy((uint8_t *)k_pad, (uint8_t *)key, key_len);
  for (i = 0; i < 64; i++)
    k_pad[i] ^= 0x5c;
  _addr[0] = k_pad;
  _len[0] = 64;
  _addr[1] = mac;
  _len[1] = 20;
  sha1_vector(2, _addr, _len, mac);
}
```