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

```asm
<PKCS5_pbkdf2_set>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %edi,%r13d
  mov    %rsi,%r14
  mov    %edx,%r12d
  mov    %ecx,%r15d
  mov    %r8d,0xc(%rsp)
  mov    $0x0,%eax
  call   <PBKDF2PARAM_new@plt>
  mov    %rax,%rbp
  test   %rax,%rax
  je     L178
  mov    $0x0,%eax
  call   <ASN1_OCTET_STRING_new@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  je     L129
  mov    0x10(%rbp),%rax
  mov    %rbx,0x8(%rax)
  mov    0x10(%rbp),%rax
  mov    D20(%rip),%rdx
  mov    (%rdx),%edx
  mov    %edx,(%rax)
  test   %r12d,%r12d
  jne    L58
  mov    D26(%rip),%rax
  mov    (%rax),%r12d
L58:
  mov    %r12d,%edi
  call   <malloc@plt>
  mov    %eax,%edi
  mov    %eax,0x4(%rbx)
  test   %eax,%eax
  je     L144
  mov    %r12d,(%rbx)
  test   %r14,%r14
  je     L239
  mov    %r12d,%edx
  mov    %r14,%rsi
  call   <memcpy@plt>
L159:
  test   %r13d,%r13d
  jle    L90
L93:
  mov    0xc(%rbp),%edi
  mov    %r13d,%esi
  call   <ASN1_INTEGER_set@plt>
  test   %eax,%eax
  je     L89
  mov    0xc(%rsp),%ebx
  test   %ebx,%ebx
  jg     L14
L212:
  test   %r15d,%r15d
  jle    L175
  mov    D24(%rip),%rax
  cmp    %r15d,(%rax)
  jne    L209
L175:
  mov    $0x0,%eax
  call   <X509_ALGOR_new@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  je     L129
  mov    D52(%rip),%rax
  mov    (%rax),%edi
  call   <OBJ_nid2obj@plt>
  mov    %eax,0x8(%rbx)
  mov    $0x0,%eax
  call   <ASN1_TYPE_new@plt>
  mov    %rax,(%rbx)
  test   %rax,%rax
  je     L129
  lea    0x4(%rax),%rdx
  mov    D39(%rip),%rsi
  mov    %rbp,%rdi
  call   <ASN1_item_pack@plt>
  test   %eax,%eax
  je     L129
  mov    (%rbx),%rax
  mov    D4(%rip),%rdx
  mov    (%rdx),%edx
  mov    %edx,(%rax)
  mov    %rbp,%rdi
  call   <PBKDF2PARAM_free@plt>
  jmp    L44
L239:
  mov    %r12d,%esi
  call   <arc4random_buf@plt>
  jmp    L159
L90:
  mov    D78(%rip),%rax
  mov    (%rax),%r13d
  jmp    L93
L14:
  mov    $0x0,%eax
  call   <ASN1_INTEGER_new@plt>
  mov    %eax,%edi
  mov    %eax,0x8(%rbp)
  test   %eax,%eax
  je     L189
  mov    %ebx,%esi
  call   <ASN1_INTEGER_set@plt>
  test   %eax,%eax
  jne    L212
  mov    $0x0,%ebx
  jmp    L129
L209:
  mov    $0x0,%eax
  call   <X509_ALGOR_new@plt>
  mov    %rax,%rbx
  mov    %rax,0x0(%rbp)
  test   %rax,%rax
  je     L129
  mov    D56(%rip),%rax
  mov    (%rax),%ebx
  mov    %r15d,%edi
  call   <OBJ_nid2obj@plt>
  mov    %eax,%esi
  mov    $0x0,%ecx
  mov    %ebx,%edx
  mov    0x0(%rbp),%rdi
  call   <X509_ALGOR_set0@plt>
  jmp    L175
L178:
  mov    %rax,%rbx
L129:
  mov    D31(%rip),%rax
  mov    (%rax),%edi
  call   <ASN1error@plt>
  mov    %rbp,%rdi
  call   <PBKDF2PARAM_free@plt>
  mov    %rbx,%rdi
  call   <X509_ALGOR_free@plt>
  mov    $0x0,%ebx
L44:
  mov    %rbx,%rax
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L144:
  mov    $0x0,%ebx
  jmp    L129
L89:
  mov    $0x0,%ebx
  jmp    L129
L189:
  mov    $0x0,%ebx
  jmp    L129
```

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;
}
```