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

```asm
<un3DES>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x190,%rsp
  mov    %rcx,%r13
  mov    0x1c0(%rsp),%rax
  mov    %fs:0x28,%rcx
  mov    %rcx,0x188(%rsp)
  xor    %ecx,%ecx
  test   %rdi,%rdi
  je     L55
  mov    %rdi,%rbp
  mov    %esi,%r12d
  mov    %r8,%r14
  mov    %r9,%rbx
  test   %r9,%r9
  je     L55
  test   %rdx,%rdx
  je     L25
  test   %r13,%r13
  je     L25
  test   %r8,%r8
  sete   %cl
  test   %rax,%rax
  sete   %sil
  or     %sil,%cl
  jne    L146
  test   %r12d,%r12d
  je     L146
  mov    %r12d,%ecx
  shr    $0x3,%ecx
  mov    %r12d,%esi
  and    $0x7,%esi
  cmp    $0x1,%esi
  sbb    $0xffffffff,%ecx
  shl    $0x3,%ecx
  mov    %ecx,(%rax)
  mov    %rsp,%rsi
  mov    %rdx,%rdi
  call   <genKey@plt>
  lea    0x80(%rsp),%rsi
  mov    %r13,%rdi
  call   <genKey@plt>
  lea    0x100(%rsp),%rsi
  mov    %r14,%rdi
  call   <genKey@plt>
  movb   $0x0,0x180(%rsp)
  movb   $0x0,0x181(%rsp)
  movb   $0x0,0x182(%rsp)
  movb   $0x0,0x183(%rsp)
  movb   $0x0,0x184(%rsp)
  movb   $0x0,0x185(%rsp)
  movb   $0x0,0x186(%rsp)
  movb   $0x0,0x187(%rsp)
  lea    0x100(%rsp),%r13
  mov    $0x1,%eax
  test   %r12d,%r12d
  jg     L154
  jmp    L69
L147:
  mov    %rsp,%rdx
  lea    0x180(%rsp),%rdi
  mov    $0x2,%ecx
  mov    %rbx,%rsi
  call   <comDES@plt>
  add    $0x8,%rbp
  add    $0x8,%rbx
  sub    $0x8,%r12d
  test   %r12d,%r12d
  jle    L76
L154:
  movb   $0x0,0x180(%rsp)
  movb   $0x0,0x181(%rsp)
  movb   $0x0,0x182(%rsp)
  movb   $0x0,0x183(%rsp)
  movb   $0x0,0x184(%rsp)
  movb   $0x0,0x185(%rsp)
  movb   $0x0,0x186(%rsp)
  movb   $0x0,0x187(%rsp)
  mov    $0x8,%ecx
  cmp    %ecx,%r12d
  cmovle %r12d,%ecx
  mov    $0x0,%eax
  test   %r12d,%r12d
  jle    L38
L43:
  movzbl 0x0(%rbp,%rax,1),%edx
  mov    %dl,0x180(%rsp,%rax,1)
  add    $0x1,%rax
  cmp    %eax,%ecx
  jg     L43
L38:
  lea    0x180(%rsp),%rdi
  mov    $0x2,%ecx
  mov    %r13,%rdx
  mov    %rbx,%rsi
  call   <comDES@plt>
  mov    $0x0,%eax
L99:
  movzbl (%rbx,%rax,1),%edx
  mov    %dl,0x180(%rsp,%rax,1)
  add    $0x1,%rax
  cmp    $0x8,%rax
  jne    L99
  lea    0x80(%rsp),%rdx
  lea    0x180(%rsp),%rdi
  mov    $0x1,%ecx
  mov    %rbx,%rsi
  call   <comDES@plt>
  mov    $0x0,%eax
L71:
  movzbl (%rbx,%rax,1),%edx
  mov    %dl,0x180(%rsp,%rax,1)
  add    $0x1,%rax
  cmp    $0x8,%rax
  jne    L71
  jmp    L147
L55:
  mov    $0x0,%eax
L69:
  mov    0x188(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L139
  add    $0x190,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L25:
  mov    $0x0,%eax
  jmp    L69
L146:
  mov    $0x0,%eax
  jmp    L69
L76:
  mov    $0x1,%eax
  jmp    L69
L139:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
unsigned char un3DES(unsigned char *indata, unsigned int inlen, unsigned char *key_1, unsigned char *key_2, unsigned char *key_3, unsigned char *outdata, unsigned int *outlen) {
  unsigned char *p, *p1, s_key_1[16][8], s_key_2[16][8], s_key_3[16][8], tt[8];
  int tlen = 0, i = 0, ttlen = 0;
  if ((indata == NULL) || (outdata == NULL) || (key_1 == NULL) || (key_2 == NULL) || (key_3 == NULL) || (outlen == NULL) || (inlen <= 0))
    return 0;
  p = indata;
  tlen = inlen / 8;
  if (inlen % 8 != 0)
    tlen = tlen + 1;
  tlen = tlen * 8;
  *outlen = tlen;
  genKey(key_1, s_key_1);
  genKey(key_2, s_key_2);
  genKey(key_3, s_key_3);
  p1 = outdata;
  tlen = inlen;
  for (i = 0; i < 8; i++)
    tt[i] = 0;
  while (tlen > 0) {
    for (i = 0; i < 8; i++)
      tt[i] = 0;
    ttlen = (tlen < 8) ? tlen : 8;
    for (i = 0; i < ttlen; i++)
      tt[i] = *(p + i);
    comDES(tt, p1, s_key_3, 2);
    for (i = 0; i < 8; i++)
      tt[i] = p1[i];
    comDES(tt, p1, s_key_2, 1);
    for (i = 0; i < 8; i++)
      tt[i] = p1[i];
    comDES(tt, p1, s_key_1, 2);
    p = p + 8;
    p1 = p1 + 8;
    tlen = tlen - 8;
  }
  return 1;
}
```