diff --git a/kniznica/komunikacia.c b/kniznica/komunikacia.c index 29252ae..f890e6b 100644 --- a/kniznica/komunikacia.c +++ b/kniznica/komunikacia.c @@ -3,26 +3,30 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 6.4.2020 // +// Datum poslednej upravy: 15.4.2020 // ////////////////////////////////////////////////// #include "komunikacia.h" #include "kryptografia.h" -#include "rs232.h" int poslat_subor(WOLFSSL* ssl, WOLFSSL_CTX* ctx, const char* cesta, nastavenia_aplikacie *nastavenia) { int uspech; - //odoslanie nazvu (resp. cesty) suboru - uspech = wolfSSL_write(ssl, cesta, VELKOST_CESTY); - if(uspech <= 0) + //odoslanie nazvu (resp. cesty) suboru + uspech = 0; + while(uspech < VELKOST_CESTY) { - fprintf(stderr, "Nastala chyba pri posielani dat o subore.\n"); - return -1; + uspech = wolfSSL_write(ssl, cesta, VELKOST_CESTY); + if(uspech <= 0) + { + fprintf(stderr, "Nastala chyba pri posielani dat o subore.\n"); + return -1; + } } - FILE* subor = fopen(cesta, "r"); + //otvorenie suboru na citanie + FILE* subor = fopen(cesta, "rb"); if(subor == NULL) { fprintf(stderr, "Nebolo mozne najst pozadovany subor.\n"); @@ -36,47 +40,58 @@ int poslat_subor(WOLFSSL* ssl, WOLFSSL_CTX* ctx, const char* cesta, nastavenia_a //nastavi ukazovatel na koniec suboru //a zisti velkost suboru fseek(subor, 0, SEEK_END); - long velkost = ftell(subor); + int velkost = (int)ftell(subor); char velkost_suboru[VELKOST_SUBOR]; sprintf(velkost_suboru, "%ld", velkost); printf("Velkost suboru: %s bajtov\n", velkost_suboru); - wolfSSL_write(ssl, velkost_suboru, VELKOST_SUBOR); + uspech = 0; + while(uspech < VELKOST_SUBOR) + { + uspech = wolfSSL_write(ssl, velkost_suboru, VELKOST_SUBOR); + if(uspech <= 0) + { + fprintf(stderr, "Nastala chyba pri posielani dat o velkosti suboru.\n"); + return -1; + } + } //nastavi ukazovatel na zaciatok suboru //a nacita data zo suboru do pola - char* pole = malloc(velkost); - char* pole_uk = pole; + unsigned char* pole = calloc(velkost, sizeof(unsigned char)); fseek(subor, 0, SEEK_SET); - fread(pole, 1, velkost, subor); - fclose(subor); + fread((unsigned char*)pole, 1, velkost, subor); //posielanie jednotlivych bajtov - for(int i = 0; i < velkost + 1; ++i) + uspech = 0; + while(uspech < velkost) { - uspech = wolfSSL_write(ssl, pole_uk, velkost); + uspech = wolfSSL_write(ssl, (unsigned char*)pole, velkost); if(uspech <= 0) { fprintf(stderr, "Nastala chyba pri posielani suboru.\n"); return -1; } - pole_uk += 1; } printf("Subor bol uspesne odoslany.\n"); //generovanie a poslanie kontrolneho suctu serveru pre kontrolu byte* kontrolny_sucet; int velkost_kontrolneho_suctu; - kontrolny_sucet = generovat_kontrolny_sucet_suboru(nastavenia->funkcia, cesta, &velkost_kontrolneho_suctu); - for(int i = 0; i < velkost_kontrolneho_suctu; i++) + kontrolny_sucet = generovat_kontrolny_sucet_suboru(nastavenia, cesta, &velkost_kontrolneho_suctu); + + uspech = 0; + while(uspech < velkost_kontrolneho_suctu) { - kontrolny_sucet[i] = (char)kontrolny_sucet[i]; - } - wolfSSL_write(ssl, kontrolny_sucet, velkost_kontrolneho_suctu); - if(uspech <= 0) - { - fprintf(stderr, "Nastala chyba pri posielani kontrolneho suctu.\n"); - return -1; + uspech = wolfSSL_write(ssl, kontrolny_sucet, velkost_kontrolneho_suctu); + if(uspech <= 0) + { + fprintf(stderr, "Nastala chyba pri posielani kontrolneho suctu.\n"); + return -1; + } } + free(kontrolny_sucet); + fclose(subor); + free(pole); return 0; } } @@ -85,25 +100,35 @@ int prijat_subor(WOLFSSL* ssl, WOLFSSL_CTX* ctx, nastavenia_aplikacie* nastaveni { int uspech; - //prijem dat o velkosti suboru + //prijem dat o subore char* cesta = calloc(VELKOST_CESTY, sizeof(char)); - uspech = wolfSSL_read(ssl, cesta, VELKOST_CESTY); - if(uspech <= 0) + char* velkost_suboru = calloc(VELKOST_SUBOR, sizeof(char)); + + uspech = 0; + while(uspech < VELKOST_CESTY) { - fprintf(stderr, "Nastala chyba pri prijati dat o subore\n"); - return -1; + uspech = wolfSSL_read(ssl, cesta, VELKOST_CESTY); + if(uspech <= 0) + { + fprintf(stderr, "Nastala chyba pri prijati dat o subore\n"); + return -1; + } } printf("Prebieha prijimanie suboru %s\n", cesta); //ziskanie informacie od klienta o velkosti odoslaneho suboru - char velkost_suboru[32]; - uspech = wolfSSL_read(ssl, velkost_suboru, VELKOST_SUBOR); - if(uspech <= 0) + uspech = 0; + while(uspech < VELKOST_SUBOR) { - fprintf(stderr, "Nastala chyba pri prijati velkosti suboru\n"); - return -1; + uspech = wolfSSL_read(ssl, velkost_suboru, VELKOST_SUBOR); + if(uspech <= 0) + { + fprintf(stderr, "Nastala chyba pri prijati velkosti suboru\n"); + return -1; + } } - long velkost = atol(velkost_suboru); + + int velkost = (int)atol(velkost_suboru); if(velkost < 1) { printf("Nastala chyba pri prijati suboru\n"); @@ -115,42 +140,46 @@ int prijat_subor(WOLFSSL* ssl, WOLFSSL_CTX* ctx, nastavenia_aplikacie* nastaveni } //prijem jednotlivych bajtov - char* pole = malloc(velkost); - char* pole_uk = pole; - for(int i = 0; i < velkost + 1; ++i) + unsigned char* pole = calloc(velkost, sizeof(unsigned char)); + uspech = 0; + while(uspech < velkost) { - uspech = wolfSSL_read(ssl, pole_uk, velkost); + uspech = wolfSSL_read(ssl, (unsigned char*)pole, velkost); if(uspech <= 0) { - fprintf(stderr, "Nastala chyba pri prijati suboru.\n"); + fprintf(stderr, "Nastala chyba pri prijatii suboru.\n"); return -1; } - pole_uk += 1; } printf("Subor bol uspesne prijaty.\n"); //vypocet vlastneho kontrolneho suctu byte* kontrolny_sucet; int velkost_kontrolneho_suctu; - kontrolny_sucet = generovat_kontrolny_sucet_suboru(nastavenia->funkcia, cesta, &velkost_kontrolneho_suctu); + + FILE *subor = fopen(cesta, "wb+"); + int n = fwrite((unsigned char*)pole, 1, velkost, subor); + fclose(subor); + + kontrolny_sucet = generovat_kontrolny_sucet_suboru(nastavenia, cesta, &velkost_kontrolneho_suctu); //prijem hashu, ktory vypocital server char* prijaty_kontrolny_sucet = calloc(velkost_kontrolneho_suctu, sizeof(char)); - uspech = wolfSSL_read(ssl, prijaty_kontrolny_sucet, velkost_kontrolneho_suctu); - if(uspech <= 0) + + uspech = 0; + while(uspech != velkost_kontrolneho_suctu) { - fprintf(stderr, "Nastala chyba pri prijati kontrolneho suctu.\n"); - return -1; + uspech = wolfSSL_read(ssl, (char*)prijaty_kontrolny_sucet, velkost_kontrolneho_suctu); + if(uspech <= 0) + { + fprintf(stderr, "Nastala chyba pri prijati kontrolneho suctu.\n"); + free(prijaty_kontrolny_sucet); + return -1; + } } - + //kontrola ci sa prijaty a vypocitany kontrolny sucet suboru zhoduju - for(int i = 0; i < velkost_kontrolneho_suctu; i++) - { - kontrolny_sucet[i] = (char)kontrolny_sucet[i]; - } - printf("%s\n", prijaty_kontrolny_sucet); - printf("%s\n", kontrolny_sucet); - if(!strcmp(prijaty_kontrolny_sucet, kontrolny_sucet)) + if(!strcmp((char*)prijaty_kontrolny_sucet, (char*)kontrolny_sucet)) { printf("Subor prisiel v poriadku.\n"); } @@ -160,11 +189,15 @@ int prijat_subor(WOLFSSL* ssl, WOLFSSL_CTX* ctx, nastavenia_aplikacie* nastaveni printf("Subor neprisiel v poriadku alebo neboli pouzite rovnake funkcie.\n"); return -1; } - - //zapis nacitanych dat do suboru - FILE* subor = fopen(cesta, "w"); - fwrite(pole, 1, velkost, subor); - fclose(subor); + + char*data = calloc(100, sizeof(char)); + uspech = wolfSSL_read(ssl, data, 100); + free(data); + + free(cesta); + free(velkost_suboru); + free(kontrolny_sucet); + free(prijaty_kontrolny_sucet); return 0; } diff --git a/kniznica/komunikacia.h b/kniznica/komunikacia.h index 2b7c52d..c534e9e 100644 --- a/kniznica/komunikacia.h +++ b/kniznica/komunikacia.h @@ -3,7 +3,7 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 6.4.2020 // +// Datum poslednej upravy: 15.4.2020 // ////////////////////////////////////////////////// #ifndef __KOMUNIKACIA_H__ @@ -87,6 +87,7 @@ int cakat_na_komunikaciu(int cislo_portu); * @parameter WOLFSSL* ssl : ukazuje na aktualnu relaciu * @parameter WOLFSSL_CTX* ctx : ukazuje na WOLFSSL_CTX strukturu * @parameter char* cesta: ukazuje na retazec, ktory reprezentuje cestu k suboru + * @parameter nastavenia_aplikacie* nastavenia: reprezentuje nastavenia aplikacie: server alebo klient * @vrati int : operacia bola uspesna(0), neuspesna(-1) */ int poslat_subor(WOLFSSL* ssl, WOLFSSL_CTX* ctx, const char* cesta, nastavenia_aplikacie* nastavenia); @@ -95,6 +96,7 @@ int poslat_subor(WOLFSSL* ssl, WOLFSSL_CTX* ctx, const char* cesta, nastavenia_ * prijat_subor: realizuje prijem suboru * @parameter WOLFSSL* ssl : ukazuje na aktualnu relaciu * @parameter WOLFSSL_CTX* ctx : ukazuje na WOLFSSL_CTX strukturu + * @parameter nastavenia_aplikacie* nastavenia: reprezentuje nastavenia aplikacie: server alebo klient * @vrati int : operacia bola uspesna(0), neuspesna(-1) */ int prijat_subor(WOLFSSL* ssl, WOLFSSL_CTX* ctx, nastavenia_aplikacie* nastavenia); diff --git a/kniznica/kryptografia.c b/kniznica/kryptografia.c index a23e076..93c24a3 100644 --- a/kniznica/kryptografia.c +++ b/kniznica/kryptografia.c @@ -3,7 +3,7 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 6.4.2020 // +// Datum poslednej upravy: 15.4.2020 // ////////////////////////////////////////////////// #include "kryptografia.h" @@ -44,8 +44,9 @@ void nastav_sifry(WOLFSSL_CTX* ctx, const char* sifry) wolfSSL_CTX_set_cipher_list(ctx, sifry); } -void nastav_funkciu(nastavenia_aplikacie* nastavenia, hashovacia_funkcia funkcia) +void nastav_funkciu(nastavenia_aplikacie* nastavenia, char* typ_vypoctu, hashovacia_funkcia funkcia) { + strcpy(nastavenia->typ_vypoctu, typ_vypoctu); nastavenia->funkcia = funkcia; } @@ -67,7 +68,7 @@ int generovat_rsa_certifikat(int pocet_bitov, int exponent, int algoritmus, char //nacitanie certifikatu autority vo formate DER ulozeneho v subore certifikaty/autorita/autorita_rsa.der printf("Nacitavanie certifikatu autority zo suboru.\n"); - FILE* subor = fopen("../certifikaty/autorita/autorita_rsa.der", "rb"); + FILE* subor = fopen("../../certifikaty/autorita/autorita_rsa.der", "rb"); der_autorita_certifikat_velkost = fread(der_autorita_certifikat, 1, VELKOST_BUFFERA , subor); if(der_autorita_certifikat_velkost < 0) { @@ -79,7 +80,7 @@ int generovat_rsa_certifikat(int pocet_bitov, int exponent, int algoritmus, char //vytvorenie struktury RsaKey autority zo sukromneho kluca vo formate DER ulozeneho v subore certifikaty/autorita/autorita_kluc_rsa.der printf("Nacitavanie sukromneho kluca autority zo suboru.\n"); - subor = fopen("../certifikaty/autorita/autorita_kluc_rsa.der", "rb"); + subor = fopen("../../certifikaty/autorita/autorita_kluc_rsa.der", "rb"); der_autorita_kluc_velkost = fread(der_autorita_kluc, 1, VELKOST_BUFFERA , subor); if(der_autorita_kluc_velkost < 0) { @@ -134,7 +135,7 @@ int generovat_rsa_certifikat(int pocet_bitov, int exponent, int algoritmus, char pem_kluc_velkost = uspech; //zapis vygenerovaneho klucu do suboru - subor = fopen("../certifikaty/vygenerovany_kluc.key", "wb"); + subor = fopen("../../certifikaty/vygenerovany_kluc.key", "wb"); fwrite(pem_kluc, 1, pem_kluc_velkost, subor); fclose(subor); @@ -188,7 +189,7 @@ int generovat_rsa_certifikat(int pocet_bitov, int exponent, int algoritmus, char pem_certifikat_velkost = uspech; //zapis vygenerovaneho klucu do suboru - subor = fopen("../certifikaty/vygenerovany_certifikat.pem", "wb"); + subor = fopen("../../certifikaty/vygenerovany_certifikat.pem", "wb"); fwrite(pem_certifikat, 1, pem_certifikat_velkost, subor); fclose(subor); @@ -544,87 +545,119 @@ void zobraz_certifikat(WOLFSSL* ssl) X509_free(certifikat); } -byte* generovat_kontrolny_sucet_suboru(hashovacia_funkcia funkcia, const char* cesta, int* velkost) +byte* generovat_kontrolny_sucet_suboru(nastavenia_aplikacie* nastavenia, const char* cesta, int* velkost) { int pocet_bajtov; FILE* subor = fopen(cesta, "rb"); - unsigned char data[1024]; + unsigned char data[100000]; + memset(data, 0, 100000); byte* vysledok; - if(funkcia == funkcia_SHA) + if(!strcmp(nastavenia->typ_vypoctu, "crc")) { - *velkost = SHA_DIGEST_SIZE; - vysledok = calloc(SHA_DIGEST_SIZE, sizeof(byte)); - Sha sha; - wc_InitSha(&sha); - while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) - wc_ShaUpdate(&sha, data, pocet_bajtov); - wc_ShaFinal(&sha, vysledok); + //crc32 + *velkost = 11; + vysledok = calloc(11, sizeof(byte)); + fread((unsigned char*)data, 1, 100000, subor); + int i, j; + unsigned int byte, crc, mask; + i = 0; + crc = 0xFFFFFFFF; + while (data[i] != 0) + { + byte = data[i]; + crc = crc ^ byte; + for (j = 7; j >= 0; j--) + { + mask = -(crc & 1); + crc = (crc >> 1) ^ (0xEDB88320 & mask); + } + i = i + 1; + } + crc = crc ^ 0xFFFFFFFF; + sprintf(vysledok, "%u", crc); } - else if(funkcia == funkcia_SHA224) + else if(!strcmp(nastavenia->typ_vypoctu, "hash")) { - *velkost = SHA224_DIGEST_SIZE; - vysledok = calloc(SHA224_DIGEST_SIZE, sizeof(byte)); - Sha224 sha; - wc_InitSha224(&sha); - while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) - wc_Sha224Update(&sha, data, pocet_bajtov); - wc_Sha224Final(&sha, vysledok); - } - else if(funkcia == funkcia_SHA256) - { - *velkost = SHA256_DIGEST_SIZE; - byte* vysledok = calloc(SHA256_DIGEST_SIZE, sizeof(byte)); - Sha256 sha; - wc_InitSha256(&sha); - while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) - wc_Sha256Update(&sha, data, pocet_bajtov); - wc_Sha256Final(&sha, vysledok); - } - else if(funkcia == funkcia_SHA384) - { - *velkost = SHA384_DIGEST_SIZE; - vysledok = calloc(SHA384_DIGEST_SIZE, sizeof(byte)); - Sha384 sha; - wc_InitSha384(&sha); - while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) - wc_Sha384Update(&sha, data, pocet_bajtov); - wc_Sha384Final(&sha, vysledok); - } - else if(funkcia == funkcia_SHA512) - { - *velkost = WC_SHA512_DIGEST_SIZE; - vysledok = calloc(WC_SHA512_DIGEST_SIZE, sizeof(byte)); - wc_Sha512 sha; - wc_InitSha512(&sha); - while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) - wc_Sha512Update(&sha, data, pocet_bajtov); - wc_Sha512Final(&sha, vysledok); - } - else if(funkcia == funkcia_BLAKE2B) - { - *velkost = 64; - vysledok = calloc(64, sizeof(byte)); - Blake2b b2b; - wc_InitBlake2b(&b2b, 64); - while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) - wc_Blake2bUpdate(&b2b, data, pocet_bajtov); - wc_Blake2bFinal(&b2b, vysledok, 64); - } - else if(funkcia == funkcia_RIPEMD160) - { - *velkost = RIPEMD_DIGEST_SIZE; - vysledok = calloc(RIPEMD_DIGEST_SIZE, sizeof(byte)); - RipeMd ripemd; - wc_InitRipeMd(&ripemd); - while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) - wc_RipeMdUpdate(&ripemd, data, pocet_bajtov); - wc_RipeMdFinal(&ripemd, vysledok); + if(nastavenia->funkcia == funkcia_SHA) + { + *velkost = SHA_DIGEST_SIZE; + vysledok = calloc(SHA_DIGEST_SIZE, sizeof(byte)); + Sha sha; + wc_InitSha(&sha); + while ((pocet_bajtov = fread (data, 1, 100000, subor)) != 0) + wc_ShaUpdate(&sha, data, pocet_bajtov); + wc_ShaFinal(&sha, vysledok); + } + else if(nastavenia->funkcia == funkcia_SHA224) + { + *velkost = SHA224_DIGEST_SIZE; + vysledok = calloc(SHA224_DIGEST_SIZE, sizeof(byte)); + Sha224 sha; + wc_InitSha224(&sha); + while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) + wc_Sha224Update(&sha, data, pocet_bajtov); + wc_Sha224Final(&sha, vysledok); + } + else if(nastavenia->funkcia == funkcia_SHA256) + { + *velkost = SHA256_DIGEST_SIZE; + byte* vysledok = calloc(SHA256_DIGEST_SIZE, sizeof(byte)); + Sha256 sha; + wc_InitSha256(&sha); + while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) + wc_Sha256Update(&sha, data, pocet_bajtov); + wc_Sha256Final(&sha, vysledok); + } + else if(nastavenia->funkcia == funkcia_SHA384) + { + *velkost = SHA384_DIGEST_SIZE; + vysledok = calloc(SHA384_DIGEST_SIZE, sizeof(byte)); + Sha384 sha; + wc_InitSha384(&sha); + while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) + wc_Sha384Update(&sha, data, pocet_bajtov); + wc_Sha384Final(&sha, vysledok); + } + else if(nastavenia->funkcia == funkcia_SHA512) + { + *velkost = WC_SHA512_DIGEST_SIZE; + vysledok = calloc(WC_SHA512_DIGEST_SIZE, sizeof(byte)); + wc_Sha512 sha; + wc_InitSha512(&sha); + while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) + wc_Sha512Update(&sha, data, pocet_bajtov); + wc_Sha512Final(&sha, vysledok); + } + else if(nastavenia->funkcia == funkcia_BLAKE2B) + { + *velkost = 64; + vysledok = calloc(64, sizeof(byte)); + Blake2b b2b; + wc_InitBlake2b(&b2b, 64); + while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) + wc_Blake2bUpdate(&b2b, data, pocet_bajtov); + wc_Blake2bFinal(&b2b, vysledok, 64); + } + else if(nastavenia->funkcia == funkcia_RIPEMD160) + { + *velkost = RIPEMD_DIGEST_SIZE; + vysledok = calloc(RIPEMD_DIGEST_SIZE, sizeof(byte)); + RipeMd ripemd; + wc_InitRipeMd(&ripemd); + while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) + wc_RipeMdUpdate(&ripemd, data, pocet_bajtov); + wc_RipeMdFinal(&ripemd, vysledok); + } + else + { + fprintf(stderr, "Nepodarilo sa vybrat funkciu pre vypocet kontrolneho suctu.\n"); + } } else { - fprintf(stderr, "Nespravny nazov hashovacej funkcie.\n"); - exit(0); + fprintf(stderr, "Nepodarilo sa vybrat funkciu pre vypocet kontrolneho suctu.\n"); } + fclose(subor); return vysledok; } diff --git a/kniznica/kryptografia.h b/kniznica/kryptografia.h index f4b7a8f..7eaa9e4 100644 --- a/kniznica/kryptografia.h +++ b/kniznica/kryptografia.h @@ -3,7 +3,7 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 6.4.2020 // +// Datum poslednej upravy: 15.4.2020 // ////////////////////////////////////////////////// #ifndef __KRYPTOGRAFIA_H__ @@ -22,15 +22,19 @@ #include #include +#include +#include + #define VELKOST_BUFFERA 4096 typedef enum hashovacia_funkcia { funkcia_SHA, funkcia_SHA224, funkcia_SHA256, funkcia_SHA384, funkcia_SHA512, - funkcia_BLAKE2B, funkcia_RIPEMD160 + funkcia_BLAKE2B, funkcia_RIPEMD160, ziadna } hashovacia_funkcia; typedef struct nastavenia_aplikacie { hashovacia_funkcia funkcia; + char typ_vypoctu[32]; } nastavenia_aplikacie; /** @@ -41,7 +45,7 @@ typedef struct nastavenia_aplikacie { * na zaklade nazvu funkcie uvedenom v prvom argumente * @vrati smernik na vygenerovany hash */ -byte* generovat_kontrolny_sucet_suboru(hashovacia_funkcia funkcia, const char* cesta, int* velkost); +byte* generovat_kontrolny_sucet_suboru(nastavenia_aplikacie* nastavenia, const char* cesta, int* velkost); /** * generovat_ecc_certifikat: realizuje vygenerovania sukromneho kluca, nacitanie sukromneho kluca autority, @@ -66,7 +70,7 @@ int generovat_rsa_certifikat(int pocet_bitov, int exponent, int algoritmus, char /** * generovat_rsa_ziadost: realizuje vygenerovania sukromneho kluca, vygenerovanie a podpis ziadosti * @parameter int pocet_bitov : velkost kluca - * @parameter ecc-curve_id kluc_krivka: kod krivky pre generovanie sukromneho kluca + * @parameter int exponent : hodnota exponentu * @parameter int algoritmus: kod algoritmu, sluziaceho na vymenu klucov * @vrati int: operacia bola uspesna(0), neuspesna(-1) */ @@ -115,9 +119,10 @@ void nastav_sifry(WOLFSSL_CTX* ctx, const char* sifry); * nastav_funkciu: nastavi hashovaciu funkciu ktora bude pouzita pri vypocte kontrolneho suctu suboru * @parameter nastavenia_aplikacie* nastavenia: reprezentuje nastavenia aplikacie: server alebo klient * @paramater hashovacia_funkcia funkcia : nazov hashovacej funkcie + * @parameter char* typ_vypoctu : umoznuje vyber medzi "crc" a "hash" kontrolnym suctom moznosti: funkcia_SHA, funkcia_SHA224, funkcia_SHA256, funkcia_SHA384, funkcia_SHA512, funkcia_BLAKE2B, funkcia_RIPEMD160 */ -void nastav_funkciu(nastavenia_aplikacie* nastavenia, hashovacia_funkcia funkcia); +void nastav_funkciu(nastavenia_aplikacie* nastavenia, char* typ_vypoctu, hashovacia_funkcia funkcia); /** * nacitat_certifikaty: realizuje nacitanie certifikatov zo suborov do struktury WOLFSSL_CTX diff --git a/readme.txt b/readme.txt index 3181455..79ce531 100644 --- a/readme.txt +++ b/readme.txt @@ -2,8 +2,8 @@ Bakalarska praca Meno studenta: Tomas Lukac Veduci BP: prof. Ing. Milos Drutarovsky CSc. Skola: KEMT FEI TUKE -Datum poslednej upravy: 6.4.2020 -Verzia: 0.1 +Datum poslednej upravy: 15.4.2020 +Verzia: 0.2 ---------------------------- Zoznam zdrojovych suborov certifikaty @@ -28,15 +28,21 @@ Zoznam zdrojovych suborov |__kryptografia.h |__kryptografia.c tcpip_kanal - |__klient.c - |__server.c - |__Makefile + klient + |__klient.c + |__Makefile + server + |__server.c + |__Makefile rs232_kanal - |__klient.c - |__klient.txt - |__server.c - |__server.txt - |__Makefile + klient + |__klient.c + |__Makefile + |__klient.txt + server + |__server.c + |__Makefile + |__server.txt Opis aplikacie Realizuje zabezpecenu vymenu sprav medzi klientom a serverom a autentizaciu servera klientom vyuzitim kniznice WolfSSL. Ako prvu je @@ -98,7 +104,7 @@ Navod na prelozenie a spustenie (Linux) Navod na prelozenie a spustenie (Windows) 1. skopirovanie potrebnych dll z adresara /wolfssl/64bit_kniznice/ , resp. /wolfssl/32bit_kniznice/ - do podadresara tcpip_kanal, resp. rs232_kanal + do podadresara tcpip_kanal -> klient alebo server, resp. rs232_kanal -> klient alebo server a) wolfssl.dll -> kniznica wolfssl b) vcruntime140.dll -> visual c++ runtime c) api-ms-win-crt-runtime-l1-1-0.dll diff --git a/rs232_kanal/Makefile b/rs232_kanal/Makefile deleted file mode 100644 index 80aa1ea..0000000 --- a/rs232_kanal/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -## Bakalarska praca ## -## Meno studenta: Tomas Lukac ## -## Veduci BP: prof. Ing. Milos Drutarovsky CSc. ## -## Skola: KEMT FEI TUKE ## -## Datum poslednej upravy: 6.4.2020 ## -################################################## - -#prekladac -CC = gcc - -#prepinace pre prekladac -CFLAGS = -Wcpp -Werror -I./../wolfssl/ -LIB = - -ifeq ($(OS), Windows_NT) - ifeq ($(PROCESSOR_ARCHITECTURE), AMD64) - LIB += -L./../wolfssl/64bit_kniznice/ -lwolfssl -lws2_32 -m64 - endif - ifeq ($(PROCESSOR_ARCHITECTURE), x86) - LIB += -L./../wolfssl/32bit_kniznice/ -lwolfssl -lws2_32 -Os - endif -else - UNAME_S := $(shell uname -s) - ifeq ($(UNAME_S), Linux) - LIB += -lwolfssl - endif -endif - -all: klient server - -klient: klient.o kryptografia.o komunikacia.o rs232.o - $(CC) $(CFLAGS) -o klient klient.o kryptografia.o komunikacia.o rs232.o $(LIB) - -server: server.o kryptografia.o komunikacia.o rs232.o - $(CC) $(CFLAGS) -o server server.o kryptografia.o komunikacia.o rs232.o $(LIB) - -klient.o: klient.c - $(CC) $(CFLAGS) -c klient.c $(LIB) - -server.o: server.c - $(CC) $(CFLAGS) -c server.c $(LIB) - -kryptografia.o: ../kniznica/kryptografia.c ../kniznica/kryptografia.h - $(CC) $(CFLAGS) -c ../kniznica/kryptografia.c $(LIB) - -komunikacia.o: ../kniznica/komunikacia.c ../kniznica/komunikacia.h - $(CC) $(CFLAGS) -c ../kniznica/komunikacia.c $(LIB) - -rs232.o: ../kniznica/rs232.c ../kniznica/rs232.h - $(CC) $(CFLAGS) -c ../kniznica/rs232.c $(LIB) - -.PHONY: clean - -clean-linux: - rm *.o -f klient server - -clean-win: - del *.o klient.exe server.exe \ No newline at end of file diff --git a/rs232_kanal/klient.txt b/rs232_kanal/klient.txt deleted file mode 100644 index 8d2aea9..0000000 Binary files a/rs232_kanal/klient.txt and /dev/null differ diff --git a/rs232_kanal/klient/Makefile b/rs232_kanal/klient/Makefile new file mode 100644 index 0000000..f34f639 --- /dev/null +++ b/rs232_kanal/klient/Makefile @@ -0,0 +1,45 @@ +################################################## +## Bakalarska praca ## +## Meno studenta: Tomas Lukac ## +## Veduci BP: prof. Ing. Milos Drutarovsky CSc. ## +## Skola: KEMT FEI TUKE ## +## Datum poslednej upravy: 15.4.2020 ## +################################################## + +#prekladac +CC = gcc + +#prepinace pre prekladac +CFLAGS = -Wcpp -Werror -I./../../wolfssl/ +SOURCES = $(wildcard ../../kniznica/*.c) \ + $(wildcard *.c) +OBJECTS = $(SOURCES:.c=.o) +EXECUTABLE = klient + +ifeq ($(OS), Windows_NT) + CLEAN += del *.o *.exe + ifeq ($(PROCESSOR_ARCHITECTURE), AMD64) + ARCH += -m64 + CFLAGS += $(ARCH) + LDFLAGS += -L./../../wolfssl/64bit_kniznice/ -lwolfssl -lws2_32 + endif + ifeq ($(PROCESSOR_ARCHITECTURE), x86) + ARCH += -m32 + CFLAGS += $(ARCH) + LDFLAGS += -L./../../wolfssl/32bit_kniznice/ -lwolfssl -lws2_32 + endif +else + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S), Linux) + LDFLAGS += -lwolfssl + CLEAN += rm *.o $(EXECUTABLE) + endif +endif + +all: $(EXECUTABLE) + +$(EXECUTABLE): $(OBJECTS) + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) + +clean: + $(CLEAN) \ No newline at end of file diff --git a/rs232_kanal/klient.c b/rs232_kanal/klient/klient.c similarity index 59% rename from rs232_kanal/klient.c rename to rs232_kanal/klient/klient.c index 75640d8..80ce3d7 100644 --- a/rs232_kanal/klient.c +++ b/rs232_kanal/klient/klient.c @@ -3,7 +3,7 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 6.4.2020 // +// Datum poslednej upravy: 15.4.2020 // ////////////////////////////////////////////////// #include @@ -23,68 +23,102 @@ #include #endif -#include "../kniznica/kryptografia.h" -#include "../kniznica/komunikacia.h" -#include "../kniznica/rs232.h" +#include "../../kniznica/kryptografia.h" +#include "../../kniznica/komunikacia.h" +#include "../../kniznica/rs232.h" #define RSA_VELKOST 2048 #define ECC_VELKOST 32 #define RSA_EXPONENT 65537 //cesty ku suborom -#define RSA_KLUC "../certifikaty/klient/klient_rsa.key" -#define RSA_CERTIFIKAT "../certifikaty/klient/klient_rsa.pem" -#define ECC_KLUC "../certifikaty/klient/klient_ecc.key" -#define ECC_CERTIFIKAT "../certifikaty/klient/klient_ecc.pem" -#define VYGENEROVANY_KLUC "../certifikaty/klient/vygenerovany_kluc.key" -#define VYGENEROVANY_CERTIFIKAT "../certifikaty/klient/vygenerovany_certifikat.pem" +#define RSA_KLUC "../../certifikaty/klient/klient_rsa.key" +#define RSA_CERTIFIKAT "../../certifikaty/klient/klient_rsa.pem" +#define ECC_KLUC "../../certifikaty/klient/klient_ecc.key" +#define ECC_CERTIFIKAT "../../certifikaty/klient/klient_ecc.pem" +#define VYGENEROVANY_KLUC "../../certifikaty/klient/vygenerovany_kluc.key" +#define VYGENEROVANY_CERTIFIKAT "../../certifikaty/klient/vygenerovany_certifikat.pem" #define KOMUNIKACNY_SUBOR "klient.txt" int rs232_prijat; int cislo_rozhrania = 0; -int prebieha_nacitanie = 0; int aktualne_data = 0; int rs232_citanie(WOLFSSL *ssl, char *buf, int sz, void *ctx) { int uspech = 0; + int prebieha_nacitanie = 0; + int prebieha_nacitanie_velkosti_spravy = 0; + unsigned char znak; + //ziskanie dat zo serioveho rozhrania if(aktualne_data == 0) { - FILE* f = fopen(KOMUNIKACNY_SUBOR, "ab"); + //otvorenie suboru do ktoreho sa zapisuju prijate binarne data + //ktore sa nasledne nacitaju do buffera (buf) pre desifrovanie + FILE* f = fopen(KOMUNIKACNY_SUBOR, "ab+"); + + //mnozstvo nacitanych dat int nacitane_data = 0; - unsigned char znak; + //velkost spravy, ktora sa bude prijmat + int velkost_spravy = 0; + //urcuje kolko bajtov z informacie o velkosti spravy + //uz bolo prijatych z celkoveho poctu (4) + int velkost_spravy_bajt = 0; + int velkost_spravy_pocet_bajtov = 4; //kontrolne vzory, ktore jednoznacne identifikuju zaciatok a koniec spravy unsigned char zaciatok_spravy[] = {0xAA, 0xAA, 0xAA, 0xAA}; int zaciatok_spravy_pozicia = 0; //aktualna pozicia v kontrolnom vzore unsigned char koniec_spravy[] = {0xBB, 0xBB, 0xBB, 0xBB}; - int koniec_spravy_pozicia = 0; //aktualna pozicia v kontrolnom vzore + int koniec_spravy_pozicia = 0; //aktualna pozicia v kontrolnom vzore + int velkost_kontrolneho_vzoru = sizeof(zaciatok_spravy)/sizeof(zaciatok_spravy[0]); while(1) { uspech = RS232_PollComport(cislo_rozhrania, &znak, 1); if(uspech > 0) { - if(!prebieha_nacitanie && (znak == zaciatok_spravy[zaciatok_spravy_pozicia]) && (zaciatok_spravy_pozicia <= 2)) + //ak nacitanie spravy este nezacalo, ale bol najdeny bajt, ktory je sucastou kontrolneho vzoru, + //ktory urcuje zaciatok spravy, posun sa v kontrolnom vzore o jednu poziciu a cakaj ci nebudu + //prichadzat dalsie bajty z tohto kontrolneho vzoru + if(!prebieha_nacitanie && (znak == zaciatok_spravy[zaciatok_spravy_pozicia]) && + (zaciatok_spravy_pozicia < velkost_kontrolneho_vzoru - 1)) { zaciatok_spravy_pozicia++; } - else if(!prebieha_nacitanie && (znak == zaciatok_spravy[zaciatok_spravy_pozicia]) && (zaciatok_spravy_pozicia == 3)) + //ak prebehlo nacitanie vsetkych bajtov, ktore su sucastou kontrolneho vzoru urcujuceho zaciatok spravy + //ocakavaj prichod bajtov, ktore budu niest informaciu o velkosti spravy + else if(!prebieha_nacitanie && (znak == zaciatok_spravy[zaciatok_spravy_pozicia]) && + (zaciatok_spravy_pozicia == velkost_kontrolneho_vzoru - 1)) { - //ak bol najdeny koniec kontrolneho vzoru, tak je zapnuta znacka, - //ktora urcuje ze prebieha nacitavanie spravy - prebieha_nacitanie = 1; + prebieha_nacitanie_velkosti_spravy = 1; zaciatok_spravy_pozicia = 0; - //zaciatok_spravy_pozicia = 0; } - else if((prebieha_nacitanie && (znak == koniec_spravy[0]) && (koniec_spravy_pozicia == 0)) || (!prebieha_nacitanie && (znak == koniec_spravy[0]) && (koniec_spravy_pozicia <= 2))) + //pokracuj v nacitavani bajtov urcujucich velkost spravy, dokym nie su vsetky nacitane + //a po nacitani vsetkych bajtov moze zacat nacitanie spravy + else if(!prebieha_nacitanie && prebieha_nacitanie_velkosti_spravy) + { + velkost_spravy_bajt++; + if(velkost_spravy_bajt == velkost_spravy_pocet_bajtov) + { + prebieha_nacitanie = 1; + prebieha_nacitanie_velkosti_spravy = 0; + } + } + //ak prebieha nacitanie a bol najdeny bajt, ktory je sucastou kontrolneho vzoru, ktory urcuje koniec spravy, + //posun sa v kontrolnom vzore o jednu poziciu a cakaj ci nebudu prichadzat dalsie bajty z tohto kontrolneho vzoru + else if((prebieha_nacitanie && (znak == koniec_spravy[koniec_spravy_pozicia]) && + (koniec_spravy_pozicia == 0)) || (!prebieha_nacitanie && (znak == koniec_spravy[koniec_spravy_pozicia]) && + (koniec_spravy_pozicia < velkost_kontrolneho_vzoru - 1))) { koniec_spravy_pozicia++; prebieha_nacitanie = 0; } - else if(!prebieha_nacitanie && znak != koniec_spravy[0]) + //v pripade ak zacalo nacitanie kontrolneho vzoru, ktory urcuje koniec spravy, ale nebol najdeny posledny znak z tohto vzoru + //nacitaj do suboru docasne nezapisane znaky, ktore su sucastou kontrolneho vzoru a zaroven nacitaj aktualny znak + else if(!prebieha_nacitanie_velkosti_spravy && !prebieha_nacitanie && znak != koniec_spravy[koniec_spravy_pozicia]) { for(int i = 0; i < koniec_spravy_pozicia; i++) { @@ -97,18 +131,19 @@ int rs232_citanie(WOLFSSL *ssl, char *buf, int sz, void *ctx) koniec_spravy_pozicia = 0; prebieha_nacitanie = 1; } - else if(!prebieha_nacitanie && (znak == koniec_spravy[0]) && (koniec_spravy_pozicia == 3)) + //ak prebehlo nacitanie vsetkych bajtov, ktore su sucastou kontrolneho vzoru urcujuceho koniec spravy + //ukonci nacitanie spravy + else if(!prebieha_nacitanie_velkosti_spravy && !prebieha_nacitanie && (znak == koniec_spravy[0]) && + (koniec_spravy_pozicia == 3)) { - //ak bol najdeny koniec kontrolneho vzoru, tak je vypnuta znacka, - //ktora urcuje ze prebieha nacitanie spravy prebieha_nacitanie = 0; koniec_spravy_pozicia = 0; - //koniec_spravy_pozicia = 0; break; } + //inak prebieha nacitanie, cize zapis aktualny znak (bajt) do suboru else { - if(prebieha_nacitanie) + if(prebieha_nacitanie && !prebieha_nacitanie_velkosti_spravy) { fwrite((char*)&znak, 1, uspech, f); nacitane_data += uspech; @@ -120,24 +155,36 @@ int rs232_citanie(WOLFSSL *ssl, char *buf, int sz, void *ctx) nacitane_data = 0; fclose(f); } - //nacitanie dat zo suboru do buffera + //nacitanie dat zo suboru do buffera pre desifrovanie uspech = 0; while(uspech <= 0) uspech = read(rs232_prijat, buf, sz); aktualne_data -= uspech; + return uspech; } int rs232_zapis(WOLFSSL *ssl, char *buf, int sz, void *ctx) { int uspech = 0; + //kontrolne vzory, ktore jednoznacne identifikuju zaciatok a koniec spravy unsigned char zaciatok_spravy[] = {0xAA, 0xAA, 0xAA, 0xAA}; unsigned char koniec_spravy[] = {0xBB, 0xBB, 0xBB, 0xBB}; + + //vytvorenie bajtov ktore budu niest informaciu o velkosti posielanej spravy + unsigned char* velkost_spravy = calloc(4, sizeof(unsigned char)); + velkost_spravy[0] = (sz >> 24) & 0xFF; + velkost_spravy[1] = (sz >> 16) & 0xFF; + velkost_spravy[2] = (sz >> 8) & 0xFF; + velkost_spravy[3] = sz & 0xFF; + + //odoslanie kontrolnych vzorov, bajtov s velkostou spravy a samotnych dat na seriove rozhranie RS232_SendBuf(cislo_rozhrania, (unsigned char*)zaciatok_spravy, sizeof(zaciatok_spravy)); + RS232_SendBuf(cislo_rozhrania, (unsigned char*)velkost_spravy, 4); uspech = (int)RS232_SendBuf(cislo_rozhrania, (unsigned char*)buf, sz); RS232_SendBuf(cislo_rozhrania, (unsigned char*)koniec_spravy, sizeof(koniec_spravy)); - RS232_flushTX(cislo_rozhrania); + free(velkost_spravy); return uspech; } @@ -154,6 +201,7 @@ int main(int argc, char const *argv[]) int nacitanie_zo_suboru = 0; int generovanie_certifikatu = 0; nastavenia_aplikacie nastavenia; + RS232_flushRXTX(cislo_rozhrania); rs232_prijat = open(KOMUNIKACNY_SUBOR, O_RDWR | O_NOCTTY | O_NDELAY); @@ -212,14 +260,14 @@ int main(int argc, char const *argv[]) } else if(!strcmp(argv[i+1], "rsa")) { - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita/autorita_rsa.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita/autorita_rsa.pem", NULL); if(nacitat_certifikaty(ctx, RSA_CERTIFIKAT, RSA_KLUC) == -1) return -1; wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0); } else if(!strcmp(argv[i+1], "ecc")) { - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita/autorita_ecc.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita/autorita_ecc.pem", NULL); if(nacitat_certifikaty(ctx, ECC_CERTIFIKAT, ECC_KLUC) == -1) return -1; wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0); @@ -245,16 +293,18 @@ int main(int argc, char const *argv[]) } else if(!strcmp(argv[i+1], "rsa")) { - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita/autorita_rsa.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita/autorita_rsa.pem", NULL); if(generovat_rsa_certifikat(RSA_VELKOST, RSA_EXPONENT, CTC_SHA256wRSA, "SR", "Kosice", "local.dev", "server@server.sk") == -1) return -1; if(nacitat_certifikaty(ctx, VYGENEROVANY_CERTIFIKAT, VYGENEROVANY_KLUC) == -1) return -1; + wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); } else if(!strcmp(argv[i+1], "ecc")) { - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita/autorita_ecc.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita/autorita_ecc.pem", NULL); if(generovat_ecc_certifikat(ECC_VELKOST, ECC_SECP256R1, CTC_SHAwECDSA, "SR", "Kosice", "local.dev", "server@server.sk") == -1) return -1; if(nacitat_certifikaty(ctx, VYGENEROVANY_CERTIFIKAT, VYGENEROVANY_KLUC) == -1) return -1; + wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); } else { @@ -282,13 +332,13 @@ int main(int argc, char const *argv[]) return -1; } - //nastav_sifry(ctx, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"); - //wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); + //nastavenie vlastnych I/O funkcii wolfSSL_SetIOSend(ctx, rs232_zapis); wolfSSL_SetIORecv(ctx, rs232_citanie); + //pokus o vytvorenie novej wolfSSL relacie if ((ssl = wolfSSL_new(ctx)) == NULL) { printf("Nepodarilo sa vytvorit ssl relaciu\n"); @@ -296,9 +346,11 @@ int main(int argc, char const *argv[]) return -1; } + //priradenie file descriptora suboru ako I/O pre TLS spojenie wolfSSL_set_fd(ssl, rs232_prijat); wolfSSL_set_using_nonblock(ssl, rs232_prijat); - + + //pokus o inizicalizaciu TLS handshaku so serverom uspech = wolfSSL_connect(ssl); if(uspech != SSL_SUCCESS) { @@ -307,18 +359,21 @@ int main(int argc, char const *argv[]) wolfSSL_ERR_error_string(chyba, popis_chyby); fprintf(stderr, "Nastala chyba v spojeni.\nCislo chyby: %d\nDovod chyby: %s\n", chyba, popis_chyby); printf("Skontrolujte certifikaty.\n"); + free(popis_chyby); return -1; } zobraz_sifru(ssl); zobraz_certifikat(ssl); - nastav_funkciu(&nastavenia, funkcia_BLAKE2B); - if(poslat_subor(ssl, ctx, subor, &nastavenia) == -1) return -1; - ukoncit_spojenie(ssl, ctx); - - RS232_CloseComport(cislo_rozhrania); + nastav_funkciu(&nastavenia, "crc", ziadna); + poslat_subor(ssl, ctx, subor, &nastavenia); + //ukoncenie spojenia, vymazanie komunikacneho suboru + //a vycistenie serioveho buffera + ukoncit_spojenie(ssl, ctx); + RS232_flushRXTX(cislo_rozhrania); + RS232_CloseComport(cislo_rozhrania); close(rs232_prijat); - close(open(KOMUNIKACNY_SUBOR, O_RDWR | O_NOCTTY | O_NDELAY)); + fclose(fopen(KOMUNIKACNY_SUBOR, "wb")); return 0; } \ No newline at end of file diff --git a/rs232_kanal/klient/klient.txt b/rs232_kanal/klient/klient.txt new file mode 100644 index 0000000..e69de29 diff --git a/rs232_kanal/nieco.txt b/rs232_kanal/klient/nieco.txt similarity index 100% rename from rs232_kanal/nieco.txt rename to rs232_kanal/klient/nieco.txt diff --git a/rs232_kanal/spustit_klient.bat b/rs232_kanal/klient/spustit_klient.bat similarity index 88% rename from rs232_kanal/spustit_klient.bat rename to rs232_kanal/klient/spustit_klient.bat index 88e30ba..0e064cb 100644 --- a/rs232_kanal/spustit_klient.bat +++ b/rs232_kanal/klient/spustit_klient.bat @@ -3,14 +3,14 @@ :: Meno studenta: Tomas Lukac :: :: Veduci BP: prof. Ing. Milos Drutarovsky CSc. :: :: Skola: KEMT FEI TUKE :: -:: Datum poslednej upravy: 6.4.2020 :: +:: Datum poslednej upravy: 15.4.2020 :: :::::::::::::::::::::::::::::::::::::::::::::::::: :: Program je mozne spustit s prepinacmi: :: -port seriove_rozhranie :: -g rsa|ecc sluzi na generovanie certifikatu :: -n rsa|ecc sluzi na nacitanie uz vygenerovanych certifikatov z adresara /certifikaty -:: -s cesta-ku-suboru sluzi na nacitanie cesty k suboru, ktory chceme odoslat (este nie je) +:: -s cesta-ku-suboru sluzi na nacitanie cesty k suboru, ktory chceme odoslat ::Priklady spustenia: klient -port 4 -n rsa -s nieco.txt diff --git a/rs232_kanal/server.txt b/rs232_kanal/server.txt deleted file mode 100644 index 0984779..0000000 Binary files a/rs232_kanal/server.txt and /dev/null differ diff --git a/rs232_kanal/server/Makefile b/rs232_kanal/server/Makefile new file mode 100644 index 0000000..9a08ea6 --- /dev/null +++ b/rs232_kanal/server/Makefile @@ -0,0 +1,45 @@ +################################################## +## Bakalarska praca ## +## Meno studenta: Tomas Lukac ## +## Veduci BP: prof. Ing. Milos Drutarovsky CSc. ## +## Skola: KEMT FEI TUKE ## +## Datum poslednej upravy: 15.4.2020 ## +################################################## + +#prekladac +CC = gcc + +#prepinace pre prekladac +CFLAGS = -Wcpp -Werror -I./../../wolfssl/ +SOURCES = $(wildcard ../../kniznica/*.c) \ + $(wildcard *.c) +OBJECTS = $(SOURCES:.c=.o) +EXECUTABLE = server + +ifeq ($(OS), Windows_NT) + CLEAN += del *.o *.exe + ifeq ($(PROCESSOR_ARCHITECTURE), AMD64) + ARCH += -m64 + CFLAGS += $(ARCH) + LDFLAGS += -L./../../wolfssl/64bit_kniznice/ -lwolfssl -lws2_32 + endif + ifeq ($(PROCESSOR_ARCHITECTURE), x86) + ARCH += -m32 + CFLAGS += $(ARCH) + LDFLAGS += -L./../../wolfssl/32bit_kniznice/ -lwolfssl -lws2_32 + endif +else + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S), Linux) + LDFLAGS += -lwolfssl + CLEAN += rm *.o $(EXECUTABLE) + endif +endif + +all: $(EXECUTABLE) + +$(EXECUTABLE): $(OBJECTS) + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) + +clean: + $(CLEAN) \ No newline at end of file diff --git a/tcpip_kanal/nieco.txt b/rs232_kanal/server/nieco.txt similarity index 100% rename from tcpip_kanal/nieco.txt rename to rs232_kanal/server/nieco.txt diff --git a/rs232_kanal/server.c b/rs232_kanal/server/server.c similarity index 52% rename from rs232_kanal/server.c rename to rs232_kanal/server/server.c index f7d81dd..ee1e691 100644 --- a/rs232_kanal/server.c +++ b/rs232_kanal/server/server.c @@ -3,7 +3,7 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 6.4.2020 // +// Datum poslednej upravy: 15.4.2020 // ////////////////////////////////////////////////// #include @@ -23,93 +23,127 @@ #include #endif -#include "../kniznica/kryptografia.h" -#include "../kniznica/komunikacia.h" -#include "../kniznica/rs232.h" +#include "../../kniznica/kryptografia.h" +#include "../../kniznica/komunikacia.h" +#include "../../kniznica/rs232.h" #define RSA_VELKOST 2048 #define ECC_VELKOST 32 #define RSA_EXPONENT 65537 //cesty ku suborom -#define RSA_KLUC "../certifikaty/server/server_rsa.key" -#define RSA_CERTIFIKAT "../certifikaty/server/server_rsa.pem" -#define ECC_KLUC "../certifikaty/server/server_ecc.key" -#define ECC_CERTIFIKAT "../certifikaty/server/server_ecc.pem" -#define VYGENEROVANY_KLUC "../certifikaty/server/vygenerovany_kluc.key" -#define VYGENEROVANY_CERTIFIKAT "../certifikaty/server/vygenerovany_certifikat.pem" +#define RSA_KLUC "../../certifikaty/server/server_rsa.key" +#define RSA_CERTIFIKAT "../../certifikaty/server/server_rsa.pem" +#define ECC_KLUC "../../certifikaty/server/server_ecc.key" +#define ECC_CERTIFIKAT "../../certifikaty/server/server_ecc.pem" +#define VYGENEROVANY_KLUC "../../certifikaty/server/vygenerovany_kluc.key" +#define VYGENEROVANY_CERTIFIKAT "../../certifikaty/server/vygenerovany_certifikat.pem" #define KOMUNIKACNY_SUBOR "server.txt" int rs232_prijat; int cislo_rozhrania = 0; -int prebieha_nacitanie = 0; int aktualne_data = 0; - int rs232_citanie(WOLFSSL *ssl, char *buf, int sz, void *ctx) -{ +{ int uspech = 0; + int prebieha_nacitanie = 0; + int prebieha_nacitanie_velkosti_spravy = 0; + unsigned char znak; + //ziskanie dat zo serioveho rozhrania if(aktualne_data == 0) { - FILE* f = fopen(KOMUNIKACNY_SUBOR, "ab"); + //otvorenie suboru do ktoreho sa zapisuju prijate binarne data + //ktore sa nasledne nacitaju do buffera (buf) pre desifrovanie + FILE* f = fopen(KOMUNIKACNY_SUBOR, "ab+"); + + //mnozstvo nacitanych dat int nacitane_data = 0; - unsigned char znak; + //velkost spravy, ktora sa bude prijmat + int velkost_spravy = 0; + //urcuje kolko bajtov z informacie o velkosti spravy + //uz bolo prijatych z celkoveho poctu (4) + int velkost_spravy_bajt = 0; + int velkost_spravy_pocet_bajtov = 4; //kontrolne vzory, ktore jednoznacne identifikuju zaciatok a koniec spravy unsigned char zaciatok_spravy[] = {0xAA, 0xAA, 0xAA, 0xAA}; int zaciatok_spravy_pozicia = 0; //aktualna pozicia v kontrolnom vzore unsigned char koniec_spravy[] = {0xBB, 0xBB, 0xBB, 0xBB}; - int koniec_spravy_pozicia = 0; //aktualna pozicia v kontrolnom vzore + int koniec_spravy_pozicia = 0; //aktualna pozicia v kontrolnom vzore + int velkost_kontrolneho_vzoru = sizeof(zaciatok_spravy)/sizeof(zaciatok_spravy[0]); while(1) { uspech = RS232_PollComport(cislo_rozhrania, &znak, 1); if(uspech > 0) { - if(!prebieha_nacitanie && (znak == zaciatok_spravy[zaciatok_spravy_pozicia]) && (zaciatok_spravy_pozicia <= 2)) + //ak nacitanie spravy este nezacalo, ale bol najdeny bajt, ktory je sucastou kontrolneho vzoru, + //ktory urcuje zaciatok spravy, posun sa v kontrolnom vzore o jednu poziciu a cakaj ci nebudu + //prichadzat dalsie bajty z tohto kontrolneho vzoru + if(!prebieha_nacitanie && (znak == zaciatok_spravy[zaciatok_spravy_pozicia]) && + (zaciatok_spravy_pozicia < velkost_kontrolneho_vzoru - 1)) { zaciatok_spravy_pozicia++; } - else if(!prebieha_nacitanie && (znak == zaciatok_spravy[zaciatok_spravy_pozicia]) && (zaciatok_spravy_pozicia == 3)) + //ak prebehlo nacitanie vsetkych bajtov, ktore su sucastou kontrolneho vzoru urcujuceho zaciatok spravy + //ocakavaj prichod bajtov, ktore budu niest informaciu o velkosti spravy + else if(!prebieha_nacitanie && (znak == zaciatok_spravy[zaciatok_spravy_pozicia]) && + (zaciatok_spravy_pozicia == velkost_kontrolneho_vzoru - 1)) { - //ak bol najdeny koniec kontrolneho vzoru, tak je zapnuta znacka, - //ktora urcuje ze prebieha nacitavanie spravy - prebieha_nacitanie = 1; + prebieha_nacitanie_velkosti_spravy = 1; zaciatok_spravy_pozicia = 0; - //zaciatok_spravy_pozicia = 0; } - else if((prebieha_nacitanie && (znak == koniec_spravy[0]) && (koniec_spravy_pozicia == 0)) || (!prebieha_nacitanie && (znak == koniec_spravy[0]) && (koniec_spravy_pozicia <= 2))) + //pokracuj v nacitavani bajtov urcujucich velkost spravy, dokym nie su vsetky nacitane + //a po nacitani vsetkych bajtov moze zacat nacitanie spravy + else if(!prebieha_nacitanie && prebieha_nacitanie_velkosti_spravy) + { + velkost_spravy_bajt++; + if(velkost_spravy_bajt == velkost_spravy_pocet_bajtov) + { + prebieha_nacitanie = 1; + prebieha_nacitanie_velkosti_spravy = 0; + } + } + //ak prebieha nacitanie a bol najdeny bajt, ktory je sucastou kontrolneho vzoru, ktory urcuje koniec spravy, + //posun sa v kontrolnom vzore o jednu poziciu a cakaj ci nebudu prichadzat dalsie bajty z tohto kontrolneho vzoru + else if((prebieha_nacitanie && (znak == koniec_spravy[koniec_spravy_pozicia]) && + (koniec_spravy_pozicia == 0)) || (!prebieha_nacitanie && (znak == koniec_spravy[koniec_spravy_pozicia]) && + (koniec_spravy_pozicia < velkost_kontrolneho_vzoru - 1))) { koniec_spravy_pozicia++; prebieha_nacitanie = 0; } - else if(!prebieha_nacitanie && znak != koniec_spravy[0]) + //v pripade ak zacalo nacitanie kontrolneho vzoru, ktory urcuje koniec spravy, ale nebol najdeny posledny znak z tohto vzoru + //nacitaj do suboru docasne nezapisane znaky, ktore su sucastou kontrolneho vzoru a zaroven nacitaj aktualny znak + else if(!prebieha_nacitanie_velkosti_spravy && !prebieha_nacitanie && znak != koniec_spravy[koniec_spravy_pozicia]) { for(int i = 0; i < koniec_spravy_pozicia; i++) { fwrite((char*)&koniec_spravy[i], 1, uspech, f); nacitane_data += uspech; } - fwrite((char*)&znak, 1, uspech, f); nacitane_data += uspech; + koniec_spravy_pozicia = 0; prebieha_nacitanie = 1; } - else if(!prebieha_nacitanie && (znak == koniec_spravy[0]) && (koniec_spravy_pozicia == 3)) + //ak prebehlo nacitanie vsetkych bajtov, ktore su sucastou kontrolneho vzoru urcujuceho koniec spravy + //ukonci nacitanie spravy + else if(!prebieha_nacitanie_velkosti_spravy && !prebieha_nacitanie && (znak == koniec_spravy[0]) && + (koniec_spravy_pozicia == 3)) { - //ak bol najdeny koniec kontrolneho vzoru, tak je vypnuta znacka, - //ktora urcuje ze prebieha nacitanie spravy prebieha_nacitanie = 0; koniec_spravy_pozicia = 0; - //koniec_spravy_pozicia = 0; break; } + //inak prebieha nacitanie, cize zapis aktualny znak (bajt) do suboru else { - if(prebieha_nacitanie) + if(prebieha_nacitanie && !prebieha_nacitanie_velkosti_spravy) { fwrite((char*)&znak, 1, uspech, f); nacitane_data += uspech; @@ -118,14 +152,15 @@ int rs232_citanie(WOLFSSL *ssl, char *buf, int sz, void *ctx) } } aktualne_data = nacitane_data; - nacitane_data = 0; + nacitane_data = 0; fclose(f); } - //nacitanie dat zo suboru do buffera + //nacitanie dat zo suboru do buffera pre desifrovanie uspech = 0; while(uspech <= 0) uspech = read(rs232_prijat, buf, sz); aktualne_data -= uspech; + return uspech; } @@ -136,13 +171,23 @@ int rs232_zapis(WOLFSSL *ssl, char *buf, int sz, void *ctx) //kontrolne vzory, ktore jednoznacne identifikuju zaciatok a koniec spravy unsigned char zaciatok_spravy[] = {0xAA, 0xAA, 0xAA, 0xAA}; unsigned char koniec_spravy[] = {0xBB, 0xBB, 0xBB, 0xBB}; + + //vytvorenie bajtov ktore budu niest informaciu o velkosti posielanej spravy + unsigned char* velkost_spravy = calloc(4, sizeof(unsigned char)); + velkost_spravy[0] = (sz >> 24) & 0xFF; + velkost_spravy[1] = (sz >> 16) & 0xFF; + velkost_spravy[2] = (sz >> 8) & 0xFF; + velkost_spravy[3] = sz & 0xFF; + + //odoslanie kontrolnych vzorov, bajtov s velkostou spravy a samotnych dat na seriove rozhranie + RS232_SendBuf(cislo_rozhrania, (unsigned char*)zaciatok_spravy, sizeof(zaciatok_spravy)); + RS232_SendBuf(cislo_rozhrania, (unsigned char*)velkost_spravy, 4); + uspech = (int)RS232_SendBuf(cislo_rozhrania, (unsigned char*)buf, sz); + RS232_SendBuf(cislo_rozhrania, (unsigned char*)koniec_spravy, sizeof(koniec_spravy)); + free(velkost_spravy); - RS232_SendBuf(cislo_rozhrania, (unsigned char*)zaciatok_spravy, 4); - uspech = RS232_SendBuf(cislo_rozhrania, (unsigned char*)buf, sz); - RS232_SendBuf(cislo_rozhrania, (unsigned char*)koniec_spravy, 4); - RS232_flushTX(cislo_rozhrania); return uspech; -} +} int main(int argc, char const *argv[]) { @@ -154,6 +199,7 @@ int main(int argc, char const *argv[]) int generovanie_certifikatu = 0; int nacitanie_zo_suboru = 0; nastavenia_aplikacie nastavenia; + RS232_flushRXTX(cislo_rozhrania); rs232_prijat = open(KOMUNIKACNY_SUBOR, O_RDWR | O_NOCTTY | O_NDELAY); @@ -199,15 +245,14 @@ int main(int argc, char const *argv[]) } else if(!strcmp(argv[i+1], "rsa")) { - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita/autorita_rsa.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita/autorita_rsa.pem", NULL); if(nacitat_certifikaty(ctx, RSA_CERTIFIKAT, RSA_KLUC) == -1) return -1; wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0); } else if(!strcmp(argv[i+1], "ecc")) { - printf("jo\n"); - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita/autorita_ecc.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita/autorita_ecc.pem", NULL); if(nacitat_certifikaty(ctx, ECC_CERTIFIKAT, ECC_KLUC) == -1) return -1; wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0); @@ -233,14 +278,14 @@ int main(int argc, char const *argv[]) } else if(!strcmp(argv[i+1], "rsa")) { - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita/autorita_rsa.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita/autorita_rsa.pem", NULL); if(generovat_rsa_certifikat(RSA_VELKOST, RSA_EXPONENT, CTC_SHA256wRSA, "SR", "Kosice", "local.dev", "server@server.sk") == -1) return -1; if(nacitat_certifikaty(ctx, VYGENEROVANY_CERTIFIKAT, VYGENEROVANY_KLUC) == -1) return -1; } else if(!strcmp(argv[i+1], "ecc")) { - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita/autorita_ecc.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita/autorita_ecc.pem", NULL); if(generovat_ecc_certifikat(ECC_VELKOST, ECC_SECP256R1, CTC_SHAwECDSA, "SR", "Kosice", "local.dev", "server@server.sk") == -1) return -1; if(nacitat_certifikaty(ctx, VYGENEROVANY_CERTIFIKAT, VYGENEROVANY_KLUC) == -1) return -1; } @@ -266,44 +311,46 @@ int main(int argc, char const *argv[]) } //nastav_sifry(ctx, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"); - //wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); - + + //nastavenie vlastnych I/O funkcii wolfSSL_SetIOSend(ctx, rs232_zapis); wolfSSL_SetIORecv(ctx, rs232_citanie); - while(1) + //pokus o vytvorenie novej wolfSSL relacie + if ((ssl = wolfSSL_new(ctx)) == NULL) { - printf("------------\n"); - if ((ssl = wolfSSL_new(ctx)) == NULL) - { - printf("Nepodarilo sa vytvorit ssl relaciu\n"); - wolfSSL_CTX_free(ctx); - return -1; - } - - wolfSSL_set_fd(ssl, rs232_prijat); - wolfSSL_set_using_nonblock(ssl, rs232_prijat); - - uspech = wolfSSL_accept(ssl); - if(uspech != SSL_SUCCESS) - { - char* popis_chyby = calloc(100, sizeof(char)); - int chyba = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(chyba, popis_chyby); - fprintf(stderr, "Nastala chyba v spojeni.\nCislo chyby: %d\nDovod chyby: %s\n", chyba, popis_chyby); - printf("Skontrolujte certifikaty.\n"); - return -1; - } - zobraz_sifru(ssl); - zobraz_certifikat(ssl); - nastav_funkciu(&nastavenia, funkcia_BLAKE2B); - prijat_subor(ssl, ctx, &nastavenia); + printf("Nepodarilo sa vytvorit ssl relaciu\n"); + wolfSSL_CTX_free(ctx); + return -1; } + //priradenie file descriptora suboru ako I/O pre TLS spojenie + wolfSSL_set_fd(ssl, rs232_prijat); + wolfSSL_set_using_nonblock(ssl, rs232_prijat); + + //cakanie na inicializaciu TLS handshaku klientom + uspech = wolfSSL_accept(ssl); + if(uspech != SSL_SUCCESS) + { + char* popis_chyby = calloc(100, sizeof(char)); + int chyba = wolfSSL_get_error(ssl, 0); + wolfSSL_ERR_error_string(chyba, popis_chyby); + fprintf(stderr, "Nastala chyba v spojeni.\nCislo chyby: %d\nDovod chyby: %s\n", chyba, popis_chyby); + printf("Skontrolujte certifikaty.\n"); + free(popis_chyby); + return -1; + } + zobraz_sifru(ssl); + zobraz_certifikat(ssl); + nastav_funkciu(&nastavenia, "crc", ziadna); + prijat_subor(ssl, ctx, &nastavenia); + + //ukoncenie spojenia, vymazanie komunikacneho suboru + //a vycistenie serioveho buffera + ukoncit_spojenie(ssl, ctx); + RS232_flushRXTX(cislo_rozhrania); RS232_CloseComport(cislo_rozhrania); - close(rs232_prijat); - close(open(KOMUNIKACNY_SUBOR, O_RDWR | O_NOCTTY | O_NDELAY)); - + fclose(fopen(KOMUNIKACNY_SUBOR, "wb")); return 0; } diff --git a/rs232_kanal/server/server.txt b/rs232_kanal/server/server.txt new file mode 100644 index 0000000..e69de29 diff --git a/rs232_kanal/spustit_server.bat b/rs232_kanal/server/spustit_server.bat similarity index 73% rename from rs232_kanal/spustit_server.bat rename to rs232_kanal/server/spustit_server.bat index 8d46af1..8f2baf0 100644 --- a/rs232_kanal/spustit_server.bat +++ b/rs232_kanal/server/spustit_server.bat @@ -3,17 +3,12 @@ :: Meno studenta: Tomas Lukac :: :: Veduci BP: prof. Ing. Milos Drutarovsky CSc. :: :: Skola: KEMT FEI TUKE :: -:: Datum poslednej upravy: 6.4.2020 :: +:: Datum poslednej upravy: 15.4.2020 :: :::::::::::::::::::::::::::::::::::::::::::::::::: -:: Program server je mozne spustit s prepinacmi: +:: Program je mozne spustit s prepinacmi: :: -port seriove_rozhranie :: -g rsa|ecc sluzi na generovanie certifikatu :: -n rsa|ecc sluzi na nacitanie uz vygenerovanych certifikatov z adresara /certifikaty -del klient.txt -del server.txt -type nul >klient.txt -type nul >server.txt - server -port 5 -n rsa \ No newline at end of file diff --git a/tcpip_kanal/Makefile b/tcpip_kanal/Makefile deleted file mode 100644 index 1f49917..0000000 --- a/tcpip_kanal/Makefile +++ /dev/null @@ -1,59 +0,0 @@ -################################################## -## Bakalarska praca ## -## Meno studenta: Tomas Lukac ## -## Veduci BP: prof. Ing. Milos Drutarovsky CSc. ## -## Skola: KEMT FEI TUKE ## -## Datum poslednej upravy: 6.4.2020 ## -################################################## - -#prekladac -CC = gcc - -#prepinace pre prekladac -CFLAGS = -Wcpp -Werror -I./../wolfssl/ -LIB = - -ifeq ($(OS), Windows_NT) - ifeq ($(PROCESSOR_ARCHITECTURE), AMD64) - LIB += -L./../wolfssl/64bit_kniznice/ -lwolfssl -lws2_32 -m64 - endif - ifeq ($(PROCESSOR_ARCHITECTURE), x86) - LIB += -L./../wolfssl/32bit_kniznice/ -lwolfssl -lws2_32 -Os - endif -else - UNAME_S := $(shell uname -s) - ifeq ($(UNAME_S), Linux) - LIB += -lwolfssl - endif -endif - -all: klient server - -klient: klient.o kryptografia.o komunikacia.o rs232.o - $(CC) $(CFLAGS) -o klient klient.o kryptografia.o komunikacia.o rs232.o $(LIB) - -server: server.o kryptografia.o komunikacia.o rs232.o - $(CC) $(CFLAGS) -o server server.o kryptografia.o komunikacia.o rs232.o $(LIB) - -klient.o: klient.c - $(CC) $(CFLAGS) -c klient.c $(LIB) - -server.o: server.c - $(CC) $(CFLAGS) -c server.c $(LIB) - -kryptografia.o: ../kniznica/kryptografia.c ../kniznica/kryptografia.h - $(CC) $(CFLAGS) -c ../kniznica/kryptografia.c $(LIB) - -komunikacia.o: ../kniznica/komunikacia.c ../kniznica/komunikacia.h - $(CC) $(CFLAGS) -c ../kniznica/komunikacia.c $(LIB) - -rs232.o: ../kniznica/rs232.c ../kniznica/rs232.h - $(CC) $(CFLAGS) -c ../kniznica/rs232.c $(LIB) - -.PHONY: clean - -clean-linux: - rm *.o -f klient server - -clean-win: - del *.o klient.exe server.exe \ No newline at end of file diff --git a/tcpip_kanal/klient/Makefile b/tcpip_kanal/klient/Makefile new file mode 100644 index 0000000..f34f639 --- /dev/null +++ b/tcpip_kanal/klient/Makefile @@ -0,0 +1,45 @@ +################################################## +## Bakalarska praca ## +## Meno studenta: Tomas Lukac ## +## Veduci BP: prof. Ing. Milos Drutarovsky CSc. ## +## Skola: KEMT FEI TUKE ## +## Datum poslednej upravy: 15.4.2020 ## +################################################## + +#prekladac +CC = gcc + +#prepinace pre prekladac +CFLAGS = -Wcpp -Werror -I./../../wolfssl/ +SOURCES = $(wildcard ../../kniznica/*.c) \ + $(wildcard *.c) +OBJECTS = $(SOURCES:.c=.o) +EXECUTABLE = klient + +ifeq ($(OS), Windows_NT) + CLEAN += del *.o *.exe + ifeq ($(PROCESSOR_ARCHITECTURE), AMD64) + ARCH += -m64 + CFLAGS += $(ARCH) + LDFLAGS += -L./../../wolfssl/64bit_kniznice/ -lwolfssl -lws2_32 + endif + ifeq ($(PROCESSOR_ARCHITECTURE), x86) + ARCH += -m32 + CFLAGS += $(ARCH) + LDFLAGS += -L./../../wolfssl/32bit_kniznice/ -lwolfssl -lws2_32 + endif +else + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S), Linux) + LDFLAGS += -lwolfssl + CLEAN += rm *.o $(EXECUTABLE) + endif +endif + +all: $(EXECUTABLE) + +$(EXECUTABLE): $(OBJECTS) + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) + +clean: + $(CLEAN) \ No newline at end of file diff --git a/tcpip_kanal/klient.c b/tcpip_kanal/klient/klient.c similarity index 79% rename from tcpip_kanal/klient.c rename to tcpip_kanal/klient/klient.c index af84afd..392ad32 100644 --- a/tcpip_kanal/klient.c +++ b/tcpip_kanal/klient/klient.c @@ -3,11 +3,11 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 6.4.2020 // +// Datum poslednej upravy: 15.4.2020 // ////////////////////////////////////////////////// -#include "../kniznica/kryptografia.h" -#include "../kniznica/komunikacia.h" +#include "../../kniznica/kryptografia.h" +#include "../../kniznica/komunikacia.h" #include @@ -16,12 +16,12 @@ #define RSA_EXPONENT 65537 //cesty ku suborom -#define RSA_KLUC "../certifikaty/klient/klient_rsa.key" -#define RSA_CERTIFIKAT "../certifikaty/klient/klient_rsa.pem" -#define ECC_KLUC "../certifikaty/klient/klient_ecc.key" -#define ECC_CERTIFIKAT "../certifikaty/klient/klient_ecc.pem" -#define VYGENEROVANY_KLUC "../certifikaty/klient/vygenerovany_kluc.key" -#define VYGENEROVANY_CERTIFIKAT "../certifikaty/klient/vygenerovany_certifikat.pem" +#define RSA_KLUC "../../certifikaty/klient/klient_rsa.key" +#define RSA_CERTIFIKAT "../../certifikaty/klient/klient_rsa.pem" +#define ECC_KLUC "../../certifikaty/klient/klient_ecc.key" +#define ECC_CERTIFIKAT "../../certifikaty/klient/klient_ecc.pem" +#define VYGENEROVANY_KLUC "../../certifikaty/klient/vygenerovany_kluc.key" +#define VYGENEROVANY_CERTIFIKAT "../../certifikaty/klient/vygenerovany_certifikat.pem" int main(int argc, char** argv) { @@ -112,12 +112,12 @@ int main(int argc, char** argv) } else if(!strcmp(argv[i+1], "rsa")) { - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita/autorita_rsa.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita/autorita_rsa.pem", NULL); if(nacitat_certifikaty(ctx, RSA_CERTIFIKAT, RSA_KLUC) == -1) return -1; } else if(!strcmp(argv[i+1], "ecc")) { - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita/autorita_ecc.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita/autorita_ecc.pem", NULL); if(nacitat_certifikaty(ctx, ECC_CERTIFIKAT, ECC_KLUC) == -1) return -1; } else @@ -136,14 +136,14 @@ int main(int argc, char** argv) } else if(!strcmp(argv[i+1], "rsa")) { - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita_rsa.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita_rsa.pem", NULL); if(generovat_rsa_certifikat(RSA_VELKOST, RSA_EXPONENT, CTC_SHA256wRSA, "SR", "Kosice", "local.dev", "klient@klient.sk") == -1) return -1; if(nacitat_certifikaty(ctx, VYGENEROVANY_CERTIFIKAT, VYGENEROVANY_KLUC) == -1) return -1; wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); } else if(!strcmp(argv[i+1], "ecc")) { - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita/autorita_ecc.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita/autorita_ecc.pem", NULL); if(generovat_ecc_certifikat(ECC_VELKOST, ECC_SECP256R1, CTC_SHAwECDSA, "SR", "Kosice", "local.dev", "klient@klient.sk") == -1) return -1; if(nacitat_certifikaty(ctx, VYGENEROVANY_CERTIFIKAT, VYGENEROVANY_KLUC) == -1) return -1; wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); @@ -179,15 +179,20 @@ int main(int argc, char** argv) } //umoznuje vybrat sifry ktore sa budu nachadzat v sifrovacom subore //nastav_sifry(ctx, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"); - - cislo_soketu = pripojit_na_server(ip_adresa, cislo_portu, 10); + + //pokus o inicializaciu TCP/IP prenosoveho kanala + cislo_soketu = pripojit_na_server(ip_adresa, cislo_portu, 500); if(!cislo_soketu) return -1; - + + //pokus o vytvorenie novej wolfSSL relacie ssl = wolfSSL_new(ctx); - wolfSSL_set_fd(ssl, cislo_soketu); - int uspech = wolfSSL_connect(ssl); + //priradenie file descriptora soketu ako I/O pre TLS spojenie + wolfSSL_set_fd(ssl, cislo_soketu); + + //pokus o inizicalizaciu TLS handshaku so serverom + uspech = wolfSSL_connect(ssl); if(uspech != SSL_SUCCESS) { char* popis_chyby = calloc(100, sizeof(char)); @@ -195,11 +200,12 @@ int main(int argc, char** argv) wolfSSL_ERR_error_string(chyba, popis_chyby); fprintf(stderr, "Nastala chyba v spojeni.\nCislo chyby: %d\nDovod chyby: %s\n", chyba, popis_chyby); printf("Skontrolujte certifikaty.\n"); + free(popis_chyby); return -1; } zobraz_sifru(ssl); zobraz_certifikat(ssl); - nastav_funkciu(&nastavenia, funkcia_BLAKE2B); + nastav_funkciu(&nastavenia, "crc", ziadna); if(poslat_subor(ssl, ctx, subor, &nastavenia) == -1) return -1; ukoncit_spojenie(ssl, ctx); } diff --git a/tcpip_kanal/klient/nieco.txt b/tcpip_kanal/klient/nieco.txt new file mode 100644 index 0000000..1e17e8d --- /dev/null +++ b/tcpip_kanal/klient/nieco.txt @@ -0,0 +1 @@ +janooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo \ No newline at end of file diff --git a/tcpip_kanal/spustit_klient.bat b/tcpip_kanal/klient/spustit_klient.bat similarity index 85% rename from tcpip_kanal/spustit_klient.bat rename to tcpip_kanal/klient/spustit_klient.bat index 49202ce..d1382ff 100644 --- a/tcpip_kanal/spustit_klient.bat +++ b/tcpip_kanal/klient/spustit_klient.bat @@ -3,7 +3,7 @@ :: Meno studenta: Tomas Lukac :: :: Veduci BP: prof. Ing. Milos Drutarovsky CSc. :: :: Skola: KEMT FEI TUKE :: -:: Datum poslednej upravy: 6.4.2020 :: +:: Datum poslednej upravy: 15.4.2020 :: :::::::::::::::::::::::::::::::::::::::::::::::::: :: Program je mozne spustit s prepinacmi: @@ -12,4 +12,4 @@ :: -s cesta-ku-suboru sluzi na nacitanie cesty k suboru, ktory chceme odoslat ::Priklady spustenia: -klient -ip 127.0.0.1 -port 8080 -n rsa +klient -ip 127.0.0.1 -port 8080 -g rsa -s nieco.txt diff --git a/tcpip_kanal/server/Makefile b/tcpip_kanal/server/Makefile new file mode 100644 index 0000000..9a08ea6 --- /dev/null +++ b/tcpip_kanal/server/Makefile @@ -0,0 +1,45 @@ +################################################## +## Bakalarska praca ## +## Meno studenta: Tomas Lukac ## +## Veduci BP: prof. Ing. Milos Drutarovsky CSc. ## +## Skola: KEMT FEI TUKE ## +## Datum poslednej upravy: 15.4.2020 ## +################################################## + +#prekladac +CC = gcc + +#prepinace pre prekladac +CFLAGS = -Wcpp -Werror -I./../../wolfssl/ +SOURCES = $(wildcard ../../kniznica/*.c) \ + $(wildcard *.c) +OBJECTS = $(SOURCES:.c=.o) +EXECUTABLE = server + +ifeq ($(OS), Windows_NT) + CLEAN += del *.o *.exe + ifeq ($(PROCESSOR_ARCHITECTURE), AMD64) + ARCH += -m64 + CFLAGS += $(ARCH) + LDFLAGS += -L./../../wolfssl/64bit_kniznice/ -lwolfssl -lws2_32 + endif + ifeq ($(PROCESSOR_ARCHITECTURE), x86) + ARCH += -m32 + CFLAGS += $(ARCH) + LDFLAGS += -L./../../wolfssl/32bit_kniznice/ -lwolfssl -lws2_32 + endif +else + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S), Linux) + LDFLAGS += -lwolfssl + CLEAN += rm *.o $(EXECUTABLE) + endif +endif + +all: $(EXECUTABLE) + +$(EXECUTABLE): $(OBJECTS) + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) + +clean: + $(CLEAN) \ No newline at end of file diff --git a/tcpip_kanal/server/nieco.txt b/tcpip_kanal/server/nieco.txt new file mode 100644 index 0000000..1e17e8d --- /dev/null +++ b/tcpip_kanal/server/nieco.txt @@ -0,0 +1 @@ +janooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo \ No newline at end of file diff --git a/tcpip_kanal/server.c b/tcpip_kanal/server/server.c similarity index 66% rename from tcpip_kanal/server.c rename to tcpip_kanal/server/server.c index 4f34a36..07fab89 100644 --- a/tcpip_kanal/server.c +++ b/tcpip_kanal/server/server.c @@ -3,11 +3,11 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 6.4.2020 // +// Datum poslednej upravy: 15.4.2020 // ////////////////////////////////////////////////// -#include "../kniznica/kryptografia.h" -#include "../kniznica/komunikacia.h" +#include "../../kniznica/kryptografia.h" +#include "../../kniznica/komunikacia.h" #include @@ -16,12 +16,12 @@ #define RSA_EXPONENT 65537 //cesty ku suborom -#define RSA_KLUC "../certifikaty/server/server_rsa.key" -#define RSA_CERTIFIKAT "../certifikaty/server/server_rsa.pem" -#define ECC_KLUC "../certifikaty/server/server_ecc.key" -#define ECC_CERTIFIKAT "../certifikaty/server/server_ecc.pem" -#define VYGENEROVANY_KLUC "../certifikaty/server/vygenerovany_kluc.key" -#define VYGENEROVANY_CERTIFIKAT "../certifikaty/server/vygenerovany_certifikat.pem" +#define RSA_KLUC "../../certifikaty/server/server_rsa.key" +#define RSA_CERTIFIKAT "../../certifikaty/server/server_rsa.pem" +#define ECC_KLUC "../../certifikaty/server/server_ecc.key" +#define ECC_CERTIFIKAT "../../certifikaty/server/server_ecc.pem" +#define VYGENEROVANY_KLUC "../../certifikaty/server/vygenerovany_kluc.key" +#define VYGENEROVANY_CERTIFIKAT "../../certifikaty/server/vygenerovany_certifikat.pem" int main(int argc, char **argv) { @@ -82,7 +82,7 @@ int main(int argc, char **argv) } else if(!strcmp(argv[i+1], "rsa")) { - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita/autorita_rsa.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita/autorita_rsa.pem", NULL); if(nacitat_certifikaty(ctx, RSA_CERTIFIKAT, RSA_KLUC) == -1) return -1; wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0); @@ -90,7 +90,7 @@ int main(int argc, char **argv) else if(!strcmp(argv[i+1], "ecc")) { printf("jo\n"); - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita/autorita_ecc.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita/autorita_ecc.pem", NULL); if(nacitat_certifikaty(ctx, ECC_CERTIFIKAT, ECC_KLUC) == -1) return -1; wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0); @@ -116,14 +116,14 @@ int main(int argc, char **argv) } else if(!strcmp(argv[i+1], "rsa")) { - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita/autorita_rsa.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita/autorita_rsa.pem", NULL); if(generovat_rsa_certifikat(RSA_VELKOST, RSA_EXPONENT, CTC_SHA256wRSA, "SR", "Kosice", "local.dev", "server@server.sk") == -1) return -1; if(nacitat_certifikaty(ctx, VYGENEROVANY_CERTIFIKAT, VYGENEROVANY_KLUC) == -1) return -1; } else if(!strcmp(argv[i+1], "ecc")) { - wolfSSL_CTX_load_verify_locations(ctx, "../certifikaty/autorita/autorita_ecc.pem", NULL); + wolfSSL_CTX_load_verify_locations(ctx, "../../certifikaty/autorita/autorita_ecc.pem", NULL); if(generovat_ecc_certifikat(ECC_VELKOST, ECC_SECP256R1, CTC_SHAwECDSA, "SR", "Kosice", "local.dev", "server@server.sk") == -1) return -1; if(nacitat_certifikaty(ctx, VYGENEROVANY_CERTIFIKAT, VYGENEROVANY_KLUC) == -1) return -1; } @@ -150,33 +150,38 @@ int main(int argc, char **argv) //umoznuje vybrat sifry ktore sa budu nachadzat v sifrovacom subore //nastav_sifry(ctx, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"); + //pokus vytvorenie TCP/IP prenosoveho kanala cislo_soketu = cakat_na_komunikaciu(cislo_portu); - while(1) + struct sockaddr_in adresa; + WOLFSSL* ssl; + int velkost = sizeof(adresa); + int cislo_soketu_klienta = accept(cislo_soketu, (struct sockaddr*)&adresa, &velkost); + printf("Spojenie [%s:%d]\n", inet_ntoa(adresa.sin_addr), ntohs(adresa.sin_port)); + + //pokus o vytvorenie novej wolfSSL relacie + ssl = wolfSSL_new(ctx); + + //priradenie file descriptora soketu ako I/O pre TLS spojenie + wolfSSL_set_fd(ssl, cislo_soketu_klienta); + + //cakanie na inicializaciu TLS handshaku klientom + int uspech; + if(wolfSSL_accept(ssl) != SSL_SUCCESS) { - printf("------------\n"); - struct sockaddr_in adresa; - WOLFSSL* ssl; - int velkost = sizeof(adresa); - int cislo_soketu_klienta = accept(cislo_soketu, (struct sockaddr*)&adresa, &velkost); - printf("Spojenie [%s:%d]\n", inet_ntoa(adresa.sin_addr), ntohs(adresa.sin_port)); - ssl = wolfSSL_new(ctx); - wolfSSL_set_fd(ssl, cislo_soketu_klienta); - int uspech; - if(wolfSSL_accept(ssl) != SSL_SUCCESS) - { - char* popis_chyby = calloc(100, sizeof(char)); - int chyba = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(chyba, popis_chyby); - fprintf(stderr, "Nastala chyba v spojeni.\nCislo chyby: %d\nDovod chyby: %s\n", chyba, popis_chyby); - printf("Skontrolujte certifikaty.\n"); - return -1; - } - zobraz_sifru(ssl); - zobraz_certifikat(ssl); - nastav_funkciu(&nastavenia, funkcia_BLAKE2B); - prijat_subor(ssl, ctx, &nastavenia); + char* popis_chyby = calloc(100, sizeof(char)); + int chyba = wolfSSL_get_error(ssl, 0); + wolfSSL_ERR_error_string(chyba, popis_chyby); + fprintf(stderr, "Nastala chyba v spojeni.\nCislo chyby: %d\nDovod chyby: %s\n", chyba, popis_chyby); + printf("Skontrolujte certifikaty.\n"); + free(popis_chyby); + return -1; } + zobraz_sifru(ssl); + zobraz_certifikat(ssl); + nastav_funkciu(&nastavenia, "crc", ziadna); + if(prijat_subor(ssl, ctx, &nastavenia) == -1) return -1; + ukoncit_spojenie(ssl, ctx); } ukoncit_soket(cislo_soketu); return 0; diff --git a/tcpip_kanal/spustit_server.bat b/tcpip_kanal/server/spustit_server.bat similarity index 87% rename from tcpip_kanal/spustit_server.bat rename to tcpip_kanal/server/spustit_server.bat index ef1c779..b1cb40f 100644 --- a/tcpip_kanal/spustit_server.bat +++ b/tcpip_kanal/server/spustit_server.bat @@ -3,7 +3,7 @@ :: Meno studenta: Tomas Lukac :: :: Veduci BP: prof. Ing. Milos Drutarovsky CSc. :: :: Skola: KEMT FEI TUKE :: -:: Datum poslednej upravy: 6.4.2020 :: +:: Datum poslednej upravy: 15.4.2020 :: :::::::::::::::::::::::::::::::::::::::::::::::::: :: Program server je mozne spustit s prepinacmi: @@ -11,5 +11,5 @@ :: -n rsa|ecc sluzi na nacitanie uz vygenerovanych certifikatov z adresara /certifikaty ::Priklady spustenia: -server -port 8080 -n rsa +server -port 8080 -g rsa ::server -port 8080 -g ecc \ No newline at end of file