user: 这段汇编代码用C语言表示是什么样的:

```asm
<calc_4pmk>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xd68,%rsp
  mov    %rdi,%r13
  mov    %rsi,%r12
  mov    %rdx,%rbp
  mov    %rcx,%rbx
  mov    %r8,%rsi
  mov    %r9,0x10(%rsp)
  mov    0xda0(%rsp),%rax
  mov    %rax,0x18(%rsp)
  mov    0xda8(%rsp),%rax
  mov    %rax,0x20(%rsp)
  mov    0xdb0(%rsp),%rax
  mov    %rax,0x28(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0xd58(%rsp)
  xor    %eax,%eax
  lea    0x30(%rsp),%r15
  mov    $0x23,%edx
  mov    %r15,%rdi
  call   <strncpy@plt>
  lea    0x150(%rsp),%r14
  mov    $0x7f,%edx
  mov    %r13,%rsi
  mov    %r14,%rdi
  call   <strncpy@plt>
  lea    0x1d0(%rsp),%r13
  mov    $0x7f,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <strncpy@plt>
  lea    0x250(%rsp),%r12
  mov    $0x7f,%edx
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <strncpy@plt>
  lea    0x2d0(%rsp),%rbp
  mov    $0x7f,%edx
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  call   <strncpy@plt>
  mov    %r15,%rdi
  call   <strlen@plt>
  mov    %eax,0xc(%rsp)
  add    $0x4,%eax
  mov    %eax,0x8(%rsp)
  lea    0x350(%rsp),%rbx
  mov    $0x100,%edx
  mov    $0x0,%esi
  mov    %rbx,%rdi
  call   <memset@plt>
  lea    0x450(%rsp),%r15
  mov    $0x100,%edx
  mov    $0x0,%esi
  mov    %r15,%rdi
  call   <memset@plt>
  mov    %r14,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    %r14,%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <memcpy@plt>
  mov    %r14,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  mov    %r14,%rsi
  mov    %r15,%rdi
  mov    $0x0,%eax
  call   <memcpy@plt>
  mov    %r13,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  lea    0x390(%rsp),%rdi
  mov    %r13,%rsi
  mov    $0x0,%eax
  call   <memcpy@plt>
  mov    %r13,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  lea    0x490(%rsp),%rdi
  mov    %r13,%rsi
  mov    $0x0,%eax
  call   <memcpy@plt>
  mov    %r12,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  lea    0x3d0(%rsp),%rdi
  mov    %r12,%rsi
  mov    $0x0,%eax
  call   <memcpy@plt>
  mov    %r12,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  lea    0x4d0(%rsp),%rdi
  mov    %r12,%rsi
  mov    $0x0,%eax
  call   <memcpy@plt>
  mov    %rbp,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  lea    0x410(%rsp),%rdi
  mov    %rbp,%rsi
  mov    $0x0,%eax
  call   <memcpy@plt>
  mov    %rbp,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  lea    0x510(%rsp),%rdi
  mov    %rbp,%rsi
  mov    $0x0,%eax
  call   <memcpy@plt>
  lea    0x550(%rsp),%rax
  lea    0x390(%rsp),%rcx
L7:
  add    $0x4,%rbx
  mov    -0x4(%rbx),%edx
  xor    $0x36363636,%edx
  mov    %edx,(%rax)
  mov    0x3c(%rbx),%edx
  xor    $0x36363636,%edx
  mov    %edx,0x4(%rax)
  mov    0x7c(%rbx),%edx
  xor    $0x36363636,%edx
  mov    %edx,0x8(%rax)
  add    $0x10,%rax
  mov    0xbc(%rbx),%edx
  xor    $0x36363636,%edx
  mov    %edx,-0x4(%rax)
  cmp    %rcx,%rbx
  jne    L7
  lea    0x60(%rsp),%rbp
  mov    %rbp,%rdi
  call   <shasse2_init@plt>
  lea    0x850(%rsp),%rdx
  lea    0x550(%rsp),%rbx
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  call   <shasse2_data@plt>
  lea    0x450(%rsp),%rax
  lea    0x490(%rsp),%rcx
L8:
  add    $0x4,%rax
  mov    -0x4(%rax),%edx
  xor    $0x5c5c5c5c,%edx
  mov    %edx,(%rbx)
  mov    0x3c(%rax),%edx
  xor    $0x5c5c5c5c,%edx
  mov    %edx,0x4(%rbx)
  mov    0x7c(%rax),%edx
  xor    $0x5c5c5c5c,%edx
  mov    %edx,0x8(%rbx)
  add    $0x10,%rbx
  mov    0xbc(%rax),%edx
  xor    $0x5c5c5c5c,%edx
  mov    %edx,-0x4(%rbx)
  cmp    %rcx,%rax
  jne    L8
  lea    0xb0(%rsp),%rbp
  mov    %rbp,%rdi
  call   <shasse2_init@plt>
  lea    0x850(%rsp),%rdx
  lea    0x550(%rsp),%rbx
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  call   <shasse2_data@plt>
  mov    $0x100,%edx
  mov    $0x0,%esi
  mov    %rbx,%rdi
  call   <memset@plt>
  movb   $0x80,0x5ac(%rsp)
  movb   $0x80,0x5a8(%rsp)
  movb   $0x80,0x5a4(%rsp)
  movb   $0x80,0x5a0(%rsp)
  movb   $0x2,0x64e(%rsp)
  movb   $0x2,0x64a(%rsp)
  movb   $0x2,0x646(%rsp)
  movb   $0x2,0x642(%rsp)
  movb   $0xa0,0x64f(%rsp)
  movb   $0xa0,0x64b(%rsp)
  movb   $0xa0,0x647(%rsp)
  movb   $0xa0,0x643(%rsp)
  mov    0xc(%rsp),%r15d
  add    $0x3,%r15d
  movslq %r15d,%rax
  movb   $0x1,0x30(%rsp,%rax,1)
  lea    0x150(%rsp),%r12
  mov    %r12,%rdi
  call   <strlen@plt>
  mov    %eax,%ebp
  mov    $0x0,%eax
  call   <EVP_sha1@plt>
  mov    %eax,%edi
  lea    0x30(%rsp),%rbx
  sub    $0x8,%rsp
  push   $0x0
  lea    0x660(%rsp),%r9
  mov    0x18(%rsp),%r14d
  mov    %r14d,%r8d
  mov    %rbx,%rcx
  mov    %ebp,%edx
  mov    %r12,%rsi
  call   <HMAC@plt>
  lea    0x1e0(%rsp),%r12
  mov    %r12,%rdi
  call   <strlen@plt>
  mov    %eax,%ebp
  mov    $0x0,%eax
  call   <EVP_sha1@plt>
  mov    %eax,%edi
  movq   $0x0,(%rsp)
  lea    0x6e0(%rsp),%r9
  mov    %r14d,%r8d
  mov    %rbx,%rcx
  mov    %ebp,%edx
  mov    %r12,%rsi
  call   <HMAC@plt>
  lea    0x260(%rsp),%r12
  mov    %r12,%rdi
  call   <strlen@plt>
  mov    %eax,%ebp
  mov    $0x0,%eax
  call   <EVP_sha1@plt>
  mov    %eax,%edi
  movq   $0x0,(%rsp)
  lea    0x760(%rsp),%r9
  mov    %r14d,%r8d
  mov    %rbx,%rcx
  mov    %ebp,%edx
  mov    %r12,%rsi
  call   <HMAC@plt>
  lea    0x2e0(%rsp),%r12
  mov    %r12,%rdi
  call   <strlen@plt>
  mov    %eax,%ebp
  mov    $0x0,%eax
  call   <EVP_sha1@plt>
  mov    %eax,%edi
  movq   $0x0,(%rsp)
  lea    0x7e0(%rsp),%r9
  mov    %r14d,%r8d
  mov    %rbx,%rcx
  mov    %ebp,%edx
  mov    %r12,%rsi
  call   <HMAC@plt>
  mov    0x660(%rsp),%eax
  mov    %eax,0x560(%rsp)
  mov    0x6e0(%rsp),%eax
  mov    %eax,0x564(%rsp)
  mov    0x760(%rsp),%eax
  mov    %eax,0x568(%rsp)
  mov    0x7e0(%rsp),%eax
  mov    %eax,0x56c(%rsp)
  mov    0x664(%rsp),%eax
  mov    %eax,0x570(%rsp)
  mov    0x6e4(%rsp),%eax
  mov    %eax,0x574(%rsp)
  mov    0x764(%rsp),%eax
  mov    %eax,0x578(%rsp)
  mov    0x7e4(%rsp),%eax
  mov    %eax,0x57c(%rsp)
  mov    0x668(%rsp),%eax
  mov    %eax,0x580(%rsp)
  mov    0x6e8(%rsp),%eax
  mov    %eax,0x584(%rsp)
  mov    0x768(%rsp),%eax
  mov    %eax,0x588(%rsp)
  mov    0x7e8(%rsp),%eax
  mov    %eax,0x58c(%rsp)
  mov    0x66c(%rsp),%eax
  mov    %eax,0x590(%rsp)
  mov    0x6ec(%rsp),%eax
  mov    %eax,0x594(%rsp)
  mov    0x76c(%rsp),%eax
  mov    %eax,0x598(%rsp)
  mov    0x7ec(%rsp),%eax
  mov    %eax,0x59c(%rsp)
  mov    0x670(%rsp),%eax
  mov    %eax,0x5a0(%rsp)
  mov    0x6f0(%rsp),%eax
  mov    %eax,0x5a4(%rsp)
  mov    0x770(%rsp),%eax
  mov    %eax,0x5a8(%rsp)
  mov    0x7f0(%rsp),%eax
  mov    %eax,0x5ac(%rsp)
  add    $0x10,%rsp
  mov    $0xfff,%r12d
  lea    0x60(%rsp),%r14
L2:
  lea    0x100(%rsp),%rbx
  mov    $0x50,%edx
  mov    %r14,%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <memcpy@plt>
  lea    0x850(%rsp),%r13
  lea    0x550(%rsp),%rbp
  mov    %r13,%rdx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <shasse2_data@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <shasse2_ends@plt>
  lea    0xb0(%rsp),%rsi
  mov    $0x50,%edx
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <memcpy@plt>
  mov    %r13,%rdx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <shasse2_data@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <shasse2_ends@plt>
  mov    0x550(%rsp),%eax
  xor    %eax,0x650(%rsp)
  mov    0x554(%rsp),%eax
  xor    %eax,0x6d0(%rsp)
  mov    0x558(%rsp),%eax
  xor    %eax,0x750(%rsp)
  mov    0x55c(%rsp),%eax
  xor    %eax,0x7d0(%rsp)
  mov    0x560(%rsp),%eax
  xor    %eax,0x654(%rsp)
  mov    0x564(%rsp),%eax
  xor    %eax,0x6d4(%rsp)
  mov    0x568(%rsp),%eax
  xor    %eax,0x754(%rsp)
  mov    0x56c(%rsp),%eax
  xor    %eax,0x7d4(%rsp)
  mov    0x570(%rsp),%eax
  xor    %eax,0x658(%rsp)
  mov    0x574(%rsp),%eax
  xor    %eax,0x6d8(%rsp)
  mov    0x578(%rsp),%eax
  xor    %eax,0x758(%rsp)
  mov    0x57c(%rsp),%eax
  xor    %eax,0x7d8(%rsp)
  mov    0x580(%rsp),%eax
  xor    %eax,0x65c(%rsp)
  mov    0x584(%rsp),%eax
  xor    %eax,0x6dc(%rsp)
  mov    0x588(%rsp),%eax
  xor    %eax,0x75c(%rsp)
  mov    0x58c(%rsp),%eax
  xor    %eax,0x7dc(%rsp)
  mov    0x590(%rsp),%eax
  xor    %eax,0x660(%rsp)
  mov    0x594(%rsp),%eax
  xor    %eax,0x6e0(%rsp)
  mov    0x598(%rsp),%eax
  xor    %eax,0x760(%rsp)
  mov    0x59c(%rsp),%eax
  xor    %eax,0x7e0(%rsp)
  sub    $0x1,%r12d
  jne    L2
  movslq %r15d,%r15
  movb   $0x2,0x30(%rsp,%r15,1)
  lea    0x150(%rsp),%r12
  mov    %r12,%rdi
  call   <strlen@plt>
  mov    %eax,%ebp
  mov    $0x0,%eax
  call   <EVP_sha1@plt>
  mov    %eax,%edi
  lea    0x30(%rsp),%rbx
  sub    $0x8,%rsp
  push   $0x0
  lea    0x674(%rsp),%r9
  mov    0x18(%rsp),%r15d
  mov    %r15d,%r8d
  mov    %rbx,%rcx
  mov    %ebp,%edx
  mov    %r12,%rsi
  call   <HMAC@plt>
  lea    0x1e0(%rsp),%r12
  mov    %r12,%rdi
  call   <strlen@plt>
  mov    %eax,%ebp
  mov    $0x0,%eax
  call   <EVP_sha1@plt>
  mov    %eax,%edi
  movq   $0x0,(%rsp)
  lea    0x6f4(%rsp),%r9
  mov    %r15d,%r8d
  mov    %rbx,%rcx
  mov    %ebp,%edx
  mov    %r12,%rsi
  call   <HMAC@plt>
  lea    0x260(%rsp),%r12
  mov    %r12,%rdi
  call   <strlen@plt>
  mov    %eax,%ebp
  mov    $0x0,%eax
  call   <EVP_sha1@plt>
  mov    %eax,%edi
  movq   $0x0,(%rsp)
  lea    0x774(%rsp),%r9
  mov    %r15d,%r8d
  mov    %rbx,%rcx
  mov    %ebp,%edx
  mov    %r12,%rsi
  call   <HMAC@plt>
  lea    0x2e0(%rsp),%r12
  mov    %r12,%rdi
  call   <strlen@plt>
  mov    %eax,%ebp
  mov    $0x0,%eax
  call   <EVP_sha1@plt>
  mov    %eax,%edi
  movq   $0x0,(%rsp)
  lea    0x7f4(%rsp),%r9
  mov    %r15d,%r8d
  mov    %rbx,%rcx
  mov    %ebp,%edx
  mov    %r12,%rsi
  call   <HMAC@plt>
  mov    0x674(%rsp),%eax
  mov    %eax,0x560(%rsp)
  mov    0x6f4(%rsp),%eax
  mov    %eax,0x564(%rsp)
  mov    0x774(%rsp),%eax
  mov    %eax,0x568(%rsp)
  mov    0x7f4(%rsp),%eax
  mov    %eax,0x56c(%rsp)
  mov    0x678(%rsp),%eax
  mov    %eax,0x570(%rsp)
  mov    0x6f8(%rsp),%eax
  mov    %eax,0x574(%rsp)
  mov    0x778(%rsp),%eax
  mov    %eax,0x578(%rsp)
  mov    0x7f8(%rsp),%eax
  mov    %eax,0x57c(%rsp)
  mov    0x67c(%rsp),%eax
  mov    %eax,0x580(%rsp)
  mov    0x6fc(%rsp),%eax
  mov    %eax,0x584(%rsp)
  mov    0x77c(%rsp),%eax
  mov    %eax,0x588(%rsp)
  mov    0x7fc(%rsp),%eax
  mov    %eax,0x58c(%rsp)
  mov    0x680(%rsp),%eax
  mov    %eax,0x590(%rsp)
  mov    0x700(%rsp),%eax
  mov    %eax,0x594(%rsp)
  mov    0x780(%rsp),%eax
  mov    %eax,0x598(%rsp)
  mov    0x800(%rsp),%eax
  mov    %eax,0x59c(%rsp)
  mov    0x684(%rsp),%eax
  mov    %eax,0x5a0(%rsp)
  mov    0x704(%rsp),%eax
  mov    %eax,0x5a4(%rsp)
  mov    0x784(%rsp),%eax
  mov    %eax,0x5a8(%rsp)
  mov    0x804(%rsp),%eax
  mov    %eax,0x5ac(%rsp)
  add    $0x10,%rsp
  mov    $0xfff,%r12d
  lea    0x60(%rsp),%r14
L38:
  lea    0x100(%rsp),%rbx
  mov    $0x50,%edx
  mov    %r14,%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <memcpy@plt>
  lea    0x850(%rsp),%r13
  lea    0x550(%rsp),%rbp
  mov    %r13,%rdx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <shasse2_data@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <shasse2_ends@plt>
  lea    0xb0(%rsp),%rsi
  mov    $0x50,%edx
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <memcpy@plt>
  mov    %r13,%rdx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <shasse2_data@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <shasse2_ends@plt>
  mov    0x550(%rsp),%eax
  xor    %eax,0x664(%rsp)
  mov    0x554(%rsp),%eax
  xor    %eax,0x6e4(%rsp)
  mov    0x558(%rsp),%eax
  xor    %eax,0x764(%rsp)
  mov    0x55c(%rsp),%eax
  xor    %eax,0x7e4(%rsp)
  mov    0x560(%rsp),%eax
  xor    %eax,0x668(%rsp)
  mov    0x564(%rsp),%eax
  xor    %eax,0x6e8(%rsp)
  mov    0x568(%rsp),%eax
  xor    %eax,0x768(%rsp)
  mov    0x56c(%rsp),%eax
  xor    %eax,0x7e8(%rsp)
  mov    0x570(%rsp),%eax
  xor    %eax,0x66c(%rsp)
  mov    0x574(%rsp),%eax
  xor    %eax,0x6ec(%rsp)
  mov    0x578(%rsp),%eax
  xor    %eax,0x76c(%rsp)
  mov    0x57c(%rsp),%eax
  xor    %eax,0x7ec(%rsp)
  sub    $0x1,%r12d
  jne    L38
  lea    0x650(%rsp),%rbx
  lea    0x750(%rsp),%rsi
  mov    $0x20,%edx
  mov    0x20(%rsp),%rdi
  mov    $0x0,%eax
  call   <memcpy@plt>
  lea    0x7d0(%rsp),%rsi
  mov    $0x20,%edx
  mov    0x28(%rsp),%rdi
  mov    $0x0,%eax
  call   <memcpy@plt>
  mov    $0x20,%edx
  mov    %rbx,%rsi
  mov    0x10(%rsp),%rdi
  mov    $0x0,%eax
  call   <memcpy@plt>
  lea    0x6d0(%rsp),%rsi
  mov    $0x20,%edx
  mov    0x18(%rsp),%rdi
  mov    $0x0,%eax
  call   <memcpy@plt>
  mov    0xd58(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L39
  add    $0xd68,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L39:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void calc_4pmk(char *_key1, char *_key2, char *_key3, char *_key4, char *_essid, unsigned char *_pmk1, unsigned char *_pmk2, unsigned char *_pmk3, unsigned char *_pmk4) {
  int slen;
  char essid[36] __attribute__((aligned(16)));
  char key1[128] __attribute__((aligned(16)));
  char key2[128] __attribute__((aligned(16)));
  char key3[128] __attribute__((aligned(16)));
  char key4[128] __attribute__((aligned(16)));
  unsigned char pmks[128 * 4] __attribute__((aligned(16)));
  unsigned char k_ipad[256] __attribute__((aligned(16)));
  unsigned char ctx_ipad[80] __attribute__((aligned(16)));
  unsigned char k_opad[256] __attribute__((aligned(16)));
  unsigned char ctx_opad[80] __attribute__((aligned(16)));
  unsigned char buffer[256] __attribute__((aligned(16)));
  unsigned char sha1_ctx[80] __attribute__((aligned(16)));
  unsigned char wrkbuf[1280] __attribute__((aligned(16)));
  uint i, *u, *v, *w, *u3, *v4;
  unsigned char *pmk1, *pmk2, *pmk3, *pmk4;
  pmk1 = pmks;
  pmk2 = pmks + 128;
  pmk3 = pmks + 128 * 2;
  pmk4 = pmks + 128 * 3;
  strncpy(essid, _essid, 35);
  strncpy(key1, _key1, 127);
  strncpy(key2, _key2, 127);
  strncpy(key3, _key3, 127);
  strncpy(key4, _key4, 127);
  slen = strlen(essid) + 4;
  memset(k_ipad, 0, sizeof(k_ipad));
  memset(k_opad, 0, sizeof(k_opad));
  memcpy(k_ipad, key1, strlen(key1));
  memcpy(k_opad, key1, strlen(key1));
  memcpy(k_ipad + 64, key2, strlen(key2));
  memcpy(k_opad + 64, key2, strlen(key2));
  memcpy(k_ipad + 128, key3, strlen(key3));
  memcpy(k_opad + 128, key3, strlen(key3));
  memcpy(k_ipad + 192, key4, strlen(key4));
  memcpy(k_opad + 192, key4, strlen(key4));
  u = (uint *)(k_ipad);
  v = (uint *)(k_ipad + 64);
  u3 = (uint *)(k_ipad + 128);
  v4 = (uint *)(k_ipad + 192);
  w = (uint *)buffer;
  for (i = 0; i < 16; i++) {
    *w++ = *u++ ^ 0x36363636;
    *w++ = *v++ ^ 0x36363636;
    *w++ = *u3++ ^ 0x36363636;
    *w++ = *v4++ ^ 0x36363636;
  }
  shasse2_init(ctx_ipad);
  shasse2_data(ctx_ipad, buffer, wrkbuf);
  u = (uint *)(k_opad);
  v = (uint *)(k_opad + 64);
  u3 = (uint *)(k_opad + 128);
  v4 = (uint *)(k_opad + 192);
  w = (uint *)buffer;
  for (i = 0; i < 16; i++) {
    *w++ = *u++ ^ 0x5C5C5C5C;
    *w++ = *v++ ^ 0x5C5C5C5C;
    *w++ = *u3++ ^ 0x5C5C5C5C;
    *w++ = *v4++ ^ 0x5C5C5C5C;
  }
  shasse2_init(ctx_opad);
  shasse2_data(ctx_opad, buffer, wrkbuf);
  memset(buffer, 0, sizeof(buffer));
  buffer[80] = buffer[84] = buffer[88] = buffer[92] = 0x80;
  buffer[242] = buffer[246] = buffer[250] = buffer[254] = 0x02;
  buffer[243] = buffer[247] = buffer[251] = buffer[255] = 0xA0;
  essid[slen - 1] = '\1';
  HMAC(EVP_sha1(), (unsigned char *)key1, strlen(key1), (unsigned char *)essid, slen, pmk1, NULL);
  HMAC(EVP_sha1(), (unsigned char *)key2, strlen(key2), (unsigned char *)essid, slen, pmk2, NULL);
  HMAC(EVP_sha1(), (unsigned char *)key3, strlen(key3), (unsigned char *)essid, slen, pmk3, NULL);
  HMAC(EVP_sha1(), (unsigned char *)key4, strlen(key4), (unsigned char *)essid, slen, pmk4, NULL);
  u = (uint *)pmk1;
  v = (uint *)pmk2;
  u3 = (uint *)pmk3;
  v4 = (uint *)pmk4;
  w = (uint *)buffer;
  *w++ = *u++;
  *w++ = *v++;
  *w++ = *u3++;
  *w++ = *v4++;
  *w++ = *u++;
  *w++ = *v++;
  *w++ = *u3++;
  *w++ = *v4++;
  *w++ = *u++;
  *w++ = *v++;
  *w++ = *u3++;
  *w++ = *v4++;
  *w++ = *u++;
  *w++ = *v++;
  *w++ = *u3++;
  *w++ = *v4++;
  *w++ = *u++;
  *w++ = *v++;
  *w++ = *u3++;
  *w++ = *v4++;
  for (i = 1; i < 4096; i++) {
    memcpy(sha1_ctx, ctx_ipad, 80);
    shasse2_data(sha1_ctx, buffer, wrkbuf);
    shasse2_ends(sha1_ctx, buffer);
    memcpy(sha1_ctx, ctx_opad, 80);
    shasse2_data(sha1_ctx, buffer, wrkbuf);
    shasse2_ends(sha1_ctx, buffer);
    u = (uint *)pmk1;
    v = (uint *)pmk2;
    u3 = (uint *)pmk3;
    v4 = (uint *)pmk4;
    w = (uint *)buffer;
    *u++ ^= *w++;
    *v++ ^= *w++;
    *u3++ ^= *w++;
    *v4++ ^= *w++;
    *u++ ^= *w++;
    *v++ ^= *w++;
    *u3++ ^= *w++;
    *v4++ ^= *w++;
    *u++ ^= *w++;
    *v++ ^= *w++;
    *u3++ ^= *w++;
    *v4++ ^= *w++;
    *u++ ^= *w++;
    *v++ ^= *w++;
    *u3++ ^= *w++;
    *v4++ ^= *w++;
    *u++ ^= *w++;
    *v++ ^= *w++;
    *u3++ ^= *w++;
    *v4++ ^= *w++;
  }
  essid[slen - 1] = '\2';
  HMAC(EVP_sha1(), (unsigned char *)key1, strlen(key1), (unsigned char *)essid, slen, pmk1 + 20, NULL);
  HMAC(EVP_sha1(), (unsigned char *)key2, strlen(key2), (unsigned char *)essid, slen, pmk2 + 20, NULL);
  HMAC(EVP_sha1(), (unsigned char *)key3, strlen(key3), (unsigned char *)essid, slen, pmk3 + 20, NULL);
  HMAC(EVP_sha1(), (unsigned char *)key4, strlen(key4), (unsigned char *)essid, slen, pmk4 + 20, NULL);
  u = (uint *)(pmk1 + 20);
  v = (uint *)(pmk2 + 20);
  u3 = (uint *)(pmk3 + 20);
  v4 = (uint *)(pmk4 + 20);
  w = (uint *)buffer;
  *w++ = *u++;
  *w++ = *v++;
  *w++ = *u3++;
  *w++ = *v4++;
  *w++ = *u++;
  *w++ = *v++;
  *w++ = *u3++;
  *w++ = *v4++;
  *w++ = *u++;
  *w++ = *v++;
  *w++ = *u3++;
  *w++ = *v4++;
  *w++ = *u++;
  *w++ = *v++;
  *w++ = *u3++;
  *w++ = *v4++;
  *w++ = *u++;
  *w++ = *v++;
  *w++ = *u3++;
  *w++ = *v4++;
  for (i = 1; i < 4096; i++) {
    memcpy(sha1_ctx, ctx_ipad, 80);
    shasse2_data(sha1_ctx, buffer, wrkbuf);
    shasse2_ends(sha1_ctx, buffer);
    memcpy(sha1_ctx, ctx_opad, 80);
    shasse2_data(sha1_ctx, buffer, wrkbuf);
    shasse2_ends(sha1_ctx, buffer);
    u = (uint *)(pmk1 + 20);
    v = (uint *)(pmk2 + 20);
    u3 = (uint *)(pmk3 + 20);
    v4 = (uint *)(pmk4 + 20);
    w = (uint *)buffer;
    *u++ ^= *w++;
    *v++ ^= *w++;
    *u3++ ^= *w++;
    *v4++ ^= *w++;
    *u++ ^= *w++;
    *v++ ^= *w++;
    *u3++ ^= *w++;
    *v4++ ^= *w++;
    *u++ ^= *w++;
    *v++ ^= *w++;
    *u3++ ^= *w++;
    *v4++ ^= *w++;
  }
  memcpy(_pmk3, pmk3, 32);
  memcpy(_pmk4, pmk4, 32);
  memcpy(_pmk1, pmk1, 32);
  memcpy(_pmk2, pmk2, 32);
}
```