From 54fab0ad23d060968ae6283babbf17923d72132d Mon Sep 17 00:00:00 2001 From: HappyTanuki Date: Sun, 15 Jun 2025 23:21:54 +0900 Subject: [PATCH] =?UTF-8?q?openssl=20=EC=B3=90=EB=82=B4!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Client/CMakeLists.txt | 3 -- Server/CMakeLists.txt | 3 -- impl/session/session.cpp | 32 +------------- impl/socket/iocp.cpp | 89 ++++----------------------------------- include/session/session.h | 7 --- include/socket/address.h | 6 --- include/socket/iocp.h | 30 ------------- 7 files changed, 9 insertions(+), 161 deletions(-) diff --git a/Client/CMakeLists.txt b/Client/CMakeLists.txt index 65d0a80..4fd0458 100644 --- a/Client/CMakeLists.txt +++ b/Client/CMakeLists.txt @@ -3,7 +3,6 @@ set(PROJECT_NAME "Client") project(${PROJECT_NAME}) find_package(Vulkan REQUIRED) -find_package(OpenSSL REQUIRED) include(Shaders.cmake) include(FetchContent) @@ -59,8 +58,6 @@ target_link_libraries(${PROJECT_NAME} PRIVATE glfw) target_link_libraries(${PROJECT_NAME} PRIVATE Microsoft.GSL::GSL) target_link_libraries(${PROJECT_NAME} PRIVATE spdlog) target_link_libraries(${PROJECT_NAME} PRIVATE assimp::assimp) -target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::Crypto) -target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL) if(WIN32) target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32) diff --git a/Server/CMakeLists.txt b/Server/CMakeLists.txt index 4f48301..79e1135 100644 --- a/Server/CMakeLists.txt +++ b/Server/CMakeLists.txt @@ -5,7 +5,6 @@ set(PROJECT_NAME "Server") project(${PROJECT_NAME}) find_package(Vulkan REQUIRED) -find_package(OpenSSL REQUIRED) include(FetchContent) @@ -60,8 +59,6 @@ target_link_libraries(${PROJECT_NAME} PRIVATE glfw) target_link_libraries(${PROJECT_NAME} PRIVATE Microsoft.GSL::GSL) target_link_libraries(${PROJECT_NAME} PRIVATE spdlog) target_link_libraries(${PROJECT_NAME} PRIVATE assimp::assimp) -target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::Crypto) -target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL) if(WIN32) target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32) diff --git a/impl/session/session.cpp b/impl/session/session.cpp index a9e86d8..0e9f4ef 100644 --- a/impl/session/session.cpp +++ b/impl/session/session.cpp @@ -11,31 +11,7 @@ Session::Session(gsl::not_null iocp, utils::ThreadPool* tp, : iocp_(iocp), tp_(tp), proto_(proto) { switch (proto) { case SessionProtocol::UDP: - case SessionProtocol::QUIC: { - Network::UDPSocket* sock = new Network::UDPSocket(); - sock_ = sock; - sock->init(addr.family); - switch (type) { - case SessionType::CONNECT: - ssl_ctx_ = ::SSL_CTX_new(::OSSL_QUIC_client_method()); - if (ssl_ctx_ == nullptr) { - spdlog::critical("SSL_CTX_new()"); - std::exit(EXIT_FAILURE); - } - ::SSL_CTX_set_verify(ssl_ctx_, SSL_VERIFY_PEER, NULL); - - if (!::SSL_CTX_set_default_verify_paths(ssl_ctx_)) { - spdlog::critical("SSL_CTX_set_default_verify_paths()"); - std::exit(EXIT_FAILURE); - } - break; - case SessionType::LISTEN: - sock->bind(addr); - break; - default: - std::exit(EXIT_FAILURE); - } - } break; + case SessionProtocol::QUIC: case SessionProtocol::TCP: case SessionProtocol::TLS: { Network::TCPSocket* sock = new Network::TCPSocket(); @@ -56,12 +32,6 @@ Session::Session(gsl::not_null iocp, utils::ThreadPool* tp, default: std::exit(EXIT_FAILURE); } - - ssl_ = ::SSL_new(ssl_ctx_); - if (ssl_ == nullptr) { - spdlog::critical("SSL_new()"); - std::exit(EXIT_FAILURE); - } } Session::~Session() { diff --git a/impl/socket/iocp.cpp b/impl/socket/iocp.cpp index d83c23e..ca7268b 100644 --- a/impl/socket/iocp.cpp +++ b/impl/socket/iocp.cpp @@ -192,59 +192,10 @@ void IOCP::iocpWatcher_(utils::ThreadPool* IOCPThread) { std::lock_guard lock(*GetRecvQueueMutex_(sock)); auto queue_list = GetRecvQueue_(sock); if (data->event == IOCPEVENT::READ) { - if (proto_ == SessionProtocol::TLS || - proto_ == SessionProtocol::QUIC) { // DEPRECATED. openssl을 사용할 수가 - // 없기 때문에 추후 완성 뒤에 기능을 - // 붙이든 해야 할 듯 함. - // DEBUG: BIO_write 전 OpenSSL 에러 스택 확인 (혹시 모를 이전 에러) - ERR_print_errors_fp(stderr); // 이미 오류 스택에 뭔가 있는지 확인용 - fprintf(stderr, "--- Before BIO_write ---\n"); - - ::BIO_write(::SSL_get_rbio(data->ssl.get()), data->wsabuf.buf, - cbTransfrred); - - // DEBUG: BIO_write 후 OpenSSL 에러 스택 확인 (BIO_write에서 에러 발생 시) - ERR_print_errors_fp(stderr); // BIO_write에서도 에러가 발생할 수 있음 - fprintf(stderr, "--- After BIO_write, cbTransfrred: %lu ---\n", - cbTransfrred); - - while ((red_data = ::SSL_read(data->ssl.get(), buf.data(), buf.size())) > - 0) { - queue_list->emplace_back(std::make_pair( - std::vector(buf.begin(), buf.begin() + red_data), 0)); - } - if (red_data == -1) { - auto ssl_error_code = SSL_get_error( - data->ssl.get(), red_data); // 여기서 SSL_get_error 결과 저장 - auto err_msg = std::format("SSL_read failed with SSL_get_error: {}", - ssl_error_code); - fprintf(stderr, "%s\n", err_msg.c_str()); - - // *** 가장 중요한 부분: SSL_ERROR_SSL일 때 상세 에러를 강제로 출력 시도 - // *** - if (ssl_error_code == SSL_ERROR_SSL) { - fprintf(stderr, "Detailed SSL_ERROR_SSL trace:\n"); - unsigned long err_peek; - // ERR_get_error()를 사용하여 스택의 모든 오류를 팝하고 출력 - while ((err_peek = ERR_get_error()) != 0) { - char err_str[256]; - ERR_error_string_n(err_peek, err_str, sizeof(err_str)); - fprintf(stderr, "OpenSSL stack error: %s\n", err_str); - } - } else { - // SSL_ERROR_SSL이 아닌 다른 오류 (SYSCALL, WANT_READ 등)일 경우 - // ERR_print_errors_fp는 여전히 유용할 수 있음 - ERR_print_errors_fp(stderr); - } - - throw std::runtime_error(err_msg); // 예외 발생 - } - } else { - ::memcpy(buf.data(), data->wsabuf.buf, data->transferredbytes); - queue_list->emplace_back(std::make_pair( - std::vector(buf.begin(), buf.begin() + data->transferredbytes), - 0)); - } + ::memcpy(buf.data(), data->wsabuf.buf, data->transferredbytes); + queue_list->emplace_back(std::make_pair( + std::vector(buf.begin(), buf.begin() + data->transferredbytes), + 0)); DWORD recvbytes = 0, flags = 0; IOCPPASSINDATA* recv_data = new IOCPPASSINDATA(data->bufsize); @@ -314,34 +265,10 @@ void IOCP::packet_sender_(SOCKET sock) { int data_len = 0; - if (proto_ == SessionProtocol::TLS || proto_ == SessionProtocol::QUIC) { - int ret = - ::SSL_write(front->ssl.get(), front->wsabuf.buf, front->wsabuf.len); - if (ret <= 0) { - int err = ::SSL_get_error(front->ssl.get(), ret); - if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) { - queue->push_front(front); - break; - } - std::unique_lock lk(socket_mod_mutex_); - send_queue_.erase(sock); - break; - } - - while ((data_len = ::BIO_read(::SSL_get_wbio(front->ssl.get()), - buf.data(), buf.size())) > 0) { - wsabuf.buf = buf.data(); - wsabuf.len = data_len; - - ::WSASend(sock, &wsabuf, 1, &sendbytes, 0, nullptr, nullptr); - } - - } else { - data_len = front->wsabuf.len; - wsabuf.buf = front->wsabuf.buf; - wsabuf.len = data_len; - ::WSASend(sock, &wsabuf, 1, &sendbytes, 0, nullptr, nullptr); - } + data_len = front->wsabuf.len; + wsabuf.buf = front->wsabuf.buf; + wsabuf.len = data_len; + ::WSASend(sock, &wsabuf, 1, &sendbytes, 0, nullptr, nullptr); } } diff --git a/include/session/session.h b/include/session/session.h index 9ea55b0..dc692bc 100644 --- a/include/session/session.h +++ b/include/session/session.h @@ -1,9 +1,5 @@ #pragma once -#include -#include -#include - #include "socket/iocp.h" #include "utils/thread_pool.h" @@ -23,8 +19,5 @@ class Session { SessionProtocol proto_; Network::Socket* sock_ = nullptr; - - SSL_CTX* ssl_ctx_ = nullptr; - SSL* ssl_ = nullptr; }; } // namespace Network diff --git a/include/socket/address.h b/include/socket/address.h index 593e286..d479347 100644 --- a/include/socket/address.h +++ b/include/socket/address.h @@ -1,9 +1,5 @@ #pragma once -#include -#include -#include - namespace Network { struct Address { @@ -24,8 +20,6 @@ struct Address { struct sockaddr_in6 addr_in6; }; socklen_t length; - - BIO_ADDR* bio_addr_info; }; } // namespace Chattr diff --git a/include/socket/iocp.h b/include/socket/iocp.h index 3ebebb1..18eb387 100644 --- a/include/socket/iocp.h +++ b/include/socket/iocp.h @@ -1,7 +1,4 @@ #pragma once -#include -#include -#include #include #include @@ -35,7 +32,6 @@ struct IOCPPASSINDATA { OVERLAPPED overlapped; IOCPEVENT event; std::shared_ptr socket; - std::shared_ptr ssl; std::uint32_t transferredbytes; WSABUF wsabuf; std::uint32_t bufsize; @@ -48,32 +44,6 @@ struct IOCPPASSINDATA { std::memset(&overlapped, 0, sizeof(overlapped)); event = IOCPEVENT::QUIT; socket = nullptr; - ssl = nullptr; - transferredbytes = 0; - this->bufsize = bufsize; - IOCPInstance = nullptr; - - wsabuf.buf = new char[bufsize]; - wsabuf.len = bufsize; - } - IOCPPASSINDATA(std::uint32_t bufsize, SSL_CTX* ctx) { - std::memset(&overlapped, 0, sizeof(overlapped)); - event = IOCPEVENT::QUIT; - socket = nullptr; - ssl = std::shared_ptr(::SSL_new(ctx), ::SSL_free); - if (ssl == nullptr) { - throw std::runtime_error("SSL_new failed. Check SSL_CTX or memory."); - } - BIO* rbio = BIO_new(BIO_s_mem()); - BIO* wbio = BIO_new(BIO_s_mem()); - - if (!rbio || !wbio) { - BIO_free(rbio); - BIO_free(wbio); - throw std::runtime_error("BIO_new failed"); - } - - SSL_set_bio(ssl.get(), rbio, wbio); transferredbytes = 0; this->bufsize = bufsize; IOCPInstance = nullptr;