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

```asm
<keypair>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  lea    -0x11000(%rsp),%r11
L305:
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  cmp    %r11,%rsp
  jne    L305
  sub    $0xe80,%rsp
  mov    %rdi,-0x11e78(%rbp)
  mov    %rsi,-0x11e80(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x11e54(%rbp)
  movl   $0x0,-0x11e48(%rbp)
  movb   $0x0,-0x11e65(%rbp)
  mov    $0x41000,%edi
  call   <malloc@plt>
  mov    %rax,-0x11e40(%rbp)
  mov    $0x41000,%edi
  call   <malloc@plt>
  mov    %rax,-0x11e38(%rbp)
  lea    D9(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D1(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D9(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  movl   $0x0,-0x11e50(%rbp)
  jmp    L393
L61:
  movl   $0x0,-0x11e64(%rbp)
  jmp    L564
L705:
  movl   $0x0,-0x11e60(%rbp)
  jmp    L598
L590:
  mov    $0x0,%eax
  call   <rand@plt>
  cltd
  shr    $0x18,%edx
  add    %edx,%eax
  movzbl %al,%eax
  sub    %edx,%eax
  mov    %eax,%ecx
  mov    -0x11e64(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x11e60(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    %cl,-0x11010(%rbp,%rdx,1)
  mov    -0x11e64(%rbp),%edx
  mov    %edx,%ecx
  shl    $0x6,%ecx
  mov    -0x11e60(%rbp),%edx
  add    %edx,%ecx
  cltq
  movzbl -0x11010(%rbp,%rax,1),%edx
  movslq %ecx,%rax
  mov    %dl,-0x10010(%rbp,%rax,1)
  addl   $0x1,-0x11e60(%rbp)
L598:
  cmpl   $0x3f,-0x11e60(%rbp)
  jle    L590
  addl   $0x1,-0x11e64(%rbp)
L564:
  cmpl   $0x3f,-0x11e64(%rbp)
  jle    L705
  lea    -0x10010(%rbp),%rax
  mov    $0x40,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <matrixinv@plt>
  mov    %eax,-0x11e50(%rbp)
L393:
  cmpl   $0x0,-0x11e50(%rbp)
  je     L61
  movl   $0x0,-0x11e50(%rbp)
  jmp    L343
L319:
  movl   $0x0,-0x11e64(%rbp)
  jmp    L33
L82:
  movl   $0x0,-0x11e60(%rbp)
  jmp    L29
L439:
  mov    $0x0,%eax
  call   <rand@plt>
  cltd
  shr    $0x18,%edx
  add    %edx,%eax
  movzbl %al,%eax
  sub    %edx,%eax
  mov    %eax,%ecx
  mov    -0x11e64(%rbp),%eax
  shl    $0x7,%eax
  mov    %eax,%edx
  mov    -0x11e60(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    %cl,-0x8010(%rbp,%rdx,1)
  mov    -0x11e64(%rbp),%edx
  mov    %edx,%ecx
  shl    $0x7,%ecx
  mov    -0x11e60(%rbp),%edx
  add    %edx,%ecx
  cltq
  movzbl -0x8010(%rbp,%rax,1),%edx
  movslq %ecx,%rax
  mov    %dl,-0x4010(%rbp,%rax,1)
  addl   $0x1,-0x11e60(%rbp)
L29:
  cmpl   $0x7f,-0x11e60(%rbp)
  jle    L439
  addl   $0x1,-0x11e64(%rbp)
L33:
  cmpl   $0x7f,-0x11e64(%rbp)
  jle    L82
  lea    -0x4010(%rbp),%rax
  mov    $0x80,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <matrixinv@plt>
  mov    %eax,-0x11e50(%rbp)
L343:
  cmpl   $0x0,-0x11e50(%rbp)
  je     L319
  movl   $0x0,-0x11e64(%rbp)
  jmp    L676
L332:
  movl   $0x0,-0x11e60(%rbp)
  jmp    L128
L600:
  mov    -0x11e64(%rbp),%eax
  shl    $0x7,%eax
  mov    %eax,%edx
  mov    -0x11e60(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x11e54(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x11e54(%rbp)
  movslq %eax,%rdx
  mov    -0x11e78(%rbp),%rax
  add    %rax,%rdx
  movslq %ecx,%rax
  movzbl -0x4010(%rbp,%rax,1),%eax
  mov    %al,(%rdx)
  addl   $0x1,-0x11e60(%rbp)
L128:
  cmpl   $0x7f,-0x11e60(%rbp)
  jle    L600
  addl   $0x1,-0x11e64(%rbp)
L676:
  cmpl   $0x7f,-0x11e64(%rbp)
  jle    L332
  movl   $0x0,-0x11e64(%rbp)
  jmp    L527
L403:
  mov    $0x0,%eax
  call   <rand@plt>
  cltd
  shr    $0x18,%edx
  add    %edx,%eax
  movzbl %al,%eax
  sub    %edx,%eax
  mov    %eax,%edx
  mov    -0x11e64(%rbp),%eax
  cltq
  mov    %dl,-0x9010(%rbp,%rax,1)
  addl   $0x1,-0x11e64(%rbp)
L527:
  cmpl   $0xfff,-0x11e64(%rbp)
  jle    L403
  movl   $0x0,-0x11e64(%rbp)
  jmp    L451
L690:
  mov    $0x0,%eax
  call   <rand@plt>
  cltd
  shr    $0x18,%edx
  add    %edx,%eax
  movzbl %al,%eax
  sub    %edx,%eax
  mov    %eax,%edx
  mov    -0x11e64(%rbp),%eax
  cltq
  mov    %dl,-0xb010(%rbp,%rax,1)
  mov    -0x11e54(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x11e54(%rbp)
  movslq %eax,%rdx
  mov    -0x11e78(%rbp),%rax
  add    %rax,%rdx
  mov    -0x11e64(%rbp),%eax
  cltq
  movzbl -0xb010(%rbp,%rax,1),%eax
  mov    %al,(%rdx)
  addl   $0x1,-0x11e64(%rbp)
L451:
  cmpl   $0xfff,-0x11e64(%rbp)
  jle    L690
  movl   $0x0,-0x11e64(%rbp)
  jmp    L470
L443:
  mov    $0x0,%eax
  call   <rand@plt>
  cltd
  shr    $0x18,%edx
  add    %edx,%eax
  movzbl %al,%eax
  sub    %edx,%eax
  mov    %eax,%edx
  mov    -0x11e64(%rbp),%eax
  cltq
  mov    %dl,-0xa010(%rbp,%rax,1)
  mov    -0x11e54(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x11e54(%rbp)
  movslq %eax,%rdx
  mov    -0x11e78(%rbp),%rax
  add    %rax,%rdx
  mov    -0x11e64(%rbp),%eax
  cltq
  movzbl -0xa010(%rbp,%rax,1),%eax
  mov    %al,(%rdx)
  addl   $0x1,-0x11e64(%rbp)
L470:
  cmpl   $0xfff,-0x11e64(%rbp)
  jle    L443
  movl   $0x0,-0x11e4c(%rbp)
  movl   $0x0,-0x11e48(%rbp)
  movl   $0x0,-0x11e64(%rbp)
  jmp    L168
L297:
  movl   $0x0,-0x11e60(%rbp)
  jmp    L423
L586:
  mov    -0x11e64(%rbp),%eax
  shl    $0x9,%eax
  mov    %eax,%edx
  mov    -0x11e60(%rbp),%eax
  add    %edx,%eax
  cltq
  movzbl -0x9010(%rbp,%rax,1),%edx
  mov    -0x11e60(%rbp),%eax
  cltq
  mov    %dl,-0x11e30(%rbp,%rax,1)
  addl   $0x1,-0x11e60(%rbp)
L423:
  cmpl   $0x1ff,-0x11e60(%rbp)
  jle    L586
  movl   $0x0,-0x11e60(%rbp)
  jmp    L193
L450:
  movl   $0x0,-0x11e5c(%rbp)
  jmp    L67
L345:
  movl   $0x0,-0x11e58(%rbp)
  jmp    L414
L395:
  mov    -0x11e5c(%rbp),%eax
  lea    0x0(,%rax,8),%edx
  mov    -0x11e60(%rbp),%eax
  add    %edx,%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x11e58(%rbp),%eax
  add    %eax,%edx
  mov    -0x11e5c(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%ecx
  mov    -0x11e58(%rbp),%eax
  add    %eax,%ecx
  movslq %edx,%rax
  movzbl -0xb010(%rbp,%rax,1),%edx
  movslq %ecx,%rax
  mov    %dl,-0x11c30(%rbp,%rax,1)
  addl   $0x1,-0x11e58(%rbp)
L414:
  cmpl   $0x3f,-0x11e58(%rbp)
  jle    L395
  addl   $0x1,-0x11e5c(%rbp)
L67:
  cmpl   $0x7,-0x11e5c(%rbp)
  jle    L345
  lea    -0x11830(%rbp),%rdx
  lea    -0x11c30(%rbp),%rsi
  lea    -0x11e30(%rbp),%rax
  mov    $0x8,%r8d
  mov    $0x40,%ecx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <tensorproduct@plt>
  movl   $0x0,-0x11e5c(%rbp)
  jmp    L689
L647:
  mov    -0x11e5c(%rbp),%eax
  mov    %eax,-0x11e58(%rbp)
  jmp    L457
L35:
  mov    -0x11e4c(%rbp),%edx
  lea    0x1(%rdx),%eax
  mov    %eax,-0x11e4c(%rbp)
  mov    -0x11e48(%rbp),%eax
  lea    0x1(%rax),%ecx
  mov    %ecx,-0x11e48(%rbp)
  movslq %eax,%rcx
  mov    -0x11e40(%rbp),%rax
  add    %rcx,%rax
  movslq %edx,%rdx
  movzbl -0x11830(%rbp,%rdx,1),%edx
  mov    %dl,(%rax)
  mov    -0x11e54(%rbp),%edx
  lea    0x1(%rdx),%ecx
  mov    %ecx,-0x11e54(%rbp)
  movslq %edx,%rcx
  mov    -0x11e78(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  addl   $0x1,-0x11e58(%rbp)
L457:
  cmpl   $0x3f,-0x11e58(%rbp)
  jle    L35
  addl   $0x1,-0x11e5c(%rbp)
L689:
  cmpl   $0x3f,-0x11e5c(%rbp)
  jle    L647
  movl   $0x0,-0x11e4c(%rbp)
  addl   $0x1,-0x11e60(%rbp)
L193:
  cmpl   $0x7,-0x11e60(%rbp)
  jle    L450
  addl   $0x1,-0x11e64(%rbp)
L168:
  cmpl   $0x7,-0x11e64(%rbp)
  jle    L297
  movl   $0x0,-0x11e64(%rbp)
  jmp    L511
L105:
  movl   $0x0,-0x11e5c(%rbp)
  jmp    L109
L505:
  movl   $0x0,-0x11e58(%rbp)
  jmp    L217
L701:
  mov    -0x11e64(%rbp),%eax
  lea    0x0(,%rax,8),%edx
  mov    -0x11e5c(%rbp),%eax
  add    %edx,%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x11e58(%rbp),%eax
  add    %eax,%edx
  mov    -0x11e5c(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%ecx
  mov    -0x11e58(%rbp),%eax
  add    %eax,%ecx
  movslq %edx,%rax
  movzbl -0x9010(%rbp,%rax,1),%edx
  movslq %ecx,%rax
  mov    %dl,-0x11e30(%rbp,%rax,1)
  addl   $0x1,-0x11e58(%rbp)
L217:
  cmpl   $0x3f,-0x11e58(%rbp)
  jle    L701
  addl   $0x1,-0x11e5c(%rbp)
L109:
  cmpl   $0x7,-0x11e5c(%rbp)
  jle    L505
  movl   $0x0,-0x11e60(%rbp)
  jmp    L613
L606:
  movl   $0x0,-0x11e5c(%rbp)
  jmp    L558
L347:
  movl   $0x0,-0x11e58(%rbp)
  jmp    L703
L355:
  mov    -0x11e5c(%rbp),%eax
  lea    0x0(,%rax,8),%edx
  mov    -0x11e60(%rbp),%eax
  add    %edx,%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x11e58(%rbp),%eax
  add    %eax,%edx
  mov    -0x11e5c(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%ecx
  mov    -0x11e58(%rbp),%eax
  add    %eax,%ecx
  movslq %edx,%rax
  movzbl -0xa010(%rbp,%rax,1),%edx
  movslq %ecx,%rax
  mov    %dl,-0x11a30(%rbp,%rax,1)
  addl   $0x1,-0x11e58(%rbp)
L703:
  cmpl   $0x3f,-0x11e58(%rbp)
  jle    L355
  addl   $0x1,-0x11e5c(%rbp)
L558:
  cmpl   $0x7,-0x11e5c(%rbp)
  jle    L347
  lea    -0x11830(%rbp),%rdx
  lea    -0x11a30(%rbp),%rsi
  lea    -0x11e30(%rbp),%rax
  mov    $0x8,%r8d
  mov    $0x40,%ecx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <tensorproduct@plt>
  movl   $0x0,-0x11e5c(%rbp)
  jmp    L237
L651:
  mov    -0x11e5c(%rbp),%eax
  mov    %eax,-0x11e58(%rbp)
  jmp    L554
L34:
  mov    -0x11e4c(%rbp),%edx
  lea    0x1(%rdx),%eax
  mov    %eax,-0x11e4c(%rbp)
  mov    -0x11e48(%rbp),%eax
  lea    0x1(%rax),%ecx
  mov    %ecx,-0x11e48(%rbp)
  movslq %eax,%rcx
  mov    -0x11e40(%rbp),%rax
  add    %rcx,%rax
  movslq %edx,%rdx
  movzbl -0x11830(%rbp,%rdx,1),%edx
  mov    %dl,(%rax)
  mov    -0x11e54(%rbp),%edx
  lea    0x1(%rdx),%ecx
  mov    %ecx,-0x11e54(%rbp)
  movslq %edx,%rcx
  mov    -0x11e78(%rbp),%rdx
  add    %rcx,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  addl   $0x1,-0x11e58(%rbp)
L554:
  cmpl   $0x3f,-0x11e58(%rbp)
  jle    L34
  addl   $0x1,-0x11e5c(%rbp)
L237:
  cmpl   $0x3f,-0x11e5c(%rbp)
  jle    L651
  movl   $0x0,-0x11e4c(%rbp)
  addl   $0x1,-0x11e60(%rbp)
L613:
  cmpl   $0x7,-0x11e60(%rbp)
  jle    L606
  addl   $0x1,-0x11e64(%rbp)
L511:
  cmpl   $0x7,-0x11e64(%rbp)
  jle    L105
  lea    -0xf010(%rbp),%rdx
  lea    -0x11010(%rbp),%rax
  mov    $0x40,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <matrixtranspose@plt>
  movl   $0x0,-0x11e4c(%rbp)
  movl   $0x0,-0x11e48(%rbp)
  movl   $0x0,-0x11e44(%rbp)
  movl   $0x0,-0x11e64(%rbp)
  jmp    L614
L407:
  movl   $0x0,-0x11e5c(%rbp)
  jmp    L194
L493:
  mov    -0x11e5c(%rbp),%eax
  cltq
  movb   $0x0,-0xe010(%rbp,%rax,1)
  addl   $0x1,-0x11e5c(%rbp)
L194:
  cmpl   $0xfff,-0x11e5c(%rbp)
  jle    L493
  movl   $0x0,-0x11e5c(%rbp)
  jmp    L456
L373:
  mov    -0x11e5c(%rbp),%eax
  mov    %eax,-0x11e58(%rbp)
  jmp    L229
L447:
  mov    -0x11e4c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x11e4c(%rbp)
  movslq %eax,%rdx
  mov    -0x11e40(%rbp),%rax
  add    %rdx,%rax
  mov    -0x11e5c(%rbp),%edx
  mov    %edx,%ecx
  shl    $0x6,%ecx
  mov    -0x11e58(%rbp),%edx
  add    %edx,%ecx
  movzbl (%rax),%edx
  movslq %ecx,%rax
  mov    %dl,-0xe010(%rbp,%rax,1)
  addl   $0x1,-0x11e58(%rbp)
L229:
  cmpl   $0x3f,-0x11e58(%rbp)
  jle    L447
  addl   $0x1,-0x11e5c(%rbp)
L456:
  cmpl   $0x3f,-0x11e5c(%rbp)
  jle    L373
  lea    -0xd010(%rbp),%rdx
  lea    -0xe010(%rbp),%rsi
  lea    -0xf010(%rbp),%rax
  mov    %rdx,%r9
  mov    $0x40,%r8d
  mov    $0x40,%ecx
  mov    $0x40,%edx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <matrixmul@plt>
  lea    -0xc010(%rbp),%rdx
  lea    -0x11010(%rbp),%rsi
  lea    -0xd010(%rbp),%rax
  mov    %rdx,%r9
  mov    $0x40,%r8d
  mov    $0x40,%ecx
  mov    $0x40,%edx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <matrixmul@plt>
  movl   $0x0,-0x11e5c(%rbp)
  jmp    L517
L712:
  mov    -0x11e5c(%rbp),%eax
  mov    %eax,-0x11e58(%rbp)
  jmp    L366
L552:
  mov    -0x11e58(%rbp),%eax
  cmp    -0x11e5c(%rbp),%eax
  jne    L318
  mov    -0x11e5c(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x11e58(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x11e48(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x11e48(%rbp)
  movslq %eax,%rdx
  mov    -0x11e38(%rbp),%rax
  add    %rax,%rdx
  movslq %ecx,%rax
  movzbl -0xc010(%rbp,%rax,1),%eax
  mov    %al,(%rdx)
L318:
  mov    -0x11e58(%rbp),%eax
  cmp    -0x11e5c(%rbp),%eax
  je     L508
  mov    -0x11e58(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x11e5c(%rbp),%eax
  add    %edx,%eax
  cltq
  movzbl -0xc010(%rbp,%rax,1),%eax
  movzbl %al,%edx
  mov    -0x11e5c(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%ecx
  mov    -0x11e58(%rbp),%eax
  add    %ecx,%eax
  cltq
  movzbl -0xc010(%rbp,%rax,1),%eax
  movzbl %al,%eax
  mov    %edx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <add@plt>
  mov    %eax,%ecx
  mov    -0x11e48(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x11e48(%rbp)
  movslq %eax,%rdx
  mov    -0x11e38(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
L508:
  addl   $0x1,-0x11e58(%rbp)
L366:
  cmpl   $0x3f,-0x11e58(%rbp)
  jle    L552
  addl   $0x1,-0x11e5c(%rbp)
L517:
  cmpl   $0x3f,-0x11e5c(%rbp)
  jle    L712
  addl   $0x1,-0x11e64(%rbp)
L614:
  cmpl   $0x7f,-0x11e64(%rbp)
  jle    L407
  mov    -0x11e80(%rbp),%rdx
  mov    -0x11e38(%rbp),%rsi
  lea    -0x8010(%rbp),%rax
  mov    %rdx,%r9
  mov    $0x820,%r8d
  mov    $0x80,%ecx
  mov    $0x80,%edx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <matrixmul@plt>
  movl   $0x0,-0x11e64(%rbp)
  jmp    L599
L302:
  movl   $0x0,-0x11e60(%rbp)
  jmp    L540
L610:
  mov    -0x11e64(%rbp),%eax
  shl    $0x6,%eax
  mov    %eax,%edx
  mov    -0x11e60(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x11e54(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x11e54(%rbp)
  movslq %eax,%rdx
  mov    -0x11e78(%rbp),%rax
  add    %rax,%rdx
  movslq %ecx,%rax
  movzbl -0x10010(%rbp,%rax,1),%eax
  mov    %al,(%rdx)
  addl   $0x1,-0x11e60(%rbp)
L540:
  cmpl   $0x3f,-0x11e60(%rbp)
  jle    L610
  addl   $0x1,-0x11e64(%rbp)
L599:
  cmpl   $0x3f,-0x11e64(%rbp)
  jle    L302
  mov    -0x11e40(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x11e38(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    $0x1,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L276
  call   <__stack_chk_fail@plt>
L276:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D9
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D1
type_guessed: string

tool: D9: ************************************************* 

tool: D1: Start ABC key pair generation 

assistant: ```c
int keypair(unsigned char *sk, unsigned char *pk) {
  unsigned char S[64 * 64], INVS[64 * 64], ST[64 * 64];
  unsigned char M[64 * 64], U[64 * 64], V[64 * 64];
  unsigned char T[128 * 128], INVT[128 * 128];
  unsigned char B[8 * 8 * 64], C[8 * 8 * 64], A[8 * 8 * 64];
  unsigned char TEMPA[8 * 64], TEMPB[8 * 64], TEMPC[8 * 64], TEMPF[2080];
  unsigned char *F;
  unsigned char *FB;
  int i, j, s, t, ij = 0, eof, count, flag = 0;
  unsigned char W = 0;
  F = (unsigned char *)malloc(((8 * 8 + 8 * 8) * 2080) * sizeof(unsigned char));
  FB = (unsigned char *)malloc(((8 * 8 + 8 * 8) * 2080) * (sizeof(unsigned char)));
  printf("************************************************* \n");
  printf("Start ABC key pair generation \n");
  printf("************************************************* \n");
  eof = 0;
  while (eof == 0) {
    for (i = 0; i < 64; i++) {
      for (j = 0; j < 64; j++) {
        INVS[i * 64 + j] = S[i * 64 + j] = rand() % 256;
      }
    }
    eof = matrixinv(INVS, 64);
  }
  eof = 0;
  while (eof == 0) {
    for (i = 0; i < 128; i++) {
      for (j = 0; j < 128; j++) {
        INVT[i * 128 + j] = T[i * 128 + j] = rand() % 256;
      }
    }
    eof = matrixinv(INVT, 128);
  }
  for (i = 0; i < 128; i++) {
    for (j = 0; j < 128; j++) {
      sk[ij++] = INVT[i * 128 + j];
    }
  }
  for (i = 0; i < 8 * 8 * 64; i++) {
    A[i] = rand() % 256;
  }
  for (i = 0; i < 8 * 8 * 64; i++) {
    sk[ij++] = B[i] = rand() % 256;
  }
  for (i = 0; i < 8 * 8 * 64; i++) {
    sk[ij++] = C[i] = rand() % 256;
  }
  count = 0;
  flag = 0;
  for (i = 0; i < 8; i++) {
    for (j = 0; j < 8 * 64; j++) {
      TEMPA[j] = A[i * 8 * 64 + j];
    }
    for (j = 0; j < 8; j++) {
      for (s = 0; s < 8; s++) {
        for (t = 0; t < 64; t++) {
          TEMPB[s * 64 + t] = B[j * 64 + s * 8 * 64 + t];
        }
      }
      tensorproduct(TEMPA, TEMPB, TEMPF, 64, 8);
      for (s = 0; s < 64; s++) {
        for (t = s; t < 64; t++) {
          sk[ij++] = F[flag++] = TEMPF[count++];
        }
      }
      count = 0;
    }
  }
  for (i = 0; i < 8; i++) {
    for (s = 0; s < 8; s++) {
      for (t = 0; t < 64; t++) {
        TEMPA[s * 64 + t] = A[i * 8 * 64 + s * 64 + t];
      }
    }
    for (j = 0; j < 8; j++) {
      for (s = 0; s < 8; s++) {
        for (t = 0; t < 64; t++) {
          TEMPC[s * 64 + t] = C[j * 64 + s * 8 * 64 + t];
        }
      }
      tensorproduct(TEMPA, TEMPC, TEMPF, 64, 8);
      for (s = 0; s < 64; s++) {
        for (t = s; t < 64; t++) {
          sk[ij++] = F[flag++] = TEMPF[count++];
        }
      }
      count = 0;
    }
  }
  matrixtranspose(S, 64, ST);
  count = 0;
  flag = 0;
  int num = 0;
  for (i = 0; i < 8 * (8 + 8); i++) {
    for (s = 0; s < 64 * 64; s++) {
      M[s] = (unsigned char)0;
    }
    for (s = 0; s < 64; s++) {
      for (t = s; t < 64; t++) {
        M[s * 64 + t] = F[count++];
      }
    }
    matrixmul(ST, M, 64, 64, 64, U);
    matrixmul(U, S, 64, 64, 64, V);
    for (s = 0; s < 64; s++) {
      for (t = s; t < 64; t++) {
        if (t == s) {
          FB[flag++] = V[s * 64 + t];
        }
        if (t != s) {
          FB[flag++] = add((unsigned char)V[s * 64 + t], (unsigned char)V[t * 64 + s]);
        }
      }
    }
  }
  matrixmul(T, FB, 128, 128, 2080, pk);
  for (i = 0; i < 64; i++) {
    for (j = 0; j < 64; j++) {
      sk[ij++] = INVS[i * 64 + j];
    }
  }
  free(F);
  free(FB);
  return (1);
}
```