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

```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,0x10(%rsp)
  mov    %rax,0x8(%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,0x20(%rsp)
  lea    0x48(%rsp),%rax
  mov    $0x8,%ecx
  mov    %r15,%rdi
  mov    %rax,0x28(%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    L49
  mov    0x290(%rsp),%eax
  lea    -0x1(%rax),%r15d
  cmp    $0x2,%r15d
  jbe    L188
  movdqa 0x140(%rsp),%xmm0
  pxor   0x40(%rsp),%xmm0
  shr    $0x2,%eax
  movaps %xmm0,0x140(%rsp)
  cmp    $0x1,%eax
  je     L441
  movdqa 0x150(%rsp),%xmm0
  pxor   0x50(%rsp),%xmm0
  movaps %xmm0,0x150(%rsp)
  cmp    $0x2,%eax
  je     L441
  movdqa 0x160(%rsp),%xmm0
  pxor   0x60(%rsp),%xmm0
  movaps %xmm0,0x160(%rsp)
  cmp    $0x3,%eax
  je     L441
  movdqa 0x170(%rsp),%xmm0
  pxor   0x70(%rsp),%xmm0
  movaps %xmm0,0x170(%rsp)
  cmp    $0x4,%eax
  je     L441
  movdqa 0x180(%rsp),%xmm0
  pxor   0x80(%rsp),%xmm0
  movaps %xmm0,0x180(%rsp)
  cmp    $0x5,%eax
  je     L441
  movdqa 0x190(%rsp),%xmm0
  pxor   0x90(%rsp),%xmm0
  movaps %xmm0,0x190(%rsp)
  cmp    $0x6,%eax
  je     L441
  movdqa 0x1a0(%rsp),%xmm0
  pxor   0xa0(%rsp),%xmm0
  movaps %xmm0,0x1a0(%rsp)
  cmp    $0x7,%eax
  je     L441
  movdqa 0x1b0(%rsp),%xmm0
  pxor   0xb0(%rsp),%xmm0
  movaps %xmm0,0x1b0(%rsp)
  cmp    $0x8,%eax
  je     L441
  movdqa 0x1c0(%rsp),%xmm0
  pxor   0xc0(%rsp),%xmm0
  movaps %xmm0,0x1c0(%rsp)
  cmp    $0x9,%eax
  je     L441
  movdqa 0x1d0(%rsp),%xmm0
  pxor   0xd0(%rsp),%xmm0
  movaps %xmm0,0x1d0(%rsp)
  cmp    $0xa,%eax
  je     L441
  movdqa 0x1e0(%rsp),%xmm0
  pxor   0xe0(%rsp),%xmm0
  movaps %xmm0,0x1e0(%rsp)
  cmp    $0xb,%eax
  je     L441
  movdqa 0x1f0(%rsp),%xmm0
  pxor   0xf0(%rsp),%xmm0
  movaps %xmm0,0x1f0(%rsp)
  cmp    $0xc,%eax
  je     L441
  movdqa 0x200(%rsp),%xmm0
  pxor   0x100(%rsp),%xmm0
  movaps %xmm0,0x200(%rsp)
  cmp    $0xd,%eax
  je     L441
  movdqa 0x210(%rsp),%xmm0
  pxor   0x110(%rsp),%xmm0
  movaps %xmm0,0x210(%rsp)
  cmp    $0xe,%eax
  je     L441
  movdqa 0x220(%rsp),%xmm0
  pxor   0x120(%rsp),%xmm0
  movaps %xmm0,0x220(%rsp)
  cmp    $0xf,%eax
  je     L441
  movdqa 0x230(%rsp),%xmm0
  pxor   0x130(%rsp),%xmm0
  movaps %xmm0,0x230(%rsp)
  xchg   %ax,%ax
L441:
  mov    0x290(%rsp),%edx
  and    $0xfffffffc,%edx
  mov    %edx,%eax
  cmp    %edx,0x290(%rsp)
  je     L425
L239:
  mov    0x290(%rsp),%ecx
  sub    %edx,%ecx
  cmp    $0x1,%ecx
  je     L148
  shl    $0x2,%rdx
  lea    0x0(%rbp,%rdx,1),%rsi
  movq   0x40(%rsp,%rdx,1),%xmm1
  mov    %ecx,%edx
  movq   (%rsi),%xmm0
  and    $0xfffffffe,%edx
  add    %edx,%eax
  pxor   %xmm1,%xmm0
  movq   %xmm0,(%rsi)
  cmp    %edx,%ecx
  je     L425
L148:
  cltq
  mov    0x140(%rsp,%rax,4),%edx
  xor    0x40(%rsp,%rax,4),%edx
  mov    %edx,0x140(%rsp,%rax,4)
L425:
  mov    0x2c(%rsp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,0x3c(%rsp)
  cmp    0x28(%rsp),%edx
  jg     L118
L236:
  lea    0x3c(%rsp),%r15
  mov    %r15,%rax
  mov    %r13d,%r15d
  mov    %r12,%r13
  mov    %rbp,%r12
  mov    %rax,%rbp
  cs nopw 0x0(%rax,%rax,1)
L229:
  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    L229
  sub    $0x8,%rsp
  mov    $0x4,%r9d
  mov    $0x8,%ecx
  mov    %r12,%rbp
  push   0x28(%rsp)
  mov    $0x10,%esi
  push   $0x10
  mov    0x28(%rsp),%rdi
  push   %rdi
  mov    0x38(%rsp),%rdx
  lea    0x48(%rsp),%r8
  call   <__Hash4@plt>
  mov    0x2b0(%rsp),%eax
  add    $0x20,%rsp
  test   %eax,%eax
  jle    L320
  mov    0x290(%rsp),%eax
  lea    -0x1(%rax),%r15d
L230:
  cmp    $0x2,%r15d
  jbe    L23
  movdqa 0x140(%rsp),%xmm0
  mov    0x290(%rsp),%eax
  pxor   0x40(%rsp),%xmm0
  shr    $0x2,%eax
  movaps %xmm0,0x140(%rsp)
  cmp    $0x1,%eax
  je     L147
  movdqa 0x150(%rsp),%xmm0
  pxor   0x50(%rsp),%xmm0
  movaps %xmm0,0x150(%rsp)
  cmp    $0x2,%eax
  je     L147
  movdqa 0x160(%rsp),%xmm0
  pxor   0x60(%rsp),%xmm0
  movaps %xmm0,0x160(%rsp)
  cmp    $0x3,%eax
  je     L147
  movdqa 0x170(%rsp),%xmm0
  pxor   0x70(%rsp),%xmm0
  movaps %xmm0,0x170(%rsp)
  cmp    $0x4,%eax
  je     L147
  movdqa 0x180(%rsp),%xmm0
  pxor   0x80(%rsp),%xmm0
  movaps %xmm0,0x180(%rsp)
  cmp    $0x5,%eax
  je     L147
  movdqa 0x190(%rsp),%xmm0
  pxor   0x90(%rsp),%xmm0
  movaps %xmm0,0x190(%rsp)
  cmp    $0x6,%eax
  je     L147
  movdqa 0x1a0(%rsp),%xmm0
  pxor   0xa0(%rsp),%xmm0
  movaps %xmm0,0x1a0(%rsp)
  cmp    $0x7,%eax
  je     L147
  movdqa 0x1b0(%rsp),%xmm0
  pxor   0xb0(%rsp),%xmm0
  movaps %xmm0,0x1b0(%rsp)
  cmp    $0x8,%eax
  je     L147
  movdqa 0x1c0(%rsp),%xmm0
  pxor   0xc0(%rsp),%xmm0
  movaps %xmm0,0x1c0(%rsp)
  cmp    $0x9,%eax
  je     L147
  movdqa 0x1d0(%rsp),%xmm0
  pxor   0xd0(%rsp),%xmm0
  movaps %xmm0,0x1d0(%rsp)
  cmp    $0xa,%eax
  je     L147
  movdqa 0x1e0(%rsp),%xmm0
  pxor   0xe0(%rsp),%xmm0
  movaps %xmm0,0x1e0(%rsp)
  cmp    $0xb,%eax
  je     L147
  movdqa 0x1f0(%rsp),%xmm0
  pxor   0xf0(%rsp),%xmm0
  movaps %xmm0,0x1f0(%rsp)
  cmp    $0xc,%eax
  je     L147
  movdqa 0x200(%rsp),%xmm0
  pxor   0x100(%rsp),%xmm0
  movaps %xmm0,0x200(%rsp)
  cmp    $0xd,%eax
  je     L147
  movdqa 0x210(%rsp),%xmm0
  pxor   0x110(%rsp),%xmm0
  movaps %xmm0,0x210(%rsp)
  cmp    $0xe,%eax
  je     L147
  movdqa 0x220(%rsp),%xmm0
  pxor   0x120(%rsp),%xmm0
  movaps %xmm0,0x220(%rsp)
  cmp    $0xf,%eax
  je     L147
  movdqa 0x230(%rsp),%xmm0
  pxor   0x130(%rsp),%xmm0
  movaps %xmm0,0x230(%rsp)
  nopl   0x0(%rax)
L147:
  mov    0x290(%rsp),%edx
  and    $0xfffffffc,%edx
  mov    %edx,%eax
  cmp    %edx,0x290(%rsp)
  je     L320
L111:
  mov    0x290(%rsp),%ecx
  sub    %edx,%ecx
  cmp    $0x1,%ecx
  je     L421
  shl    $0x2,%rdx
  lea    0x0(%rbp,%rdx,1),%rsi
  movq   0x40(%rsp,%rdx,1),%xmm1
  mov    %ecx,%edx
  movq   (%rsi),%xmm0
  and    $0xfffffffe,%edx
  add    %edx,%eax
  pxor   %xmm1,%xmm0
  movq   %xmm0,(%rsi)
  cmp    %edx,%ecx
  je     L320
L421:
  cltq
  mov    0x140(%rsp,%rax,4),%edx
  xor    0x40(%rsp,%rax,4),%edx
  mov    %edx,0x140(%rsp,%rax,4)
L320:
  mov    0x290(%rsp),%edx
  mov    0x8(%rsp),%rdi
  mov    %rbp,%rsi
  call   <memcpy@plt>
  mov    0x248(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L233
  add    $0x258,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
L49:
  mov    0x2c(%rsp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,0x3c(%rsp)
  cmp    0x28(%rsp),%edx
  jle    L236
  sub    $0x8,%rsp
  mov    $0x4,%r9d
  mov    $0x8,%ecx
  mov    $0x10,%esi
  push   0x28(%rsp)
  push   $0x10
  mov    0x28(%rsp),%rdi
  push   %rdi
  mov    0x38(%rsp),%rdx
  lea    0x48(%rsp),%r8
  call   <__Hash4@plt>
  add    $0x20,%rsp
  jmp    L320
  nopl   (%rax)
L118:
  sub    $0x8,%rsp
  mov    $0x4,%r9d
  mov    $0x8,%ecx
  mov    $0x10,%esi
  push   0x28(%rsp)
  push   $0x10
  mov    0x28(%rsp),%rdi
  push   %rdi
  mov    0x38(%rsp),%rdx
  lea    0x48(%rsp),%r8
  call   <__Hash4@plt>
  add    $0x20,%rsp
  jmp    L230
L188:
  xor    %edx,%edx
  xor    %eax,%eax
  jmp    L239
L23:
  xor    %edx,%edx
  xor    %eax,%eax
  jmp    L111
L233:
  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);
}
```