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

```asm
<test_encrypt_cbc>:
  endbr64
  push   %rbx
  sub    $0x390,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x388(%rsp)
  xor    %eax,%eax
  movl   $0x2b,(%rsp)
  movl   $0x7e,0x4(%rsp)
  movl   $0x15,0x8(%rsp)
  movl   $0x16,0xc(%rsp)
  movl   $0x28,0x10(%rsp)
  movl   $0xae,0x14(%rsp)
  movl   $0xd2,0x18(%rsp)
  movl   $0xa6,0x1c(%rsp)
  movl   $0xab,0x20(%rsp)
  movl   $0xf7,0x24(%rsp)
  movl   $0x15,0x28(%rsp)
  movl   $0x88,0x2c(%rsp)
  movl   $0x9,0x30(%rsp)
  movl   $0xcf,0x34(%rsp)
  movl   $0x4f,0x38(%rsp)
  movl   $0x3c,0x3c(%rsp)
  movl   $0x0,0x40(%rsp)
  movl   $0x1,0x44(%rsp)
  movl   $0x2,0x48(%rsp)
  movl   $0x3,0x4c(%rsp)
  movl   $0x4,0x50(%rsp)
  movl   $0x5,0x54(%rsp)
  movl   $0x6,0x58(%rsp)
  movl   $0x7,0x5c(%rsp)
  movl   $0x8,0x60(%rsp)
  movl   $0x9,0x64(%rsp)
  movl   $0xa,0x68(%rsp)
  movl   $0xb,0x6c(%rsp)
  movl   $0xc,0x70(%rsp)
  movl   $0xd,0x74(%rsp)
  movl   $0xe,0x78(%rsp)
  movl   $0xf,0x7c(%rsp)
  movl   $0x6b,0x80(%rsp)
  movl   $0xc1,0x84(%rsp)
  movl   $0xbe,0x88(%rsp)
  movl   $0xe2,0x8c(%rsp)
  movl   $0x2e,0x90(%rsp)
  movl   $0x40,0x94(%rsp)
  movl   $0x9f,0x98(%rsp)
  movl   $0x96,0x9c(%rsp)
  movl   $0xe9,0xa0(%rsp)
  movl   $0x3d,0xa4(%rsp)
  movl   $0x7e,0xa8(%rsp)
  movl   $0x11,0xac(%rsp)
  movl   $0x73,0xb0(%rsp)
  movl   $0x93,0xb4(%rsp)
  movl   $0x17,0xb8(%rsp)
  movl   $0x2a,0xbc(%rsp)
  movl   $0xae,0xc0(%rsp)
  movl   $0x2d,0xc4(%rsp)
  movl   $0x8a,0xc8(%rsp)
  movl   $0x57,0xcc(%rsp)
  movl   $0x1e,0xd0(%rsp)
  movl   $0x3,0xd4(%rsp)
  movl   $0xac,0xd8(%rsp)
  movl   $0x9c,0xdc(%rsp)
  movl   $0x9e,0xe0(%rsp)
  movl   $0xb7,0xe4(%rsp)
  movl   $0x6f,0xe8(%rsp)
  movl   $0xac,0xec(%rsp)
  movl   $0x45,0xf0(%rsp)
  movl   $0xaf,0xf4(%rsp)
  movl   $0x8e,0xf8(%rsp)
  movl   $0x51,0xfc(%rsp)
  movl   $0x30,0x100(%rsp)
  movl   $0xc8,0x104(%rsp)
  movl   $0x1c,0x108(%rsp)
  movl   $0x46,0x10c(%rsp)
  movl   $0xa3,0x110(%rsp)
  movl   $0x5c,0x114(%rsp)
  movl   $0xe4,0x118(%rsp)
  movl   $0x11,0x11c(%rsp)
  movl   $0xe5,0x120(%rsp)
  movl   $0xfb,0x124(%rsp)
  movl   $0xc1,0x128(%rsp)
  movl   $0x19,0x12c(%rsp)
  movl   $0x1a,0x130(%rsp)
  movl   $0xa,0x134(%rsp)
  movl   $0x52,0x138(%rsp)
  movl   $0xef,0x13c(%rsp)
  movl   $0xf6,0x140(%rsp)
  movl   $0x9f,0x144(%rsp)
  movl   $0x24,0x148(%rsp)
  movl   $0x45,0x14c(%rsp)
  movl   $0xdf,0x150(%rsp)
  movl   $0x4f,0x154(%rsp)
  movl   $0x9b,0x158(%rsp)
  movl   $0x17,0x15c(%rsp)
  movl   $0xad,0x160(%rsp)
  movl   $0x2b,0x164(%rsp)
  movl   $0x41,0x168(%rsp)
  movl   $0x7b,0x16c(%rsp)
  movl   $0xe6,0x170(%rsp)
  movl   $0x6c,0x174(%rsp)
  movl   $0x37,0x178(%rsp)
  movl   $0x10,0x17c(%rsp)
  movl   $0x76,0x180(%rsp)
  movl   $0x49,0x184(%rsp)
  movl   $0xab,0x188(%rsp)
  movl   $0xac,0x18c(%rsp)
  movl   $0x81,0x190(%rsp)
  movl   $0x19,0x194(%rsp)
  movl   $0xb2,0x198(%rsp)
  movl   $0x46,0x19c(%rsp)
  movl   $0xce,0x1a0(%rsp)
  movl   $0xe9,0x1a4(%rsp)
  movl   $0x8e,0x1a8(%rsp)
  movl   $0x9b,0x1ac(%rsp)
  movl   $0x12,0x1b0(%rsp)
  movl   $0xe9,0x1b4(%rsp)
  movl   $0x19,0x1b8(%rsp)
  movl   $0x7d,0x1bc(%rsp)
  movl   $0x50,0x1c0(%rsp)
  movl   $0x86,0x1c4(%rsp)
  movl   $0xcb,0x1c8(%rsp)
  movl   $0x9b,0x1cc(%rsp)
  movl   $0x50,0x1d0(%rsp)
  movl   $0x72,0x1d4(%rsp)
  movl   $0x19,0x1d8(%rsp)
  movl   $0xee,0x1dc(%rsp)
  movl   $0x95,0x1e0(%rsp)
  movl   $0xdb,0x1e4(%rsp)
  movl   $0x11,0x1e8(%rsp)
  movl   $0x3a,0x1ec(%rsp)
  movl   $0x91,0x1f0(%rsp)
  movl   $0x76,0x1f4(%rsp)
  movl   $0x78,0x1f8(%rsp)
  movl   $0xb2,0x1fc(%rsp)
  movl   $0x73,0x200(%rsp)
  movl   $0xbe,0x204(%rsp)
  movl   $0xd6,0x208(%rsp)
  movl   $0xb8,0x20c(%rsp)
  movl   $0xe3,0x210(%rsp)
  movl   $0xc1,0x214(%rsp)
  movl   $0x74,0x218(%rsp)
  movl   $0x3b,0x21c(%rsp)
  movl   $0x71,0x220(%rsp)
  movl   $0x16,0x224(%rsp)
  movl   $0xe6,0x228(%rsp)
  movl   $0x9e,0x22c(%rsp)
  movl   $0x22,0x230(%rsp)
  movl   $0x22,0x234(%rsp)
  movl   $0x95,0x238(%rsp)
  movl   $0x16,0x23c(%rsp)
  movl   $0x3f,0x240(%rsp)
  movl   $0xf1,0x244(%rsp)
  movl   $0xca,0x248(%rsp)
  movl   $0xa1,0x24c(%rsp)
  movl   $0x68,0x250(%rsp)
  movl   $0x1f,0x254(%rsp)
  movl   $0xac,0x258(%rsp)
  movl   $0x9,0x25c(%rsp)
  movl   $0x12,0x260(%rsp)
  movl   $0xe,0x264(%rsp)
  movl   $0xca,0x268(%rsp)
  movl   $0x30,0x26c(%rsp)
  movl   $0x75,0x270(%rsp)
  movl   $0x86,0x274(%rsp)
  movl   $0xe1,0x278(%rsp)
  movl   $0xa7,0x27c(%rsp)
  mov    %rsp,%rcx
  lea    0x80(%rsp),%rsi
  lea    0x280(%rsp),%rbx
  lea    0x40(%rsp),%r8
  mov    $0x40,%edx
  mov    %rbx,%rdi
  call   <AES128_CBC_encrypt_buffer@plt>
  lea    D2(%rip),%rdi
  call   <printf@plt>
  lea    0x180(%rsp),%rdi
  mov    $0x40,%edx
  mov    %rbx,%rsi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L12
  lea    D1(%rip),%rdi
  call   <printf@plt>
L17:
  mov    0x388(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L2
  add    $0x390,%rsp
  pop    %rbx
  ret
L12:
  lea    D14(%rip),%rdi
  call   <printf@plt>
  jmp    L17
L2:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: data_tag: D2
datatype: string
name: unpack_data
arguments: data_tag: D1
datatype: string
name: unpack_data
arguments: data_tag: D14
datatype: string

tool: D2: CBC encrypt: 

tool: D1: SUCCESS!


tool: D14: FAILURE!


assistant: ```c
void test_encrypt_cbc(void) {
  uint8_t key[] = {0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c};
  uint8_t iv[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
  uint8_t in[] = {0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10};
  uint8_t out[] = {0x76, 0x49, 0xab, 0xac, 0x81, 0x19, 0xb2, 0x46, 0xce, 0xe9, 0x8e, 0x9b, 0x12, 0xe9, 0x19, 0x7d, 0x50, 0x86, 0xcb, 0x9b, 0x50, 0x72, 0x19, 0xee, 0x95, 0xdb, 0x11, 0x3a, 0x91, 0x76, 0x78, 0xb2, 0x73, 0xbe, 0xd6, 0xb8, 0xe3, 0xc1, 0x74, 0x3b, 0x71, 0x16, 0xe6, 0x9e, 0x22, 0x22, 0x95, 0x16, 0x3f, 0xf1, 0xca, 0xa1, 0x68, 0x1f, 0xac, 0x09, 0x12, 0x0e, 0xca, 0x30, 0x75, 0x86, 0xe1, 0xa7};
  uint8_t buffer[64];
  AES128_CBC_encrypt_buffer(buffer, in, 64, key, iv);
  printf("CBC encrypt: ");
  if (0 == strncmp((char *)out, (char *)buffer, 64)) {
    printf("SUCCESS!\n");
  } else {
    printf("FAILURE!\n");
  }
}
```