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

```asm
<iCvmDoVerify>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  movl   $0x0,(%rsi)
  movzbl (%rdi),%eax
  and    $0x3f,%eax
  cmp    $0x20,%al
  ja     L60
  lea    D2(%rip),%rdx
  movzbl %al,%eax
  mov    %rdi,%rbx
  mov    %rsi,%rbp
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  nopw   0x0(%rax,%rax,1)
L60:
  mov    $0x1,%edx
  mov    $0x11,%esi
  mov    $0x2,%edi
  mov    $0xffffffff,%r12d
  call   <iEmvSetItemBit@plt>
L143:
  mov    %r12d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopw   0x0(%rax,%rax,1)
  mov    $0x8,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L217
  xor    %eax,%eax
  call   <iCvmVerifyOfflinePlainPin@plt>
  mov    %eax,%r12d
  test   %eax,%eax
  je     L104
L54:
  cmp    $0xffffffff,%r12d
  jne    L143
L42:
  mov    $0xfffffffd,%r12d
  movb   $0x1,0x2(%rbx)
  pop    %rbx
  mov    %r12d,%eax
  pop    %rbp
  pop    %r12
  ret
  nopl   (%rax)
  mov    $0xfffffffe,%r12d
  mov    $0xb,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  mov    %r12d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   (%rax)
  mov    $0xf,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  jne    L212
L217:
  mov    $0xfffffffe,%r12d
  pop    %rbx
  pop    %rbp
  mov    %r12d,%eax
  pop    %r12
  ret
  nopl   (%rax)
  mov    $0x8,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L217
  mov    $0xa,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L217
  movl   $0x1,0x0(%rbp)
  xor    %eax,%eax
  call   <iCvmVerifyOfflinePlainPin@plt>
  mov    %eax,%r12d
  test   %eax,%eax
  jne    L54
  movb   $0x0,0x2(%rbx)
  jmp    L143
  mov    $0xb,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L217
  mov    $0xa,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L217
  movl   $0x1,0x0(%rbp)
  jmp    L217
  nopw   0x0(%rax,%rax,1)
  mov    $0xa,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L217
  movl   $0x1,0x0(%rbp)
  xor    %r12d,%r12d
  movb   $0x0,0x2(%rbx)
  jmp    L143
  nopw   0x0(%rax,%rax,1)
  mov    $0xc,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L217
L104:
  movb   $0x2,0x2(%rbx)
  xor    %r12d,%r12d
  jmp    L143
  nopl   0x0(%rax,%rax,1)
  mov    $0x9,%esi
  mov    $0x4,%edi
  call   <iEmvTestItemBit@plt>
  test   %eax,%eax
  je     L217
  xor    %eax,%eax
  call   <iCvmEnterOnlinePin@plt>
  mov    %eax,%r12d
  test   %eax,%eax
  je     L231
  cmp    $0x1,%eax
  jne    L143
  jmp    L42
  nopl   0x0(%rax,%rax,1)
L212:
  xor    %eax,%eax
  call   <iEmvTermEnvironment@plt>
  cmp    $0x1,%eax
  jne    L217
  xor    %eax,%eax
  call   <iCvmVerifyHolderId@plt>
  mov    %eax,%r12d
  test   %eax,%eax
  je     L104
  jmp    L54
  nopl   0x0(%rax,%rax,1)
L231:
  movb   $0x0,0x2(%rbx)
  mov    $0x1,%edx
  mov    $0x15,%esi
  mov    $0x2,%edi
  call   <iEmvSetItemBit@plt>
  jmp    L143
```

assistant: ```c
int iCvmDoVerify(unsigned char *psCvmResult, int *piNeedSignFlag) {
  int iRet;
  int iCvmRecognisedFlag;
  int iCvmSupportFlag;
  int iCvmPassFlag;
  iCvmSupportFlag = 0;
  *piNeedSignFlag = 0;
  iCvmRecognisedFlag = 1;
  iCvmPassFlag = 0;
  switch (psCvmResult[0] & 0x3F) {
  case 0:
    iCvmSupportFlag = 1;
    psCvmResult[2] = 1;
    break;
  case 1:
    if (iEmvTestItemBit(4, 8) == 0)
      break;
    iCvmSupportFlag = 1;
    iRet = iCvmVerifyOfflinePlainPin();
    if (iRet == 0) {
      iCvmPassFlag = 1;
      psCvmResult[2] = 2;
      break;
    }
    if (iRet == -1) {
      psCvmResult[2] = 1;
      break;
    }
    return (iRet);
  case 3:
    if (iEmvTestItemBit(4, 8) == 0)
      break;
    if (iEmvTestItemBit(4, 10) == 0)
      break;
    *piNeedSignFlag = 1;
    iCvmSupportFlag = 1;
    iRet = iCvmVerifyOfflinePlainPin();
    if (iRet == 0) {
      iCvmPassFlag = 1;
      psCvmResult[2] = 0;
      break;
    }
    if (iRet == -1) {
      psCvmResult[2] = 1;
      break;
    }
    return (iRet);
  case 2:
    if (iEmvTestItemBit(4, 9) == 0)
      break;
    iCvmSupportFlag = 1;
    iRet = iCvmEnterOnlinePin();
    if (iRet == 0) {
      iCvmPassFlag = 1;
      psCvmResult[2] = 0;
      iEmvSetItemBit(2, 21, 1);
      break;
    }
    if (iRet == 1) {
      psCvmResult[2] = 1;
      break;
    }
    return (iRet);
    break;
  case 4:
    if (iEmvTestItemBit(4, 11) == 0)
      break;
    break;
  case 5:
    if (iEmvTestItemBit(4, 11) == 0)
      break;
    if (iEmvTestItemBit(4, 10) == 0)
      break;
    *piNeedSignFlag = 1;
    break;
  case 0x1E:
    if (iEmvTestItemBit(4, 10) == 0)
      break;
    iCvmSupportFlag = 1;
    *piNeedSignFlag = 1;
    psCvmResult[2] = 0;
    iCvmPassFlag = 1;
    break;
  case 0x1F:
    if (iEmvTestItemBit(4, 12) == 0)
      break;
    iCvmSupportFlag = 1;
    psCvmResult[2] = 2;
    iCvmPassFlag = 1;
    break;
  case 0x20:
    if (iEmvTestItemBit(4, 15) == 0)
      break;
    if (iEmvTermEnvironment() != 1)
      break;
    iCvmSupportFlag = 1;
    iRet = iCvmVerifyHolderId();
    if (iRet == 0) {
      iCvmPassFlag = 1;
      psCvmResult[2] = 2;
      break;
    }
    if (iRet == -1) {
      psCvmResult[2] = 1;
      break;
    }
    return (iRet);
    break;
  default:
    iCvmRecognisedFlag = 0;
    break;
  }
  if (iCvmRecognisedFlag == 0) {
    iEmvSetItemBit(2, 17, 1);
    return (-1);
  }
  if (iCvmSupportFlag == 0) {
    return (-2);
  }
  if (iCvmPassFlag == 0) {
    return (-3);
  }
  return (0);
}
```