user: 请从给定的汇编指令推导出C源代码:

```asm
<CI_Keyed_Update>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x248,%rsp
  mov    %esi,%r12d
  mov    %rdx,%r13
  mov    %ecx,%r14d
  mov    %r8d,0x1c(%rsp)
  mov    %r9d,0x18(%rsp)
  mov    0x288(%rsp),%rax
  mov    %rax,0x8(%rsp)
  mov    0x298(%rsp),%rbx
  mov    %rbx,0x10(%rsp)
  mov    %fs:0x28,%rdx
  mov    %rdx,0x238(%rsp)
  xor    %edx,%edx
  mov    0x290(%rsp),%edx
  mov    %edx,0x28(%rsp)
  lea    0x130(%rsp),%rbx
  mov    0x280(%rsp),%edx
  mov    %rdi,%rsi
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    $0x40,%ebp
  sub    0x280(%rsp),%ebp
  movslq 0x280(%rsp),%rax
  lea    (%rbx,%rax,4),%r15
  mov    %ebp,%edx
  mov    $0x0,%esi
  mov    %r15,%rdi
  call   <memset@plt>
  lea    0x28(%rsp),%rdx
  sub    $0x8,%rsp
  lea    0x38(%rsp),%rax
  push   %rax
  push   $0x10
  mov    0x20(%rsp),%rdi
  push   %rdi
  mov    $0x4,%r9d
  lea    0x3c(%rsp),%r8
  mov    $0x8,%ecx
  mov    $0x10,%esi
  call   <__Hash4@plt>
  add    $0x20,%rsp
  cmpl   $0x0,0x280(%rsp)
  jle    L28
  mov    %rbx,%rax
  lea    0x30(%rsp),%rdx
  mov    0x280(%rsp),%ebx
  lea    -0x1(%rbx),%ecx
  lea    0x134(%rsp,%rcx,4),%rsi
L48:
  mov    (%rdx),%ecx
  xor    %ecx,(%rax)
  add    $0x4,%rax
  add    $0x4,%rdx
  cmp    %rsi,%rax
  jne    L48
  mov    0x1c(%rsp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,0x2c(%rsp)
  cmp    0x18(%rsp),%edx
  jg     L71
L95:
  lea    0x130(%rsp),%rbx
L8:
  mov    %rbx,%r9
  mov    %r14d,%r8d
  mov    %r13,%rcx
  mov    %r12d,%esi
  mov    %rbx,%rdi
  call   <Flap@plt>
  lea    0x2c(%rsp),%rdi
  mov    %rbx,%r8
  mov    $0x40,%ecx
  mov    %rbx,%rdx
  mov    $0x1,%esi
  call   <__Hash2@plt>
  mov    %ebp,%edx
  mov    $0x0,%esi
  mov    %r15,%rdi
  call   <memset@plt>
  mov    0x2c(%rsp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,0x2c(%rsp)
  cmp    0x18(%rsp),%edx
  jle    L8
  lea    0x28(%rsp),%rdx
  sub    $0x8,%rsp
  lea    0x38(%rsp),%rax
  push   %rax
  push   $0x10
  mov    0x20(%rsp),%rdi
  push   %rdi
  mov    $0x4,%r9d
  lea    0x38(%rsp),%r8
  mov    $0x8,%ecx
  mov    $0x10,%esi
  call   <__Hash4@plt>
  add    $0x20,%rsp
  cmpl   $0x0,0x280(%rsp)
  jle    L1
L67:
  lea    0x130(%rsp),%rax
  lea    0x30(%rsp),%rdx
  mov    0x280(%rsp),%ebx
  lea    -0x1(%rbx),%ecx
  lea    0x134(%rsp,%rcx,4),%rsi
L15:
  mov    (%rdx),%ecx
  xor    %ecx,(%rax)
  add    $0x4,%rax
  add    $0x4,%rdx
  cmp    %rsi,%rax
  jne    L15
L1:
  lea    0x130(%rsp),%rsi
  mov    0x280(%rsp),%edx
  mov    0x10(%rsp),%rdi
  call   <memcpy@plt>
  mov    0x238(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L78
  add    $0x248,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L71:
  lea    0x28(%rsp),%rdx
  sub    $0x8,%rsp
  lea    0x38(%rsp),%rax
  push   %rax
  push   $0x10
  mov    0x20(%rsp),%rdi
  push   %rdi
  mov    $0x4,%r9d
  lea    0x38(%rsp),%r8
  mov    $0x8,%ecx
  mov    $0x10,%esi
  call   <__Hash4@plt>
  add    $0x20,%rsp
  jmp    L67
L28:
  mov    0x1c(%rsp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,0x2c(%rsp)
  cmp    0x18(%rsp),%edx
  jle    L95
  lea    0x28(%rsp),%rdx
  sub    $0x8,%rsp
  lea    0x38(%rsp),%rax
  push   %rax
  push   $0x10
  mov    0x20(%rsp),%rdi
  push   %rdi
  mov    $0x4,%r9d
  lea    0x38(%rsp),%r8
  mov    $0x8,%ecx
  mov    $0x10,%esi
  call   <__Hash4@plt>
  add    $0x20,%rsp
  jmp    L1
L78:
  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);
}
```