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

```asm
<_asn1_get_indefinite_length_string>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  mov    %eax,-0x18(%rbp)
L118:
  mov    -0x40(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x18(%rbp)
  jle    L77
  mov    $0x4,%eax
  jmp    L88
L77:
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L61
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L61
  addl   $0x2,-0x18(%rbp)
  subl   $0x1,-0x14(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  jg     L125
  jmp    L1
L61:
  mov    -0x40(%rbp),%rax
  mov    (%rax),%eax
  sub    -0x18(%rbp),%eax
  mov    -0x18(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x38(%rbp),%rdx
  lea    (%rcx,%rdx,1),%rdi
  lea    -0x10(%rbp),%rsi
  lea    -0x20(%rbp),%rcx
  lea    -0x21(%rbp),%rdx
  mov    %rsi,%r8
  mov    %eax,%esi
  call   <asn1_get_tag_der@plt>
  test   %rax,%rax
  je     L43
  mov    $0x4,%eax
  jmp    L88
L43:
  mov    -0x20(%rbp),%edx
  mov    -0x18(%rbp),%eax
  add    %eax,%edx
  mov    -0x40(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,%edx
  jle    L78
  mov    $0x4,%eax
  jmp    L88
L78:
  mov    -0x20(%rbp),%eax
  add    %eax,-0x18(%rbp)
  mov    -0x40(%rbp),%rax
  mov    (%rax),%eax
  sub    -0x18(%rbp),%eax
  mov    -0x18(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x38(%rbp),%rdx
  add    %rdx,%rcx
  lea    -0x1c(%rbp),%rdx
  mov    %eax,%esi
  mov    %rcx,%rdi
  call   <asn1_get_length_der@plt>
  mov    %eax,-0x20(%rbp)
  mov    -0x20(%rbp),%eax
  cmp    $0xffffffff,%eax
  jge    L158
  mov    $0x4,%eax
  jmp    L88
L158:
  mov    -0x20(%rbp),%eax
  cmp    $0xffffffff,%eax
  jne    L18
  addl   $0x1,-0x14(%rbp)
  addl   $0x1,-0x18(%rbp)
  jmp    L118
L18:
  mov    -0x20(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  add    %eax,-0x18(%rbp)
  jmp    L118
L125:
  nop
  jmp    L118
L1:
  mov    -0x40(%rbp),%rax
  mov    -0x18(%rbp),%edx
  mov    %edx,(%rax)
  mov    $0x0,%eax
L88:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L34
  call   <__stack_chk_fail@plt>
L34:
  leave
  ret
```

assistant: ```c
int _asn1_get_indefinite_length_string(const unsigned char *der, int *len) {
  int len2, len3, counter, indefinite;
  unsigned long tag;
  unsigned char class;
  counter = indefinite = 0;
  while (1) {
    if ((*len) < counter)
      return 4;
    if ((der[counter] == 0) && (der[counter + 1] == 0)) {
      counter += 2;
      indefinite--;
      if (indefinite <= 0)
        break;
      else
        continue;
    }
    if (asn1_get_tag_der(der + counter, *len - counter, &class, &len2, &tag) != 0)
      return 4;
    if (counter + len2 > *len)
      return 4;
    counter += len2;
    len2 = asn1_get_length_der(der + counter, *len - counter, &len3);
    if (len2 < -1)
      return 4;
    if (len2 == -1) {
      indefinite++;
      counter += 1;
    } else {
      counter += len2 + len3;
    }
  }
  *len = counter;
  return 0;
}
```