@@ -144,13 +144,13 @@ kphp::coro::task<int64_t> f$openssl_verify(string data, string signature, string
144144
145145 auto expected_stream{kphp::component::stream::open (CRYPTO_COMPONENT_NAME, k2::stream_kind::component)};
146146 if (!expected_stream) [[unlikely]] {
147- co_return false ;
147+ co_return 0 ;
148148 }
149149
150150 auto stream{*std::move (expected_stream)};
151151 std::array<std::byte, tl::magic{}.footprint ()> response{};
152152 if (!co_await kphp::forks::id_managed (kphp::component::query (stream, tls.view (), response))) [[unlikely]] {
153- co_return false ;
153+ co_return 0 ;
154154 }
155155
156156 tl::fetcher tlf{response};
@@ -362,6 +362,133 @@ kphp::coro::task<Optional<string>> f$openssl_decrypt(string data, string method,
362362 co_return string{response.inner .value .data (), static_cast <string::size_type>(response.inner .value .size ())};
363363}
364364
365+ kphp::coro::task<Optional<string>> f$openssl_pkey_get_public(string key) noexcept {
366+ tl::GetPublicKey get_public_key{.key = {.value = {key.c_str (), key.size ()}}};
367+ tl::storer tls{get_public_key.footprint ()};
368+ get_public_key.store (tls);
369+
370+ auto expected_stream{kphp::component::stream::open (CRYPTO_COMPONENT_NAME, k2::stream_kind::component)};
371+ if (!expected_stream) [[unlikely]] {
372+ co_return false ;
373+ }
374+
375+ auto stream{*std::move (expected_stream)};
376+ kphp::stl::vector<std::byte, kphp::memory::script_allocator> response_bytes{};
377+ if (!co_await kphp::forks::id_managed (kphp::component::query (stream, tls.view (), kphp::component::read_ext::append (response_bytes)))) [[unlikely]] {
378+ co_return false ;
379+ }
380+
381+ tl::fetcher tlf{response_bytes};
382+ tl::Maybe<tl::string> response;
383+ kphp::log::assertion (response.fetch (tlf));
384+ if (!response.opt_value ) {
385+ co_return false ;
386+ }
387+
388+ co_return string{(*response.opt_value ).value .data (), static_cast <string::size_type>((*response.opt_value ).value .size ())};
389+ }
390+
391+ kphp::coro::task<Optional<string>> f$openssl_pkey_get_private(string key, string passphrase) noexcept {
392+ tl::GetPrivateKey get_private_key{
393+ .key = {.value = {key.c_str (), key.size ()}},
394+ .passphrase = {.value = {passphrase.c_str (), passphrase.size ()}},
395+ };
396+ tl::storer tls{get_private_key.footprint ()};
397+ get_private_key.store (tls);
398+
399+ auto expected_stream{kphp::component::stream::open (CRYPTO_COMPONENT_NAME, k2::stream_kind::component)};
400+ if (!expected_stream) [[unlikely]] {
401+ co_return false ;
402+ }
403+
404+ auto stream{*std::move (expected_stream)};
405+ kphp::stl::vector<std::byte, kphp::memory::script_allocator> response_bytes{};
406+ if (!co_await kphp::forks::id_managed (kphp::component::query (stream, tls.view (), kphp::component::read_ext::append (response_bytes)))) [[unlikely]] {
407+ co_return false ;
408+ }
409+
410+ tl::fetcher tlf{response_bytes};
411+ tl::Maybe<tl::string> response;
412+ kphp::log::assertion (response.fetch (tlf));
413+ if (!response.opt_value ) {
414+ co_return false ;
415+ }
416+
417+ co_return string{(*response.opt_value ).value .data (), static_cast <string::size_type>((*response.opt_value ).value .size ())};
418+ }
419+
420+ kphp::coro::task<bool > f$openssl_public_encrypt(string data, string& encrypted_data, string public_key) noexcept {
421+ tl::PublicEncrypt public_encrypt{
422+ .key = {.value = {public_key.c_str (), public_key.size ()}},
423+ .data = {.value = {data.c_str (), data.size ()}},
424+ };
425+ tl::storer tls{public_encrypt.footprint ()};
426+ public_encrypt.store (tls);
427+
428+ auto expected_stream{kphp::component::stream::open (CRYPTO_COMPONENT_NAME, k2::stream_kind::component)};
429+ if (!expected_stream) [[unlikely]] {
430+ co_return false ;
431+ }
432+
433+ auto stream{*std::move (expected_stream)};
434+ kphp::stl::vector<std::byte, kphp::memory::script_allocator> response_bytes{};
435+ if (!co_await kphp::forks::id_managed (kphp::component::query (stream, tls.view (), kphp::component::read_ext::append (response_bytes)))) [[unlikely]] {
436+ co_return false ;
437+ }
438+
439+ tl::fetcher tlf{response_bytes};
440+ tl::String response{};
441+ kphp::log::assertion (response.fetch (tlf));
442+ encrypted_data = {response.inner .value .data (), static_cast <string::size_type>(response.inner .value .size ())};
443+ co_return true ;
444+ }
445+
446+ kphp::coro::task<bool > f$openssl_public_encrypt(string data, mixed& result, string key) noexcept {
447+ string result_string;
448+ if (co_await f$openssl_public_encrypt (data, result_string, key)) {
449+ result = std::move (result_string);
450+ co_return true ;
451+ }
452+ result = mixed{};
453+ co_return false ;
454+ }
455+
456+ kphp::coro::task<bool > f$openssl_private_decrypt(string data, string& decrypted_data, string private_key) noexcept {
457+ tl::PrivateDecrypt private_decrypt{
458+ .key = {.value = {private_key.c_str (), private_key.size ()}},
459+ .data = {.value = {data.c_str (), data.size ()}},
460+ };
461+ tl::storer tls{private_decrypt.footprint ()};
462+ private_decrypt.store (tls);
463+
464+ auto expected_stream{kphp::component::stream::open (CRYPTO_COMPONENT_NAME, k2::stream_kind::component)};
465+ if (!expected_stream) [[unlikely]] {
466+ co_return false ;
467+ }
468+
469+ auto stream{*std::move (expected_stream)};
470+ kphp::stl::vector<std::byte, kphp::memory::script_allocator> response_bytes{};
471+ if (!co_await kphp::forks::id_managed (kphp::component::query (stream, tls.view (), kphp::component::read_ext::append (response_bytes)))) [[unlikely]] {
472+ co_return false ;
473+ }
474+
475+ tl::fetcher tlf{response_bytes};
476+ tl::String response{};
477+ kphp::log::assertion (response.fetch (tlf));
478+ decrypted_data = {response.inner .value .data (), static_cast <string::size_type>(response.inner .value .size ())};
479+ co_return true ;
480+ }
481+
482+ kphp::coro::task<bool > f$openssl_private_decrypt(string data, mixed& result, string key) noexcept {
483+ string result_string;
484+ if (co_await f$openssl_private_decrypt (data, result_string, key)) {
485+ result = std::move (result_string);
486+ co_return true ;
487+ }
488+ result = mixed{};
489+ co_return false ;
490+ }
491+
365492namespace {
366493
367494constexpr std::array<std::pair<std::string_view, tl::HashAlgorithm>, 6 > HASH_ALGOS = {{{" md5" , tl::HashAlgorithm::MD5},
0 commit comments