user: 请将以下的汇编代码转换成C语言代码:

```asm
<ece_decrypt_record>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    %rdx,-0x78(%rbp)
  mov    %rcx,-0x80(%rbp)
  mov    %r8,-0x88(%rbp)
  mov    %r9,-0x90(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0xffffffff,-0x5c(%rbp)
  mov    $0x0,%eax
  call   <EVP_aes_128_gcm@plt>
  mov    %eax,%esi
  mov    -0x78(%rbp),%rcx
  mov    -0x70(%rbp),%rdx
  mov    -0x68(%rbp),%rax
  mov    %rcx,%r8
  mov    %rdx,%rcx
  mov    $0x0,%edx
  mov    %rax,%rdi
  call   <EVP_DecryptInit_ex@plt>
  cmp    $0x1,%eax
  je     L26
  mov    $0xfffffffa,%eax
  jmp    L49
L26:
  cmpq   $0x10,-0x88(%rbp)
  seta   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x88(%rbp),%rax
  sub    $0x10,%rax
  mov    %rax,-0x58(%rbp)
  mov    -0x58(%rbp),%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x80(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  lea    -0x50(%rbp),%rax
  mov    $0x10,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    D6(%rip),%rax
  mov    (%rax),%esi
  lea    -0x50(%rbp),%rdx
  mov    -0x68(%rbp),%rax
  mov    %rdx,%rcx
  mov    $0x10,%edx
  mov    %rax,%rdi
  call   <EVP_CIPHER_CTX_ctrl@plt>
  cmp    $0x1,%eax
  je     L88
  mov    $0xfffffffa,%eax
  jmp    L49
L88:
  mov    D16(%rip),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x58(%rbp)
  ja     L29
  mov    -0x58(%rbp),%rax
  mov    %eax,%edi
  mov    -0x80(%rbp),%rcx
  lea    -0x5c(%rbp),%rdx
  mov    -0x90(%rbp),%rsi
  mov    -0x68(%rbp),%rax
  mov    %edi,%r8d
  mov    %rax,%rdi
  call   <EVP_DecryptUpdate@plt>
  cmp    $0x1,%eax
  je     L109
L29:
  mov    $0xfffffffa,%eax
  jmp    L49
L109:
  mov    -0x68(%rbp),%rax
  mov    %rax,%rdi
  call   <EVP_CIPHER_CTX_block_size@plt>
  cmp    $0x1,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x5c(%rbp),%rdx
  mov    -0x68(%rbp),%rax
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <EVP_DecryptFinal_ex@plt>
  cmp    $0x1,%eax
  je     L59
  mov    $0xfffffffa,%eax
  jmp    L49
L59:
  mov    -0x68(%rbp),%rax
  mov    %rax,%rdi
  call   <EVP_CIPHER_CTX_reset@plt>
  cmp    $0x1,%eax
  je     L6
  mov    $0xfffffffa,%eax
  jmp    L49
L6:
  mov    $0x0,%eax
L49:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L95
  call   <__stack_chk_fail@plt>
L95:
  leave
  ret
```

assistant: ```c
int ece_decrypt_record(EVP_CIPHER_CTX *ctx, const uint8_t *key, const uint8_t *iv, const uint8_t *record, size_t recordLen, uint8_t *block) {
  int chunkLen = -1;
  if (EVP_DecryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, key, iv) != 1) {
    return -6;
  }
  assert(recordLen > 16);
  size_t blockLen = recordLen - 16;
  uint8_t tag[16];
  memcpy(tag, &record[blockLen], 16);
  if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, 16, tag) != 1) {
    return -6;
  }
  if (blockLen > INT_MAX || EVP_DecryptUpdate(ctx, block, &chunkLen, record, (int)blockLen) != 1) {
    return -6;
  }
  assert(EVP_CIPHER_CTX_block_size(ctx) == 1);
  if (EVP_DecryptFinal_ex(ctx, NULL, &chunkLen) != 1) {
    return -6;
  }
  if (EVP_CIPHER_CTX_reset(ctx) != 1) {
    return -6;
  }
  return 0;
}
```