Subversion Repositories Kolibri OS

Rev

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