Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

решения / client_ssl

.cpp
Скачиваний:
3
Добавлен:
18.02.2023
Размер:
5.44 Кб
Скачать
// client_ssl.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
// Обеспечить замену символов из имен файлов в нескольких каталогах. Клиент посылает серверу искомые символы и 
// символы для замены. Сервер после завершения операции возвращает результат клиенту в виде имен файлов, где 
// было удалено заданное слово. Протокол взаимодействия UDP.

#include <iostream>
#include <string.h>
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

// link with ws2_32.lib
#pragma comment(lib, "ws2_32.lib")

using namespace std;

SOCKET create_socket(int port)
{
    WORD wVersionRequested = MAKEWORD(2, 2);
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in addr;

    if (WSAStartup(wVersionRequested, &wsa) != 0)
    {
        cout << "Unable to startup. Error Code: " << WSAGetLastError() << endl;
        system("pause");
        exit(EXIT_FAILURE);
    }
    s = socket(AF_INET, SOCK_STREAM, 0);
    if (s < 0)
    {
        cout << "Unable to create socket" << endl;
        WSACleanup();
        system("pause");
        exit(EXIT_FAILURE);
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    //addr.sin_addr.s_addr = inet_pton("74.125.235.20");
    inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);

    while (connect(s, (struct sockaddr*)&addr, sizeof(addr)) != 0)
    {
        cout << "Unable to connect" << endl;
    }
    return s;
}

void init_openssl()
{
    // registers the error strings for all libcrypto functions and also registers the libssl error strings.
    SSL_load_error_strings();

    // registers the available SSL/TLS ciphers and digests.
    SSL_library_init(); // заменено на равнозначное с OpenSSL_add_ssl_algorithms 
}

SSL_CTX* create_context()
{
    const SSL_METHOD* method;
    SSL_CTX* ctx;

    // These are the general - purpose version - flexible SSL / TLS methods.
    method = TLS_client_method(); // заменены с SSLv23_method на рекомендуемые 
    if (!method)
    {
        cout << "Unable to collect SSL method" << endl;
        system("pause");
        exit(EXIT_FAILURE);
    }

    // creates a new SSL_CTX object as framework to establish TLS / SSL enabled connections.
    ctx = SSL_CTX_new(method);
    if (!ctx)
    {
        cout << "Unable to create SSL context" << endl;
        system("pause");
        exit(EXIT_FAILURE);
    }

    return ctx;
}

void configure_context(SSL_CTX* ctx)
{
    SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
    SSL_CTX_set_verify_depth(ctx, 5);
    if (!SSL_CTX_load_verify_locations(ctx, "rootca.pem", NULL))
    {
        cout << "Unable to create SSL context" << endl;
        system("pause");
        exit(EXIT_FAILURE);
    }
}

int main(int argc, char** argv)
{
    setlocale(LC_ALL, "Russian");
    SOCKET sock;
    SSL_CTX* ctx;

    init_openssl();
    ctx = create_context();
    configure_context(ctx);
    sock = create_socket(4433);

    /* Handle connections */
    SSL* ssl = SSL_new(ctx); // create a new SSL structure for a connection
    SSL_set_fd(ssl, (int)sock); // connect the SSL object with a file descriptor

    if (SSL_connect(ssl) != 1)
    {
        char* err = new char[1024];
        ERR_error_string_n(ERR_get_error(), err, 1024);
        cout << err << endl;
        delete[] err;
        cout << "Unable to execute SSL_connect" << endl;
        WSACleanup();
        system("pause");
        exit(EXIT_FAILURE);
    }
    
    // The TLS/SSL handshake was successfully completed
    char* input = new char[256];
    cout << "Введите папку для поиска: ";
    cin >> input;
    if (SSL_write(ssl, input, 256) <= 0)
    {
        char* err = new char[1024];
        ERR_error_string_n(ERR_get_error(), err, 1024);
        cout << err << endl;
        delete[] err;
    }
    
    cout << "Введите искомый набор символов: ";
    cin >> input;
    if (SSL_write(ssl, input, 256) <= 0)
    {
        char* err = new char[1024];
        ERR_error_string_n(ERR_get_error(), err, 1024);
        cout << err << endl;
        delete[] err;
    }

    cout << "Введите набор символов для замены: ";
    cin >> input;
    if (SSL_write(ssl, input, 256) <= 0)
    {
        char* err = new char[1024];
        ERR_error_string_n(ERR_get_error(), err, 1024);
        cout << err << endl;
        delete[] err;
    }
    delete[] input;

    cout << "Результат:" << endl;
    char* reply = new char[256];
    while (1)
    {
        if (SSL_read(ssl, reply, 256) > 0)
        {
            if (!strcmp(reply, "END")) break;
            else cout << reply << endl;
        }
    }
    delete[] reply;

    SSL_shutdown(ssl); // shut down a TLS/SSL connection
    SSL_free(ssl); // free an allocated SSL structure
    closesocket(sock);
    SSL_CTX_free(ctx);
    WSACleanup();
    system("pause");
    return 0;
}
Соседние файлы в папке решения