Subversion Repositories Kolibri OS

Rev

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