diff --git a/DOCS.md b/DOCS.md index bc11944..7b63925 100644 --- a/DOCS.md +++ b/DOCS.md @@ -2,8 +2,8 @@ - [Установка](#установка) - [Шифрование](#шифрование) - [Регистрация ключа](#регистрация-ключа) - - [Создание пользователя и шифрование](#создание-пользователя-и-шифрование) - - [Чтение данных пользователя и расшифровка](#чтение-данных-пользователя-и-расшифровка) + - [Команда шифрования](#команда-шифрования) + - [Расшифровка](#расшифровка) - [Опции команды](#опции-команды) - [API](#api) ## Установка @@ -27,7 +27,7 @@ make update vipre-cryptor --version ``` ## Шифрование -Для шифрования программа требует создать локального пользователя, зарегистрировать электронный ключ и привязать к пользователю зашифрованный ключом файл. +Для шифрования программа требует зарегистрировать электронный ключ и привязать к нему зашифрованный файл. ## Регистрация ключа Ключ можно создать с помощью OpenSSL: ```bash @@ -41,18 +41,16 @@ openssl rand -base64 30 vipre-cryptor --sig ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig ``` Данная команда запросит ваш ключ и запишет его в файл **ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig** особым образом. -## Создание пользователя и шифрование -Создание пользователя и шифрование файла выглядит следующим образом: +## Команда шифрования +Шифрование файла выглядит следующим образом: ```bash -vipre-cryptor ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig --create-user ИМЯ_ПОЛЬЗОВАТЕЛЯ.bin --file-input ФАЙЛ_ДЛЯ_ШИФРОВАНИЯ +vipre-cryptor ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig --create-user ИМЯ_ЗАШИФРОВАННОГО_ФАЙЛА.bin --file-input ФАЙЛ_ДЛЯ_ШИФРОВАНИЯ ``` -Данная команда запросит логин и пароль нового пользователя. -## Чтение данных пользователя и расшифровка +## Расшифровка Для чтения данных необходимо выполнить команду: ```bash -vipre-cryptor ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig --user-data ИМЯ_ПОЛЬЗОВАТЕЛЯ.bin --file-out ФАЙЛ_РАСШИФРОВАННЫХ_ДАННЫХ +vipre-cryptor ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig --user-data ИМЯ_ЗАШИФРОВАННОГО_ФАЙЛА.bin --file-out ФАЙЛ_РАСШИФРОВАННЫХ_ДАННЫХ ``` -Данная команда запросит логин и пароль пользователя. ## Опции команды Доступны опции: - **--help** @@ -62,12 +60,15 @@ vipre-cryptor ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig --user-data ИМЯ_ПОЛЬ - **--sig** - **--file-input** - **--file-out** + - **--type=users** Все опции можно сокращать до одного знака, например: ```ini # Опции "--file-input" и "--file-out" можно сократить до "--file" или просто "-f" -"--help" - "-h" -"--version" - "-v" +[options] +"--help" = "-h" +"--version" = "-v" +"--type=users" = "-t" ``` ## API У библиотеки есть **API**: @@ -76,11 +77,11 @@ vipre-cryptor ИМЯ_ФАЙЛА_С_КЛЮЧОМ.sig --user-data ИМЯ_ПОЛЬ #include "vipre-manager.h" int main(void) { - __set_api_mode("admin", "1234", "signature_key"); + __set_api_mode(NULL, NULL, "signature_key"); __create_sig("api_example_key.sig"); - __create_user("api_example_key.sig", "api_example_user.bin", "example.txt"); - __read_user("api_example_key.sig", "api_example_user.bin", "example_out.txt"); + __create_user("api_example_key.sig", "api_example_file.bin", "example.txt"); + __read_user("api_example_key.sig", "api_example_file.bin", "example_out.txt"); __api_detach(); return EXIT_SUCCESS; } -``` +``` \ No newline at end of file diff --git a/Makefile b/Makefile index 60c32c0..3d62f1f 100644 --- a/Makefile +++ b/Makefile @@ -29,16 +29,24 @@ REMOVE=rm INSTALL_NAME=/usr/local/bin/vipre-cryptor MODE=chmod +x RUN_OF=./ +API_NAME=api_example.c +API_OUT_NAME=api_example -.PHONY: clear run install uninstall update +.PHONY: clear run install uninstall update api run-api $(OUTPUT_NAME) $(OUTPUT_NAME): $(INPUT_NAME) $(CC) $(OPTIONS) $(INPUT_NAME) -o $(OUTPUT_NAME) +api: + $(CC) $(OPTIONS) $(API_NAME) -o $(API_OUT_NAME) clear: $(REMOVE) -f $(OUTPUT_NAME) + $(REMOVE) -f $(API_OUT_NAME) run: $(MODE) $(OUTPUT_NAME) $(RUN_OF)$(OUTPUT_NAME) +run-api: + $(MODE) $(API_OUT_NAME) + $(RUN_OF)$(API_OUT_NAME) install: $(COPY) $(OUTPUT_NAME) $(INSTALL_NAME) uninstall: diff --git a/api_example b/api_example index 008cd2b..53a661f 100755 Binary files a/api_example and b/api_example differ diff --git a/api_example.c b/api_example.c index 362b693..c659492 100644 --- a/api_example.c +++ b/api_example.c @@ -2,10 +2,10 @@ #include "vipre-manager.h" int main(void) { - __set_api_mode("admin", "1234", "signature_key"); + __set_api_mode(NULL, NULL, "signature_key"); __create_sig("api_example_key.sig"); - __create_user("api_example_key.sig", "api_example_user.bin", "example.txt"); - __read_user("api_example_key.sig", "api_example_user.bin", "example_out.txt"); + __create_user("api_example_key.sig", "api_example_file.bin", "example.txt"); + __read_user("api_example_key.sig", "api_example_file.bin", "example_out.txt"); __api_detach(); return EXIT_SUCCESS; -} +} \ No newline at end of file diff --git a/api_example_user.bin b/api_example_user.bin index 1bd6e91..a2a3e5e 100644 Binary files a/api_example_user.bin and b/api_example_user.bin differ diff --git a/key.sig b/key.sig deleted file mode 100644 index 2eed4df..0000000 Binary files a/key.sig and /dev/null differ diff --git a/user.bin b/user.bin deleted file mode 100644 index 1bd6e91..0000000 Binary files a/user.bin and /dev/null differ diff --git a/user_test.bin b/user_test.bin new file mode 100644 index 0000000..e69de29 diff --git a/vipre-cryptor b/vipre-cryptor index 0ff3976..6dec0cf 100755 Binary files a/vipre-cryptor and b/vipre-cryptor differ diff --git a/vipre-manager.h b/vipre-manager.h index 5eea7b5..69cb1c7 100644 --- a/vipre-manager.h +++ b/vipre-manager.h @@ -28,6 +28,9 @@ #include #include +#define LIB_TRUE 1 +#define LIB_FALSE 0 + #define VERSION "1.0" #define ERROR_FILE_OUT "unnamed_out_file.csv" @@ -39,6 +42,7 @@ char* __YEFWHD_api_login = NULL; char* __YEFWHD_api_password = NULL; char* __YEFWHD_api_datakey = NULL; char __YEFWHD_data_type = '\0'; +bool __YEFWHD_users = false; #define VIPRE_API_MODE 'A' @@ -55,6 +59,10 @@ void __set_api_mode(char* login, char* password, char* data_key) { __YEFWHD_data_type = VIPRE_API_MODE; } +void __use_users(bool is_use_users) { + __YEFWHD_users = is_use_users; +} + void _put_vipre_help(void) { puts ( "Vipre Console Cryptor V " VERSION "\n" @@ -190,7 +198,7 @@ int __create_user(char* file, char* user_file, char* cry_file) { char user_login[32]; char password[32]; int c; - if (__YEFWHD_data_type != VIPRE_API_MODE) { + if (__YEFWHD_data_type != VIPRE_API_MODE && __YEFWHD_users == true) { fputs("Login: ", stdout); size_t cnt = 0; while((c=getchar())!=EOF && cnt < 31 && c != '\n') { @@ -221,10 +229,15 @@ int __create_user(char* file, char* user_file, char* cry_file) { return EXIT_FAILURE; } } else { - strncpy(user_login, __YEFWHD_api_login, 31); - strncpy(password, __YEFWHD_api_password, 31); - user_login[31] = '\0'; - password[31] = '\0'; + if (__YEFWHD_users == false) { + strcpy(user_login, "admin"); + strcpy(password, "1234"); + } else { + strncpy(user_login, __YEFWHD_api_login, 31); + strncpy(password, __YEFWHD_api_password, 31); + user_login[31] = '\0'; + password[31] = '\0'; + } } fputs(user_login, wp); putc('\n', wp); fputs(password, wp); putc('\n', wp); @@ -232,6 +245,22 @@ int __create_user(char* file, char* user_file, char* cry_file) { unsigned long file_size = ftell(fw); rewind(fw); unsigned long count = 0; + + unsigned char crc = 0xFF; + while (count < file_size) { + crc ^= (unsigned char)getc(fw); + unsigned short int i = 0; + while (i < 8) { + crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1; + i ++; + } + count ++; + } + + putc((char)crc, wp); + fprintf(wp, "%lu\n", count); + rewind(fw); + count = 0; while (count < file_size) { c = (char)getc(fw); c = arr[(unsigned char)c]; @@ -263,21 +292,33 @@ int __read_user(char* file, char* user_file, char* cry_file) { char password[32]; char correct_password[32]; char* res; + unsigned char crc_file = 0xFF; res = fgets(correct_login, 32, up); res = fgets(correct_password, 32, up); - if (__YEFWHD_data_type != VIPRE_API_MODE) { + crc_file = (unsigned char)fgetc(up); + unsigned long read_sum = 0; + res = (char*)(unsigned long int)fscanf(up, "%lu\n", &read_sum); + if (__YEFWHD_data_type != VIPRE_API_MODE && __YEFWHD_users == true) { fputs("Login: ", stdout); res = fgets(user_login, 32, stdin); fputs("Password: ", stdout); res = fgets(password, 32, stdin); } else { - strncpy(user_login, __YEFWHD_api_login, 31); - strncpy(password, __YEFWHD_api_password, 31); - user_login[31] = '\0'; - password[31] = '\0'; - + if (__YEFWHD_users == false) { + strcpy(user_login, "admin"); + strcpy(password, "1234"); + } else { + strncpy(user_login, __YEFWHD_api_login, 31); + strncpy(password, __YEFWHD_api_password, 31); + user_login[31] = '\0'; + password[31] = '\0'; + } } - if (res); + if (res == NULL) { + puts("\033[1mvipre-cryptor: \033[91mThe file is in the wrong format!\033[0m"); + free(arr); + return EXIT_FAILURE; + }; __nl_del(user_login); __nl_del(password); __nl_del(correct_login); __nl_del(correct_password); if (user_login[strlen(user_login) - 1] == '\n') user_login[strlen(user_login) - 1] = '\0'; @@ -292,12 +333,26 @@ int __read_user(char* file, char* user_file, char* cry_file) { fseek(up, save_pos, SEEK_SET); unsigned long pos = 0; int c; + unsigned char crc = 0xFF; while (pos < data_size) { c = getc(up); c = __find_arr_index(c, arr, arr_len); __refresh_data(arr, arr_len, abs(arr[0])); putc(c, fw); pos ++; + crc ^= (unsigned char)c; + unsigned short int i = 0; + while (i < 8) { + crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1; + i ++; + } + + } + + if (crc != crc_file || read_sum != pos) { + puts("\033[1mvipre-cryptor: \033[91mVerification error! Request the data again.\033[0m"); + free(arr); + return EXIT_FAILURE; } fclose(fp); fclose(up); @@ -314,6 +369,7 @@ int parse_file_data(int argc, char** argv) { bool create_user = false; bool create_sig = false; bool read_user = false; + bool users = false; char* cry_file = NULL; bool read_cry_file = false; while (n < argc) { @@ -342,6 +398,9 @@ int parse_file_data(int argc, char** argv) { case 'f': read_cry_file = true; break; + case 't': + users = true; + break; default: printf("\033[1mvipre-cryptor: \033[91mUnknown option \"%s\"!\033[0m\n", str); return EXIT_FAILURE; @@ -355,6 +414,7 @@ int parse_file_data(int argc, char** argv) { } n ++; } + __YEFWHD_users = users; if (file == NULL) { puts("\033[1mvipre-cryptor: \033[91mNo input file!\033[0m"); return EXIT_FAILURE;