user: Demonstrate the C code that generates the assembly output below:

```asm
<ntlm_crypt>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x78,%rsp
  mov    %rdi,%rbx
  mov    %fs:0x28,%rax
  mov    %rax,0x68(%rsp)
  xor    %eax,%eax
  call   <strlen@plt>
  mov    %rax,%rdi
  movabs $0x3736353433323130,%rax
  movabs $0x6665646362613938,%rdx
  mov    %rax,0x50(%rsp)
  mov    %rdx,0x58(%rsp)
  movq   $0x0,0x10(%rsp)
  movq   $0x0,0x18(%rsp)
  movq   $0x0,0x20(%rsp)
  movq   $0x0,0x28(%rsp)
  movq   $0x0,0x30(%rsp)
  movq   $0x0,0x38(%rsp)
  movq   $0x0,0x40(%rsp)
  movq   $0x0,0x48(%rsp)
  mov    %edi,%ecx
  shr    $0x1f,%ecx
  add    %edi,%ecx
  sar    %ecx
  cmp    $0x1,%edi
  jle    L43
  mov    $0x0,%eax
L11:
  movsbl 0x1(%rbx,%rax,2),%edx
  shl    $0x10,%edx
  movsbl (%rbx,%rax,2),%esi
  or     %esi,%edx
  mov    %edx,0x10(%rsp,%rax,4)
  add    $0x1,%rax
  cmp    %eax,%ecx
  jg     L11
  test   %ecx,%ecx
  mov    $0x1,%eax
  cmovle %eax,%ecx
L24:
  mov    %edi,%edx
  shr    $0x1f,%edx
  lea    (%rdx,%rdi,1),%eax
  and    $0x1,%eax
  sub    %edx,%eax
  mov    $0x80,%edx
  cmp    $0x1,%eax
  je     L51
L75:
  movslq %ecx,%rcx
  mov    %edx,0x10(%rsp,%rcx,4)
  shl    $0x4,%edi
  mov    0x10(%rsp),%r13d
  lea    -0x1(%r13),%eax
  rol    $0x3,%eax
  mov    0x14(%rsp),%r10d
  mov    %eax,%edx
  and    $0x77777777,%edx
  xor    $0x98badcfe,%edx
  lea    0x10325476(%r10,%rdx,1),%edx
  rol    $0x7,%edx
  mov    0x18(%rsp),%r11d
  mov    %eax,%ecx
  xor    $0xefcdab89,%ecx
  and    %edx,%ecx
  xor    $0xefcdab89,%ecx
  lea    -0x67452302(%r11,%rcx,1),%esi
  rol    $0xb,%esi
  mov    0x1c(%rsp),%r8d
  mov    %eax,%ecx
  xor    %edx,%ecx
  and    %esi,%ecx
  xor    %eax,%ecx
  lea    -0x10325477(%r8,%rcx,1),%ecx
  ror    $0xd,%ecx
  mov    0x20(%rsp),%ebp
  lea    0x0(%rbp,%rax,1),%r9d
  mov    %edx,%eax
  xor    %esi,%eax
  and    %ecx,%eax
  xor    %edx,%eax
  add    %r9d,%eax
  rol    $0x3,%eax
  add    0x24(%rsp),%edx
  mov    %edx,%r9d
  mov    %esi,%edx
  xor    %ecx,%edx
  and    %eax,%edx
  xor    %esi,%edx
  add    %r9d,%edx
  rol    $0x7,%edx
  add    0x28(%rsp),%esi
  mov    %esi,%r9d
  mov    %ecx,%esi
  xor    %eax,%esi
  and    %edx,%esi
  xor    %ecx,%esi
  add    %r9d,%esi
  rol    $0xb,%esi
  add    0x2c(%rsp),%ecx
  mov    %eax,%r9d
  xor    %edx,%r9d
  and    %esi,%r9d
  xor    %eax,%r9d
  add    %ecx,%r9d
  ror    $0xd,%r9d
  mov    0x30(%rsp),%r12d
  add    %r12d,%eax
  mov    %edx,%ecx
  xor    %esi,%ecx
  and    %r9d,%ecx
  xor    %edx,%ecx
  add    %eax,%ecx
  rol    $0x3,%ecx
  add    0x34(%rsp),%edx
  mov    %esi,%eax
  xor    %r9d,%eax
  and    %ecx,%eax
  xor    %esi,%eax
  add    %edx,%eax
  rol    $0x7,%eax
  add    0x38(%rsp),%esi
  mov    %r9d,%edx
  xor    %ecx,%edx
  and    %eax,%edx
  xor    %r9d,%edx
  add    %esi,%edx
  rol    $0xb,%edx
  add    0x3c(%rsp),%r9d
  mov    %ecx,%esi
  xor    %eax,%esi
  and    %edx,%esi
  xor    %ecx,%esi
  add    %r9d,%esi
  ror    $0xd,%esi
  mov    0x40(%rsp),%ebx
  add    %ebx,%ecx
  mov    %eax,%r14d
  xor    %edx,%r14d
  and    %esi,%r14d
  xor    %eax,%r14d
  add    %ecx,%r14d
  rol    $0x3,%r14d
  mov    0x44(%rsp),%r9d
  add    %r9d,%eax
  mov    %edx,%ecx
  xor    %esi,%ecx
  and    %r14d,%ecx
  xor    %edx,%ecx
  add    %eax,%ecx
  rol    $0x7,%ecx
  mov    %esi,%eax
  xor    %r14d,%eax
  and    %ecx,%eax
  xor    %esi,%eax
  add    %edx,%eax
  add    %edi,%eax
  rol    $0xb,%eax
  add    0x4c(%rsp),%esi
  mov    %r14d,%edx
  xor    %ecx,%edx
  and    %eax,%edx
  xor    %r14d,%edx
  add    %esi,%edx
  ror    $0xd,%edx
  lea    0x5a827999(%r13,%r14,1),%esi
  mov    %ecx,%r14d
  or     %eax,%r14d
  and    %edx,%r14d
  mov    %ecx,%r15d
  and    %eax,%r15d
  or     %r15d,%r14d
  add    %esi,%r14d
  rol    $0x3,%r14d
  lea    0x5a827999(%rbp,%rcx,1),%ecx
  mov    %eax,%esi
  or     %edx,%esi
  and    %r14d,%esi
  mov    %eax,%r15d
  and    %edx,%r15d
  or     %r15d,%esi
  add    %ecx,%esi
  rol    $0x5,%esi
  lea    0x5a827999(%r12,%rax,1),%eax
  mov    %edx,%ecx
  or     %r14d,%ecx
  and    %esi,%ecx
  mov    %edx,%r15d
  and    %r14d,%r15d
  or     %r15d,%ecx
  add    %eax,%ecx
  rol    $0x9,%ecx
  lea    0x5a827999(%rbx,%rdx,1),%eax
  mov    %r14d,%edx
  or     %esi,%edx
  and    %ecx,%edx
  mov    %r14d,%r15d
  and    %esi,%r15d
  or     %r15d,%edx
  add    %eax,%edx
  rol    $0xd,%edx
  lea    0x5a827999(%r10,%r14,1),%r14d
  mov    %esi,%eax
  or     %ecx,%eax
  and    %edx,%eax
  mov    %esi,%r15d
  and    %ecx,%r15d
  or     %r15d,%eax
  add    %r14d,%eax
  rol    $0x3,%eax
  mov    0x24(%rsp),%r14d
  lea    0x5a827999(%r14,%rsi,1),%r14d
  mov    %ecx,%esi
  or     %edx,%esi
  and    %eax,%esi
  mov    %ecx,%r15d
  and    %edx,%r15d
  or     %r15d,%esi
  add    %r14d,%esi
  rol    $0x5,%esi
  mov    0x34(%rsp),%r14d
  lea    0x5a827999(%r14,%rcx,1),%r14d
  mov    %edx,%ecx
  or     %eax,%ecx
  and    %esi,%ecx
  mov    %edx,%r15d
  and    %eax,%r15d
  or     %r15d,%ecx
  add    %r14d,%ecx
  rol    $0x9,%ecx
  lea    0x5a827999(%r9,%rdx,1),%r14d
  mov    %eax,%edx
  or     %esi,%edx
  and    %ecx,%edx
  mov    %eax,%r15d
  and    %esi,%r15d
  or     %r15d,%edx
  add    %r14d,%edx
  rol    $0xd,%edx
  lea    0x5a827999(%r11,%rax,1),%r14d
  mov    %esi,%eax
  or     %ecx,%eax
  and    %edx,%eax
  mov    %esi,%r15d
  and    %ecx,%r15d
  or     %r15d,%eax
  add    %r14d,%eax
  rol    $0x3,%eax
  mov    0x28(%rsp),%r14d
  lea    0x5a827999(%r14,%rsi,1),%r14d
  mov    %ecx,%esi
  or     %edx,%esi
  and    %eax,%esi
  mov    %ecx,%r15d
  and    %edx,%r15d
  or     %r15d,%esi
  add    %r14d,%esi
  rol    $0x5,%esi
  mov    0x38(%rsp),%r14d
  lea    0x5a827999(%r14,%rcx,1),%r14d
  mov    %edx,%ecx
  or     %eax,%ecx
  and    %esi,%ecx
  mov    %edx,%r15d
  and    %eax,%r15d
  or     %r15d,%ecx
  add    %r14d,%ecx
  rol    $0x9,%ecx
  lea    0x5a827999(%rdi,%rdx,1),%r14d
  mov    %eax,%edx
  or     %esi,%edx
  and    %ecx,%edx
  mov    %eax,%r15d
  and    %esi,%r15d
  or     %r15d,%edx
  add    %r14d,%edx
  rol    $0xd,%edx
  lea    0x5a827999(%r8,%rax,1),%r14d
  mov    %esi,%eax
  or     %ecx,%eax
  and    %edx,%eax
  mov    %esi,%r15d
  and    %ecx,%r15d
  or     %r15d,%eax
  add    %r14d,%eax
  rol    $0x3,%eax
  mov    0x2c(%rsp),%r14d
  lea    0x5a827999(%r14,%rsi,1),%r14d
  mov    %ecx,%esi
  or     %edx,%esi
  and    %eax,%esi
  mov    %ecx,%r15d
  and    %edx,%r15d
  or     %r15d,%esi
  add    %r14d,%esi
  rol    $0x5,%esi
  mov    0x3c(%rsp),%r14d
  lea    0x5a827999(%r14,%rcx,1),%r14d
  mov    %edx,%ecx
  or     %eax,%ecx
  and    %esi,%ecx
  mov    %edx,%r15d
  and    %eax,%r15d
  or     %r15d,%ecx
  add    %r14d,%ecx
  rol    $0x9,%ecx
  mov    0x4c(%rsp),%r14d
  lea    0x5a827999(%r14,%rdx,1),%r14d
  mov    %eax,%edx
  or     %esi,%edx
  and    %ecx,%edx
  mov    %eax,%r15d
  and    %esi,%r15d
  or     %r15d,%edx
  add    %r14d,%edx
  rol    $0xd,%edx
  lea    0x6ed9eba1(%r13,%rax,1),%r13d
  mov    %esi,%eax
  xor    %ecx,%eax
  xor    %edx,%eax
  add    %r13d,%eax
  rol    $0x3,%eax
  lea    0x6ed9eba1(%r12,%rsi,1),%r12d
  mov    %ecx,%esi
  xor    %edx,%esi
  xor    %eax,%esi
  add    %r12d,%esi
  rol    $0x9,%esi
  lea    0x6ed9eba1(%rbp,%rcx,1),%ebp
  mov    %edx,%ecx
  xor    %eax,%ecx
  xor    %esi,%ecx
  add    %ebp,%ecx
  rol    $0xb,%ecx
  lea    0x6ed9eba1(%rbx,%rdx,1),%ebx
  mov    %eax,%edx
  xor    %esi,%edx
  xor    %ecx,%edx
  add    %ebx,%edx
  rol    $0xf,%edx
  lea    0x6ed9eba1(%r11,%rax,1),%r11d
  mov    %esi,%eax
  xor    %ecx,%eax
  xor    %edx,%eax
  add    %r11d,%eax
  rol    $0x3,%eax
  mov    0x38(%rsp),%ebx
  lea    0x6ed9eba1(%rbx,%rsi,1),%r11d
  mov    %ecx,%esi
  xor    %edx,%esi
  xor    %eax,%esi
  add    %r11d,%esi
  rol    $0x9,%esi
  mov    0x28(%rsp),%ebx
  lea    0x6ed9eba1(%rbx,%rcx,1),%r11d
  mov    %edx,%ecx
  xor    %eax,%ecx
  xor    %esi,%ecx
  add    %r11d,%ecx
  rol    $0xb,%ecx
  lea    0x6ed9eba1(%rdi,%rdx,1),%edx
  mov    %eax,%edi
  xor    %esi,%edi
  xor    %ecx,%edi
  add    %edx,%edi
  rol    $0xf,%edi
  lea    0x6ed9eba1(%r10,%rax,1),%edx
  mov    %esi,%eax
  xor    %ecx,%eax
  xor    %edi,%eax
  add    %edx,%eax
  rol    $0x3,%eax
  mov    0x34(%rsp),%ebx
  lea    0x6ed9eba1(%rbx,%rsi,1),%esi
  mov    %ecx,%edx
  xor    %edi,%edx
  xor    %eax,%edx
  add    %esi,%edx
  rol    $0x9,%edx
  mov    0x24(%rsp),%ebx
  lea    0x6ed9eba1(%rbx,%rcx,1),%esi
  mov    %edi,%ecx
  xor    %eax,%ecx
  xor    %edx,%ecx
  add    %esi,%ecx
  rol    $0xb,%ecx
  lea    0x6ed9eba1(%r9,%rdi,1),%edi
  mov    %eax,%esi
  xor    %edx,%esi
  xor    %ecx,%esi
  add    %edi,%esi
  rol    $0xf,%esi
  lea    0x6ed9eba1(%r8,%rax,1),%edi
  mov    %edx,%eax
  xor    %ecx,%eax
  xor    %esi,%eax
  add    %edi,%eax
  rol    $0x3,%eax
  mov    0x3c(%rsp),%ebx
  lea    0x6ed9eba1(%rbx,%rdx,1),%edi
  mov    %ecx,%edx
  xor    %esi,%edx
  xor    %eax,%edx
  add    %edi,%edx
  rol    $0x9,%edx
  mov    0x2c(%rsp),%ebx
  lea    0x6ed9eba1(%rbx,%rcx,1),%edi
  mov    %esi,%ecx
  xor    %eax,%ecx
  xor    %edx,%ecx
  add    %edi,%ecx
  rol    $0xb,%ecx
  mov    0x4c(%rsp),%ebx
  lea    0x6ed9eba1(%rbx,%rsi,1),%edi
  mov    %eax,%esi
  xor    %edx,%esi
  xor    %ecx,%esi
  add    %edi,%esi
  add    $0x67452301,%eax
  mov    %eax,(%rsp)
  mov    %esi,%eax
  rol    $0xf,%eax
  sub    $0x10325477,%eax
  mov    %eax,0x4(%rsp)
  sub    $0x67452302,%ecx
  mov    %ecx,0x8(%rsp)
  add    $0x10325476,%edx
  mov    %edx,0xc(%rsp)
  mov    %rsp,%r8
  lea    D26(%rip),%rsi
  mov    $0x0,%edi
L48:
  mov    (%r8),%edx
  lea    -0x8(%rsi),%rax
L66:
  mov    %edx,%ecx
  and    $0xf,%ecx
  movzbl 0x50(%rsp,%rcx,1),%ecx
  mov    %cl,0x1(%rax)
  mov    %rdx,%rcx
  shr    $0x4,%rcx
  and    $0xf,%ecx
  movzbl 0x50(%rsp,%rcx,1),%ecx
  mov    %cl,(%rax)
  shr    $0x8,%edx
  add    $0x2,%rax
  cmp    %rsi,%rax
  jne    L66
  add    $0x4,%r8
  add    $0x4,%edi
  add    $0x8,%rsi
  cmp    $0x10,%edi
  jne    L48
  movb   $0x0,D25(%rip)
  mov    0x68(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L28
  lea    D20(%rip),%rax
  add    $0x78,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L43:
  mov    $0x0,%ecx
  jmp    L24
L51:
  movslq %edi,%rax
  movsbl -0x1(%rbx,%rax,1),%edx
  or     $0x800000,%edx
  jmp    L75
L28:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
char *ntlm_crypt(char *key) {
  int i, j;
  int length = strlen(key);
  unsigned int nt_buffer[16], a, b, c, d, sqrt2, sqrt3, n, output[4];
  static char hex_format[33];
  char itoa16[16] = "0123456789abcdef";
  memset(nt_buffer, 0, 16 * sizeof(unsigned int));
  for (i = 0; i < length / 2; i++)
    nt_buffer[i] = key[2 * i] | (key[2 * i + 1] << 16);
  if (length % 2 == 1)
    nt_buffer[i] = key[length - 1] | 0x800000;
  else
    nt_buffer[i] = 0x80;
  nt_buffer[14] = length << 4;
  output[0] = a = 0x67452301;
  output[1] = b = 0xefcdab89;
  output[2] = c = 0x98badcfe;
  output[3] = d = 0x10325476;
  sqrt2 = 0x5a827999;
  sqrt3 = 0x6ed9eba1;
  a += (d ^ (b & (c ^ d))) + nt_buffer[0];
  a = (a << 3) | (a >> 29);
  d += (c ^ (a & (b ^ c))) + nt_buffer[1];
  d = (d << 7) | (d >> 25);
  c += (b ^ (d & (a ^ b))) + nt_buffer[2];
  c = (c << 11) | (c >> 21);
  b += (a ^ (c & (d ^ a))) + nt_buffer[3];
  b = (b << 19) | (b >> 13);
  a += (d ^ (b & (c ^ d))) + nt_buffer[4];
  a = (a << 3) | (a >> 29);
  d += (c ^ (a & (b ^ c))) + nt_buffer[5];
  d = (d << 7) | (d >> 25);
  c += (b ^ (d & (a ^ b))) + nt_buffer[6];
  c = (c << 11) | (c >> 21);
  b += (a ^ (c & (d ^ a))) + nt_buffer[7];
  b = (b << 19) | (b >> 13);
  a += (d ^ (b & (c ^ d))) + nt_buffer[8];
  a = (a << 3) | (a >> 29);
  d += (c ^ (a & (b ^ c))) + nt_buffer[9];
  d = (d << 7) | (d >> 25);
  c += (b ^ (d & (a ^ b))) + nt_buffer[10];
  c = (c << 11) | (c >> 21);
  b += (a ^ (c & (d ^ a))) + nt_buffer[11];
  b = (b << 19) | (b >> 13);
  a += (d ^ (b & (c ^ d))) + nt_buffer[12];
  a = (a << 3) | (a >> 29);
  d += (c ^ (a & (b ^ c))) + nt_buffer[13];
  d = (d << 7) | (d >> 25);
  c += (b ^ (d & (a ^ b))) + nt_buffer[14];
  c = (c << 11) | (c >> 21);
  b += (a ^ (c & (d ^ a))) + nt_buffer[15];
  b = (b << 19) | (b >> 13);
  a += ((b & (c | d)) | (c & d)) + nt_buffer[0] + sqrt2;
  a = (a << 3) | (a >> 29);
  d += ((a & (b | c)) | (b & c)) + nt_buffer[4] + sqrt2;
  d = (d << 5) | (d >> 27);
  c += ((d & (a | b)) | (a & b)) + nt_buffer[8] + sqrt2;
  c = (c << 9) | (c >> 23);
  b += ((c & (d | a)) | (d & a)) + nt_buffer[12] + sqrt2;
  b = (b << 13) | (b >> 19);
  a += ((b & (c | d)) | (c & d)) + nt_buffer[1] + sqrt2;
  a = (a << 3) | (a >> 29);
  d += ((a & (b | c)) | (b & c)) + nt_buffer[5] + sqrt2;
  d = (d << 5) | (d >> 27);
  c += ((d & (a | b)) | (a & b)) + nt_buffer[9] + sqrt2;
  c = (c << 9) | (c >> 23);
  b += ((c & (d | a)) | (d & a)) + nt_buffer[13] + sqrt2;
  b = (b << 13) | (b >> 19);
  a += ((b & (c | d)) | (c & d)) + nt_buffer[2] + sqrt2;
  a = (a << 3) | (a >> 29);
  d += ((a & (b | c)) | (b & c)) + nt_buffer[6] + sqrt2;
  d = (d << 5) | (d >> 27);
  c += ((d & (a | b)) | (a & b)) + nt_buffer[10] + sqrt2;
  c = (c << 9) | (c >> 23);
  b += ((c & (d | a)) | (d & a)) + nt_buffer[14] + sqrt2;
  b = (b << 13) | (b >> 19);
  a += ((b & (c | d)) | (c & d)) + nt_buffer[3] + sqrt2;
  a = (a << 3) | (a >> 29);
  d += ((a & (b | c)) | (b & c)) + nt_buffer[7] + sqrt2;
  d = (d << 5) | (d >> 27);
  c += ((d & (a | b)) | (a & b)) + nt_buffer[11] + sqrt2;
  c = (c << 9) | (c >> 23);
  b += ((c & (d | a)) | (d & a)) + nt_buffer[15] + sqrt2;
  b = (b << 13) | (b >> 19);
  a += (d ^ c ^ b) + nt_buffer[0] + sqrt3;
  a = (a << 3) | (a >> 29);
  d += (c ^ b ^ a) + nt_buffer[8] + sqrt3;
  d = (d << 9) | (d >> 23);
  c += (b ^ a ^ d) + nt_buffer[4] + sqrt3;
  c = (c << 11) | (c >> 21);
  b += (a ^ d ^ c) + nt_buffer[12] + sqrt3;
  b = (b << 15) | (b >> 17);
  a += (d ^ c ^ b) + nt_buffer[2] + sqrt3;
  a = (a << 3) | (a >> 29);
  d += (c ^ b ^ a) + nt_buffer[10] + sqrt3;
  d = (d << 9) | (d >> 23);
  c += (b ^ a ^ d) + nt_buffer[6] + sqrt3;
  c = (c << 11) | (c >> 21);
  b += (a ^ d ^ c) + nt_buffer[14] + sqrt3;
  b = (b << 15) | (b >> 17);
  a += (d ^ c ^ b) + nt_buffer[1] + sqrt3;
  a = (a << 3) | (a >> 29);
  d += (c ^ b ^ a) + nt_buffer[9] + sqrt3;
  d = (d << 9) | (d >> 23);
  c += (b ^ a ^ d) + nt_buffer[5] + sqrt3;
  c = (c << 11) | (c >> 21);
  b += (a ^ d ^ c) + nt_buffer[13] + sqrt3;
  b = (b << 15) | (b >> 17);
  a += (d ^ c ^ b) + nt_buffer[3] + sqrt3;
  a = (a << 3) | (a >> 29);
  d += (c ^ b ^ a) + nt_buffer[11] + sqrt3;
  d = (d << 9) | (d >> 23);
  c += (b ^ a ^ d) + nt_buffer[7] + sqrt3;
  c = (c << 11) | (c >> 21);
  b += (a ^ d ^ c) + nt_buffer[15] + sqrt3;
  b = (b << 15) | (b >> 17);
  output[0] += a;
  output[1] += b;
  output[2] += c;
  output[3] += d;
  for (i = 0; i < 4; i++)
    for (j = 0, n = output[i]; j < 4; j++) {
      unsigned int convert = n % 256;
      hex_format[i * 8 + j * 2 + 1] = itoa16[convert % 16];
      convert = convert / 16;
      hex_format[i * 8 + j * 2 + 0] = itoa16[convert % 16];
      n = n / 256;
    }
  hex_format[33] = 0;
  return hex_format;
}
```