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

```asm
<crypto_onetimeauth_poly1305_tinynacl>:
  endbr64
  push   %r15
  push   %r14
  mov    %rsi,%r14
  push   %r13
  xor    %r13d,%r13d
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rcx,%rbx
  sub    $0x98,%rsp
  mov    %rdx,0x18(%rsp)
  mov    %rcx,0x68(%rsp)
  mov    %rdi,0x60(%rsp)
  mov    %rcx,%rdi
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  call   <unpack@plt>
  lea    0x3(%rbx),%rdi
  and    $0x3ffffff,%eax
  mov    %rax,0x28(%rsp)
  call   <unpack@plt>
  lea    0x6(%rbx),%rdi
  shr    $0x2,%rax
  mov    %rax,%rcx
  and    $0x3ffff03,%ecx
  mov    %rcx,0x20(%rsp)
  call   <unpack@plt>
  lea    0x9(%rbx),%rdi
  shr    $0x4,%rax
  and    $0x3ffc0ff,%eax
  mov    %rax,%r15
  mov    %rax,0x8(%rsp)
  call   <unpack@plt>
  lea    0xc(%rbx),%rdi
  shr    $0x6,%rax
  and    $0x3f03fff,%eax
  mov    %rax,%rbp
  mov    %rax,0x10(%rsp)
  call   <unpack@plt>
  lea    (%r15,%r15,4),%rcx
  mov    0x18(%rsp),%r9
  shr    $0x8,%rax
  mov    %rcx,0x50(%rsp)
  lea    0x0(%rbp,%rbp,4),%rcx
  and    $0xfffff,%eax
  mov    %rcx,0x58(%rsp)
  mov    %rax,0x48(%rsp)
  lea    (%rax,%rax,4),%r10
  test   %r9,%r9
  jle    L63
  lea    0x70(%rsp),%rax
  mov    0x28(%rsp),%r8
  xor    %r12d,%r12d
  xor    %ebp,%ebp
  mov    %rax,0x18(%rsp)
  mov    0x20(%rsp),%rcx
  xor    %ebx,%ebx
  xor    %r15d,%r15d
  jmp    L47
L0:
  mov    %r14,%rdi
  mov    %r9,0x38(%rsp)
  mov    %rcx,0x30(%rsp)
  mov    %r8,0x28(%rsp)
  call   <unpack@plt>
  lea    0x3(%r14),%rdi
  and    $0x3ffffff,%eax
  add    %rax,%r15
  call   <unpack@plt>
  lea    0x6(%r14),%rdi
  shr    $0x2,%rax
  mov    %rax,%rdx
  and    $0x3ffffff,%edx
  add    %rbx,%rdx
  mov    %rdx,0x20(%rsp)
  call   <unpack@plt>
  lea    0x9(%r14),%rdi
  shr    $0x4,%rax
  mov    %rax,%rbx
  call   <unpack@plt>
  and    $0x3ffffff,%ebx
  lea    0xc(%r14),%rdi
  shr    $0x6,%rax
  add    %rbp,%rbx
  mov    %rax,%rbp
  call   <unpack@plt>
  and    $0x3ffffff,%ebp
  mov    0x20(%rsp),%rdx
  mov    0x28(%rsp),%r8
  shr    $0x8,%rax
  mov    0x30(%rsp),%rcx
  mov    0x38(%rsp),%r9
  add    %r12,%rbp
  mov    %rax,%rsi
  mov    0x40(%rsp),%r10
  or     $0x1000000,%rsi
  add    %r13,%rsi
L27:
  mov    %r15,%rax
  mov    %rdx,%rdi
  mov    0x50(%rsp),%r12
  mov    0x58(%rsp),%r13
  imul   %r8,%rax
  mov    %rdx,%r11
  imul   %r10,%rdi
  imul   %r8,%r11
  add    %rax,%rdi
  mov    %r12,%rax
  imul   %rbp,%rax
  add    %rdi,%rax
  mov    %r13,%rdi
  imul   %rbx,%rdi
  add    %rdi,%rax
  mov    %rsi,%rdi
  imul   %rcx,%rdi
  lea    (%rdi,%rdi,4),%rdi
  add    %rdi,%rax
  mov    %r15,%rdi
  imul   %rcx,%rdi
  add    %rdi,%r11
  mov    %r13,%rdi
  imul   %rbp,%rdi
  imul   %rsi,%r13
  add    %r11,%rdi
  mov    %rbx,%r11
  imul   %r10,%r11
  add    %rdi,%r11
  mov    %r12,%rdi
  mov    0x8(%rsp),%r12
  imul   %rsi,%rdi
  imul   %r15,%r12
  add    %rdi,%r11
  mov    %rdx,%rdi
  imul   %rcx,%rdi
  add    %r12,%rdi
  mov    %rbp,%r12
  imul   %r10,%r12
  add    %rdi,%r12
  mov    %rbx,%rdi
  imul   %r8,%rdi
  add    %r12,%rdi
  mov    0x10(%rsp),%r12
  add    %r13,%rdi
  mov    0x8(%rsp),%r13
  imul   %r15,%r12
  imul   %rdx,%r13
  add    %r12,%r13
  mov    %rbp,%r12
  imul   %r8,%r12
  add    %r13,%r12
  mov    %rbx,%r13
  imul   %rcx,%r13
  add    $0x10,%r14
  imul   0x48(%rsp),%r15
  imul   0x10(%rsp),%rdx
  imul   %rcx,%rbp
  add    %r12,%r13
  mov    %rsi,%r12
  imul   %r10,%r12
  add    %r15,%rdx
  imul   0x8(%rsp),%rbx
  add    %rdx,%rbp
  imul   %r8,%rsi
  mov    %rax,%rdx
  shr    $0x1a,%rax
  add    %r11,%rax
  add    %r13,%r12
  and    $0x3ffffff,%edx
  mov    %rax,%r11
  shr    $0x1a,%rax
  add    %rbp,%rbx
  add    %rdi,%rax
  add    %rbx,%rsi
  and    $0x3ffffff,%r11d
  mov    %rax,%rbp
  shr    $0x1a,%rax
  add    %r12,%rax
  and    $0x3ffffff,%ebp
  mov    %rax,%r12
  shr    $0x1a,%rax
  add    %rsi,%rax
  and    $0x3ffffff,%r12d
  mov    %rax,%r13
  shr    $0x1a,%rax
  lea    (%rax,%rax,4),%rbx
  and    $0x3ffffff,%r13d
  add    %rdx,%rbx
  mov    %rbx,%r15
  shr    $0x1a,%rbx
  and    $0x3ffffff,%r15d
  add    %r11,%rbx
  sub    $0x10,%r9
  test   %r9,%r9
  jle    L25
L47:
  mov    %r10,0x40(%rsp)
  cmp    $0xf,%r9
  ja     L0
  mov    0x18(%rsp),%rax
  pxor   %xmm0,%xmm0
  mov    %r14,%rsi
  mov    %r9,%rdx
  mov    %rcx,0x38(%rsp)
  movaps %xmm0,(%rax)
  mov    %rax,%rdi
  mov    %r8,0x30(%rsp)
  mov    %r9,0x20(%rsp)
  call   <memcpy@plt>
  mov    0x20(%rsp),%r9
  mov    0x18(%rsp),%rdi
  movb   $0x1,0x70(%rsp,%r9,1)
  mov    %r9,0x28(%rsp)
  call   <unpack@plt>
  lea    0x73(%rsp),%rdi
  and    $0x3ffffff,%eax
  add    %rax,%r15
  call   <unpack@plt>
  lea    0x76(%rsp),%rdi
  shr    $0x2,%rax
  mov    %rax,%rdx
  and    $0x3ffffff,%edx
  add    %rbx,%rdx
  mov    %rdx,0x20(%rsp)
  call   <unpack@plt>
  lea    0x79(%rsp),%rdi
  shr    $0x4,%rax
  mov    %rax,%rbx
  call   <unpack@plt>
  and    $0x3ffffff,%ebx
  lea    0x7c(%rsp),%rdi
  shr    $0x6,%rax
  add    %rbp,%rbx
  mov    %rax,%rbp
  call   <unpack@plt>
  and    $0x3ffffff,%ebp
  mov    0x40(%rsp),%r10
  mov    0x38(%rsp),%rcx
  shr    $0x8,%rax
  mov    0x30(%rsp),%r8
  mov    0x28(%rsp),%r9
  add    %r12,%rbp
  mov    0x20(%rsp),%rdx
  lea    (%rax,%r13,1),%rsi
  jmp    L27
  nopl   0x0(%rax,%rax,1)
L25:
  mov    %rbx,%rax
  and    $0x3ffffff,%ebx
  shr    $0x1a,%rax
  add    %rbp,%rax
  mov    %rax,%rbp
  and    $0x3ffffff,%eax
  shr    $0x1a,%rbp
  add    %r12,%rbp
  mov    %rax,%r12
  mov    %rbp,%rsi
  and    $0x3ffffff,%ebp
  shr    $0x1a,%rsi
  add    %r13,%rsi
  mov    %rsi,%rax
  mov    %rsi,%r8
  or     $0xfffffffffc000000,%rsi
  shr    $0x1a,%rax
  and    $0x3ffffff,%r8d
  lea    (%rax,%rax,4),%r11
  add    %r15,%r11
  mov    %r11,%rax
  and    $0x3ffffff,%r11d
  lea    0x5(%r11),%rdi
  shr    $0x1a,%rax
  add    %rbx,%rax
  mov    %rdi,%rbx
  shr    $0x1a,%rbx
  add    %rax,%rbx
  mov    %rbx,%rdx
  shr    $0x1a,%rdx
  add    %r12,%rdx
  mov    %rdx,%rcx
  shr    $0x1a,%rcx
  add    %rbp,%rcx
  mov    %rcx,%r9
  shr    $0x1a,%r9
  add    %r9,%rsi
  mov    %rsi,%r9
  mov    %rsi,%r10
  shr    $0x3f,%r9
  sar    $0x3f,%r10
  sub    $0x1,%r9
  and    %r10,%rax
  and    %r9,%rbx
  and    %r9,%rdx
  and    $0x3ffffff,%ebx
  or     %rbx,%rax
  and    $0x3ffffff,%edx
  and    %r9,%rcx
  and    %r10,%rbp
  and    %r9,%rdi
  and    $0x3ffffff,%ecx
  and    %r10,%r12
  and    %r10,%r11
  or     %rbp,%rcx
  mov    %rdi,%rbp
  mov    %rax,%rdi
  or     %r12,%rdx
  and    $0x3ffffff,%ebp
  shl    $0x1a,%rdi
  and    %r10,%r8
  and    %r9,%rsi
  or     %r11,%rbp
  shr    $0x6,%rax
  mov    %r8,%r13
  or     %rdi,%rbp
  mov    %rdx,%rdi
  or     %rsi,%r13
  shr    $0xc,%rdx
  shl    $0x14,%rdi
  shl    $0x8,%r13
  mov    %ebp,%ebp
  or     %rdi,%rax
  mov    %eax,%r12d
  mov    %rcx,%rax
  shr    $0x12,%rcx
  shl    $0xe,%rax
  or     %r13,%rcx
  or     %rax,%rdx
  mov    %ecx,%r13d
  mov    %edx,%r14d
L38:
  mov    0x68(%rsp),%rbx
  lea    0x10(%rbx),%rdi
  call   <unpack@plt>
  lea    0x14(%rbx),%rdi
  add    %rax,%rbp
  call   <unpack@plt>
  mov    %rbp,%rdx
  lea    0x18(%rbx),%rdi
  shr    $0x20,%rdx
  add    %rax,%r12
  add    %rdx,%r12
  call   <unpack@plt>
  mov    %r12,%rdx
  lea    0x1c(%rbx),%rdi
  shr    $0x20,%rdx
  add    %rax,%r14
  add    %rdx,%r14
  call   <unpack@plt>
  mov    0x60(%rsp),%rbx
  mov    %r14,%rdx
  mov    %rbp,%rsi
  shr    $0x20,%rdx
  add    %rax,%r13
  mov    %rbx,%rdi
  add    %rdx,%r13
  call   <pack@plt>
  lea    0x4(%rbx),%rdi
  mov    %r12,%rsi
  call   <pack@plt>
  lea    0x8(%rbx),%rdi
  mov    %r14,%rsi
  call   <pack@plt>
  lea    0xc(%rbx),%rdi
  mov    %r13,%rsi
  call   <pack@plt>
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L49
  add    $0x98,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L63:
  xor    %r14d,%r14d
  xor    %r12d,%r12d
  xor    %ebp,%ebp
  jmp    L38
L49:
  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;
}
```