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

```asm
<enctype2_encoder>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x550,%rsp
  mov    %rdi,-0x538(%rbp)
  mov    %rsi,-0x540(%rbp)
  mov    %edx,-0x544(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x8,-0x52c(%rbp)
  mov    -0x544(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,-0x530(%rbp)
  jmp    L25
L24:
  mov    -0x530(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x540(%rbp),%rax
  add    %rdx,%rax
  mov    -0x52c(%rbp),%edx
  lea    0x1(%rdx),%ecx
  mov    -0x530(%rbp),%edx
  add    %ecx,%edx
  movslq %edx,%rcx
  mov    -0x540(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  subl   $0x1,-0x530(%rbp)
L25:
  cmpl   $0x0,-0x530(%rbp)
  jns    L24
  mov    -0x52c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x540(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x540(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x528(%rbp)
  mov    -0x540(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x528(%rbp),%rax
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  movl   $0x100,-0x530(%rbp)
  jmp    L3
L28:
  mov    -0x530(%rbp),%eax
  cltq
  movl   $0x0,-0x520(%rbp,%rax,4)
  addl   $0x1,-0x530(%rbp)
L3:
  cmpl   $0x145,-0x530(%rbp)
  jle    L28
  mov    -0x540(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%ecx
  lea    -0x520(%rbp),%rdx
  mov    -0x528(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <encshare4@plt>
  mov    -0x540(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x544(%rbp),%eax
  cltq
  add    %rdx,%rax
  lea    0x1(%rax),%rdx
  mov    -0x540(%rbp),%rax
  add    %rdx,%rax
  mov    $0x6,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0x544(%rbp),%eax
  lea    0x6(%rax),%edx
  mov    -0x540(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%ecx
  mov    -0x528(%rbp),%rax
  add    %rax,%rcx
  lea    -0x520(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <encshare1@plt>
  movl   $0x0,-0x530(%rbp)
  jmp    L68
L55:
  mov    -0x530(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x528(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%ecx
  mov    -0x530(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x538(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x530(%rbp),%eax
  movslq %eax,%rsi
  mov    -0x528(%rbp),%rax
  add    %rsi,%rax
  xor    %ecx,%edx
  mov    %dl,(%rax)
  addl   $0x1,-0x530(%rbp)
L68:
  mov    -0x530(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x538(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L55
  mov    -0x540(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    $0x7,%eax
  add    %eax,-0x544(%rbp)
  mov    -0x540(%rbp),%rax
  movzbl (%rax),%eax
  xor    $0xffffffec,%eax
  mov    %eax,%edx
  mov    -0x540(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x544(%rbp),%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L35
  call   <__stack_chk_fail@plt>
L35:
  leave
  ret
```

assistant: ```c
int enctype2_encoder(unsigned char *key, unsigned char *data, int size) {
  unsigned int dest[326];
  int i;
  unsigned char *datap;
  int header_size = 8;
  for (i = size - 1; i >= 0; i--) {
    data[1 + header_size + i] = data[i];
  }
  *data = header_size;
  datap = data + 1;
  memset(datap, 0, *data);
  for (i = 256; i < 326; i++)
    dest[i] = 0;
  encshare4(datap, *data, dest);
  memset(data + 1 + *data + size, 0, 6);
  encshare1(dest, datap + *data, size + 6);
  for (i = 0; key[i]; i++)
    datap[i] ^= key[i];
  size += 1 + *data + 6;
  *data ^= 0xec;
  return size;
}
```