Subversion Repositories Kolibri OS

Rev

Rev 8707 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /* Copyright (C) 2019-2021 Logaev Maxim (turbocat2001), GPLv2 */
  2.  
  3. #include <sys/ksys.h>
  4. #include <stdio.h>
  5. #include <stdbool.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <cryptal/md5.h>
  9. #include <cryptal/sha1.h>
  10. #include <cryptal/sha256.h>
  11. #include <clayer/dialog.h>
  12. #include <clayer/boxlib.h>
  13.  
  14. #define TRUE 1;
  15. #define FALSE 0;
  16. #define MAX_HASH_LEN 65 // Œ ªá¨¬ «ì­ ï ¤«¨­  áâப¨
  17. #define WINDOW_W 665
  18. #define VERSION "%s - thashview 2.6.2"
  19. #define EDIT_TEXT_SIZE 0x10000000
  20. #define DATA(type, addr, offset) *((type*)((uint8_t*)addr+offset))
  21.  
  22. ksys_colors_table_t sys_color_table;
  23.  
  24. char hash_str_md5[MAX_HASH_LEN]=   "Click the 'MD5:' button to show the md5-checksum!"; //‚뢮¤ MD5
  25. char hash_str_sha1[MAX_HASH_LEN]=  "Click the 'SHA1:' button to show the sha1-checksum!"; //‚뢮¤ SHA1
  26. char hash_str_sha256[MAX_HASH_LEN]="Click the 'SHA256:' button to show the sha256-checksum!"; //‚뢮¤ SHA256
  27. char edit_box_buff[MAX_HASH_LEN]; // ãää¥à ¤«ï ¢¢®¤ 
  28. char *filename; // ˆ¬ï ®¡à ¡ â뢠¥¬®£® ä ©« 
  29. char *title; // ‡ £®«®¢®ª ®ª­ 
  30.  
  31. enum MYCOLORS // –¢¥â 
  32. {
  33.     GREEN = 0x067D06 | EDIT_TEXT_SIZE,
  34.     RED   = 0xFF0000 | EDIT_TEXT_SIZE,
  35.     BLACK = 0x000000 | EDIT_TEXT_SIZE,
  36.     WHITE = 0xFFFFFF,
  37.     GREY  = 0x919191
  38. };
  39.  
  40. edit_box hash_edit_box={WINDOW_W-140,10,121,WHITE,0,0,GREY,EDIT_TEXT_SIZE, MAX_HASH_LEN-1, edit_box_buff,NULL,ed_focus}; // ‘®§¤ ñ¬ áâàãªâãàã edit_box
  41. int md5_flag=0, sha1_flag=0, sha256_flag=0; // ”« £¨ ¯®ª §ë¢ î騥 ¡ë«  «¨ 㦥 à ááç¨â ­  ª®â஫쭠ï á㬬  ¢ ä㭪樨 check_sum()
  42.  
  43. enum BUTTONS // Š­®¯ª¨ ¢ ¨­âà¥ä¥©á¥
  44. {
  45.     BTN_QUIT=1,        //‚ë室
  46.     BTN_MD5 = 10,      // ááç¨â âì md5-ª®­â஫ì­ãî á㬬ã
  47.     BTN_SHA1 = 20,     // ááç¨â âì sha1-ª®­â஫ì­ãî á㬬ã
  48.     BTN_SHA256 = 30,   // ááç¨â âì sha256-ª®­â஫ì­ãî á㬬ã
  49.     BTN_COPY_MD5= 11,  //‘ª®¯¨à®¢ âì ¢ ¡ãää¥à ®¡¬¥­ 
  50.     BTN_COPY_SHA1= 21,
  51.     BTN_COPY_SHA256=31,
  52.     BTN_CMP=40,        //‘à ¢­¨âì edit_box ¨ ª®­â஫ì­ãî á㬬ã
  53.     BTN_PASTE=50       //‚áâ ¢¨âì ¢ edit_box(¯®ª  ¢ ࠧࠡ®âª¥)
  54. };
  55.  
  56. void notify_show(char *text)
  57. {
  58.    _ksys_exec("/sys/@notify", text);
  59. }
  60.  
  61. void* safe_malloc(size_t size) // ¥§®¯ á­ë© malloc. ®ª §ë¢ ¥â 㢥¤®¬«¥­¨¥ ®¡ ®è¨¡ª¥ ¨ § ªà뢠¥â ¯à®£à ¬¬ã ¥á«¨ ¯ ¬ïâì ­¥ ¡ë«  ¢ë¤¥«¥­ 
  62. {
  63.     void *p=malloc(size);
  64.     if(p==NULL){
  65.        notify_show("'Memory allocation error!' -E");
  66.        exit(0);
  67.     }else{
  68.         return p;
  69.     }
  70. }
  71.  
  72. void global_var_init(unsigned int size)  // ˆ­¨æ¨ «¨§¨àãîâáï £«®¡ «ì­ë¥ ¬ áᨢë
  73. {
  74.   filename=safe_malloc(size);
  75.   title=safe_malloc(size+20);
  76. }
  77.  
  78. /* ”㭪樨 £¥­¥à æ¨¨ ª®­â஫ì­ëå á㬬 */
  79. void md5_hash(FILE* input, BYTE* hash )
  80. {
  81.     int input_size;
  82.     BYTE *temp_buffer;
  83.     temp_buffer=safe_malloc(1024);
  84.     MD5_CTX ctx;
  85.     md5_init(&ctx);
  86.     while((input_size = fread(temp_buffer, 1, 1024, input)) > 0){
  87.                 md5_update(&ctx, temp_buffer, input_size);
  88.     }
  89.     md5_final(&ctx, hash);
  90.     free(temp_buffer);
  91. }
  92.  
  93. void sha1_hash(FILE* input, BYTE* hash )
  94. {
  95.     int input_size;
  96.     BYTE *buffer;
  97.     buffer=safe_malloc(1024);
  98.     SHA1_CTX ctx;
  99.     sha1_init(&ctx);
  100.     while((input_size = fread(buffer, 1, 1024, input)) > 0){
  101.                 sha1_update(&ctx, buffer, input_size);
  102.     }
  103.     sha1_final(&ctx, hash);
  104.     free(buffer);
  105. }
  106.  
  107. void sha256_hash(FILE* input, BYTE* hash )
  108. {
  109.     int input_size;
  110.     BYTE *buffer;
  111.     buffer=safe_malloc(1024);
  112.     SHA256_CTX ctx;
  113.     sha256_init(&ctx);
  114.     while((input_size = fread(buffer, 1, 1024, input)) > 0){
  115.                 sha256_update(&ctx, buffer, input_size);
  116.     }
  117.     sha256_final(&ctx, hash);
  118.     free(buffer);
  119. }
  120.  
  121.  
  122. BYTE* check_sum(int alg) // ƒ¥­¥à¨à㥬 ª®­â஫ì­ë¥ áã¬¬ë ¨á¯®«ì§ãï ®¤¨­ ¨§  «£®à¨â¬®¢
  123. {
  124.     FILE* input_file;
  125.     BYTE *hash;
  126.     input_file=fopen(filename,"rb");
  127.     hash = safe_malloc(alg);
  128.     switch (alg)
  129.     {
  130.         case MD5_BLOCK_SIZE :
  131.             md5_hash(input_file, hash);
  132.             md5_flag=1;
  133.         break;
  134.  
  135.         case SHA1_BLOCK_SIZE :
  136.             sha1_hash(input_file, hash);
  137.             sha1_flag=1;
  138.         break;
  139.  
  140.         case SHA256_BLOCK_SIZE :
  141.             sha256_hash(input_file, hash);
  142.             sha256_flag=1;
  143.         break;
  144.     }
  145.     fclose(input_file);
  146.     return hash;
  147. }
  148.  
  149. void sprint_hash(BYTE *hash, char* hash_str, int hash_size) //à¥®¡à ã¥¬ ¤¢®¨ç­ë¥ ¤ ­­ë¥ ¨§ hash ¢ áâபã hash_str
  150. {
  151.     char block[3];
  152.     memset(hash_str, 0, MAX_HASH_LEN); // Žç¨é ¥¬ áâப㠤«ï strcat
  153.     for(int i=0; i<hash_size; i++)
  154.     {
  155.         sprintf(block,"%02x", hash[i]);
  156.         strcat(hash_str,block);
  157.     }
  158.     free(hash);
  159. }
  160.  
  161. void redraw_window() //¨á㥬 ®ª­®
  162. {
  163.     sprintf(title,VERSION, filename); // “áâ ­ ¢«¨¢ ¥¬ § £®«®¢®ª ®ª­ 
  164.     ksys_pos_t win_pos = _ksys_get_mouse_pos(KSYS_MOUSE_SCREEN_POS); // ®«ãç ¥¬ ª®®à¤¨­ âë ªãàá®à 
  165.     _ksys_start_draw(); // ç¨­ ¥¬ à¨á®¢ ­¨¥ ¨­â¥àä¥©á  )
  166.     _ksys_create_window(win_pos.x, win_pos.y, WINDOW_W, 150, title, sys_color_table.work_area, 0x14); // ‘®§¤ ñ¬ ®ª­®.
  167.     edit_box_draw(&hash_edit_box); // ¨á㥬 edit_box
  168.  
  169.     _ksys_define_button(10, 30, 60, 20, BTN_MD5, GREEN); // Ž¯à¥¤¥«ï¥¬ ª­®¯ªã md5
  170.     _ksys_define_button(10, 60, 60, 20, BTN_SHA1, GREEN);// Ž¯à¥¤¥«ï¥¬ ª­®¯ªã sha1
  171.     _ksys_define_button(10, 90, 60, 20, BTN_SHA256, GREEN);// Ž¯à¥¤¥«ï¥¬ ª­®¯ªã sha256
  172.  
  173.     _ksys_draw_text("MD5:", 15, 34, 0,   0x90000000 | sys_color_table.work_button_text); // ¨é¥¬ ⥪áâ ­  ª­®¯ª å
  174.     _ksys_draw_text("SHA1:", 15, 64, 0,  0x90000000 | sys_color_table.work_button_text);
  175.     _ksys_draw_text("SHA256:", 15,94, 0, 0x90000000 | sys_color_table.work_button_text);
  176.  
  177.     _ksys_draw_text(hash_str_md5, 80, 34, 0, 0x90000000 | sys_color_table.work_text); // ‚뢮¤¨¬ ª®­â஫ì­ë¥ áã¬¬ë ¢ ®ª­®
  178.     _ksys_draw_text(hash_str_sha1, 80, 64, 0, 0x90000000 | sys_color_table.work_text);
  179.     _ksys_draw_text(hash_str_sha256, 80, 94, 0, 0x90000000| sys_color_table.work_text);
  180.  
  181.    
  182.     _ksys_define_button(610, 30, 42, 20, BTN_COPY_MD5, sys_color_table.work_button); // Ž¯à¥¤¥«ï¥¬ ª­®¯ª¨ ¤«ï ª®¯¨à®¢ ­¨ï
  183.     _ksys_define_button(610, 60, 42, 20, BTN_COPY_SHA1, sys_color_table.work_button);
  184.     _ksys_define_button(610, 90, 42, 20, BTN_COPY_SHA256, sys_color_table.work_button);
  185.  
  186.     _ksys_draw_text("Copy", 615, 34, 0,   0x90000000 | sys_color_table.work_button_text); // ¨è¥¬ copy ­  ¢á¥å ª­®¯ª å ¤«ï ª®¯¨à®¢ ­¨ï
  187.     _ksys_draw_text("Copy", 615, 64, 0,  0x90000000 | sys_color_table.work_button_text);
  188.     _ksys_draw_text("Copy", 615, 94, 0, 0x90000000 | sys_color_table.work_button_text);
  189.  
  190.     _ksys_define_button(592, 120, 60, 20, BTN_CMP, GREEN); // Ž¯à¥¤¥«ï¥¬ ª­®¯ªã ¤«ï áà ¢­¥­¨ï ª®­â®«ì­ëå á㬬
  191.     _ksys_draw_text("Compare", 595, 124 , 0,0x90000000 | sys_color_table.work_button_text); // ¨è¥¬ â¥ªá ­  ª­®¯ª¥.
  192.     _ksys_define_button(540, 120, 45, 20, BTN_PASTE, sys_color_table.work_button); //Š­®¯ª  ¤«ï ¢áâ ¢ª¨ (­¥à ¡®â ¥â)
  193.     _ksys_draw_text("Paste", 543, 124 , 0,0x90000000 | sys_color_table.work_button_text); // ’¥ªáâ paste ­  ª­®¯ª¥
  194.     _ksys_end_draw();
  195. }
  196.  
  197. void paste_to_edit_buffer()    // ‚áâ ¢¨âì ¨§ ¡ãää¥à  ®¡¬¥­ 
  198. {
  199.     char *temp_buff=NULL;
  200.     if(_ksys_clip_num()>0){
  201.         temp_buff=_ksys_clip_get(_ksys_clip_num()-1);
  202.         memset(edit_box_buff,0,MAX_HASH_LEN);
  203.         if(DATA(int, temp_buff,0)>0 && DATA(int,temp_buff,4)==KSYS_CLIP_TEXT && DATA(int,temp_buff,8)==KSYS_CLIP_CP866){
  204.             strncpy(edit_box_buff,temp_buff+12, MAX_HASH_LEN-1);
  205.             edit_box_set_text(&hash_edit_box,edit_box_buff);
  206.             notify_show("'Pasted from clipboard!' -I");
  207.             hash_edit_box.text_color = BLACK;
  208.             free(temp_buff);
  209.         }
  210.     }
  211. }
  212.  
  213. void copy_to_clipboard(char *text) // Š®¯¨à®¢ âì ¢ ¡ãä¥à ®¡¬¥­ 
  214. {
  215.     int text_hash_len = strlen(text)/2;
  216.     if(text_hash_len==MD5_BLOCK_SIZE  ||
  217.        text_hash_len==SHA1_BLOCK_SIZE ||
  218.        text_hash_len==SHA256_BLOCK_SIZE) // …᫨ ⥪áâ ï¥âáï åíè-áâப®©
  219.     {
  220.         char *temp_buffer=safe_malloc(MAX_HASH_LEN+12); // ‚뤥«ï¥¬ ¯ ¬ïâì ¤«ï ¢à¥¬­­®£® ¡ãä¥à 
  221.         memset(temp_buffer, 0, MAX_HASH_LEN);   // ‡ ­ã«ï¥¬ ¡ãä¥à
  222.         DATA(char,temp_buffer,4)=KSYS_CLIP_TEXT;     // “áâ ­ ¢«¨¢ ¥¬ TEXT ¤«ï ¡ãä¥à (‘¬¥é¥­¨¥ 4 ¡ ©â )
  223.         DATA(char,temp_buffer,8)=KSYS_CLIP_CP866;    // “áâ ­ ¢«¨¢ ¥¬ ª®¤¨à®¢ªã CP866(‘¬¥é¥­¨¥ 8 ¡ ©â)
  224.         strncpy(temp_buffer+12, text, MAX_HASH_LEN-1); // Š®¯¨à㥬 ¤ ­­ë¥ ¨§ text ¢® ¢à¥¬¥­­ë© ¡ãä¥à(‘¬¥é¥­¨¥ 12 ¡ ©â)
  225.         _ksys_clip_set(strlen(text)+12, temp_buffer); // ‚믮«­ï¥¬ á¨á⥬­ë© ¢ë§®¢ ¨ ¯¥à¥¬¥é ¥¬ ¤ ­­ë¥ ¨§ ¢à¥¬¥­­®£® ¡ãä¥à  ¢ ¡ãä¥à ®¡¬¥­ 
  226.         notify_show("'Copied to clipboard!' -I");  
  227.         free(temp_buffer); // Žá¢®¡®¦ ¥¬ ¢à¥¬¥­­ë© ¡ãä¥à.
  228.     }
  229. }
  230.  
  231. void print_pending_calc(char *str) // ‚뢮¤¨¬ á®®¡é¥­¨¥ ® ⮬ çâ® ª®­â஫쭠ï á㬬¬  ¢ëç¨á«ï¥âáï.
  232. {
  233.   strcpy(str, "Please wait! Calculating checksum...");
  234.   redraw_window();
  235. }
  236.  
  237. bool calc_and_cmp(char *hash_str_universal,int alg) // ‚ëç¨á«ï¥¬ ª®­â஫ì­ãî á㬬㠨 áà ¢­¨¢ ¥¬ á edit_box_buff.
  238. {
  239.    print_pending_calc(hash_str_universal);
  240.    sprint_hash(check_sum(alg),hash_str_universal, alg);
  241.    return !strcmp(edit_box_buff, hash_str_universal);
  242. }
  243.  
  244. bool hash_compare() // ƒ« ¢­ ï äã­ªæ¨ï ¤«ï áà ¢­¥­¨ï
  245. {
  246.    int alg=strlen(edit_box_buff)/2;
  247.    switch (alg){ // …᫨ ¢ëç¨á«¥­¨ï ¥éñ ­¥¡ë«®
  248.         case MD5_BLOCK_SIZE:
  249.             if(md5_flag){
  250.                 return !strcmp(edit_box_buff,hash_str_md5);
  251.             }else{
  252.                 return calc_and_cmp(hash_str_md5,alg);
  253.             }
  254.             break;
  255.         case SHA1_BLOCK_SIZE:
  256.             if(sha1_flag){
  257.                 return !strcmp(edit_box_buff,hash_str_sha1);
  258.             }else{
  259.                 return calc_and_cmp(hash_str_sha1,alg);
  260.             }
  261.             break;
  262.         case SHA256_BLOCK_SIZE:
  263.             if(sha256_flag){
  264.                 return !strcmp(edit_box_buff,hash_str_sha256);
  265.             }else{
  266.                 return calc_and_cmp(hash_str_sha256,alg);
  267.             }
  268.             break;
  269.         default:
  270.             return FALSE;
  271.             break;
  272.     }
  273. }
  274.  
  275. int main(int argc, char** argv)
  276. {
  277.     kolibri_boxlib_init(); // ‡ £à㦠¥¬ boxlib
  278.     if(argc<2){ // …᫨  à£ã¬¥­â®¢ ­¥â, â® § ¯ã᪠¥¬ ¤¨ «®£ ¢ë¡®à  ä 
  279.         kolibri_dialog_init(); // § £à㦠¥¬ proc_lib(libdialog)
  280.         open_dialog* dialog = kolibri_new_open_dialog(OPEN,0, 0, 420, 320);
  281.         OpenDialog_init(dialog);
  282.         OpenDialog_start(dialog);
  283.         if(dialog->status==SUCCESS){ // …᫨ ä ©« ¢ë¡à ­
  284.             global_var_init(strlen(dialog->openfile_path));
  285.             strcpy(filename, dialog->openfile_path);  
  286.         }else{ // …᫨ ä ©« ­¥ ¢ë¡à ­
  287.             notify_show("'No file selected!' -E");
  288.             exit(0);
  289.         }
  290.         free(dialog);
  291.     }else{
  292.         global_var_init(strlen(argv[1]));
  293.         strcpy(filename, argv[1]);
  294.     }
  295.  
  296.     if(NULL==fopen(filename,"rb")){ // …᫨ ä ©«  ­¥â ¨«¨ ­¥ ®âªà뢠¥âáï
  297.         notify_show("'File not found!' -E");
  298.         exit(0);
  299.     }
  300.     if(_ksys_screen_size().x<WINDOW_W){
  301.         notify_show("'Low screen resolution! Program will not display correctrly!' -W");
  302.     }
  303.  
  304.     int gui_event; // ¥à¥¬¥­­ ï ¤«ï åà ­¥­¨ï ᮡëâ¨ï
  305.     uint32_t pressed_button = 0; // Š®¤ ­ ¦ â®© ª­®¯ª¨ ¢ ®ª­¥
  306.  
  307.     _ksys_get_system_colors(&sys_color_table);
  308.     hash_edit_box.shift_color=sys_color_table.work_button;
  309.  
  310.     _ksys_set_event_mask(0xC0000027);// “áâ ­ ¢«¨¢ ¥¬ ¬ áªã ᮡë⨩
  311.     do // –¨ª« ®¡à ¡®âª¨ ᮡë⨩
  312.     {
  313.         gui_event = _ksys_get_event(); // ®«ãç ¥¬ ᮡë⨥
  314.         switch(gui_event){ // Ž¡à ¡ â뢠¥¬ ᮡëâ¨ï
  315.             case KSYS_EVENT_NONE:
  316.                 break;
  317.             case KSYS_EVENT_REDRAW:
  318.                 redraw_window();
  319.                 break;
  320.             case KSYS_EVENT_MOUSE:
  321.                 edit_box_mouse(&hash_edit_box);
  322.                 break;        
  323.             case KSYS_EVENT_KEY:
  324.                 hash_edit_box.text_color = BLACK;
  325.                 edit_box_key(&hash_edit_box, _ksys_get_key().val);
  326.                 break;
  327.             case KSYS_EVENT_BUTTON: // ‘®¡ë⨥ ®¡à ¡®âª¨ ª­®¯®ª
  328.                 pressed_button = _ksys_get_button(); // ®«ã祭¨¥ ª®¤  ­ ¦ â®© ª­®¯ª¨.
  329.                 switch (pressed_button){ // à®¢¥àª  ª ª ï ª­®¯ª  ¡ë«  ­ ¦ â 
  330.                     case BTN_MD5:
  331.                         print_pending_calc(hash_str_md5);
  332.                         sprint_hash(check_sum(MD5_BLOCK_SIZE),hash_str_md5, MD5_BLOCK_SIZE);
  333.                         break;
  334.                     case BTN_SHA1:
  335.                         print_pending_calc(hash_str_sha1);
  336.                         sprint_hash(check_sum(SHA1_BLOCK_SIZE),hash_str_sha1, SHA1_BLOCK_SIZE);
  337.                         break;
  338.                     case BTN_SHA256:
  339.                         print_pending_calc(hash_str_sha256);
  340.                         sprint_hash(check_sum(SHA256_BLOCK_SIZE),hash_str_sha256, SHA256_BLOCK_SIZE);
  341.                         break;
  342.                     case BTN_COPY_MD5:
  343.                         copy_to_clipboard(hash_str_md5);
  344.                         break;
  345.                     case BTN_COPY_SHA1:
  346.                         copy_to_clipboard(hash_str_sha1);
  347.                         break;
  348.                     case BTN_COPY_SHA256:
  349.                         copy_to_clipboard(hash_str_sha256);
  350.                         break;
  351.                     case BTN_PASTE:
  352.                         paste_to_edit_buffer();
  353.                         break;
  354.                     case BTN_CMP:
  355.                         if(hash_compare()){
  356.                             notify_show("'The checksum matches :)' -OK");
  357.                             hash_edit_box.text_color = GREEN; // “áâ ­ ¢«¨¢ ¥¬ ⥪áâ ¢¢®¤  §¥«ñ­ë¬ ¥á«¨ ª®­â஫쭠ï á㬬  ᮢ¯ ¤ ¥â
  358.                         }else{
  359.                             notify_show("'The checksum does not match! :(' -W");
  360.                             hash_edit_box.text_color = RED; // “áâ ­ ¢«¨¢ ¥¬ ⥪áâ ¢¢®¤  ªà á­ë¬ ¥á«¨ ª®­â஫쭠ï áã¬¬ë ­¥ ᮢ¯ ¤ ¥â
  361.                         }
  362.                         break;
  363.                     case BTN_QUIT:
  364.                         exit(0);
  365.                         break;
  366.                 }
  367.                 redraw_window();
  368.                 break;
  369.         }
  370.     }while(1);
  371.     return 0;
  372. }
  373.