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

```asm
<des_encrypt>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  mov    %esi,%r13d
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x78,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x68(%rsp)
  xor    %eax,%eax
  test   %rdx,%rdx
  je     L64
  lea    -0x1(%rsi),%r14d
  neg    %r14d
  and    $0x7,%r14d
  lea    (%r14,%rsi,1),%eax
  cmp    $0x106,%eax
  jg     L19
  mov    %rdi,%rbx
  xor    %eax,%eax
  lea    0x59(%rsp),%rdi
  mov    %r14d,%esi
  mov    %rdx,%r12
  call   <des_random_get@plt>
  test   %r14d,%r14d
  je     L168
  lea    0x1(%r13),%edx
  xor    %eax,%eax
  movslq %edx,%rdx
  nop
L40:
  movzbl 0x59(%rsp,%rax,1),%eax
  mov    %edx,%ebp
  mov    %al,-0x1(%rbx,%rdx,1)
  mov    %edx,%eax
  add    $0x1,%rdx
  sub    %r13d,%eax
  movswq %ax,%rax
  cmp    %eax,%r14d
  jg     L40
L210:
  lea    0x1(%rbp),%eax
  movslq %ebp,%r8
  movslq %eax,%r14
  mov    %eax,0xc(%rsp)
  add    %rbx,%r8
  add    %rbx,%r14
  cmp    $0x2,%ebp
  jle    L198
  lea    -0xa(%rbp),%eax
  cmp    $0x7ff5,%eax
  ja     L222
  lea    -0x3(%rbp),%eax
  lea    -0x2(%rbp),%edi
  cmp    $0xe,%eax
  jbe    L105
  mov    %edi,%ecx
  xor    %eax,%eax
  pxor   %xmm0,%xmm0
  shr    $0x4,%ecx
  nopl   0x0(%rax)
L221:
  mov    %rax,%rdx
  add    $0x1,%rax
  shl    $0x4,%rdx
  movdqu 0x2(%rbx,%rdx,1),%xmm1
  pxor   %xmm1,%xmm0
  cmp    %eax,%ecx
  ja     L221
  movdqa %xmm0,%xmm1
  mov    %edi,%edx
  psrldq $0x8,%xmm1
  and    $0xfffffff0,%edx
  pxor   %xmm1,%xmm0
  lea    0x2(%rdx),%esi
  movdqa %xmm0,%xmm1
  psrldq $0x4,%xmm1
  pxor   %xmm1,%xmm0
  movdqa %xmm0,%xmm1
  psrldq $0x2,%xmm1
  pxor   %xmm1,%xmm0
  movdqa %xmm0,%xmm1
  psrldq $0x1,%xmm1
  pxor   %xmm1,%xmm0
  movd   %xmm0,%eax
  cmp    %edi,%edx
  je     L215
  mov    %ebp,%ecx
  sub    %edx,%ecx
  lea    -0x2(%rcx),%edi
  sub    $0x3,%ecx
  cmp    $0x6,%ecx
  jbe    L45
L225:
  add    $0x2,%edx
  mov    (%rbx,%rdx,1),%rdx
  movzbl %dh,%ecx
  mov    %edx,%r9d
  mov    %rdx,0x48(%rsp)
  xor    %r9d,%ecx
  mov    %rdx,0x40(%rsp)
  xor    %eax,%ecx
  mov    %rdx,%rax
  mov    %rdx,0x38(%rsp)
  shr    $0x10,%rax
  mov    %rdx,0x30(%rsp)
  xor    %eax,%ecx
  mov    %rdx,%rax
  mov    %rdx,0x28(%rsp)
  shr    $0x18,%rax
  mov    %rdx,0x20(%rsp)
  xor    %eax,%ecx
  mov    %rdx,%rax
  mov    %rdx,0x18(%rsp)
  shr    $0x20,%rax
  mov    %rdx,0x10(%rsp)
  xor    %eax,%ecx
  mov    %rdx,%rax
  shr    $0x28,%rax
  xor    %eax,%ecx
  mov    %rdx,%rax
  shr    $0x30,%rax
  xor    %eax,%ecx
  mov    %rdx,%rax
  mov    %edi,%edx
  shr    $0x38,%rax
  and    $0xfffffff8,%edx
  xor    %ecx,%eax
  add    %edx,%esi
  cmp    %edx,%edi
  je     L215
L45:
  movswq %si,%rdx
  xor    (%rbx,%rdx,1),%al
  lea    0x1(%rsi),%edx
  movswl %dx,%ecx
  cmp    %ebp,%ecx
  jge    L215
  movswq %dx,%rdx
  xor    (%rbx,%rdx,1),%al
  lea    0x2(%rsi),%edx
  movswl %dx,%ecx
  cmp    %ecx,%ebp
  jle    L215
  movswq %dx,%rdx
  xor    (%rbx,%rdx,1),%al
  lea    0x3(%rsi),%edx
  movswl %dx,%ecx
  cmp    %ebp,%ecx
  jge    L215
  movswq %dx,%rdx
  xor    (%rbx,%rdx,1),%al
  lea    0x4(%rsi),%edx
  movswl %dx,%ecx
  cmp    %ebp,%ecx
  jge    L215
  movswq %dx,%rdx
  xor    (%rbx,%rdx,1),%al
  lea    0x5(%rsi),%edx
  movswl %dx,%ecx
  cmp    %ecx,%ebp
  jle    L215
  movswq %dx,%rdx
  add    $0x6,%esi
  xor    (%rbx,%rdx,1),%al
  movswl %si,%edx
  cmp    %edx,%ebp
  jle    L215
  movswq %si,%rsi
  xor    (%rbx,%rsi,1),%al
L215:
  mov    %al,(%r8)
  lea    0x60(%rsp),%rdi
  mov    $0x8,%esi
  xor    %eax,%eax
  call   <des_random_get@plt>
  mov    0x60(%rsp),%rax
  mov    %rax,(%r14)
L94:
  lea    0x8(%r12),%r14
  mov    $0x2,%r15d
  mov    $0x2,%eax
  nopl   0x0(%rax)
L124:
  movswq %r15w,%r8
  movzbl 0x60(%rsp),%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  lea    (%rbx,%r8,1),%r13
  movzbl 0x61(%rsp),%ecx
  add    $0x8,%r15d
  xor    %dl,0x0(%r13)
  lea    0x1(%rax),%edx
  mov    %r13,%r8
  movslq %edx,%rdx
  xor    %cl,(%rbx,%rdx,1)
  lea    0x2(%rax),%edx
  movzbl 0x62(%rsp),%ecx
  movslq %edx,%rdx
  xor    %cl,(%rbx,%rdx,1)
  lea    0x3(%rax),%edx
  movzbl 0x63(%rsp),%ecx
  movslq %edx,%rdx
  xor    %cl,(%rbx,%rdx,1)
  lea    0x4(%rax),%edx
  movzbl 0x64(%rsp),%ecx
  movslq %edx,%rdx
  xor    %cl,(%rbx,%rdx,1)
  lea    0x5(%rax),%edx
  movzbl 0x65(%rsp),%ecx
  movslq %edx,%rdx
  xor    %cl,(%rbx,%rdx,1)
  lea    0x6(%rax),%edx
  add    $0x7,%eax
  movzbl 0x66(%rsp),%ecx
  movslq %edx,%rdx
  cltq
  xor    %cl,(%rbx,%rdx,1)
  movzbl 0x67(%rsp),%edx
  mov    $0x1,%ecx
  xor    %dl,(%rbx,%rax,1)
  mov    $0x3,%edx
  xor    %eax,%eax
  call   <EuroDes@plt>
  mov    0x0(%r13),%rax
  mov    %rax,0x60(%rsp)
  movswl %r15w,%eax
  cmp    0xc(%rsp),%eax
  jl     L124
L228:
  lea    0x9(%rbp),%eax
L102:
  mov    0x68(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L98
  add    $0x78,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L64:
  mov    %esi,%eax
  jmp    L102
L222:
  mov    $0x2,%edx
  xor    %eax,%eax
  nopl   0x0(%rax,%rax,1)
L153:
  movswq %dx,%rcx
  add    $0x1,%edx
  xor    (%rbx,%rcx,1),%al
  movswl %dx,%ecx
  cmp    %ecx,%ebp
  jg     L153
  jmp    L215
L198:
  movb   $0x0,(%r8)
  xor    %eax,%eax
  lea    0x60(%rsp),%rdi
  mov    $0x8,%esi
  call   <des_random_get@plt>
  mov    0x60(%rsp),%rax
  cmpl   $0x2,0xc(%rsp)
  mov    %rax,(%r14)
  jle    L228
  jmp    L94
  nop
L168:
  mov    %r13d,%ebp
  jmp    L210
L105:
  xor    %eax,%eax
  mov    $0x2,%esi
  xor    %edx,%edx
  jmp    L225
L19:
  mov    $0xffffffff,%eax
  jmp    L102
L98:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int des_encrypt(unsigned char *buffer, int len, unsigned char *deskey) {
  unsigned char checksum = 0;
  unsigned char noPadBytes;
  unsigned char padBytes[7];
  char ivec[8];
  short i;
  if (!deskey)
    return len;
  noPadBytes = (8 - ((len - 1) % 8)) % 8;
  if (len + noPadBytes + 1 >= 272 - 8)
    return -1;
  des_random_get(padBytes, noPadBytes);
  for (i = 0; i < noPadBytes; i++)
    buffer[len++] = padBytes[i];
  for (i = 2; i < len; i++)
    checksum ^= buffer[i];
  buffer[len++] = checksum;
  des_random_get((unsigned char *)ivec, 8);
  memcpy(buffer + len, ivec, 8);
  for (i = 2; i < len; i += 8) {
    unsigned char j;
    const unsigned char flags = (1 << 0) | (1 << 1);
    for (j = 0; j < 8; j++)
      buffer[i + j] ^= ivec[j];
    EuroDes(deskey, deskey + 8, flags, 1, buffer + i);
    memcpy(ivec, buffer + i, 8);
  }
  len += 8;
  return len;
}
```