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

```asm
<crypto_onetimeauth_poly1305_tinynacl>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    %rdi,0x60(%rsp)
  mov    %rsi,%r14
  mov    %rdx,%r15
  mov    %rcx,%rbx
  mov    %rcx,0x68(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  mov    %rcx,%rdi
  call   <unpack@plt>
  and    $0x3ffffff,%eax
  mov    %rax,0x28(%rsp)
  lea    0x3(%rbx),%rdi
  call   <unpack@plt>
  shr    $0x2,%rax
  and    $0x3ffff03,%eax
  mov    %rax,0x30(%rsp)
  lea    0x6(%rbx),%rdi
  call   <unpack@plt>
  shr    $0x4,%rax
  and    $0x3ffc0ff,%eax
  mov    %rax,%rbp
  mov    %rax,0x8(%rsp)
  lea    0x9(%rbx),%rdi
  call   <unpack@plt>
  shr    $0x6,%rax
  and    $0x3f03fff,%eax
  mov    %rax,%r12
  mov    %rax,0x20(%rsp)
  lea    0xc(%rbx),%rdi
  call   <unpack@plt>
  shr    $0x8,%rax
  and    $0xfffff,%eax
  mov    %rax,0x38(%rsp)
  lea    0x0(%rbp,%rbp,4),%rbx
  mov    %rbx,0x40(%rsp)
  lea    (%r12,%r12,4),%rbx
  mov    %rbx,0x48(%rsp)
  lea    (%rax,%rax,4),%rax
  mov    %rax,0x50(%rsp)
  test   %r15,%r15
  jle    L0
  movq   $0x0,0x18(%rsp)
  mov    $0x0,%r13d
  movq   $0x0,0x10(%rsp)
  mov    $0x0,%ebp
  lea    0x80(%rsp),%rax
  mov    %rax,0x58(%rsp)
  mov    %rbp,%rbx
  jmp    L63
L66:
  lea    0x70(%rsp),%rax
  mov    0x58(%rsp),%rdx
L33:
  movb   $0x0,(%rax)
  add    $0x1,%rax
  cmp    %rdx,%rax
  jne    L33
  test   %r15,%r15
  je     L75
  mov    $0x0,%eax
L16:
  movzbl (%r14,%rax,1),%edx
  mov    %dl,0x70(%rsp,%rax,1)
  add    $0x1,%rax
  cmp    %r15,%rax
  jne    L16
L46:
  movb   $0x1,0x70(%rsp,%rax,1)
  lea    0x70(%rsp),%rdi
  call   <unpack@plt>
  and    $0x3ffffff,%eax
  add    %rax,%rbx
  lea    0x73(%rsp),%rdi
  call   <unpack@plt>
  shr    $0x2,%rax
  and    $0x3ffffff,%eax
  add    %rax,%rbp
  lea    0x76(%rsp),%rdi
  call   <unpack@plt>
  shr    $0x4,%rax
  mov    %rax,%r12
  and    $0x3ffffff,%r12d
  add    0x10(%rsp),%r12
  lea    0x79(%rsp),%rdi
  call   <unpack@plt>
  shr    $0x6,%rax
  and    $0x3ffffff,%eax
  add    %rax,%r13
  lea    0x7c(%rsp),%rdi
  call   <unpack@plt>
  shr    $0x8,%rax
  mov    0x18(%rsp),%rdx
  add    %rax,%rdx
L85:
  mov    0x28(%rsp),%r9
  mov    %r9,%rax
  imul   %rbx,%rax
  mov    0x50(%rsp),%r10
  mov    %r10,%rcx
  imul   %rbp,%rcx
  add    %rcx,%rax
  mov    0x40(%rsp),%rdi
  mov    %rdi,%rcx
  imul   %r13,%rcx
  add    %rcx,%rax
  mov    0x48(%rsp),%r8
  mov    %r8,%rcx
  imul   %r12,%rcx
  add    %rcx,%rax
  mov    0x30(%rsp),%r11
  mov    %r11,%rcx
  imul   %rdx,%rcx
  lea    (%rcx,%rcx,4),%rcx
  add    %rcx,%rax
  mov    %r11,%rcx
  imul   %rbx,%rcx
  mov    %r9,%rsi
  imul   %rbp,%rsi
  add    %rsi,%rcx
  mov    %r8,%rsi
  imul   %r13,%rsi
  add    %rsi,%rcx
  mov    %r10,%rsi
  imul   %r12,%rsi
  add    %rsi,%rcx
  imul   %rdx,%rdi
  add    %rdi,%rcx
  mov    0x8(%rsp),%rdi
  imul   %rbx,%rdi
  mov    %r11,%rsi
  imul   %rbp,%rsi
  add    %rsi,%rdi
  mov    %r10,%rsi
  imul   %r13,%rsi
  add    %rsi,%rdi
  mov    %r9,%rsi
  imul   %r12,%rsi
  add    %rsi,%rdi
  mov    %r8,%rsi
  imul   %rdx,%rsi
  add    %rsi,%rdi
  mov    0x20(%rsp),%rsi
  imul   %rbx,%rsi
  mov    0x8(%rsp),%r8
  imul   %rbp,%r8
  add    %r8,%rsi
  mov    %r9,%r8
  imul   %r13,%r8
  add    %r8,%rsi
  mov    %r11,%r8
  imul   %r12,%r8
  add    %r8,%rsi
  imul   %rdx,%r10
  add    %r10,%rsi
  imul   0x38(%rsp),%rbx
  imul   0x20(%rsp),%rbp
  add    %rbp,%rbx
  imul   %r11,%r13
  add    %rbx,%r13
  imul   0x8(%rsp),%r12
  add    %r13,%r12
  imul   %r9,%rdx
  add    %rdx,%r12
  mov    %rax,%rdx
  and    $0x3ffffff,%edx
  shr    $0x1a,%rax
  add    %rcx,%rax
  mov    %rax,%rcx
  and    $0x3ffffff,%ecx
  shr    $0x1a,%rax
  add    %rdi,%rax
  mov    %rax,%rbx
  and    $0x3ffffff,%ebx
  mov    %rbx,0x10(%rsp)
  shr    $0x1a,%rax
  add    %rsi,%rax
  mov    %rax,%r13
  and    $0x3ffffff,%r13d
  shr    $0x1a,%rax
  add    %r12,%rax
  mov    %rax,%rbx
  and    $0x3ffffff,%ebx
  mov    %rbx,0x18(%rsp)
  shr    $0x1a,%rax
  lea    (%rax,%rax,4),%rbp
  add    %rdx,%rbp
  mov    %rbp,%rbx
  and    $0x3ffffff,%ebx
  shr    $0x1a,%rbp
  add    %rcx,%rbp
  add    $0x10,%r14
  sub    $0x10,%r15
  test   %r15,%r15
  jle    L88
L63:
  cmp    $0xf,%r15
  jbe    L66
  mov    %r14,%rdi
  call   <unpack@plt>
  and    $0x3ffffff,%eax
  add    %rax,%rbx
  lea    0x3(%r14),%rdi
  call   <unpack@plt>
  shr    $0x2,%rax
  and    $0x3ffffff,%eax
  add    %rax,%rbp
  lea    0x6(%r14),%rdi
  call   <unpack@plt>
  shr    $0x4,%rax
  mov    %rax,%r12
  and    $0x3ffffff,%r12d
  add    0x10(%rsp),%r12
  lea    0x9(%r14),%rdi
  call   <unpack@plt>
  shr    $0x6,%rax
  and    $0x3ffffff,%eax
  add    %rax,%r13
  lea    0xc(%r14),%rdi
  call   <unpack@plt>
  shr    $0x8,%rax
  mov    %rax,%rdx
  or     $0x1000000,%rdx
  add    0x18(%rsp),%rdx
  jmp    L85
L75:
  mov    $0x0,%eax
  jmp    L46
L88:
  mov    %r13,%rdi
  mov    %rbp,%r12
  mov    %rbx,%rbp
L4:
  mov    %r12,%rdx
  and    $0x3ffffff,%edx
  shr    $0x1a,%r12
  mov    0x10(%rsp),%rax
  add    %r12,%rax
  mov    %rax,%rsi
  and    $0x3ffffff,%esi
  shr    $0x1a,%rax
  add    %rdi,%rax
  mov    %rax,%r8
  and    $0x3ffffff,%r8d
  shr    $0x1a,%rax
  add    0x18(%rsp),%rax
  mov    %rax,%r9
  and    $0x3ffffff,%r9d
  mov    %rax,%rcx
  shr    $0x1a,%rcx
  lea    (%rcx,%rcx,4),%rcx
  add    %rbp,%rcx
  mov    %rcx,%r13
  and    $0x3ffffff,%r13d
  shr    $0x1a,%rcx
  add    %rdx,%rcx
  lea    0x5(%r13),%r11
  mov    %r11,%rbp
  shr    $0x1a,%rbp
  add    %rcx,%rbp
  mov    %rbp,%rbx
  shr    $0x1a,%rbx
  add    %rsi,%rbx
  mov    %rbx,%rdx
  shr    $0x1a,%rdx
  add    %r8,%rdx
  or     $0xfffffffffc000000,%rax
  mov    %rdx,%rdi
  shr    $0x1a,%rdi
  add    %rdi,%rax
  mov    %rax,%r10
  shr    $0x3f,%r10
  lea    -0x1(%r10),%rdi
  and    %rdi,%r11
  and    %rdi,%rbp
  and    %rdi,%rbx
  and    %rdi,%rdx
  neg    %r10
  and    %r10,%r13
  and    %r10,%rcx
  and    $0x3ffffff,%ebp
  or     %rcx,%rbp
  and    %r10,%rsi
  and    $0x3ffffff,%ebx
  or     %rsi,%rbx
  and    %r10,%r8
  and    $0x3ffffff,%edx
  or     %r8,%rdx
  and    %r9,%r10
  and    $0x3ffffff,%r11d
  mov    %r11,%r12
  or     %r13,%r12
  mov    %rbp,%rcx
  shl    $0x1a,%rcx
  or     %rcx,%r12
  shr    $0x6,%rbp
  mov    %rbx,%rcx
  shl    $0x14,%rcx
  or     %rcx,%rbp
  shr    $0xc,%rbx
  mov    %rdx,%rcx
  shl    $0xe,%rcx
  or     %rcx,%rbx
  and    %rdi,%rax
  mov    %rax,%r13
  or     %r10,%r13
  shl    $0x8,%r13
  shr    $0x12,%rdx
  or     %rdx,%r13
  mov    0x68(%rsp),%r15
  lea    0x10(%r15),%rdi
  call   <unpack@plt>
  mov    %r12d,%r12d
  add    %rax,%r12
  lea    0x14(%r15),%rdi
  call   <unpack@plt>
  mov    %rax,%rdx
  mov    %r12,%rax
  shr    $0x20,%rax
  mov    %ebp,%ebp
  add    %rdx,%rbp
  add    %rax,%rbp
  lea    0x18(%r15),%rdi
  call   <unpack@plt>
  mov    %rax,%rdx
  mov    %rbp,%rax
  shr    $0x20,%rax
  mov    %ebx,%ebx
  add    %rdx,%rbx
  add    %rax,%rbx
  lea    0x1c(%r15),%rdi
  call   <unpack@plt>
  mov    %rax,%rdx
  mov    %rbx,%rax
  shr    $0x20,%rax
  mov    %r13d,%r13d
  add    %rdx,%r13
  add    %rax,%r13
  mov    %r12,%rsi
  mov    0x60(%rsp),%r14
  mov    %r14,%rdi
  call   <pack@plt>
  lea    0x4(%r14),%rdi
  mov    %rbp,%rsi
  call   <pack@plt>
  lea    0x8(%r14),%rdi
  mov    %rbx,%rsi
  call   <pack@plt>
  lea    0xc(%r14),%rdi
  mov    %r13,%rsi
  call   <pack@plt>
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L2
  mov    $0x0,%eax
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L0:
  movq   $0x0,0x18(%rsp)
  mov    $0x0,%edi
  movq   $0x0,0x10(%rsp)
  mov    $0x0,%r12d
  mov    $0x0,%ebp
  jmp    L4
L2:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int crypto_onetimeauth_poly1305_tinynacl(unsigned char *o, const unsigned char *m, unsigned long long n, const unsigned char *k) {
  unsigned long h0, h1, h2, h3, h4;
  unsigned long r0, r1, r2, r3, r4;
  unsigned long s1, s2, s3, s4;
  unsigned long long d0, d1, d2, d3, d4;
  unsigned long c, mask;
  unsigned long long f;
  long long i;
  r0 = (unpack(k + 0)) & 0x3ffffff;
  r1 = (unpack(k + 3) >> 2) & 0x3ffff03;
  r2 = (unpack(k + 6) >> 4) & 0x3ffc0ff;
  r3 = (unpack(k + 9) >> 6) & 0x3f03fff;
  r4 = (unpack(k + 12) >> 8) & 0x00fffff;
  s1 = r1 * 5;
  s2 = r2 * 5;
  s3 = r3 * 5;
  s4 = r4 * 5;
  h0 = h1 = h2 = h3 = h4 = 0;
  while ((long long)n > 0) {
    if (n >= 16) {
      h0 += (unpack(m)) & 0x3ffffff;
      h1 += (unpack(m + 3) >> 2) & 0x3ffffff;
      h2 += (unpack(m + 6) >> 4) & 0x3ffffff;
      h3 += (unpack(m + 9) >> 6) & 0x3ffffff;
      h4 += (unpack(m + 12) >> 8) | 16777216;
    } else {
      unsigned char mm[16];
      for (i = 0; i < 16; ++i)
        mm[i] = 0;
      for (i = 0; i < n; ++i)
        mm[i] = m[i];
      mm[i] = 1;
      h0 += (unpack(mm)) & 0x3ffffff;
      h1 += (unpack(mm + 3) >> 2) & 0x3ffffff;
      h2 += (unpack(mm + 6) >> 4) & 0x3ffffff;
      h3 += (unpack(mm + 9) >> 6) & 0x3ffffff;
      h4 += (unpack(mm + 12) >> 8);
    }
    d0 = ((unsigned long long)h0 * r0) + ((unsigned long long)h1 * s4) + ((unsigned long long)h2 * s3) + ((unsigned long long)h3 * s2) + ((unsigned long long)h4 * s1);
    d1 = ((unsigned long long)h0 * r1) + ((unsigned long long)h1 * r0) + ((unsigned long long)h2 * s4) + ((unsigned long long)h3 * s3) + ((unsigned long long)h4 * s2);
    d2 = ((unsigned long long)h0 * r2) + ((unsigned long long)h1 * r1) + ((unsigned long long)h2 * r0) + ((unsigned long long)h3 * s4) + ((unsigned long long)h4 * s3);
    d3 = ((unsigned long long)h0 * r3) + ((unsigned long long)h1 * r2) + ((unsigned long long)h2 * r1) + ((unsigned long long)h3 * r0) + ((unsigned long long)h4 * s4);
    d4 = ((unsigned long long)h0 * r4) + ((unsigned long long)h1 * r3) + ((unsigned long long)h2 * r2) + ((unsigned long long)h3 * r1) + ((unsigned long long)h4 * r0);
    c = (unsigned long)(d0 >> 26);
    h0 = (unsigned long)d0 & 0x3ffffff;
    d1 += c;
    c = (unsigned long)(d1 >> 26);
    h1 = (unsigned long)d1 & 0x3ffffff;
    d2 += c;
    c = (unsigned long)(d2 >> 26);
    h2 = (unsigned long)d2 & 0x3ffffff;
    d3 += c;
    c = (unsigned long)(d3 >> 26);
    h3 = (unsigned long)d3 & 0x3ffffff;
    d4 += c;
    c = (unsigned long)(d4 >> 26);
    h4 = (unsigned long)d4 & 0x3ffffff;
    h0 += c * 5;
    c = (h0 >> 26);
    h0 = h0 & 0x3ffffff;
    h1 += c;
    m += 16;
    n -= 16;
  }
  c = h1 >> 26;
  h1 = h1 & 0x3ffffff;
  h2 += c;
  c = h2 >> 26;
  h2 = h2 & 0x3ffffff;
  h3 += c;
  c = h3 >> 26;
  h3 = h3 & 0x3ffffff;
  h4 += c;
  c = h4 >> 26;
  h4 = h4 & 0x3ffffff;
  h0 += c * 5;
  c = h0 >> 26;
  h0 = h0 & 0x3ffffff;
  h1 += c;
  r0 = h0 + 5;
  c = r0 >> 26;
  r0 &= 0x3ffffff;
  r1 = h1 + c;
  c = r1 >> 26;
  r1 &= 0x3ffffff;
  r2 = h2 + c;
  c = r2 >> 26;
  r2 &= 0x3ffffff;
  r3 = h3 + c;
  c = r3 >> 26;
  r3 &= 0x3ffffff;
  r4 = h4 + c - (1 << 26);
  mask = (r4 >> ((sizeof(unsigned long) * 8) - 1)) - 1;
  r0 &= mask;
  r1 &= mask;
  r2 &= mask;
  r3 &= mask;
  r4 &= mask;
  mask = ~mask;
  h0 = (h0 & mask) | r0;
  h1 = (h1 & mask) | r1;
  h2 = (h2 & mask) | r2;
  h3 = (h3 & mask) | r3;
  h4 = (h4 & mask) | r4;
  h0 = ((h0) | (h1 << 26)) & 0xffffffff;
  h1 = ((h1 >> 6) | (h2 << 20)) & 0xffffffff;
  h2 = ((h2 >> 12) | (h3 << 14)) & 0xffffffff;
  h3 = ((h3 >> 18) | (h4 << 8)) & 0xffffffff;
  f = (unsigned long long)h0 + unpack(k + 16);
  h0 = (unsigned long)f;
  f = (unsigned long long)h1 + unpack(k + 20) + (f >> 32);
  h1 = (unsigned long)f;
  f = (unsigned long long)h2 + unpack(k + 24) + (f >> 32);
  h2 = (unsigned long)f;
  f = (unsigned long long)h3 + unpack(k + 28) + (f >> 32);
  h3 = (unsigned long)f;
  pack(o + 0, h0);
  pack(o + 4, h1);
  pack(o + 8, h2);
  pack(o + 12, h3);
  return 0;
}
```