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

```asm
<PKCS5_pbkdf2_set>:
  endbr64
  push   %r15
  xor    %eax,%eax
  mov    %ecx,%r15d
  push   %r14
  mov    %rsi,%r14
  push   %r13
  mov    %edi,%r13d
  push   %r12
  mov    %edx,%r12d
  push   %rbp
  push   %rbx
  mov    %r8d,%ebx
  sub    $0x18,%rsp
  call   <PBKDF2PARAM_new@plt>
  mov    %rax,%rbp
  test   %rax,%rax
  je     L91
  xor    %eax,%eax
  call   <ASN1_OCTET_STRING_new@plt>
  mov    %rax,%rdx
  test   %rax,%rax
  je     L91
  mov    D36(%rip),%rcx
  mov    0x10(%rbp),%rax
  mov    (%rcx),%ecx
  mov    %rdx,0x8(%rax)
  mov    %ecx,(%rax)
  test   %r12d,%r12d
  je     L8
L6:
  mov    %r12d,%edi
  mov    %rdx,0x8(%rsp)
  call   <malloc@plt>
  mov    0x8(%rsp),%rdx
  mov    %eax,%edi
  mov    %eax,0x4(%rdx)
  test   %eax,%eax
  je     L91
  mov    %r12d,(%rdx)
  test   %r14,%r14
  je     L86
  mov    %r12d,%edx
  mov    %r14,%rsi
  call   <memcpy@plt>
L69:
  test   %r13d,%r13d
  jg     L22
  mov    D87(%rip),%rax
  mov    (%rax),%r13d
L22:
  mov    0xc(%rbp),%edi
  mov    %r13d,%esi
  call   <ASN1_INTEGER_set@plt>
  test   %eax,%eax
  je     L91
  test   %ebx,%ebx
  jg     L134
L37:
  test   %r15d,%r15d
  jle    L113
  mov    D80(%rip),%rax
  cmp    %r15d,(%rax)
  jne    L60
L113:
  xor    %eax,%eax
  call   <X509_ALGOR_new@plt>
  mov    %rax,%r12
  test   %rax,%rax
  je     L91
  mov    D55(%rip),%rax
  mov    (%rax),%edi
  call   <OBJ_nid2obj@plt>
  mov    %eax,0x8(%r12)
  xor    %eax,%eax
  call   <ASN1_TYPE_new@plt>
  mov    %rax,(%r12)
  test   %rax,%rax
  je     L102
  mov    D46(%rip),%rsi
  lea    0x4(%rax),%rdx
  mov    %rbp,%rdi
  call   <ASN1_item_pack@plt>
  test   %eax,%eax
  je     L102
  mov    D84(%rip),%rdx
  mov    (%r12),%rax
  mov    %rbp,%rdi
  mov    (%rdx),%edx
  mov    %edx,(%rax)
  call   <PBKDF2PARAM_free@plt>
  jmp    L82
  nopw   0x0(%rax,%rax,1)
L134:
  xor    %eax,%eax
  call   <ASN1_INTEGER_new@plt>
  mov    %eax,0x8(%rbp)
  mov    %eax,%edi
  test   %eax,%eax
  jne    L93
  nopl   0x0(%rax)
L91:
  xor    %r12d,%r12d
L102:
  mov    D12(%rip),%rax
  mov    (%rax),%edi
  call   <ASN1error@plt>
  mov    %rbp,%rdi
  call   <PBKDF2PARAM_free@plt>
  mov    %r12,%rdi
  xor    %r12d,%r12d
  call   <X509_ALGOR_free@plt>
L82:
  add    $0x18,%rsp
  mov    %r12,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  xchg   %ax,%ax
L8:
  mov    D31(%rip),%rax
  mov    (%rax),%r12d
  jmp    L6
  nop
L86:
  mov    %r12d,%esi
  call   <arc4random_buf@plt>
  jmp    L69
  nopl   (%rax)
L60:
  xor    %eax,%eax
  call   <X509_ALGOR_new@plt>
  mov    %rax,0x0(%rbp)
  test   %rax,%rax
  je     L91
  mov    D11(%rip),%rax
  mov    %r15d,%edi
  mov    (%rax),%r12d
  call   <OBJ_nid2obj@plt>
  mov    0x0(%rbp),%rdi
  xor    %ecx,%ecx
  mov    %eax,%esi
  mov    %r12d,%edx
  call   <X509_ALGOR_set0@plt>
  jmp    L113
  nopw   0x0(%rax,%rax,1)
L93:
  mov    %ebx,%esi
  call   <ASN1_INTEGER_set@plt>
  test   %eax,%eax
  jne    L37
  jmp    L91
```

assistant: ```c
X509_ALGOR *PKCS5_pbkdf2_set(int iter, unsigned char *salt, int saltlen, int prf_nid, int keylen) {
  X509_ALGOR *keyfunc = NULL;
  PBKDF2PARAM *kdf = NULL;
  ASN1_OCTET_STRING *osalt = NULL;
  if (!(kdf = PBKDF2PARAM_new()))
    goto merr;
  if (!(osalt = ASN1_OCTET_STRING_new()))
    goto merr;
  kdf->salt->value.octet_string = osalt;
  kdf->salt->type = V_ASN1_OCTET_STRING;
  if (!saltlen)
    saltlen = PKCS5_SALT_LEN;
  if (!(osalt->data = malloc(saltlen)))
    goto merr;
  osalt->length = saltlen;
  if (salt)
    memcpy(osalt->data, salt, saltlen);
  else
    arc4random_buf(osalt->data, saltlen);
  if (iter <= 0)
    iter = PKCS5_DEFAULT_ITER;
  if (!ASN1_INTEGER_set(kdf->iter, iter))
    goto merr;
  if (keylen > 0) {
    if (!(kdf->keylength = ASN1_INTEGER_new()))
      goto merr;
    if (!ASN1_INTEGER_set(kdf->keylength, keylen))
      goto merr;
  }
  if (prf_nid > 0 && prf_nid != NID_hmacWithSHA1) {
    kdf->prf = X509_ALGOR_new();
    if (!kdf->prf)
      goto merr;
    X509_ALGOR_set0(kdf->prf, OBJ_nid2obj(prf_nid), V_ASN1_NULL, NULL);
  }
  keyfunc = X509_ALGOR_new();
  if (!keyfunc)
    goto merr;
  keyfunc->algorithm = OBJ_nid2obj(NID_id_pbkdf2);
  if (!(keyfunc->parameter = ASN1_TYPE_new()))
    goto merr;
  if (!ASN1_item_pack(kdf, &PBKDF2PARAM_it, &keyfunc->parameter->value.sequence))
    goto merr;
  keyfunc->parameter->type = V_ASN1_SEQUENCE;
  PBKDF2PARAM_free(kdf);
  return keyfunc;
merr:
  ASN1error(ERR_R_MALLOC_FAILURE);
  PBKDF2PARAM_free(kdf);
  X509_ALGOR_free(keyfunc);
  return NULL;
}
```