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

```asm
<aes256gcmdecrypt>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x190,%rsp
  mov    %rdi,-0x168(%rbp)
  mov    %rsi,-0x170(%rbp)
  mov    %rdx,-0x178(%rbp)
  mov    %rcx,-0x180(%rbp)
  mov    %r8,-0x188(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  cmpq   $0xf,-0x178(%rbp)
  ja     L54
  mov    $0xffffffff,%eax
  jmp    L61
L54:
  lea    -0x60(%rbp),%rax
  mov    $0x10,%esi
  mov    %rax,%rdi
  call   <bzero@plt>
  mov    -0x180(%rbp),%rcx
  lea    -0x40(%rbp),%rax
  mov    $0xc,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  movb   $0x0,-0x34(%rbp)
  movb   $0x0,-0x33(%rbp)
  movb   $0x0,-0x32(%rbp)
  movb   $0x1,-0x31(%rbp)
  mov    -0x188(%rbp),%rdx
  lea    -0x150(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <aeskey@plt>
  lea    -0x150(%rbp),%rdx
  lea    -0x60(%rbp),%rcx
  lea    -0x50(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <aescrypt@plt>
  lea    -0x150(%rbp),%rdx
  lea    -0x40(%rbp),%rcx
  lea    -0x30(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <aescrypt@plt>
  mov    -0x178(%rbp),%rax
  lea    -0x10(%rax),%rdi
  mov    -0x170(%rbp),%rax
  lea    0x10(%rax),%rsi
  lea    -0x30(%rbp),%rcx
  lea    -0x50(%rbp),%rdx
  lea    -0x20(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdx,%rcx
  mov    %rdi,%rdx
  mov    %rax,%rdi
  call   <crypto_ghash@plt>
  mov    -0x170(%rbp),%rdx
  lea    -0x20(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <verify16@plt>
  test   %rax,%rax
  je     L16
  lea    -0x50(%rbp),%rax
  mov    $0x10,%esi
  mov    %rax,%rdi
  call   <bzero@plt>
  movl   $0x0,-0x158(%rbp)
  jmp    L8
L68:
  mov    -0x158(%rbp),%eax
  cltq
  movl   $0x0,-0x150(%rbp,%rax,4)
  addl   $0x1,-0x158(%rbp)
L8:
  cmpl   $0x3b,-0x158(%rbp)
  jle    L68
  mov    $0xffffffff,%eax
  jmp    L61
L16:
  lea    -0x40(%rbp),%rdi
  mov    -0x188(%rbp),%rcx
  mov    -0x178(%rbp),%rdx
  mov    -0x170(%rbp),%rsi
  mov    -0x168(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <aes256ctr@plt>
  mov    -0x168(%rbp),%rax
  mov    $0x10,%esi
  mov    %rax,%rdi
  call   <bzero@plt>
  lea    -0x50(%rbp),%rax
  mov    $0x10,%esi
  mov    %rax,%rdi
  call   <bzero@plt>
  movl   $0x0,-0x154(%rbp)
  jmp    L78
L1:
  mov    -0x154(%rbp),%eax
  cltq
  movl   $0x0,-0x150(%rbp,%rax,4)
  addl   $0x1,-0x154(%rbp)
L78:
  cmpl   $0x3b,-0x154(%rbp)
  jle    L1
  mov    $0x0,%eax
L61:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L0
  call   <__stack_chk_fail@plt>
L0:
  leave
  ret
```

assistant: ```c
extern int aes256gcmdecrypt(unsigned char *m, unsigned char *c, unsigned long long clen, unsigned char *nonce, unsigned char *key) {
  unsigned char zeros[16];
  unsigned char h[16];
  unsigned int space[60];
  unsigned char j0[16];
  unsigned char tagkey[16];
  unsigned char tag[16];
  if (clen < 16)
    return -1;
  bzero(zeros, 16);
  memcpy(j0, nonce, 12);
  j0[12] = 0;
  j0[13] = 0;
  j0[14] = 0;
  j0[15] = 1;
  aeskey(space, key);
  aescrypt(h, zeros, space);
  aescrypt(tagkey, j0, space);
  crypto_ghash(tag, c + 16, clen - 16, h, tagkey);
  if (verify16(tag, c)) {
    bzero(h, 16);
    for (int i = 0; i < 60; i++) {
      space[i] = 0;
    }
    return -1;
  }
  aes256ctr(m, c, clen, key, j0);
  bzero(m, 16);
  bzero(h, 16);
  for (int i = 0; i < 60; i++) {
    space[i] = 0;
  }
  return 0;
}
```