Subversion Repositories Kolibri OS

Rev

Rev 8073 | Rev 8373 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
8073 superturbo 1
/*Автор: Логаев Максим(turbocat2001) */
2
#include 
3
#include 
4
#include "kos32sys.h"
5
#include "notify.h"
6
#include 
7
#include 
8
#include "algorithms/md5.h"
9
#include "algorithms/sha1.h"
10
#include "algorithms/sha256.h"
11
 
12
#define TRUE 1;
13
#define FALSE 0;
14
#define MAX_HASH_LEN 65 // Максимальная длина строки
15
#define WINDOW_W 665
8250 superturbo 16
#define VERSION "%s - thashview 2.3"
8073 superturbo 17
 
18
typedef unsigned char bool;
19
struct kolibri_system_colors sys_color_table;
20
 
21
char hex[]={"abcdefABCDEF1234567890"}; //Для проверки вводимых символов
22
char hash_str_md5[MAX_HASH_LEN]=   "Click the 'MD5:' button to show the md5-checksum!      "; //Вывод MD5
23
char hash_str_sha1[MAX_HASH_LEN]=  "Click the 'SHA1:' button to show the sha1-checksum!    "; //Вывод SHA1
24
char hash_str_sha256[MAX_HASH_LEN]="Click the 'SHA256:' button to show the sha256-checksum!"; //Вывод SHA256
25
char edit_box_buff[MAX_HASH_LEN]; // Буффер для ввода
26
char *filename; // Имя обрабатываемого файла
27
char *title; // Заголовок окна
28
 
29
enum MYCOLORS // Цвета
30
{
31
    GREEN = 0x00067D06,
32
    RED   = 0x00FF0000,
33
    BLACK = 0x00000000,
34
    WHITE = 0xFFFFFFFF,
35
    GREY  = 0x00DDD7CF
36
};
37
 
38
 
39
unsigned int str_pos=0; // Позиция курсора при печати в строке ввода
40
int md5_flag=0, sha1_flag=0, sha256_flag=0; // Флаги показывающие была ли уже рассчитана котрольная сумма в функции check_sum()
41
int edit_box_text_color=BLACK; // Изначальный цвет текста в строке ввода
42
 
43
enum MYKEYS // Коды клавиш
44
{
45
    CTRL_V=22,
46
    BACKSPACE=8
47
};
48
 
49
enum BUTTONS // Кнопки в интрефейсе
50
{
51
    BTN_QUIT=1,        //Выход
52
    BTN_MD5 = 10,      //Рассчитать md5-контрольную сумму
53
    BTN_SHA1 = 20,     //Рассчитать sha1-контрольную сумму
54
    BTN_SHA256 = 30,   //Рассчитать sha256-контрольную сумму
55
    BTN_COPY_MD5= 11,  //Скопировать в буффер обмена
56
    BTN_COPY_SHA1= 21,
57
    BTN_COPY_SHA256=31,
58
    BTN_CMP=40,        //Сравнить edit_box и контрольную сумму
59
    BTN_PASTE=50       //Вставить в edit_box(пока в разработке)
60
};
61
 
62
 
63
 
64
void* safe_malloc(size_t size) // Безопасный malloc. Показывает уведомление об ошибке и закрывает программу если память не была выделена
65
{
66
    void *p=malloc(size);
67
    if(p==NULL)
68
    {
69
       notify_show("'Memory allocation error!' -E");
70
       exit(0);
71
    }
72
    else
73
    {
74
        return p;
75
    }
76
}
77
 
78
void global_var_init(unsigned int size)  // Инициализируются глобальные массивы
79
{
80
  filename=safe_malloc(size);
81
  title=safe_malloc(size+20);
82
}
83
 
84
/* Функции генерации контрольных сумм */
85
void md5_hash(FILE* input, BYTE* hash )
86
{
87
    int input_size;
88
    BYTE *temp_buffer;
89
    temp_buffer=safe_malloc(1024);
90
    MD5_CTX ctx;
91
    md5_init(&ctx);
92
    while((input_size = fread(temp_buffer, 1, 1024, input)) > 0){
93
                md5_update(&ctx, temp_buffer, input_size);
94
    }
95
    md5_final(&ctx, hash);
96
    free(temp_buffer);
97
}
98
 
99
void sha1_hash(FILE* input, BYTE* hash )
100
{
101
    int input_size;
102
    BYTE *buffer;
103
    buffer=safe_malloc(1024);
104
    SHA1_CTX ctx;
105
    sha1_init(&ctx);
106
    while((input_size = fread(buffer, 1, 1024, input)) > 0){
107
                sha1_update(&ctx, buffer, input_size);
108
    }
109
    sha1_final(&ctx, hash);
110
    free(buffer);
111
}
112
 
113
void sha256_hash(FILE* input, BYTE* hash )
114
{
115
    int input_size;
116
    BYTE *buffer;
117
    buffer=safe_malloc(1024);
118
    SHA256_CTX ctx;
119
    sha256_init(&ctx);
120
    while((input_size = fread(buffer, 1, 1024, input)) > 0){
121
                sha256_update(&ctx, buffer, input_size);
122
    }
123
    sha256_final(&ctx, hash);
124
    free(buffer);
125
}
126
 
127
 
128
BYTE* check_sum(int alg) // Генерируем контрольные суммы используя один из алгоритмов
129
{
130
    FILE* input_file;
131
    BYTE *hash;
132
    input_file=fopen(filename,"rb");
133
    hash = safe_malloc(alg);
134
    switch (alg)
135
    {
136
        case MD5_BLOCK_SIZE :
137
            md5_hash(input_file, hash);
138
            md5_flag=1;
139
        break;
140
 
141
        case SHA1_BLOCK_SIZE :
142
            sha1_hash(input_file, hash);
143
            sha1_flag=1;
144
        break;
145
 
146
        case SHA256_BLOCK_SIZE :
147
            sha256_hash(input_file, hash);
148
            sha256_flag=1;
149
        break;
150
    }
151
    fclose(input_file);
152
    return hash;
153
}
154
 
155
void sprint_hash(BYTE *hash, char* hash_str, int hash_size) //Преобрауем двоичные данные из hash в строку hash_str
156
{
157
    char block[3];
158
    memset(hash_str, 0, MAX_HASH_LEN); // Очищаем строку для strcat
159
    for(int i=0; i
160
    {
161
        sprintf(block,"%02x", hash[i]);
162
        strcat(hash_str,block);
163
    }
164
    free(hash);
165
}
166
 
167
void redraw_window() //Рисуем окно
168
{
169
    pos_t win_pos = get_mouse_pos(0); //Получаем позицию курсора мыши.
170
    sprintf(title,VERSION, filename); // Устанавливаем заголовок окна
171
    begin_draw(); //Начинаем рисование интерфейса )
8250 superturbo 172
    sys_create_window(win_pos.x, win_pos.y, WINDOW_W, 150, title, sys_color_table.work_area, 0x14); // Создаём окно.
8073 superturbo 173
 
174
    draw_bar(10, 121, 525,20, WHITE); // Создаём прямоугольник для поля ввода
175
    draw_text_sys(edit_box_buff,15, 125, 0, 0x90000000| edit_box_text_color); // Выводим текст из буффера ввода
176
    draw_text_sys("|",10+(8*str_pos),125,0,0x90000000 | sys_color_table.work_text);
177
 
178
    define_button((10 << 16) + 60, (30 << 16) + 20, BTN_MD5, GREEN); // Определяем кнопку md5
179
    define_button((10 << 16) + 60, (60 << 16) + 20, BTN_SHA1, GREEN);// Определяем кнопку sha1
180
    define_button((10 << 16) + 60, (90 << 16) + 20, BTN_SHA256, GREEN);// Определяем кнопку sha256
181
 
182
    draw_text_sys("MD5:", 15, 34, 0,   0x90000000 | sys_color_table.work_button_text); // Пищем текст на кнопках
183
    draw_text_sys("SHA1:", 15, 64, 0,  0x90000000 | sys_color_table.work_button_text);
184
    draw_text_sys("SHA256:", 15,94, 0, 0x90000000 | sys_color_table.work_button_text);
185
 
186
    draw_text_sys(hash_str_md5, 80, 34, 0, 0x90000000 | sys_color_table.work_text); // Выводим контрольные суммы в окно
187
    draw_text_sys(hash_str_sha1, 80, 64, 0, 0x90000000 | sys_color_table.work_text);
188
    draw_text_sys(hash_str_sha256, 80, 94, 0, 0x90000000| sys_color_table.work_text);
189
 
190
    define_button((610 << 16) + 42, (30 << 16) + 20, BTN_COPY_MD5, sys_color_table.work_button); // Определяем кнопки для копирования
191
    define_button((610<< 16) + 42, (60 << 16) + 20, BTN_COPY_SHA1, sys_color_table.work_button);
192
    define_button((610<< 16) + 42, (90 << 16) + 20, BTN_COPY_SHA256, sys_color_table.work_button);
193
 
194
    draw_text_sys("Copy", 615, 34, 0,   0x90000000 | sys_color_table.work_button_text); // Пишем copy на всех кнопках для копирования
195
    draw_text_sys("Copy", 615, 64, 0,  0x90000000 | sys_color_table.work_button_text);
196
    draw_text_sys("Copy", 615, 94, 0, 0x90000000 | sys_color_table.work_button_text);
197
 
198
    define_button((592<< 16) + 60, (120 << 16) + 20, BTN_CMP, GREEN); // Определяем кнопку для сравнения контольных сумм
199
    draw_text_sys("Compare", 595, 124 , 0,0x90000000 | sys_color_table.work_button_text); // Пишем текс на кнопке.
200
 
201
    define_button((540 << 16) + 45, (120 << 16) + 20, BTN_PASTE, sys_color_table.work_button); //Кнопка для вставки (неработает)
202
    draw_text_sys("Paste", 543, 124 , 0,0x90000000 | sys_color_table.work_button_text); // Текст paste на кнопке
203
    end_draw();
204
}
205
 
206
 
207
void paste_to_edit_buffer()    // Вставить из буффера обмена
208
{
8250 superturbo 209
    char *temp_buff=NULL;
210
    if(kol_clip_num()>0)
8073 superturbo 211
    {
8250 superturbo 212
        temp_buff=kol_clip_get(kol_clip_num()-1);
213
        memset(edit_box_buff,0,MAX_HASH_LEN);
214
        if(((int)*(temp_buff)>0) && ((int)*(temp_buff+4)==0) && ((int)*(temp_buff+8)==1))
215
        {
216
            strncpy(edit_box_buff,temp_buff+12, MAX_HASH_LEN-1);
217
            str_pos=strlen(edit_box_buff);
218
            notify_show("'Pasted from clipboard!' -I");
219
            edit_box_text_color=BLACK;
220
            user_free(temp_buff);
221
 
222
        }
8073 superturbo 223
    }
224
}
225
 
226
 
227
void copy_to_clipboard(char *text) // Копирлвать в буффер обмена
228
{
229
    if(55!=strlen(text))
230
    {
231
        char *temp_buffer=safe_malloc(MAX_HASH_LEN+12);
232
        memset(temp_buffer, 0, MAX_HASH_LEN);
233
        *(temp_buffer+4)=0;
234
        *(temp_buffer+8)=1;
235
        strncpy(temp_buffer+12, text, MAX_HASH_LEN-1);
236
        kol_clip_set(strlen(text)+12, temp_buffer);
237
        notify_show("'Copied to clipboard!' -I");
238
        free(temp_buffer);
239
    }
240
}
241
 
242
void print_pending_calc(char *str) // Выводим сообщение о том что контрольная суммма вычисляется.
243
{
244
  strcpy(str, "Please wait! Calculating checksum...                   ");
245
  redraw_window();
246
}
247
 
248
bool calc_and_cmp(char *hash_str_universal,int alg) // Вычисляем контрольную сумму и сравниваем с edit_box_buff.
249
{
250
   print_pending_calc(hash_str_universal);
251
   sprint_hash(check_sum(alg),hash_str_universal, alg);
252
   return !strcmp(edit_box_buff, hash_str_universal);
253
}
254
 
255
bool hash_compare() // Главная функция для сравнения
256
{
257
   int alg=strlen(edit_box_buff)/2;
258
 
259
        switch (alg) // Если вычисления ещё небыло
260
        {
261
        case MD5_BLOCK_SIZE:
262
            if(md5_flag)
263
            {
264
                return !strcmp(edit_box_buff,hash_str_md5);
265
            }
266
            else
267
            {
268
                return calc_and_cmp(hash_str_md5,alg);
269
            }
270
        break;
271
 
272
        case SHA1_BLOCK_SIZE:
273
            if(sha1_flag)
274
            {
275
                return !strcmp(edit_box_buff,hash_str_sha1);
276
            }
277
            else
278
            {
279
                return calc_and_cmp(hash_str_sha1,alg);
280
            }
281
        break;
282
 
283
        case SHA256_BLOCK_SIZE:
284
 
285
            if(sha256_flag)
286
            {
287
                return !strcmp(edit_box_buff,hash_str_sha256);
288
            }
289
            else
290
            {
291
                return calc_and_cmp(hash_str_sha256,alg);
292
            }
293
        break;
294
 
295
        default:
296
            return FALSE;
297
        break;
298
        }
299
}
300
 
301
void edit_box(oskey_t key)      //Функция реализующая строку ввода
302
{
8250 superturbo 303
    edit_box_text_color=sys_color_table.frame_area;
8073 superturbo 304
    if(key.code==CTRL_V) // Если нажато Ctrl+V то вставить из буфера обмена
305
    {
306
        paste_to_edit_buffer();
307
    }
308
    if(key.code==BACKSPACE && str_pos>0) // Если backspace то удалить последний символ
309
    {
310
        str_pos--;
311
        edit_box_buff[str_pos]='\0';
312
 
313
    }
314
    else if(str_pos
315
    {
316
        if(strchr(hex,key.code)!=NULL)
317
        {
318
           edit_box_buff[str_pos]=key.code;
319
           str_pos++;
320
        }
321
    }
322
}
323
 
324
int main(int argc, char** argv)
325
{
326
    // получаем имя файла
327
    if(argc<2) // Если аргументов нет то сообщаем об этом
328
    {
329
        notify_show("'No file selected!' -E");
330
        exit(0);
331
    }
332
 
333
    global_var_init(strlen(argv[1]));
334
    strcpy(filename, argv[1]);
335
 
336
    if(NULL==fopen(filename,"rb")) // Если файла нет или не открывается
337
    {
338
        notify_show("'File not found!' -E");
339
        exit(0);
340
    }
341
 
342
    if(GetScreenSize()/65536
343
    {
344
        notify_show("'Low screen resolution! Program will not display correctrly!' -W");
345
    }
346
 
347
    int gui_event; // Перемная для хранения события
348
    uint32_t pressed_button = 0; // Код нажатой кнопки в окне
349
 
350
    get_system_colors(&sys_color_table);
351
    set_event_mask(0xC0000027); // Устанавливаем маску событий
352
    do // Цикл обработки событий
353
    {
354
        gui_event = get_os_event(); // Получаем событие
355
        switch(gui_event) // Обрабатываем события
356
        {
357
        case KOLIBRI_EVENT_NONE:
358
            break;
359
        case KOLIBRI_EVENT_REDRAW:
360
            redraw_window();
361
            break;
362
        case KOLIBRI_EVENT_KEY:
363
            edit_box(get_key()); // Получаем нажатую клавишу и задействуем строку ввода
364
            redraw_window();
365
            break;
366
        case KOLIBRI_EVENT_BUTTON: // Событие обработки кнопок
367
            pressed_button = get_os_button(); // Получение кода нажатой кнопки.
368
            switch (pressed_button) // Проверка какая кнопка была нажата
369
            {
370
                case BTN_MD5:
371
                    print_pending_calc(hash_str_md5);
372
                    sprint_hash(check_sum(MD5_BLOCK_SIZE),hash_str_md5, MD5_BLOCK_SIZE);
373
                    redraw_window();
374
                break;
375
 
376
                case BTN_SHA1:
377
                    print_pending_calc(hash_str_sha1);
378
                    sprint_hash(check_sum(SHA1_BLOCK_SIZE),hash_str_sha1, SHA1_BLOCK_SIZE);
379
                    redraw_window();
380
                break;
381
 
382
                case BTN_SHA256:
383
                    print_pending_calc(hash_str_sha256);
384
                    sprint_hash(check_sum(SHA256_BLOCK_SIZE),hash_str_sha256, SHA256_BLOCK_SIZE);
385
                    redraw_window();
386
                break;
387
 
388
                case BTN_COPY_MD5:
389
                    redraw_window();
390
                    copy_to_clipboard(hash_str_md5);
391
                break;
392
 
393
                case BTN_COPY_SHA1:
394
                    redraw_window();
395
                    copy_to_clipboard(hash_str_sha1);
396
                break;
397
 
398
                case BTN_COPY_SHA256:
399
                    redraw_window();
400
                    copy_to_clipboard(hash_str_sha256);
401
                break;
402
 
403
                case BTN_PASTE:
404
                    paste_to_edit_buffer();
405
                    redraw_window();
406
                break;
407
 
408
                case BTN_CMP:
409
                if(hash_compare())
410
                {
411
                    notify_show("'The checksum matches :)' -OK");
412
                    edit_box_text_color=GREEN; // Устанавливаем текст ввода зелёным если контрольная сумма совпадает
413
                }
414
                else
415
                {
416
                    notify_show("'The checksum does not match! :(' -W");
417
                    edit_box_text_color=RED; // Устанавливаем текст ввода красным если контрольная суммы не совпадает
418
                }
419
                redraw_window();
420
                break;
421
 
422
                case BTN_QUIT:
423
                    exit(0);
424
                break;
425
            }
426
        }
427
    }while(1);
428
}