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

```asm
<poly1305_mac>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x120,%rsp
  mov    %rdi,-0x108(%rbp)
  mov    %rsi,-0x110(%rbp)
  mov    %rdx,-0x118(%rbp)
  mov    %rcx,-0x120(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x120(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xf0(%rbp)
  mov    -0x120(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xec(%rbp)
  mov    -0x120(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xe8(%rbp)
  mov    -0x120(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xf,%eax
  mov    %eax,-0xe4(%rbp)
  mov    -0x120(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xfc,%eax
  mov    %eax,-0xe0(%rbp)
  mov    -0x120(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xdc(%rbp)
  mov    -0x120(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xd8(%rbp)
  mov    -0x120(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xf,%eax
  mov    %eax,-0xd4(%rbp)
  mov    -0x120(%rbp),%rax
  add    $0x8,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xfc,%eax
  mov    %eax,-0xd0(%rbp)
  mov    -0x120(%rbp),%rax
  add    $0x9,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xcc(%rbp)
  mov    -0x120(%rbp),%rax
  add    $0xa,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xc8(%rbp)
  mov    -0x120(%rbp),%rax
  add    $0xb,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xf,%eax
  mov    %eax,-0xc4(%rbp)
  mov    -0x120(%rbp),%rax
  add    $0xc,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xfc,%eax
  mov    %eax,-0xc0(%rbp)
  mov    -0x120(%rbp),%rax
  add    $0xd,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xbc(%rbp)
  mov    -0x120(%rbp),%rax
  add    $0xe,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xb8(%rbp)
  mov    -0x120(%rbp),%rax
  add    $0xf,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xf,%eax
  mov    %eax,-0xb4(%rbp)
  movl   $0x0,-0xb0(%rbp)
  movl   $0x0,-0xf4(%rbp)
  jmp    L77
L106:
  mov    -0xf4(%rbp),%eax
  movl   $0x0,-0xa0(%rbp,%rax,4)
  addl   $0x1,-0xf4(%rbp)
L77:
  cmpl   $0x10,-0xf4(%rbp)
  jbe    L106
  jmp    L104
L92:
  movl   $0x0,-0xf4(%rbp)
  jmp    L89
L67:
  mov    -0xf4(%rbp),%eax
  movl   $0x0,-0x50(%rbp,%rax,4)
  addl   $0x1,-0xf4(%rbp)
L89:
  cmpl   $0x10,-0xf4(%rbp)
  jbe    L67
  movl   $0x0,-0xf4(%rbp)
  jmp    L81
L100:
  mov    -0xf4(%rbp),%edx
  mov    -0x110(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0xf4(%rbp),%eax
  mov    %edx,-0x50(%rbp,%rax,4)
  addl   $0x1,-0xf4(%rbp)
L81:
  cmpl   $0xf,-0xf4(%rbp)
  ja     L136
  mov    -0xf4(%rbp),%eax
  cmp    %rax,-0x118(%rbp)
  ja     L100
L136:
  mov    -0xf4(%rbp),%eax
  movl   $0x1,-0x50(%rbp,%rax,4)
  mov    -0xf4(%rbp),%eax
  add    %rax,-0x110(%rbp)
  mov    -0xf4(%rbp),%eax
  sub    %rax,-0x118(%rbp)
  lea    -0x50(%rbp),%rdx
  lea    -0xa0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <add@plt>
  lea    -0xf0(%rbp),%rdx
  lea    -0xa0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <mulmod@plt>
L104:
  cmpq   $0x0,-0x118(%rbp)
  jne    L92
  lea    -0xa0(%rbp),%rax
  mov    %rax,%rdi
  call   <freeze@plt>
  movl   $0x0,-0xf4(%rbp)
  jmp    L44
L125:
  mov    -0xf4(%rbp),%eax
  add    $0x10,%eax
  mov    %eax,%edx
  mov    -0x120(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0xf4(%rbp),%eax
  mov    %edx,-0x50(%rbp,%rax,4)
  addl   $0x1,-0xf4(%rbp)
L44:
  cmpl   $0xf,-0xf4(%rbp)
  jbe    L125
  movl   $0x0,-0x10(%rbp)
  lea    -0x50(%rbp),%rdx
  lea    -0xa0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <add@plt>
  movl   $0x0,-0xf4(%rbp)
  jmp    L12
L26:
  mov    -0xf4(%rbp),%eax
  mov    -0xa0(%rbp,%rax,4),%edx
  mov    -0xf4(%rbp),%ecx
  mov    -0x108(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  addl   $0x1,-0xf4(%rbp)
L12:
  cmpl   $0xf,-0xf4(%rbp)
  jbe    L26
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L31
  call   <__stack_chk_fail@plt>
L31:
  leave
  ret
```

assistant: ```c
int poly1305_mac(unsigned char *out, const unsigned char *in, unsigned long long inlen, const unsigned char *k) {
  unsigned int j;
  unsigned int r[17];
  unsigned int h[17];
  unsigned int c[17];
  r[0] = k[0];
  r[1] = k[1];
  r[2] = k[2];
  r[3] = k[3] & 15;
  r[4] = k[4] & 252;
  r[5] = k[5];
  r[6] = k[6];
  r[7] = k[7] & 15;
  r[8] = k[8] & 252;
  r[9] = k[9];
  r[10] = k[10];
  r[11] = k[11] & 15;
  r[12] = k[12] & 252;
  r[13] = k[13];
  r[14] = k[14];
  r[15] = k[15] & 15;
  r[16] = 0;
  for (j = 0; j < 17; ++j)
    h[j] = 0;
  while (inlen > 0) {
    for (j = 0; j < 17; ++j)
      c[j] = 0;
    for (j = 0; (j < 16) && (j < inlen); ++j)
      c[j] = in[j];
    c[j] = 1;
    in += j;
    inlen -= j;
    add(h, c);
    mulmod(h, r);
  }
  freeze(h);
  for (j = 0; j < 16; ++j)
    c[j] = k[j + 16];
  c[16] = 0;
  add(h, c);
  for (j = 0; j < 16; ++j)
    out[j] = h[j];
  return 0;
}
```