////////////////////////////////////////////////// // Bakalarska praca // // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // // Datum poslednej upravy: 6.4.2020 // ////////////////////////////////////////////////// #include "../kniznica/kryptografia.h" #include "../kniznica/komunikacia.h" #include #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" int main(int argc, char **argv) { int autentizacia_klienta = 0; int generovanie_certifikatu = 0; int nacitanie_zo_suboru = 0; int port = 0; nastavenia_aplikacie nastavenia; #if defined (_WIN32) WSADATA d; if(WSAStartup(MAKEWORD(2,2), &d)) { printf("Nastala chyba pri inicializacii winsocketu\n"); return -1; } #endif int cislo_soketu; int cislo_portu = 0; WOLFSSL_CTX* ctx; if((ctx = nastavit_ctx_server()) == NULL) { return -1; } else { //skontroluje ci nebol zadany prepinac "-g" pre moznost generovanie certifikatu, //ak ano pozrie aky typ certifikatu (v CLI argument hned za nim) bol zvoleny for(int i = 0; i < argc; i++) { if( (!strcmp(argv[i], "-port")) ) { port = 1; if((argv[i+1] == NULL) ) { printf("Nezadali ste cislo portu\n"); return -1; } else { cislo_portu = atoi(argv[i+1]); } } else if( (!strcmp(argv[i], "-n")) ) { nacitanie_zo_suboru = 1; if(generovanie_certifikatu) { fprintf(stderr, "Nie je mozne zvolit obidve metody nacitania certifikatov naraz\n"); return -1; } if((argv[i+1] == NULL) || (i == argc-1)) { printf("Nezadali ste typ certifikatu ktory chcete nacitat zo suboru\n"); return -1; } else if(!strcmp(argv[i+1], "rsa")) { 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); 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); } else { printf("Zadali ste nespravny typ certifikatu\n"); return -1; } } else if( (!strcmp(argv[i], "-g")) ) { generovanie_certifikatu = 1; if(nacitanie_zo_suboru) { fprintf(stderr, "Nie je mozne zvolit obidve metody nacitania certifikatov naraz\n"); return -1; } if((argv[i+1] == NULL) || (i == argc-1)) { printf("Nezadali ste typ certifikatu ktory chcete vygenerovat\n"); return -1; } else if(!strcmp(argv[i+1], "rsa")) { 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); 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; } else { printf("Zadali ste nespravny typ certifikatu\n"); return -1; } } } if(!port) { fprintf(stderr, "Nebol urceny port\n"); return -1; } else if(!generovanie_certifikatu && !nacitanie_zo_suboru) { fprintf(stderr, "Nebola zvolena metoda nacitania certifikatov\n"); printf("Zadajde prepinac -g (generovanie), alebo -n (nacitanie_zo_suboru) s parametrom rsa alebo ecc\n"); return -1; } //umoznuje vybrat sifry ktore sa budu nachadzat v sifrovacom subore //nastav_sifry(ctx, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"); cislo_soketu = cakat_na_komunikaciu(cislo_portu); while(1) { 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); } } ukoncit_soket(cislo_soketu); return 0; }