////////////////////////////////////////////////// // Bakalarska praca // // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // // Datum poslednej upravy: 6.5.2020 // ////////////////////////////////////////////////// #ifndef __KRYPTOGRAFIA_H__ #define __KRYPTOGRAFIA_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include "../externe_kniznice/zlib/zlib.h" #include #include //velkost bufferov do ktorych sa ukladaju data certifikatov, klucov, ziadosti #define VELKOST_BUFFERA 4096 //pocet bajtov ktore vstupuju do crc funkcie #define CRC32_VELKOST 10 //velkost vystupu blake2d hashu v bitoch #define BLAKE2B_VELKOST 64 /** * enum typ_aplikacie: obsahuje mozne typy aplikacie */ typedef enum typ_aplikacie { klient, server } typ_aplikacie; /** * enum hashovacia_funkcia: obsahuje mozne hashovacie funkcie na vypocet kontrolneho suctu suboru */ typedef enum hashovacia_funkcia { funkcia_SHA, funkcia_SHA224, funkcia_SHA256, funkcia_SHA384, funkcia_SHA512, funkcia_BLAKE2B, funkcia_RIPEMD160 } hashovacia_funkcia; /* * enum crc_funkcia: obsahuje mozne crc funkcie na vypocet kontrolneho suctu suboru */ typedef enum crc_funkcia { funkcia_CRC32 } crc_funkcia; /* * struct nastavenia_aplikacie: struktura, ktora uchovava nastavenia nastavene pocas behu aplikacie */ typedef struct nastavenia_aplikacie { typ_aplikacie typ_a; char typ_vypoctu[32]; hashovacia_funkcia h_funkcia; crc_funkcia c_funkcia; //Pozn. //Dalej rozsiritelne o napr. ukladanie bezpecnostnych parametrov //(certifikaty, kluce, resp. vypocitane crc, mac kody a podobne) } nastavenia_aplikacie; /** * generovat_kontrolny_sucet_suboru: realizuje vypocet kontrolneho suctu zo suboru, ktoreho lokacia je predana v argumente * @parameter char* funkcia : nazov funkcie pre vypocet kontrolneho suctu * @parameter char* cesta : lokacia suboru * @parameter int velkost_suboru : velkost suboru * @parameter int* velkost_suctu : uklada velkost kontrolneho suctu, ktoreho hodnota sa dynamicky priradi * na zaklade nazvu funkcie uvedenom v prvom argumente * @vrati smernik na vygenerovany kontrolny sucet * Poznamka: * funkcia dynamicky alokuje pamat o velkosti, ktora zavisi od nastavenej crc/hash funkcie v nastaveniach, * takze tuto pamat je nutne nasledne dealokovat manualne */ unsigned char* generovat_kontrolny_sucet_suboru(nastavenia_aplikacie* nastavenia, const char* cesta, int velkost_suboru, int* velkost_suctu); /** * generovat_ecc_certifikat: realizuje vygenerovania sukromneho kluca, nacitanie sukromneho kluca autority, * vygenerovanie a podpis ecc certifikatu pomocou sukromneho kluca a certifikatu autority * @parameter const char* subor_kluc : absolutna cesta ku suboru so sukromnym klucom vo formate PEM * @parameter const char* subor_certifikat : absolutna cesta ku suboru s certifikatom vo formate PEM * @parameter int pocet_bitov : velkost kluca * @parameter ecc-curve_id kluc_krivka: kod krivky pre generovanie sukromneho kluca * @parameter int algoritmus: kod algoritmu, sluziaceho na vymenu klucov * @vrati int: operacia bola uspesna(0), neuspesna(-1) */ int generovat_ecc_certifikat(const char* subor_kluc, const char* subor_certifikat, int pocet_bitov, ecc_curve_id kluc_krivka, int algoritmus, char* krajina, char* mesto, char* domena, char* email); /** * generovat_rsa_certifikat: realizuje vygenerovania sukromneho kluca, nacitanie sukromneho kluca autority, * vygenerovanie a podpis rsa certifikatu pomocou sukromneho kluca a certifikatu autority * @parameter const char* subor_kluc : absolutna cesta ku suboru so sukromnym klucom vo formate PEM * @parameter const char* subor_certifikat : absolutna cesta ku suboru s certifikatom vo formate PEM * @parameter int pocet_bitov : velkost kluca * @parameter int exponent : hodnota exponentu * @parameter int algoritmus : kod algoritmu, sluziaceho na vymenu klucov * @vrati int : operacia bola uspesna(0), neuspesna(-1) */ int generovat_rsa_certifikat(const char* subor_kluc, const char* subor_certifikat, int pocet_bitov, int exponent, int algoritmus, char* krajina, char* mesto, char* domena, char* email); /** * generovat_rsa_ziadost: realizuje vygenerovania sukromneho kluca, vygenerovanie a podpis ziadosti * @parameter const char* subor_kluc : absolutna cesta ku suboru so sukromnym klucom vo formate PEM * @parameter const char* subor_ziadost : absolutna cesta ku suboru so ziadostou vo formate PEM * @parameter int pocet_bitov : velkost kluca * @parameter int exponent : hodnota exponentu * @parameter int algoritmus: kod algoritmu, sluziaceho na vymenu klucov * @vrati int: operacia bola uspesna(0), neuspesna(-1) */ int generovat_rsa_ziadost(const char* subor_kluc, const char* subor_ziadost, int pocet_bitov, int exponent, int algoritmus, char* krajina, char* mesto, char* domena, char* email); /** * generovat_ecc_ziadost: realizuje vygenerovania sukromneho kluca, vygenerovanie a podpis ziadosti * @parameter const char* subor_kluc : absolutna cesta ku suboru so sukromnym klucom vo formate PEM * @parameter const char* subor_ziadost : absolutna cesta ku suboru so ziadostou vo formate PEM * @parameter int pocet_bitov : velkost kluca * @parameter ecc-curve_id kluc_krivka: kod krivky pre generovanie sukromneho kluca * @parameter int algoritmus: kod algoritmu, sluziaceho na vymenu klucov * @vrati int: operacia bola uspesna(0), neuspesna(-1) */ int generovat_ecc_ziadost(const char* subor_kluc, const char* subor_ziadost, int pocet_bitov, ecc_curve_id kluc_krivka, int algoritmus, char* krajina, char* mesto, char* domena, char* email); /** * nastav_ctx_klient : realizuje vytvorenie a inicializaciu CTX struktury * na zaklade verzie tls (client method) * @vrati smernik na ctx strukturu */ WOLFSSL_CTX* nastavit_ctx_klient(); /** * nastav_ctx_server: realizuje vytvorenie a inicializaciu CTX struktury * na zaklade verzie tls (server method) * @vrati smernik na ctx strukturu */ WOLFSSL_CTX* nastavit_ctx_server(); /** * Zobrazi sifru na ktorej sa strany dohodli * @parameter WOLFSSL* ssl : ukazuje na aktualnu relaciu */ void zobraz_sifru(WOLFSSL* ssl); /** * nastav_sifry: umoznuje manualne nastavit sifrovaci subor * @parameter WOLFSSL_CTX* ctx : ukazuje na WOLFSSL_CTX strukturu * @parameter const char* sifry : retazec, ktory sa sklada z nazvov sifier oddelenych pomocou znak ":" * vyber sifry zakazeme vlozenim znaku "!" pred danu sifru */ void nastav_sifry(WOLFSSL_CTX* ctx, const char* sifry); /** * nastav_typ_aplikacie: umoznuje nastavit typ aplikacie * @parameter nastavenia_aplikacie* nastavenia: reprezentuje nastavenia aplikacie * @parameter typ_aplikacie typ: umoznuje nastavit typ aplikacie moznosti: klient, server */ void nastav_typ_aplikacie(nastavenia_aplikacie* nastavenia, typ_aplikacie typ); /** * nastav_funkciu: nastavi hashovaciu funkciu ktora bude pouzita pri vypocte kontrolneho suctu suboru * @parameter nastavenia_aplikacie* nastavenia: reprezentuje nastavenia aplikacie * @parameter char* typ_vypoctu : umoznuje vyber medzi "crc" a "hash" kontrolnym suctom * @paramater hashovacia_funkcia h_funkcia : nazov hashovacej funkcie moznosti: funkcia_SHA, funkcia_SHA224, funkcia_SHA256, funkcia_SHA384, funkcia_SHA512, funkcia_BLAKE2B, funkcia_RIPEMD160 * @parameter crc_funkcia c_funkcia : nazov crc funkcie moznosti: funkcia_CRC32 */ void nastav_funkciu(nastavenia_aplikacie* nastavenia, char* typ_vypoctu, hashovacia_funkcia h_funkcia, crc_funkcia c_funkcia); /** * nacitat_certifikaty: realizuje nacitanie certifikatov zo suborov do struktury WOLFSSL_CTX * @parameter WOLFSSL_CTX* ctx : ukazuje na WOLFSSL_CTX strukturu * @parameter const char* subor_certifikat : absolutna cesta ku suboru s certifikatom vo formate PEM * @parameter const char* subor_kluc : absolutna cesta ku suboru so sukromnym klucom vo formate PEM * @vrati int : operacia bola uspesna(0), neuspesna(-1) */ int nacitat_certifikaty(WOLFSSL_CTX* ctx, const char* subor_certifikat, const char* subor_kluc); /** * zobraz_certifikat: realizuje vypis udajov extrahovanych z prijateho certifikatu * @parameter WOLFSSL* ssl : ukazuje na aktualnu relaciu */ void zobraz_certifikat(WOLFSSL* ssl); /** * ukoncit_spojenie: realizuje ukoncenie zabezpeceneho tls prenosoveho kanalu * @parameter WOLFSSL* ssl : ukazuje na aktualnu relaciu * @parameter WOLFSSL_CTX* ctx : ukazuje na WOLFSSL_CTX strukturu */ void ukoncit_spojenie(WOLFSSL *ssl, WOLFSSL_CTX *ctx); #endif