user: 下面的汇编指令对应的C源代码是什么：

```asm
<_test_iclass_key_permutation>:
  endbr64
  push   %rbx
  sub    $0x90,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x88(%rsp)
  xor    %eax,%eax
  movl   $0x6c,(%rsp)
  movl   $0x8d,0x4(%rsp)
  movl   $0x44,0x8(%rsp)
  movl   $0xf9,0xc(%rsp)
  movl   $0x2a,0x10(%rsp)
  movl   $0x2d,0x14(%rsp)
  movl   $0x1,0x18(%rsp)
  movl   $0xbf,0x1c(%rsp)
  movq   $0x0,0x20(%rsp)
  movq   $0x0,0x28(%rsp)
  movq   $0x0,0x30(%rsp)
  movq   $0x0,0x38(%rsp)
  movl   $0x8a,0x40(%rsp)
  movl   $0xd,0x44(%rsp)
  movl   $0xb9,0x48(%rsp)
  movl   $0x88,0x4c(%rsp)
  movl   $0xbb,0x50(%rsp)
  movl   $0xa7,0x54(%rsp)
  movl   $0x90,0x58(%rsp)
  movl   $0xea,0x5c(%rsp)
  movq   $0x0,0x60(%rsp)
  movq   $0x0,0x68(%rsp)
  movq   $0x0,0x70(%rsp)
  movq   $0x0,0x78(%rsp)
  lea    0x20(%rsp),%rbx
  mov    %rsp,%rdi
  mov    %rbx,%rsi
  call   <permutekey@plt>
  lea    0x60(%rsp),%rsi
  mov    %rbx,%rdi
  call   <permutekey_rev@plt>
  lea    0x40(%rsp),%rsi
  mov    $0x8,%edx
  mov    %rbx,%rdi
  call   <memcmp@plt>
  test   %rax,%rax
  jne    L6
  lea    0x60(%rsp),%rsi
  mov    %rsp,%rdi
  mov    $0x8,%edx
  call   <memcmp@plt>
  test   %rax,%rax
  jne    L26
  lea    D8(%rip),%rdi
  call   <prnlog@plt>
  mov    $0x0,%eax
L14:
  mov    0x88(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L23
  add    $0x90,%rsp
  pop    %rbx
  ret
L6:
  lea    D6(%rip),%rdi
  call   <prnlog@plt>
  mov    %rbx,%rsi
  mov    $0x8,%edx
  lea    D25(%rip),%rdi
  call   <printarr@plt>
  lea    0x40(%rsp),%rsi
  mov    $0x8,%edx
  lea    D10(%rip),%rdi
  call   <printarr@plt>
  mov    $0x1,%eax
  jmp    L14
L26:
  lea    D2(%rip),%rdi
  call   <prnlog@plt>
  mov    %rsp,%rsi
  mov    $0x8,%edx
  lea    D42(%rip),%rdi
  call   <printarr@plt>
  lea    0x60(%rsp),%rsi
  mov    $0x8,%edx
  lea    D30(%rip),%rdi
  call   <printarr@plt>
  mov    $0x1,%eax
  jmp    L14
L23:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: tag: D8
datatype: string
name: unpack_data
arguments: tag: D6
datatype: string
name: unpack_data
arguments: tag: D25
datatype: string
name: unpack_data
arguments: tag: D10
datatype: string
name: unpack_data
arguments: tag: D2
datatype: string
name: unpack_data
arguments: tag: D42
datatype: string
name: unpack_data
arguments: tag: D30
datatype: string

tool: D8: [+] Iclass key permutation OK!

tool: D6: Error with iclass key permute!

tool: D25: testcase_output

tool: D10: testcase_output_correct

tool: D2: Error with reverse iclass key permute

tool: D42: testcase

tool: D30: testcase_output_rev

assistant: ```c
int _test_iclass_key_permutation() {
  uint8_t testcase[8] = {0x6c, 0x8d, 0x44, 0xf9, 0x2a, 0x2d, 0x01, 0xbf};
  uint8_t testcase_output[8] = {0};
  uint8_t testcase_output_correct[8] = {0x8a, 0x0d, 0xb9, 0x88, 0xbb, 0xa7, 0x90, 0xea};
  uint8_t testcase_output_rev[8] = {0};
  permutekey(testcase, testcase_output);
  permutekey_rev(testcase_output, testcase_output_rev);
  if (memcmp(testcase_output, testcase_output_correct, 8) != 0) {
    prnlog("Error with iclass key permute!");
    printarr("testcase_output", testcase_output, 8);
    printarr("testcase_output_correct", testcase_output_correct, 8);
    return 1;
  }
  if (memcmp(testcase, testcase_output_rev, 8) != 0) {
    prnlog("Error with reverse iclass key permute");
    printarr("testcase", testcase, 8);
    printarr("testcase_output_rev", testcase_output_rev, 8);
    return 1;
  }
  prnlog("[+] Iclass key permutation OK!");
  return 0;
}
```