// File: /workspace/github_c_makefile_star2_O0/TimeToogo[P]ff-proxy/client/c/crypto.c
// Function: ff_client_encrypt_request
bool ff_client_encrypt_request(struct ff_request *request, struct ff_encryption_config *config)
{
    uint8_t encryption_mode = FF_CRYPTO_MODE_AES_256_GCM;
    uint8_t key_derive_mode = FF_KEY_DERIVE_MODE_PBKDF2;
    bool ret_val;
    uint8_t *iv = NULL;
    uint16_t iv_len = 0;
    uint8_t *tag = NULL;
    uint16_t tag_len = 0;
    uint8_t *salt = NULL;
    uint16_t salt_len = 16;

    if (config == NULL)
    {
        ff_log(FF_WARNING, "Encountered encrypted request and no pre-shared-key was set");
        goto error;
    }

    if (!ff_client_encrypt_request_aes_256_gcm_pbkdf2(request, config, &iv, &iv_len, &tag, &tag_len, &salt, &salt_len))
    {
        goto error;
    }

    request->options[request->options_length] = ff_request_option_node_alloc();
    request->options[request->options_length]->type = FF_REQUEST_OPTION_TYPE_ENCRYPTION_MODE;
    request->options[request->options_length]->length = 1;
    ff_request_option_load_buff(request->options[request->options_length], 1, &encryption_mode);
    request->options_length++;

    request->options[request->options_length] = ff_request_option_node_alloc();
    request->options[request->options_length]->type = FF_REQUEST_OPTION_TYPE_ENCRYPTION_IV;
    request->options[request->options_length]->length = iv_len;
    ff_request_option_load_buff(request->options[request->options_length], iv_len, iv);
    request->options_length++;

    request->options[request->options_length] = ff_request_option_node_alloc();
    request->options[request->options_length]->type = FF_REQUEST_OPTION_TYPE_ENCRYPTION_TAG;
    request->options[request->options_length]->length = tag_len;
    ff_request_option_load_buff(request->options[request->options_length], tag_len, tag);
    request->options_length++;

    request->options[request->options_length] = ff_request_option_node_alloc();
    request->options[request->options_length]->type = FF_REQUEST_OPTION_TYPE_KEY_DERIVE_MODE;
    request->options[request->options_length]->length = 1;
    ff_request_option_load_buff(request->options[request->options_length], 1, &key_derive_mode);
    request->options_length++;

    request->options[request->options_length] = ff_request_option_node_alloc();
    request->options[request->options_length]->type = FF_REQUEST_OPTION_TYPE_KEY_DERIVE_SALT;
    request->options[request->options_length]->length = salt_len;
    ff_request_option_load_buff(request->options[request->options_length], salt_len, salt);
    request->options_length++;

    goto done;

error:
    ret_val = false;
    goto cleanup;

done:
    ret_val = true;
    goto cleanup;

cleanup:
    if (iv != NULL)
    {
        FREE(iv);
    }

    if (tag != NULL)
    {
        FREE(tag);
    }

    if (salt != NULL)
    {
        FREE(salt);
    }

    return ret_val;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movb $0x1, -0x11(%rbp)
movb $0x1, -0x12(%rbp)
movq $0x0, -0x20(%rbp)
movw $0x0, -0x22(%rbp)
movq $0x0, -0x30(%rbp)
movw $0x0, -0x32(%rbp)
movq $0x0, -0x40(%rbp)
movw $0x10, -0x42(%rbp)
cmpq $0x0, -0x10(%rbp)
jne 0x3741
movl $0x3, %edi
leaq 0x2d7b(%rip), %rsi      # 0x64b0
movb $0x0, %al
callq 0x4480
jmp 0x39f8
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
leaq -0x20(%rbp), %rdx
leaq -0x22(%rbp), %rcx
leaq -0x30(%rbp), %r8
leaq -0x32(%rbp), %r9
leaq -0x40(%rbp), %r10
leaq -0x42(%rbp), %rax
movq %r10, (%rsp)
movq %rax, 0x8(%rsp)
callq 0x3a70
testb $0x1, %al
jne 0x3778
jmp 0x39f8
callq 0x4620
movq %rax, %rdx
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq %rdx, (%rax,%rcx,8)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq (%rax,%rcx,8), %rax
movl $0x1, (%rax)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq (%rax,%rcx,8), %rax
movw $0x1, 0x4(%rax)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq (%rax,%rcx,8), %rdi
movl $0x1, %esi
leaq -0x11(%rbp), %rdx
callq 0x4660
movq -0x8(%rbp), %rax
movb 0x28(%rax), %cl
addb $0x1, %cl
movb %cl, 0x28(%rax)
callq 0x4620
movq %rax, %rdx
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq %rdx, (%rax,%rcx,8)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq (%rax,%rcx,8), %rax
movl $0x2, (%rax)
movw -0x22(%rbp), %cx
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rdx
movzbl 0x28(%rdx), %edx
movq (%rax,%rdx,8), %rax
movw %cx, 0x4(%rax)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq (%rax,%rcx,8), %rdi
movzwl -0x22(%rbp), %esi
movq -0x20(%rbp), %rdx
callq 0x4660
movq -0x8(%rbp), %rax
movb 0x28(%rax), %cl
addb $0x1, %cl
movb %cl, 0x28(%rax)
callq 0x4620
movq %rax, %rdx
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq %rdx, (%rax,%rcx,8)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq (%rax,%rcx,8), %rax
movl $0x3, (%rax)
movw -0x32(%rbp), %cx
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rdx
movzbl 0x28(%rdx), %edx
movq (%rax,%rdx,8), %rax
movw %cx, 0x4(%rax)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq (%rax,%rcx,8), %rdi
movzwl -0x32(%rbp), %esi
movq -0x30(%rbp), %rdx
callq 0x4660
movq -0x8(%rbp), %rax
movb 0x28(%rax), %cl
addb $0x1, %cl
movb %cl, 0x28(%rax)
callq 0x4620
movq %rax, %rdx
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq %rdx, (%rax,%rcx,8)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq (%rax,%rcx,8), %rax
movl $0x5, (%rax)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq (%rax,%rcx,8), %rax
movw $0x1, 0x4(%rax)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq (%rax,%rcx,8), %rdi
movl $0x1, %esi
leaq -0x12(%rbp), %rdx
callq 0x4660
movq -0x8(%rbp), %rax
movb 0x28(%rax), %cl
addb $0x1, %cl
movb %cl, 0x28(%rax)
callq 0x4620
movq %rax, %rdx
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq %rdx, (%rax,%rcx,8)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq (%rax,%rcx,8), %rax
movl $0x6, (%rax)
movw -0x42(%rbp), %cx
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rdx
movzbl 0x28(%rdx), %edx
movq (%rax,%rdx,8), %rax
movw %cx, 0x4(%rax)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x8(%rbp), %rcx
movzbl 0x28(%rcx), %ecx
movq (%rax,%rcx,8), %rdi
movzwl -0x42(%rbp), %esi
movq -0x40(%rbp), %rdx
callq 0x4660
movq -0x8(%rbp), %rax
movb 0x28(%rax), %cl
addb $0x1, %cl
movb %cl, 0x28(%rax)
jmp 0x39fe
movb $0x0, -0x13(%rbp)
jmp 0x3a02
movb $0x1, -0x13(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x3a1e
jmp 0x3a0b
movq -0x20(%rbp), %rdi
callq 0x2200
movq $0x0, -0x20(%rbp)
jmp 0x3a1e
cmpq $0x0, -0x30(%rbp)
je 0x3a3a
jmp 0x3a27
movq -0x30(%rbp), %rdi
callq 0x2200
movq $0x0, -0x30(%rbp)
jmp 0x3a3a
cmpq $0x0, -0x40(%rbp)
je 0x3a56
jmp 0x3a43
movq -0x40(%rbp), %rdi
callq 0x2200
movq $0x0, -0x40(%rbp)
jmp 0x3a56
movb -0x13(%rbp), %al
andb $0x1, %al
addq $0x60, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)