Subversion Repositories Kolibri OS

Rev

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

  1. /*€¢â®à: ‹®£ ¥¢ Œ ªá¨¬(turbocat2001) */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <kos32sys1.h>
  5. #include <string.h>
  6. #include <stdarg.h>
  7. #include <cryptal/md5.h>
  8. #include <cryptal/sha1.h>
  9. #include <cryptal/sha256.h>
  10.  
  11. #define TRUE 1;
  12. #define FALSE 0;
  13. #define MAX_HASH_LEN 65 // Œ ªá¨¬ «ì­ ï ¤«¨­  áâப¨
  14. #define WINDOW_W 665
  15. #define VERSION "%s - thashview 2.4"
  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.  
  61. void notify_show(char *text)
  62. {
  63.    start_app("/sys/@notify", text);
  64. }
  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<hash_size; 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(); // ç¨­ ¥¬ à¨á®¢ ­¨¥ ¨­â¥àä¥©á  )
  174.     sys_create_window(win_pos.x, win_pos.y, WINDOW_W, 150, title, sys_color_table.work_area, 0x14); // ‘®§¤ ñ¬ ®ª­®.
  175.  
  176.     draw_bar(10, 121, 525,20, WHITE); // ‘®§¤ ñ¬ ¯àאַ㣮«ì­¨ª ¤«ï ¯®«ï ¢¢®¤ 
  177.     draw_text_sys(edit_box_buff,15, 125, 0, 0x90000000| edit_box_text_color); // ‚뢮¤¨¬ ⥪áâ ¨§ ¡ãää¥à  ¢¢®¤ 
  178.     draw_text_sys("|",10+(8*str_pos),125,0,0x90000000 | BLACK);
  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. {
  211.     char *temp_buff=NULL;
  212.     if(kol_clip_num()>0)
  213.     {
  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.         }
  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. {
  305.     edit_box_text_color=BLACK;
  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<MAX_HASH_LEN-1) // Ž£à ­¨ç¥­¨¥ ¤«¨­ë ¢¢®¤ 
  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<WINDOW_W)
  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. }
  431.