// File: /workspace/github_c_makefile_star2_O0/sbp[P]tweetnacl-tools/tweetnacl.c
// Function: crypto_sign_ed25519_tweet
int crypto_sign(u8 *sm,u64 *smlen,const u8 *m,u64 n,const u8 *sk)
{
  u8 d[64],h[64],r[64];
  i64 i,j,x[64];
  gf p[4];

  crypto_hash(d, sk, 32);
  d[0] &= 248;
  d[31] &= 127;
  d[31] |= 64;

  *smlen = n+64;
  FOR(i,n) sm[64 + i] = m[i];
  FOR(i,32) sm[32 + i] = d[32 + i];

  crypto_hash(r, sm+32, n+32);
  reduce(r);
  scalarbase(p,r);
  pack(sm,p);

  FOR(i,32) sm[i+32] = sk[i+32];
  crypto_hash(h,sm,n + 64);
  reduce(h);

  FOR(i,64) x[i] = 0;
  FOR(i,32) x[i] = (u64) r[i];
  FOR(i,32) FOR(j,32) x[i+j] += h[i] * (u64) d[j];
  modL(sm + 32,x);

  return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x500, %rsp            # imm = 0x500
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
leaq -0x70(%rbp), %rdi
movq -0x28(%rbp), %rsi
movl $0x20, %edx
callq 0x3b00
movzbl -0x70(%rbp), %eax
andl $0xf8, %eax
movb %al, -0x70(%rbp)
movzbl -0x51(%rbp), %eax
andl $0x7f, %eax
movb %al, -0x51(%rbp)
movzbl -0x51(%rbp), %eax
orl $0x40, %eax
movb %al, -0x51(%rbp)
movq -0x20(%rbp), %rcx
addq $0x40, %rcx
movq -0x10(%rbp), %rax
movq %rcx, (%rax)
movq $0x0, -0xf8(%rbp)
movq -0xf8(%rbp), %rax
cmpq -0x20(%rbp), %rax
jae 0x3fac
movq -0x18(%rbp), %rax
movq -0xf8(%rbp), %rcx
movb (%rax,%rcx), %dl
movq -0x8(%rbp), %rax
movq -0xf8(%rbp), %rcx
addq $0x40, %rcx
movb %dl, (%rax,%rcx)
movq -0xf8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xf8(%rbp)
jmp 0x3f6b
movq $0x0, -0xf8(%rbp)
cmpq $0x20, -0xf8(%rbp)
jge 0x3ff6
movq -0xf8(%rbp), %rax
addq $0x20, %rax
movb -0x70(%rbp,%rax), %dl
movq -0x8(%rbp), %rax
movq -0xf8(%rbp), %rcx
addq $0x20, %rcx
movb %dl, (%rax,%rcx)
movq -0xf8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xf8(%rbp)
jmp 0x3fb7
leaq -0xf0(%rbp), %rdi
movq -0x8(%rbp), %rsi
addq $0x20, %rsi
movq -0x20(%rbp), %rdx
addq $0x20, %rdx
callq 0x3b00
leaq -0xf0(%rbp), %rdi
callq 0x41f0
leaq -0x500(%rbp), %rdi
leaq -0xf0(%rbp), %rsi
callq 0x3dc0
movq -0x8(%rbp), %rdi
leaq -0x500(%rbp), %rsi
callq 0x3e60
movq $0x0, -0xf8(%rbp)
cmpq $0x20, -0xf8(%rbp)
jge 0x4088
movq -0x28(%rbp), %rax
movq -0xf8(%rbp), %rcx
movb 0x20(%rax,%rcx), %dl
movq -0x8(%rbp), %rax
movq -0xf8(%rbp), %rcx
movb %dl, 0x20(%rax,%rcx)
movq -0xf8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xf8(%rbp)
jmp 0x404c
leaq -0xb0(%rbp), %rdi
movq -0x8(%rbp), %rsi
movq -0x20(%rbp), %rdx
addq $0x40, %rdx
callq 0x3b00
leaq -0xb0(%rbp), %rdi
callq 0x41f0
movq $0x0, -0xf8(%rbp)
cmpq $0x40, -0xf8(%rbp)
jge 0x40e8
movq -0xf8(%rbp), %rax
movq $0x0, -0x300(%rbp,%rax,8)
movq -0xf8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xf8(%rbp)
jmp 0x40b7
movq $0x0, -0xf8(%rbp)
cmpq $0x20, -0xf8(%rbp)
jge 0x4131
movq -0xf8(%rbp), %rax
movzbl -0xf0(%rbp,%rax), %eax
movl %eax, %ecx
movq -0xf8(%rbp), %rax
movq %rcx, -0x300(%rbp,%rax,8)
movq -0xf8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xf8(%rbp)
jmp 0x40f3
movq $0x0, -0xf8(%rbp)
cmpq $0x20, -0xf8(%rbp)
jge 0x41cb
movq $0x0, -0x100(%rbp)
cmpq $0x20, -0x100(%rbp)
jge 0x41b2
movq -0xf8(%rbp), %rax
movzbl -0xb0(%rbp,%rax), %eax
movl %eax, %ecx
movq -0x100(%rbp), %rax
movzbl -0x70(%rbp,%rax), %eax
imulq %rax, %rcx
movq -0xf8(%rbp), %rax
addq -0x100(%rbp), %rax
addq -0x300(%rbp,%rax,8), %rcx
movq %rcx, -0x300(%rbp,%rax,8)
movq -0x100(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x100(%rbp)
jmp 0x4155
jmp 0x41b4
movq -0xf8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xf8(%rbp)
jmp 0x413c
movq -0x8(%rbp), %rdi
addq $0x20, %rdi
leaq -0x300(%rbp), %rsi
callq 0x42a0
xorl %eax, %eax
addq $0x500, %rsp            # imm = 0x500
popq %rbp
retq
nopw (%rax,%rax)