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

```asm
<CI_Keyed_Update>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  mov    %ecx,%r13d
  push   %r12
  mov    %rdx,%r12
  push   %rbp
  push   %rbx
  mov    $0x40,%ebx
  sub    $0x258,%rsp
  mov    0x298(%rsp),%r15
  mov    0x2a8(%rsp),%rax
  mov    %r9d,0x28(%rsp)
  lea    0x140(%rsp),%rbp
  mov    %esi,0x4(%rsp)
  mov    0x290(%rsp),%edx
  mov    %rdi,%rsi
  mov    %rbp,%rdi
  mov    %r8d,0x2c(%rsp)
  mov    %r15,0x18(%rsp)
  mov    %rax,0x10(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x248(%rsp)
  mov    0x2a0(%rsp),%eax
  mov    %eax,0x38(%rsp)
  call   <memcpy@plt>
  movslq 0x290(%rsp),%rax
  sub    0x290(%rsp),%ebx
  xor    %esi,%esi
  mov    %ebx,%edx
  lea    0x0(%rbp,%rax,4),%r14
  mov    %r14,%rdi
  call   <memset@plt>
  lea    0x38(%rsp),%rdx
  sub    $0x8,%rsp
  mov    $0x4,%r9d
  mov    %rdx,0x28(%rsp)
  lea    0x48(%rsp),%rax
  mov    $0x8,%ecx
  mov    %r15,%rdi
  mov    %rax,0x10(%rsp)
  mov    $0x10,%esi
  push   %rax
  push   $0x10
  push   %r15
  lea    0x4c(%rsp),%r8
  call   <__Hash4@plt>
  mov    0x2b0(%rsp),%edx
  add    $0x20,%rsp
  test   %edx,%edx
  jle    L59
  mov    0x290(%rsp),%edi
  lea    0x144(%rsp),%r15
  mov    0x8(%rsp),%rdx
  mov    %rbp,%rax
  lea    -0x1(%rdi),%ecx
  mov    %rcx,%r11
  lea    (%r15,%rcx,4),%rsi
  nopl   0x0(%rax)
L84:
  mov    (%rdx),%ecx
  xor    %ecx,(%rax)
  add    $0x4,%rax
  add    $0x4,%rdx
  cmp    %rsi,%rax
  jne    L84
  mov    0x2c(%rsp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,0x3c(%rsp)
  cmp    %edx,0x28(%rsp)
  jl     L75
L54:
  lea    0x3c(%rsp),%r15
  mov    %r15,%rax
  mov    %r13d,%r15d
  mov    %r12,%r13
  mov    %rbp,%r12
  mov    %rax,%rbp
  nopw   0x0(%rax,%rax,1)
L45:
  mov    0x4(%rsp),%esi
  mov    %r12,%r9
  mov    %r15d,%r8d
  mov    %r13,%rcx
  mov    %r12,%rdi
  call   <Flap@plt>
  mov    %r12,%r8
  mov    $0x40,%ecx
  mov    %r12,%rdx
  mov    $0x1,%esi
  mov    %rbp,%rdi
  call   <__Hash2@plt>
  mov    %ebx,%edx
  xor    %esi,%esi
  mov    %r14,%rdi
  call   <memset@plt>
  mov    0x3c(%rsp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,0x3c(%rsp)
  cmp    0x28(%rsp),%edx
  jle    L45
  sub    $0x8,%rsp
  mov    $0x4,%r9d
  mov    $0x8,%ecx
  mov    %r12,%rbp
  push   0x10(%rsp)
  mov    $0x10,%esi
  push   $0x10
  mov    0x30(%rsp),%rdi
  push   %rdi
  mov    0x40(%rsp),%rdx
  lea    0x48(%rsp),%r8
  call   <__Hash4@plt>
  mov    0x2b0(%rsp),%eax
  add    $0x20,%rsp
  test   %eax,%eax
  jle    L24
  mov    0x290(%rsp),%eax
  lea    0x144(%rsp),%r15
  lea    -0x1(%rax),%r11d
L26:
  mov    %r11d,%ecx
  mov    0x8(%rsp),%rdx
  mov    %rbp,%rax
  lea    (%r15,%rcx,4),%rsi
  nopl   (%rax)
L23:
  mov    (%rdx),%ecx
  xor    %ecx,(%rax)
  add    $0x4,%rax
  add    $0x4,%rdx
  cmp    %rsi,%rax
  jne    L23
L24:
  mov    0x290(%rsp),%edx
  mov    0x10(%rsp),%rdi
  mov    %rbp,%rsi
  call   <memcpy@plt>
  mov    0x248(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L71
  add    $0x258,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  xchg   %ax,%ax
L59:
  mov    0x2c(%rsp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,0x3c(%rsp)
  cmp    0x28(%rsp),%edx
  jle    L54
  sub    $0x8,%rsp
  mov    $0x4,%r9d
  mov    $0x8,%ecx
  mov    $0x10,%esi
  push   0x10(%rsp)
  push   $0x10
  mov    0x30(%rsp),%rdi
  push   %rdi
  mov    0x40(%rsp),%rdx
  lea    0x48(%rsp),%r8
  call   <__Hash4@plt>
  add    $0x20,%rsp
  jmp    L24
  nopl   (%rax)
L75:
  mov    %r11d,0x4(%rsp)
  sub    $0x8,%rsp
  mov    $0x4,%r9d
  mov    $0x8,%ecx
  push   0x10(%rsp)
  mov    $0x10,%esi
  push   $0x10
  mov    0x30(%rsp),%rdi
  push   %rdi
  mov    0x40(%rsp),%rdx
  lea    0x48(%rsp),%r8
  call   <__Hash4@plt>
  add    $0x20,%rsp
  mov    0x4(%rsp),%r11d
  jmp    L26
L71:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void CI_Keyed_Update(const uint8_t *old_hash, const uint8_t lambda, const uint8_t *salt, const uint8_t saltlen, const uint8_t old_garlic, const uint8_t new_garlic, const uint8_t hashlen, const uint8_t *key, const uint64_t uuid, uint8_t *new_hash) {
  uint8_t keystream[64];
  uint64_t tmp = (uuid);
  uint8_t c;
  uint8_t x[64];
  memcpy(x, old_hash, hashlen);
  memset(x + hashlen, 0, 64 - hashlen);
  __Hash4(key, 16, (uint8_t *)&tmp, 8, &old_garlic, sizeof(uint8_t), key, 16, keystream);
  for (int i = 0; i < hashlen; i++)
    x[i] ^= keystream[i];
  for (c = old_garlic + 1; c <= new_garlic; c++) {
    Flap(x, lambda, c, salt, saltlen, x);
    __Hash2(&c, 1, x, 64, x);
    memset(x + hashlen, 0, 64 - hashlen);
  }
  __Hash4(key, 16, (uint8_t *)&tmp, 8, &new_garlic, sizeof(uint8_t), key, 16, keystream);
  for (int i = 0; i < hashlen; i++)
    x[i] ^= keystream[i];
  memcpy(new_hash, x, hashlen);
}
```