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

```asm
<F>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    %edx,-0x74(%rbp)
  mov    %ecx,-0x78(%rbp)
  mov    %r8d,-0x7c(%rbp)
  mov    %r9,-0x88(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x74(%rbp),%edx
  mov    -0x70(%rbp),%rcx
  lea    -0x30(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x7c(%rbp),%eax
  sar    $0x18,%eax
  mov    %eax,%edx
  mov    -0x74(%rbp),%eax
  cltq
  mov    %dl,-0x30(%rbp,%rax,1)
  mov    -0x7c(%rbp),%eax
  sar    $0x10,%eax
  mov    %eax,%edx
  mov    -0x74(%rbp),%eax
  add    $0x1,%eax
  cltq
  mov    %dl,-0x30(%rbp,%rax,1)
  mov    -0x7c(%rbp),%eax
  sar    $0x8,%eax
  mov    %eax,%edx
  mov    -0x74(%rbp),%eax
  add    $0x2,%eax
  cltq
  mov    %dl,-0x30(%rbp,%rax,1)
  mov    -0x74(%rbp),%eax
  add    $0x3,%eax
  mov    -0x7c(%rbp),%edx
  cltq
  mov    %dl,-0x30(%rbp,%rax,1)
  mov    -0x68(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%edi
  mov    -0x74(%rbp),%eax
  lea    0x4(%rax),%esi
  lea    -0x50(%rbp),%rcx
  mov    -0x68(%rbp),%rdx
  lea    -0x30(%rbp),%rax
  mov    %rcx,%r8
  mov    %edi,%ecx
  mov    %rax,%rdi
  call   <HMAC_SHA1@plt>
  lea    -0x50(%rbp),%rcx
  mov    -0x88(%rbp),%rax
  mov    $0x14,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  movl   $0x1,-0x58(%rbp)
  jmp    L27
L18:
  mov    -0x68(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%esi
  lea    -0x30(%rbp),%rcx
  mov    -0x68(%rbp),%rdx
  lea    -0x50(%rbp),%rax
  mov    %rcx,%r8
  mov    %esi,%ecx
  mov    $0x14,%esi
  mov    %rax,%rdi
  call   <HMAC_SHA1@plt>
  lea    -0x30(%rbp),%rcx
  lea    -0x50(%rbp),%rax
  mov    $0x14,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  movl   $0x0,-0x54(%rbp)
  jmp    L10
L42:
  mov    -0x54(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%ecx
  mov    -0x54(%rbp),%eax
  cltq
  movzbl -0x30(%rbp,%rax,1),%edx
  mov    -0x54(%rbp),%eax
  movslq %eax,%rsi
  mov    -0x88(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %dl,(%rax)
  addl   $0x1,-0x54(%rbp)
L10:
  cmpl   $0x13,-0x54(%rbp)
  jle    L42
  addl   $0x1,-0x58(%rbp)
L27:
  mov    -0x58(%rbp),%eax
  cmp    -0x78(%rbp),%eax
  jl     L18
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L32
  call   <__stack_chk_fail@plt>
L32:
  leave
  ret
```

assistant: ```c
void F(char *password, unsigned char *ssid, int ssidlength, int iterations, int count, unsigned char *output) {
  unsigned char digest[36], digest1[20];
  int i, j;
  memcpy(digest, ssid, ssidlength);
  digest[ssidlength] = (unsigned char)((count >> 24) & 0xff);
  digest[ssidlength + 1] = (unsigned char)((count >> 16) & 0xff);
  digest[ssidlength + 2] = (unsigned char)((count >> 8) & 0xff);
  digest[ssidlength + 3] = (unsigned char)(count & 0xff);
  HMAC_SHA1(digest, ssidlength + 4, (unsigned char *)password, (int)strlen(password), digest1);
  memcpy(output, digest1, 20);
  for (i = 1; i < iterations; i++) {
    HMAC_SHA1(digest1, 20, (unsigned char *)password, (int)strlen(password), digest);
    memcpy(digest1, digest, 20);
    for (j = 0; j < 20; j++) {
      output[j] ^= digest[j];
    }
  }
}
```