user: What would the C source look like for the assembly code provided here:

```asm
<keys56to64>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  mov    %rdi,-0x8(%rbp)
  mov    %rsi,-0x10(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x10(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x7,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  shr    %al
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  mov    %dl,(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  shr    $0x2,%al
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x2,%rax
  mov    %dl,(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x5,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  shr    $0x3,%al
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x3,%rax
  mov    %dl,(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  shr    $0x4,%al
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x4,%rax
  mov    %dl,(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x3,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  shr    $0x5,%al
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x5,%rax
  mov    %dl,(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x2,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  shr    $0x6,%al
  or     %eax,%edx
  mov    -0x10(%rbp),%rax
  add    $0x6,%rax
  mov    %dl,(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x10(%rbp),%rax
  add    $0x7,%rax
  mov    %dl,(%rax)
  mov    -0x8(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  movzbl %al,%r8d
  mov    -0x8(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  movzbl %al,%edi
  mov    -0x8(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  movzbl %al,%esi
  mov    -0x8(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  movzbl %al,%r9d
  mov    -0x8(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%r10d
  mov    -0x8(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%ecx
  mov    -0x8(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  sub    $0x8,%rsp
  push   %r8
  push   %rdi
  push   %rsi
  mov    %r10d,%r8d
  mov    %eax,%esi
  lea    D14(%rip),%rax
  mov    %rax,%rdi
  call   <debug@plt>
  add    $0x20,%rsp
  mov    -0x10(%rbp),%rax
  add    $0x7,%rax
  movzbl (%rax),%eax
  movzbl %al,%r8d
  mov    -0x10(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  movzbl %al,%edi
  mov    -0x10(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  movzbl %al,%esi
  mov    -0x10(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  movzbl %al,%r9d
  mov    -0x10(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%r10d
  mov    -0x10(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%ecx
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  sub    $0x8,%rsp
  push   %r8
  push   %rdi
  push   %rsi
  mov    %r10d,%r8d
  mov    %eax,%esi
  lea    D12(%rip),%rax
  mov    %rax,%rdi
  call   <debug@plt>
  add    $0x20,%rsp
  nop
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_label: D14
datatype: string
name: parse_data
arguments: data_label: D12
datatype: string

tool: D14: ### keys56to64:  56BitKey = [%02X%02X%02X%02X%02X%02X%02X%02X]


tool: D12: ### keys56to64:  64BitKey = [%02X%02X%02X%02X%02X%02X%02X%02X]


assistant: ```c
void keys56to64(unsigned char *key56, unsigned char *key64) {
  key64[0] = key56[0];
  key64[1] = ((key56[0] << 7) & 0xFF) | (key56[1] >> 1);
  key64[2] = ((key56[1] << 6) & 0xFF) | (key56[2] >> 2);
  key64[3] = ((key56[2] << 5) & 0xFF) | (key56[3] >> 3);
  key64[4] = ((key56[3] << 4) & 0xFF) | (key56[4] >> 4);
  key64[5] = ((key56[4] << 3) & 0xFF) | (key56[5] >> 5);
  key64[6] = ((key56[5] << 2) & 0xFF) | (key56[6] >> 6);
  key64[7] = (key56[6] << 1) & 0xFF;
  debug("### keys56to64:  56BitKey = [%02X%02X%02X%02X%02X%02X%02X%02X]\n", key56[0], key56[1], key56[2], key56[3], key56[4], key56[5], key56[6], key56[7]);
  debug("### keys56to64:  64BitKey = [%02X%02X%02X%02X%02X%02X%02X%02X]\n", key64[0], key64[1], key64[2], key64[3], key64[4], key64[5], key64[6], key64[7]);
}
```