user: What is the c source code of the assembly code below:

```asm
<xxtea_to_key_array>:
  endbr64
  push   %r14
  push   %r13
  mov    %rdi,%r13
  xor    %edi,%edi
  push   %r12
  mov    %rdx,%r12
  push   %rbp
  mov    %rcx,%rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x90,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  cmp    $0xf,%rsi
  mov    %rsp,%r14
  seta   %dil
  call   <assert@plt>
  mov    $0x10,%edx
  mov    %r13,%rsi
  mov    %r14,%rdi
  call   <memcpy@plt>
  cmpq   $0x0,(%rsp)
  je     L280
  cmpq   $0x0,0x8(%rsp)
  je     L460
  cmpq   $0x0,0x10(%rsp)
  je     L338
  cmpq   $0x0,0x18(%rsp)
  je     L207
  cmpq   $0x0,0x20(%rsp)
  je     L463
  cmpq   $0x0,0x28(%rsp)
  je     L199
  cmpq   $0x0,0x30(%rsp)
  je     L162
  cmpq   $0x0,0x38(%rsp)
  je     L17
  cmpq   $0x0,0x40(%rsp)
  je     L453
  cmpq   $0x0,0x48(%rsp)
  je     L100
  cmpq   $0x0,0x50(%rsp)
  je     L116
  cmpq   $0x0,0x58(%rsp)
  je     L355
  cmpq   $0x0,0x60(%rsp)
  je     L53
  cmpq   $0x0,0x68(%rsp)
  je     L255
  cmpq   $0x0,0x70(%rsp)
  je     L430
L66:
  mov    %rbx,%r13
  shr    $0x2,%r13
  test   $0x3,%bl
  jne    L424
  lea    0x0(,%r13,8),%rax
  xor    %edi,%edi
  cmp    %rbp,%rax
  setbe  %dil
  call   <assert@plt>
  test   %rbx,%rbx
  je     L214
L228:
  mov    (%rsp),%rdx
  or     (%r12),%rdx
  mov    %rdx,(%r12)
  cmp    $0x1,%rbx
  jbe    L214
  mov    0x8(%rsp),%rax
  shl    $0x8,%rax
  or     %rdx,%rax
  mov    %rax,(%r12)
  cmp    $0x2,%rbx
  je     L214
  mov    0x10(%rsp),%rdx
  shl    $0x10,%rdx
  or     %rdx,%rax
  mov    %rax,(%r12)
  cmp    $0x3,%rbx
  je     L214
  mov    0x18(%rsp),%rdx
  shl    $0x18,%rdx
  or     %rdx,%rax
  mov    %rax,(%r12)
  cmp    $0x4,%rbx
  je     L214
  mov    0x8(%r12),%rdx
  or     0x20(%rsp),%rdx
  mov    %rdx,0x8(%r12)
  cmp    $0x5,%rbx
  je     L214
  mov    0x28(%rsp),%rax
  shl    $0x8,%rax
  or     %rdx,%rax
  mov    %rax,0x8(%r12)
  cmp    $0x6,%rbx
  je     L214
  mov    0x30(%rsp),%rdx
  shl    $0x10,%rdx
  or     %rdx,%rax
  mov    %rax,0x8(%r12)
  cmp    $0x7,%rbx
  je     L214
  mov    0x38(%rsp),%rdx
  shl    $0x18,%rdx
  or     %rdx,%rax
  mov    %rax,0x8(%r12)
  cmp    $0x8,%rbx
  je     L214
  mov    0x10(%r12),%rdx
  or     0x40(%rsp),%rdx
  mov    %rdx,0x10(%r12)
  cmp    $0x9,%rbx
  je     L214
  mov    0x48(%rsp),%rax
  shl    $0x8,%rax
  or     %rdx,%rax
  mov    %rax,0x10(%r12)
  cmp    $0xa,%rbx
  je     L214
  mov    0x50(%rsp),%rdx
  shl    $0x10,%rdx
  or     %rdx,%rax
  mov    %rax,0x10(%r12)
  cmp    $0xb,%rbx
  je     L214
  mov    0x58(%rsp),%rdx
  shl    $0x18,%rdx
  or     %rdx,%rax
  mov    %rax,0x10(%r12)
  cmp    $0xc,%rbx
  je     L214
  mov    0x18(%r12),%rdx
  or     0x60(%rsp),%rdx
  mov    %rdx,0x18(%r12)
  cmp    $0xd,%rbx
  je     L214
  mov    0x68(%rsp),%rax
  shl    $0x8,%rax
  or     %rdx,%rax
  mov    %rax,0x18(%r12)
  cmp    $0xe,%rbx
  je     L214
  mov    0x70(%rsp),%rdx
  shl    $0x10,%rdx
  or     %rdx,%rax
  mov    %rax,0x18(%r12)
  cmp    $0xf,%rbx
  jbe    L214
  mov    0x78(%rsp),%rdx
  shl    $0x18,%rdx
  or     %rdx,%rax
  mov    %rax,0x18(%r12)
  nopw   0x0(%rax,%rax,1)
L214:
  mov    0x88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L62
  add    $0x90,%rsp
  mov    %r13,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopw   0x0(%rax,%rax,1)
L424:
  add    $0x1,%r13
  xor    %edi,%edi
  lea    0x0(,%r13,8),%rax
  cmp    %rbp,%rax
  setbe  %dil
  call   <assert@plt>
  jmp    L228
L280:
  mov    $0x1,%eax
  nopl   0x0(%rax)
L138:
  mov    $0x10,%ecx
  sub    %rax,%rcx
  lea    (%r14,%rax,8),%rax
  shl    $0x3,%rcx
  movq   $0x0,(%rax)
  lea    0x8(%rax),%rdi
  mov    %ecx,%edx
  sub    $0x8,%ecx
  movq   $0x0,-0x8(%rax,%rdx,1)
  shr    $0x3,%ecx
  xor    %eax,%eax
  rep stos %rax,%es:(%rdi)
  jmp    L66
L460:
  mov    $0x2,%eax
  jmp    L138
L53:
  mov    $0xd,%eax
  jmp    L138
L338:
  mov    $0x3,%eax
  jmp    L138
L207:
  mov    $0x4,%eax
  jmp    L138
L463:
  mov    $0x5,%eax
  jmp    L138
L199:
  mov    $0x6,%eax
  jmp    L138
L162:
  mov    $0x7,%eax
  jmp    L138
L17:
  mov    $0x8,%eax
  jmp    L138
L453:
  mov    $0x9,%eax
  jmp    L138
L100:
  mov    $0xa,%eax
  jmp    L138
L116:
  mov    $0xb,%eax
  jmp    L138
L355:
  mov    $0xc,%eax
  jmp    L138
L255:
  mov    $0xe,%eax
  jmp    L138
L430:
  mov    $0xf,%eax
  jmp    L138
L62:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
size_t xxtea_to_key_array(const char *key, size_t len, uint32_t *key_array, size_t key_array_size) {
  size_t i, n;
  uint8_t fixed_key[16];
  assert(len >= 16);
  memcpy(fixed_key, key, 16);
  for (i = 0; (i < 16) && (fixed_key[i] != 0); ++i)
    ;
  for (++i; i < 16; ++i)
    fixed_key[i] = 0;
  n = (((len & 3) == 0) ? (len >> 2) : ((len >> 2) + 1));
  assert(key_array_size >= n * sizeof(uint32_t));
  for (i = 0; i < len; ++i) {
    key_array[i >> 2] |= (uint32_t)fixed_key[i] << ((i & 3) << 3);
  }
  return n;
}
```