user: Please show me the C implementation that matches the assembly code listed below:

```asm
<md4_transform>:
  endbr64
  push   %r15
  mov    $0x3,%r9d
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x28,%rsp
  mov    0x4(%rdi),%esi
  mov    0x8(%rdi),%edx
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  mov    (%rdi),%eax
  lea    0x8(%rsp),%r15
  mov    0xc(%rdi),%ecx
  mov    (%rbx),%r8d
  mov    %r15,%rdi
  lea    0x14(%rsp),%r14
  mov    %esi,0xc(%rsp)
  lea    0x10(%rsp),%r13
  mov    %edx,0x10(%rsp)
  lea    0xc(%rsp),%r12
  mov    %ecx,0x14(%rsp)
  mov    %eax,0x8(%rsp)
  xor    %eax,%eax
  call   <ROUND1@plt>
  mov    0x4(%rbx),%r8d
  mov    0x10(%rsp),%ecx
  mov    %r14,%rdi
  mov    0xc(%rsp),%edx
  mov    0x8(%rsp),%esi
  mov    $0x7,%r9d
  xor    %eax,%eax
  call   <ROUND1@plt>
  mov    0x8(%rbx),%r8d
  mov    0xc(%rsp),%ecx
  mov    %r13,%rdi
  mov    0x8(%rsp),%edx
  mov    0x14(%rsp),%esi
  mov    $0xb,%r9d
  xor    %eax,%eax
  call   <ROUND1@plt>
  mov    0xc(%rbx),%r8d
  mov    0x8(%rsp),%ecx
  mov    %r12,%rdi
  mov    0x14(%rsp),%edx
  mov    0x10(%rsp),%esi
  mov    $0x13,%r9d
  xor    %eax,%eax
  call   <ROUND1@plt>
  mov    0x10(%rbx),%r8d
  mov    0x14(%rsp),%ecx
  mov    %r15,%rdi
  mov    0x10(%rsp),%edx
  mov    0xc(%rsp),%esi
  mov    $0x3,%r9d
  xor    %eax,%eax
  call   <ROUND1@plt>
  mov    0x14(%rbx),%r8d
  mov    0x10(%rsp),%ecx
  mov    %r14,%rdi
  mov    0xc(%rsp),%edx
  mov    0x8(%rsp),%esi
  mov    $0x7,%r9d
  xor    %eax,%eax
  call   <ROUND1@plt>
  mov    0x18(%rbx),%r8d
  mov    0xc(%rsp),%ecx
  mov    %r13,%rdi
  mov    0x8(%rsp),%edx
  mov    0x14(%rsp),%esi
  mov    $0xb,%r9d
  xor    %eax,%eax
  call   <ROUND1@plt>
  mov    0x1c(%rbx),%r8d
  mov    0x8(%rsp),%ecx
  mov    %r12,%rdi
  mov    0x14(%rsp),%edx
  mov    0x10(%rsp),%esi
  mov    $0x13,%r9d
  xor    %eax,%eax
  call   <ROUND1@plt>
  mov    0x20(%rbx),%r8d
  mov    0x14(%rsp),%ecx
  mov    %r15,%rdi
  mov    0x10(%rsp),%edx
  mov    0xc(%rsp),%esi
  mov    $0x3,%r9d
  xor    %eax,%eax
  call   <ROUND1@plt>
  mov    0x24(%rbx),%r8d
  mov    0x10(%rsp),%ecx
  mov    %r14,%rdi
  mov    0xc(%rsp),%edx
  mov    0x8(%rsp),%esi
  mov    $0x7,%r9d
  xor    %eax,%eax
  call   <ROUND1@plt>
  mov    0x28(%rbx),%r8d
  mov    0xc(%rsp),%ecx
  mov    %r13,%rdi
  mov    0x8(%rsp),%edx
  mov    0x14(%rsp),%esi
  mov    $0xb,%r9d
  xor    %eax,%eax
  call   <ROUND1@plt>
  mov    0x2c(%rbx),%r8d
  mov    0x8(%rsp),%ecx
  mov    %r12,%rdi
  mov    0x14(%rsp),%edx
  mov    0x10(%rsp),%esi
  mov    $0x13,%r9d
  xor    %eax,%eax
  call   <ROUND1@plt>
  mov    0x30(%rbx),%r8d
  mov    0x14(%rsp),%ecx
  mov    %r15,%rdi
  mov    0x10(%rsp),%edx
  mov    0xc(%rsp),%esi
  mov    $0x3,%r9d
  xor    %eax,%eax
  call   <ROUND1@plt>
  mov    0x34(%rbx),%r8d
  mov    0x10(%rsp),%ecx
  mov    %r14,%rdi
  mov    0xc(%rsp),%edx
  mov    0x8(%rsp),%esi
  mov    $0x7,%r9d
  xor    %eax,%eax
  call   <ROUND1@plt>
  mov    0x38(%rbx),%r8d
  mov    0xc(%rsp),%ecx
  mov    %r13,%rdi
  mov    0x8(%rsp),%edx
  mov    0x14(%rsp),%esi
  mov    $0xb,%r9d
  xor    %eax,%eax
  call   <ROUND1@plt>
  mov    0x3c(%rbx),%r8d
  mov    0x8(%rsp),%ecx
  xor    %eax,%eax
  mov    0x14(%rsp),%edx
  mov    0x10(%rsp),%esi
  mov    $0x13,%r9d
  mov    %r12,%rdi
  call   <ROUND1@plt>
  mov    (%rbx),%r8d
  mov    0x14(%rsp),%ecx
  mov    %r15,%rdi
  mov    0x10(%rsp),%edx
  mov    0xc(%rsp),%esi
  mov    $0x3,%r9d
  xor    %eax,%eax
  call   <ROUND2@plt>
  mov    0x10(%rbx),%r8d
  mov    0x10(%rsp),%ecx
  mov    %r14,%rdi
  mov    0xc(%rsp),%edx
  mov    0x8(%rsp),%esi
  mov    $0x5,%r9d
  xor    %eax,%eax
  call   <ROUND2@plt>
  mov    0x20(%rbx),%r8d
  mov    0xc(%rsp),%ecx
  mov    %r13,%rdi
  mov    0x8(%rsp),%edx
  mov    0x14(%rsp),%esi
  mov    $0x9,%r9d
  xor    %eax,%eax
  call   <ROUND2@plt>
  mov    0x30(%rbx),%r8d
  mov    0x8(%rsp),%ecx
  mov    %r12,%rdi
  mov    0x14(%rsp),%edx
  mov    0x10(%rsp),%esi
  mov    $0xd,%r9d
  xor    %eax,%eax
  call   <ROUND2@plt>
  mov    0x4(%rbx),%r8d
  mov    0x14(%rsp),%ecx
  mov    %r15,%rdi
  mov    0x10(%rsp),%edx
  mov    0xc(%rsp),%esi
  mov    $0x3,%r9d
  xor    %eax,%eax
  call   <ROUND2@plt>
  mov    0x14(%rbx),%r8d
  mov    0x10(%rsp),%ecx
  mov    %r14,%rdi
  mov    0xc(%rsp),%edx
  mov    0x8(%rsp),%esi
  mov    $0x5,%r9d
  xor    %eax,%eax
  call   <ROUND2@plt>
  mov    0x24(%rbx),%r8d
  mov    0xc(%rsp),%ecx
  mov    %r13,%rdi
  mov    0x8(%rsp),%edx
  mov    0x14(%rsp),%esi
  mov    $0x9,%r9d
  xor    %eax,%eax
  call   <ROUND2@plt>
  mov    0x34(%rbx),%r8d
  mov    0x8(%rsp),%ecx
  mov    %r12,%rdi
  mov    0x14(%rsp),%edx
  mov    0x10(%rsp),%esi
  mov    $0xd,%r9d
  xor    %eax,%eax
  call   <ROUND2@plt>
  mov    0x8(%rbx),%r8d
  mov    0x14(%rsp),%ecx
  mov    %r15,%rdi
  mov    0x10(%rsp),%edx
  mov    0xc(%rsp),%esi
  mov    $0x3,%r9d
  xor    %eax,%eax
  call   <ROUND2@plt>
  mov    0x18(%rbx),%r8d
  mov    0x10(%rsp),%ecx
  mov    %r14,%rdi
  mov    0xc(%rsp),%edx
  mov    0x8(%rsp),%esi
  mov    $0x5,%r9d
  xor    %eax,%eax
  call   <ROUND2@plt>
  mov    0x28(%rbx),%r8d
  mov    0xc(%rsp),%ecx
  mov    %r13,%rdi
  mov    0x8(%rsp),%edx
  mov    0x14(%rsp),%esi
  mov    $0x9,%r9d
  xor    %eax,%eax
  call   <ROUND2@plt>
  mov    0x38(%rbx),%r8d
  mov    0x8(%rsp),%ecx
  mov    %r12,%rdi
  mov    0x14(%rsp),%edx
  mov    0x10(%rsp),%esi
  mov    $0xd,%r9d
  xor    %eax,%eax
  call   <ROUND2@plt>
  mov    0xc(%rbx),%r8d
  mov    0x14(%rsp),%ecx
  mov    %r15,%rdi
  mov    0x10(%rsp),%edx
  mov    0xc(%rsp),%esi
  mov    $0x3,%r9d
  xor    %eax,%eax
  call   <ROUND2@plt>
  mov    0x1c(%rbx),%r8d
  mov    0x10(%rsp),%ecx
  mov    %r14,%rdi
  mov    0xc(%rsp),%edx
  mov    0x8(%rsp),%esi
  mov    $0x5,%r9d
  xor    %eax,%eax
  call   <ROUND2@plt>
  mov    0x2c(%rbx),%r8d
  mov    0xc(%rsp),%ecx
  mov    %r13,%rdi
  mov    0x8(%rsp),%edx
  mov    0x14(%rsp),%esi
  mov    $0x9,%r9d
  xor    %eax,%eax
  call   <ROUND2@plt>
  mov    0x3c(%rbx),%r8d
  mov    0x8(%rsp),%ecx
  xor    %eax,%eax
  mov    0x14(%rsp),%edx
  mov    0x10(%rsp),%esi
  mov    $0xd,%r9d
  mov    %r12,%rdi
  call   <ROUND2@plt>
  mov    (%rbx),%r8d
  mov    0x14(%rsp),%ecx
  mov    %r15,%rdi
  mov    0x10(%rsp),%edx
  mov    0xc(%rsp),%esi
  mov    $0x3,%r9d
  xor    %eax,%eax
  call   <ROUND3@plt>
  mov    0x20(%rbx),%r8d
  mov    0x10(%rsp),%ecx
  mov    %r14,%rdi
  mov    0xc(%rsp),%edx
  mov    0x8(%rsp),%esi
  mov    $0x9,%r9d
  xor    %eax,%eax
  call   <ROUND3@plt>
  mov    0x10(%rbx),%r8d
  mov    0xc(%rsp),%ecx
  mov    %r13,%rdi
  mov    0x8(%rsp),%edx
  mov    0x14(%rsp),%esi
  mov    $0xb,%r9d
  xor    %eax,%eax
  call   <ROUND3@plt>
  mov    0x30(%rbx),%r8d
  mov    0x8(%rsp),%ecx
  mov    %r12,%rdi
  mov    0x14(%rsp),%edx
  mov    0x10(%rsp),%esi
  mov    $0xf,%r9d
  xor    %eax,%eax
  call   <ROUND3@plt>
  mov    0x8(%rbx),%r8d
  mov    0x14(%rsp),%ecx
  mov    %r15,%rdi
  mov    0x10(%rsp),%edx
  mov    0xc(%rsp),%esi
  mov    $0x3,%r9d
  xor    %eax,%eax
  call   <ROUND3@plt>
  mov    0x28(%rbx),%r8d
  mov    0x10(%rsp),%ecx
  mov    %r14,%rdi
  mov    0xc(%rsp),%edx
  mov    0x8(%rsp),%esi
  mov    $0x9,%r9d
  xor    %eax,%eax
  call   <ROUND3@plt>
  mov    0x18(%rbx),%r8d
  mov    0xc(%rsp),%ecx
  mov    %r13,%rdi
  mov    0x8(%rsp),%edx
  mov    0x14(%rsp),%esi
  mov    $0xb,%r9d
  xor    %eax,%eax
  call   <ROUND3@plt>
  mov    0x38(%rbx),%r8d
  mov    0x8(%rsp),%ecx
  mov    %r12,%rdi
  mov    0x14(%rsp),%edx
  mov    0x10(%rsp),%esi
  mov    $0xf,%r9d
  xor    %eax,%eax
  call   <ROUND3@plt>
  mov    0x4(%rbx),%r8d
  mov    0x14(%rsp),%ecx
  mov    %r15,%rdi
  mov    0x10(%rsp),%edx
  mov    0xc(%rsp),%esi
  mov    $0x3,%r9d
  xor    %eax,%eax
  call   <ROUND3@plt>
  mov    0x24(%rbx),%r8d
  mov    0x10(%rsp),%ecx
  mov    %r14,%rdi
  mov    0xc(%rsp),%edx
  mov    0x8(%rsp),%esi
  mov    $0x9,%r9d
  xor    %eax,%eax
  call   <ROUND3@plt>
  mov    0x14(%rbx),%r8d
  mov    0xc(%rsp),%ecx
  mov    %r13,%rdi
  mov    0x8(%rsp),%edx
  mov    0x14(%rsp),%esi
  mov    $0xb,%r9d
  xor    %eax,%eax
  call   <ROUND3@plt>
  mov    0x34(%rbx),%r8d
  mov    0x8(%rsp),%ecx
  mov    %r12,%rdi
  mov    0x14(%rsp),%edx
  mov    0x10(%rsp),%esi
  mov    $0xf,%r9d
  xor    %eax,%eax
  call   <ROUND3@plt>
  mov    0xc(%rbx),%r8d
  mov    0x14(%rsp),%ecx
  mov    %r15,%rdi
  mov    0x10(%rsp),%edx
  mov    0xc(%rsp),%esi
  mov    $0x3,%r9d
  xor    %eax,%eax
  call   <ROUND3@plt>
  mov    0x2c(%rbx),%r8d
  mov    0x10(%rsp),%ecx
  mov    %r14,%rdi
  mov    0xc(%rsp),%edx
  mov    0x8(%rsp),%esi
  mov    $0x9,%r9d
  xor    %eax,%eax
  call   <ROUND3@plt>
  mov    0x1c(%rbx),%r8d
  mov    0xc(%rsp),%ecx
  mov    %r13,%rdi
  mov    0x8(%rsp),%edx
  mov    0x14(%rsp),%esi
  mov    $0xb,%r9d
  xor    %eax,%eax
  call   <ROUND3@plt>
  mov    0x3c(%rbx),%r8d
  mov    0x8(%rsp),%ecx
  xor    %eax,%eax
  mov    0x14(%rsp),%edx
  mov    0x10(%rsp),%esi
  mov    $0xf,%r9d
  mov    %r12,%rdi
  call   <ROUND3@plt>
  mov    0x8(%rsp),%eax
  add    %eax,0x0(%rbp)
  mov    0xc(%rsp),%eax
  add    %eax,0x4(%rbp)
  mov    0x10(%rsp),%eax
  add    %eax,0x8(%rbp)
  mov    0x14(%rsp),%eax
  add    %eax,0xc(%rbp)
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L5
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L5:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void md4_transform(unsigned int *hash, unsigned int const *in) {
  unsigned int a, b, c, d;
  a = hash[0];
  b = hash[1];
  c = hash[2];
  d = hash[3];
  ROUND1(&a, b, c, d, in[0], 3);
  ROUND1(&d, a, b, c, in[1], 7);
  ROUND1(&c, d, a, b, in[2], 11);
  ROUND1(&b, c, d, a, in[3], 19);
  ROUND1(&a, b, c, d, in[4], 3);
  ROUND1(&d, a, b, c, in[5], 7);
  ROUND1(&c, d, a, b, in[6], 11);
  ROUND1(&b, c, d, a, in[7], 19);
  ROUND1(&a, b, c, d, in[8], 3);
  ROUND1(&d, a, b, c, in[9], 7);
  ROUND1(&c, d, a, b, in[10], 11);
  ROUND1(&b, c, d, a, in[11], 19);
  ROUND1(&a, b, c, d, in[12], 3);
  ROUND1(&d, a, b, c, in[13], 7);
  ROUND1(&c, d, a, b, in[14], 11);
  ROUND1(&b, c, d, a, in[15], 19);
  ROUND2(&a, b, c, d, in[0], 3);
  ROUND2(&d, a, b, c, in[4], 5);
  ROUND2(&c, d, a, b, in[8], 9);
  ROUND2(&b, c, d, a, in[12], 13);
  ROUND2(&a, b, c, d, in[1], 3);
  ROUND2(&d, a, b, c, in[5], 5);
  ROUND2(&c, d, a, b, in[9], 9);
  ROUND2(&b, c, d, a, in[13], 13);
  ROUND2(&a, b, c, d, in[2], 3);
  ROUND2(&d, a, b, c, in[6], 5);
  ROUND2(&c, d, a, b, in[10], 9);
  ROUND2(&b, c, d, a, in[14], 13);
  ROUND2(&a, b, c, d, in[3], 3);
  ROUND2(&d, a, b, c, in[7], 5);
  ROUND2(&c, d, a, b, in[11], 9);
  ROUND2(&b, c, d, a, in[15], 13);
  ROUND3(&a, b, c, d, in[0], 3);
  ROUND3(&d, a, b, c, in[8], 9);
  ROUND3(&c, d, a, b, in[4], 11);
  ROUND3(&b, c, d, a, in[12], 15);
  ROUND3(&a, b, c, d, in[2], 3);
  ROUND3(&d, a, b, c, in[10], 9);
  ROUND3(&c, d, a, b, in[6], 11);
  ROUND3(&b, c, d, a, in[14], 15);
  ROUND3(&a, b, c, d, in[1], 3);
  ROUND3(&d, a, b, c, in[9], 9);
  ROUND3(&c, d, a, b, in[5], 11);
  ROUND3(&b, c, d, a, in[13], 15);
  ROUND3(&a, b, c, d, in[3], 3);
  ROUND3(&d, a, b, c, in[11], 9);
  ROUND3(&c, d, a, b, in[7], 11);
  ROUND3(&b, c, d, a, in[15], 15);
  hash[0] += a;
  hash[1] += b;
  hash[2] += c;
  hash[3] += d;
}
```