<?php

// ===== SUPPORTED =====

define('OPENSSL_ALGO_SHA1'  ,  0x215fb97d);
define('OPENSSL_ALGO_MD5'   ,  0x257ddf13);
define('OPENSSL_ALGO_MD4'   ,  0x317fe3d1);
define('OPENSSL_ALGO_MD2'   ,  0x5aca6998);
define('OPENSSL_ALGO_DSS1'  ,  0xf572d6b6);
define('OPENSSL_ALGO_SHA224',  0x8bce55e9);
define('OPENSSL_ALGO_SHA256',  0x6c977f8c);
define('OPENSSL_ALGO_SHA384',  0xf54c2608);
define('OPENSSL_ALGO_SHA512',  0x225df2b6);
define('OPENSSL_ALGO_RMD160',  0x1887e6b4);

define('OPENSSL_RAW_DATA', 1);
define('OPENSSL_ZERO_PADDING', 2);
define('OPENSSL_DONT_ZERO_PAD_KEY', 4);


/** @kphp-extern-func-info interruptible */
function openssl_sign ($data ::: string, &$signature ::: string, $priv_key_id ::: string, $signature_alg ::: int = 1) ::: bool;

/** @kphp-extern-func-info interruptible */
function openssl_verify ($data ::: string, $signature ::: string, $pub_key_id ::: string, $signature_alg ::: int = 1) ::: int;

/** @kphp-extern-func-info interruptible */
function openssl_random_pseudo_bytes ($length ::: int) ::: string | false;

/** @kphp-extern-func-info interruptible */
function openssl_x509_parse ($x509cert ::: string, $shortnames ::: bool = true) ::: mixed[] | false;

function openssl_get_cipher_methods($aliases ::: bool = false) ::: string[];

function openssl_cipher_iv_length($method ::: string) ::: int | false;

/** @kphp-extern-func-info interruptible */
function openssl_encrypt($data ::: string, $method ::: string, $key ::: string,  $options ::: int = 0, $iv ::: string  = '',
                         string &$tag = TODO, $aad ::: string = '', $tag_length ::: int = 16) ::: string | false;

/** @kphp-extern-func-info interruptible */
function openssl_decrypt($data ::: string, $method ::: string, $key ::: string, $options ::: int = 0, $iv ::: string  = '',
                        $tag ::: string = '', $aad ::: string = '') ::: string | false;

function md5 ($s ::: string, $raw_output ::: bool = false): string;

// ===== UNSUPPORTED =====

define('X509_PURPOSE_SSL_CLIENT'    ,     1);
define('X509_PURPOSE_SSL_SERVER'    ,     2);
define('X509_PURPOSE_NS_SSL_SERVER' ,     3);
define('X509_PURPOSE_SMIME_SIGN'    ,     4);
define('X509_PURPOSE_SMIME_ENCRYPT' ,     5);
define('X509_PURPOSE_CRL_SIGN'      ,     6);
define('X509_PURPOSE_ANY'           ,     7);
define('X509_PURPOSE_OCSP_HELPER'   ,     8);
define('X509_PURPOSE_TIMESTAMP_SIGN',     9);

define('PKCS7_TEXT', 0x1);
define('PKCS7_NOCERTS', 0x2);
define('PKCS7_NOSIGS', 0x4);
define('PKCS7_NOCHAIN', 0x8);
define('PKCS7_NOINTERN', 0x10);
define('PKCS7_NOVERIFY', 0x20);
define('PKCS7_BINARY', 0x80);
define('PKCS7_DETACHED', 0x40);
define('PKCS7_NOATTR', 0x100);

/** @kphp-extern-func-info generate-stub */
function openssl_public_encrypt ($data ::: string, &$result ::: mixed, $key ::: string) ::: bool;
/** @kphp-extern-func-info generate-stub */
function openssl_private_decrypt ($data ::: string, &$result ::: mixed, $key ::: string) ::: bool;
/** @kphp-extern-func-info generate-stub */
function openssl_pkey_get_private ($key ::: string, $passphrase ::: string = '') ::: string | false;
/** @kphp-extern-func-info generate-stub */
function openssl_pkey_get_public ($key ::: string) ::: string | false;
/** @kphp-extern-func-info generate-stub */
function openssl_x509_verify ($x509cert ::: string, $public_key ::: string) ::: int;


/** @kphp-extern-func-info generate-stub */
function openssl_pkcs7_sign($infile ::: string, $outfile ::: string,
                            $sign_cert ::: string, $priv_key ::: string,
                            string[] $headers, $flags ::: int = PKCS7_DETACHED, $extra_certs ::: string = "") ::: bool;

