Subversion Repositories Kolibri OS

Rev

Rev 205 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;    Пример реализации генератора MD5 - хеша
  2. ;
  3. ;    MD5 Generator
  4. ;    
  5. ;    Автор: Hex
  6. ;    Сайт: www.mestack.narod.ru
  7. ;    Идея, реализация и отладка.
  8. ;
  9. ;    Автор: Halyavin
  10. ;    Сайт: www.shade.msu.ru/~msu-se/home.html
  11. ;    Доработка, отладка и оптимизация.
  12. ;
  13. ;    Компилируеться Fasm'ом для МенуэтОС
  14. include 'lang.inc'
  15. include '..\..\..\..\macros.inc'
  16.  
  17. use32
  18.  
  19.                 org     0x0
  20.  
  21.   db     'MENUET01'  ; 8-байтный идентификатор MenuetOS
  22.   dd     0x01        ; версия заголовка (всегда 1)
  23.   dd     START       ; адрес первой команды
  24.   dd     I_END       ; размер программы
  25.   dd     0x4000      ; количество памяти
  26.   dd     0x4000      ; адрес вершины стэка
  27.   dd     0x0         ; адрес буфера для параметров (не используется)
  28.   dd     0x0         ; зарезервировано
  29.  
  30. START:                                  ; Начало выполнения программы
  31.  
  32. red:
  33.         call draw_window            ; Сперва перерисуем окно
  34.  
  35. still:
  36.  
  37.     mov  eax,10                 ; Ожидаем событий
  38.     mcall
  39.  
  40.     cmp  eax,1                  ; Запрос на перерисовку ?
  41.     jz   red
  42.     cmp  eax,2                  ; нажата клавиши ?
  43.     jnz   button
  44.  
  45. key:
  46.     mov  eax,2
  47.     mcall
  48.     jmp  still
  49.  
  50. button:
  51.     mov  eax,17
  52.     mcall
  53.  
  54.     cmp  ah,1                  ;  id кнопки = 1 ?
  55.     jnz  noclose
  56.     or  eax,-1
  57.     mcall
  58.  
  59.   noclose:
  60.  
  61.     cmp  ah,2                  ; Генерировать?
  62.     je   procMD5hash
  63.  
  64.     jmp  still
  65.  
  66.  
  67. procMD5hash:        
  68.  
  69.     ; phase I - padding
  70.     mov    edi,ptBuffer
  71.     mov    eax,[dtBufferLength]
  72.  
  73.     inc    eax
  74.     add    edi,eax
  75.     mov     byte [edi-1],0x80
  76.  
  77.     xor    edx,edx
  78.  
  79.     mov    ebx,64
  80.     div    ebx
  81.  
  82.     neg    edx
  83.     add    edx,64
  84.  
  85.     cmp    edx,8
  86.     jae    @f
  87.  
  88.     add    edx,64
  89.    
  90. @@:    mov    ecx,edx
  91.     xor    al,al
  92.     rep    stosb
  93.  
  94.     mov    eax,[dtBufferLength]
  95.  
  96.     inc    edx
  97.     add    [dtBufferLength],edx
  98.  
  99.     xor    edx,edx
  100.  
  101.     mov    ebx,8
  102.     mul    ebx
  103.  
  104.     mov    [edi-8],eax
  105.     mov    [edi-4],edx
  106.  
  107.     mov    edx,[dtBufferLength]
  108.  
  109.     mov    edi,ptBuffer
  110.  
  111.     ; phase II - chaining variables initialization
  112.     mov     dword [dtA],067452301h
  113.     mov     dword [dtB],0efcdab89h
  114.     mov     dword [dtC],098badcfeh
  115.     mov     dword [dtD],010325476h
  116.        
  117.     mov    esi,ptMD5Result
  118.  
  119. hashloop:
  120. ;diff16 "hashloop",hashloop
  121.     mov    eax,[dtA]
  122.     mov    [dta],eax
  123.     mov    eax,[dtB]
  124.     mov    [dtb],eax
  125.     mov    eax,[dtC]
  126.     mov    [dtc],eax
  127.     mov    eax,[dtD]
  128.     mov    [dtd],eax
  129.    
  130. macro ff dta,dtb,dtc,dtd,data,shift,cc
  131. {
  132.     mov     eax,dtb
  133.     mov     ebx,dtc
  134.     mov     ecx,dtd
  135.    
  136.     and     ebx,eax
  137.     not     eax
  138.     and     eax,ecx
  139.     or      eax,ebx
  140.    
  141.     add     eax,dta
  142.     add     eax,data
  143.     add     eax,cc
  144.     rol     eax,shift
  145.     add     eax,dtb
  146.     mov     dta,eax
  147. }
  148. macro gg dta,dtb,dtc,dtd,data,shift,cc
  149. {
  150.     mov     eax,dtb
  151.     mov     ebx,dtc
  152.     mov     ecx,dtd
  153.    
  154.     and     eax,ecx
  155.     not     ecx
  156.     and     ecx,ebx
  157.     or      eax,ecx
  158.    
  159.     add     eax,dta
  160.     add     eax,data
  161.     add     eax,cc
  162.     rol     eax,shift
  163.     add     eax,dtb
  164.     mov     dta,eax
  165. }
  166. macro hh dta,dtb,dtc,dtd,data,shift,cc
  167. {
  168.     mov     eax,dtb
  169.     mov     ebx,dtc
  170.     mov     ecx,dtd
  171.    
  172.     xor     eax,ebx
  173.     xor     eax,ecx
  174.    
  175.     add     eax,dta
  176.     add     eax,data
  177.     add     eax,cc
  178.     rol     eax,shift
  179.     add     eax,dtb
  180.     mov     dta,eax
  181. }
  182. macro ii dta,dtb,dtc,dtd,data,shift,cc
  183. {
  184.     mov     eax,dtb
  185.     mov     ebx,dtc
  186.     mov     ecx,dtd
  187.    
  188.     not     ecx
  189.     or      eax,ecx
  190.     xor     eax,ebx
  191.    
  192.     add     eax,dta
  193.     add     eax,data
  194.     add     eax,cc
  195.     rol     eax,shift
  196.     add     eax,dtb
  197.     mov     dta,eax
  198. }        
  199.     ; round 1
  200.     ff [dta],[dtb],[dtc],[dtd],dword [edi+00*4],07,0xd76aa478
  201.     ff [dtd],[dta],[dtb],[dtc],dword [edi+01*4],12,0xe8c7b756
  202.     ff [dtc],[dtd],[dta],[dtb],dword [edi+02*4],17,0x242070db
  203.     ff [dtb],[dtc],[dtd],[dta],dword [edi+03*4],22,0xc1bdceee
  204.     ff [dta],[dtb],[dtc],[dtd],dword [edi+04*4],07,0xf57c0faf
  205.     ff [dtd],[dta],[dtb],[dtc],dword [edi+05*4],12,0x4787c62a
  206.     ff [dtc],[dtd],[dta],[dtb],dword [edi+06*4],17,0xa8304613
  207.     ff [dtb],[dtc],[dtd],[dta],dword [edi+07*4],22,0xfd469501
  208.     ff [dta],[dtb],[dtc],[dtd],dword [edi+08*4],07,0x698098d8
  209.     ff [dtd],[dta],[dtb],[dtc],dword [edi+09*4],12,0x8b44f7af
  210.     ff [dtc],[dtd],[dta],[dtb],dword [edi+10*4],17,0xffff5bb1
  211.     ff [dtb],[dtc],[dtd],[dta],dword [edi+11*4],22,0x895cd7be
  212.     ff [dta],[dtb],[dtc],[dtd],dword [edi+12*4],07,0x6b901122
  213.     ff [dtd],[dta],[dtb],[dtc],dword [edi+13*4],12,0xfd987193
  214.     ff [dtc],[dtd],[dta],[dtb],dword [edi+14*4],17,0xa679438e
  215.     ff [dtb],[dtc],[dtd],[dta],dword [edi+15*4],22,0x49b40821
  216.     ; round 2
  217.     gg [dta],[dtb],[dtc],[dtd],dword [edi+01*4],05,0xf61e2562
  218.     gg [dtd],[dta],[dtb],[dtc],dword [edi+06*4],09,0xc040b340
  219.     gg [dtc],[dtd],[dta],[dtb],dword [edi+11*4],14,0x265e5a51
  220.     gg [dtb],[dtc],[dtd],[dta],dword [edi+00*4],20,0xe9b6c7aa
  221.     gg [dta],[dtb],[dtc],[dtd],dword [edi+05*4],05,0xd62f105d
  222.     gg [dtd],[dta],[dtb],[dtc],dword [edi+10*4],09,0x02441453
  223.     gg [dtc],[dtd],[dta],[dtb],dword [edi+15*4],14,0xd8a1e681
  224.     gg [dtb],[dtc],[dtd],[dta],dword [edi+04*4],20,0xe7d3fbc8
  225.     gg [dta],[dtb],[dtc],[dtd],dword [edi+09*4],05,0x21e1cde6
  226.     gg [dtd],[dta],[dtb],[dtc],dword [edi+14*4],09,0xc33707d6
  227.     gg [dtc],[dtd],[dta],[dtb],dword [edi+03*4],14,0xf4d50d87
  228.     gg [dtb],[dtc],[dtd],[dta],dword [edi+08*4],20,0x455a14ed
  229.     gg [dta],[dtb],[dtc],[dtd],dword [edi+13*4],05,0xa9e3e905
  230.     gg [dtd],[dta],[dtb],[dtc],dword [edi+02*4],09,0xfcefa3f8
  231.     gg [dtc],[dtd],[dta],[dtb],dword [edi+07*4],14,0x676f02d9
  232.     gg [dtb],[dtc],[dtd],[dta],dword [edi+12*4],20,0x8d2a4c8a
  233.     ; round 3
  234.     hh [dta],[dtb],[dtc],[dtd],dword [edi+05*4],04,0xfffa3942
  235.     hh [dtd],[dta],[dtb],[dtc],dword [edi+08*4],11,0x8771f681
  236.     hh [dtc],[dtd],[dta],[dtb],dword [edi+11*4],16,0x6d9d6122
  237.     hh [dtb],[dtc],[dtd],[dta],dword [edi+14*4],23,0xfde5380c
  238.     hh [dta],[dtb],[dtc],[dtd],dword [edi+01*4],04,0xa4beea44
  239.     hh [dtd],[dta],[dtb],[dtc],dword [edi+04*4],11,0x4bdecfa9
  240.     hh [dtc],[dtd],[dta],[dtb],dword [edi+07*4],16,0xf6bb4b60
  241.     hh [dtb],[dtc],[dtd],[dta],dword [edi+10*4],23,0xbebfbc70
  242.     hh [dta],[dtb],[dtc],[dtd],dword [edi+13*4],04,0x289b7ec6
  243.     hh [dtd],[dta],[dtb],[dtc],dword [edi+00*4],11,0xeaa127fa
  244.     hh [dtc],[dtd],[dta],[dtb],dword [edi+03*4],16,0xd4ef3085
  245.     hh [dtb],[dtc],[dtd],[dta],dword [edi+06*4],23,0x04881d05
  246.     hh [dta],[dtb],[dtc],[dtd],dword [edi+09*4],04,0xd9d4d039
  247.     hh [dtd],[dta],[dtb],[dtc],dword [edi+12*4],11,0xe6db99e5
  248.     hh [dtc],[dtd],[dta],[dtb],dword [edi+15*4],16,0x1fa27cf8
  249.     hh [dtb],[dtc],[dtd],[dta],dword [edi+02*4],23,0xc4ac5665
  250.     ; round 4
  251.     ii [dta],[dtb],[dtc],[dtd],dword [edi+00*4],06,0xf4292244
  252.     ii [dtd],[dta],[dtb],[dtc],dword [edi+07*4],10,0x432aff97
  253.     ii [dtc],[dtd],[dta],[dtb],dword [edi+14*4],15,0xab9423a7
  254.     ii [dtb],[dtc],[dtd],[dta],dword [edi+05*4],21,0xfc93a039
  255.     ii [dta],[dtb],[dtc],[dtd],dword [edi+12*4],06,0x655b59c3
  256.     ii [dtd],[dta],[dtb],[dtc],dword [edi+03*4],10,0x8f0ccc92
  257.     ii [dtc],[dtd],[dta],[dtb],dword [edi+10*4],15,0xffeff47d
  258.     ii [dtb],[dtc],[dtd],[dta],dword [edi+01*4],21,0x85845dd1
  259.     ii [dta],[dtb],[dtc],[dtd],dword [edi+08*4],06,0x6fa87e4f
  260.     ii [dtd],[dta],[dtb],[dtc],dword [edi+15*4],10,0xfe2ce6e0
  261.     ii [dtc],[dtd],[dta],[dtb],dword [edi+06*4],15,0xa3014314
  262.     ii [dtb],[dtc],[dtd],[dta],dword [edi+13*4],21,0x4e0811a1
  263.     ii [dta],[dtb],[dtc],[dtd],dword [edi+04*4],06,0xf7537e82
  264.     ii [dtd],[dta],[dtb],[dtc],dword [edi+11*4],10,0xbd3af235
  265.     ii [dtc],[dtd],[dta],[dtb],dword [edi+02*4],15,0x2ad7d2bb
  266.     ii [dtb],[dtc],[dtd],[dta],dword [edi+09*4],21,0xeb86d391
  267.    
  268.     mov    eax,[dta]
  269.     add    [dtA],eax
  270.     mov    eax,[dtb]
  271.     add    [dtB],eax
  272.     mov    eax,[dtc]
  273.     add    [dtC],eax
  274.     mov    eax,[dtd]
  275.     add    [dtD],eax
  276.  
  277.     add    edi,64
  278.  
  279.     sub    edx,64
  280.     jnz    hashloop
  281.  
  282.     ; phase IV - results
  283.  
  284.     mov    ecx,4
  285.     mov     esi,ptMD5Result
  286.  
  287. @@:    mov    eax,[esi]
  288.     xchg    al,ah
  289.     rol    eax,16
  290.     xchg    al,ah
  291.     mov    [esi],eax
  292.  
  293.     add    esi,4
  294.     loop    @b
  295.  
  296. translate:
  297. ;diff16 "translate",translate
  298.     mov     esi,ptMD5Result-5
  299.     mov     edi,hexresult
  300.     mov     ecx,16
  301. @@:
  302.     test    ecx,3
  303.     jnz     .nojmp
  304.     add     esi,8
  305. .nojmp:
  306.     xor     eax,eax
  307.     mov     al,byte [esi]
  308.     mov     edx,eax
  309.     shr     eax,4
  310.     mov     bl,byte [table+eax]
  311.     mov     [edi],bl
  312.     inc     edi
  313.     and     edx,15
  314.     mov     bl,byte [table+edx]
  315.     mov     [edi],bl
  316.     dec     esi
  317.     inc     edi
  318.     loop    @b
  319.    
  320.     mov    esi,hexresult
  321.      
  322.         mov     [text], esi
  323.     mov     eax,32
  324.         mov     [textlen], eax
  325.     call    draw_window
  326.  
  327.     jmp     still
  328.  
  329. ;   *********************************************
  330. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  331. ;   *********************************************
  332.  
  333.  
  334. draw_window:
  335.  
  336.     mov eax,12               ; function 12:tell os about windowdraw
  337.     mov ebx,1                      ; 1, start of draw
  338.     mcall
  339.                                    ; DRAW WINDOW
  340.     mov  eax,0                     ; function 0 : define and draw window
  341.     mov  ebx,100*65536+230         ; [x start] *65536 + [x size]
  342.     mov  ecx,60*65536+100          ; [y start] *65536 + [y size]
  343.     mov  edx,0x13ffffff            ; color of work area RRGGBB
  344.     mov  edi,title                 ; WINDOW LABEL
  345.     mcall
  346.  
  347.                                    
  348.                    ; Рисуем кнопку для генерации
  349.     mov  eax,8                     ; function 8 : define and draw button
  350.     mov  ebx,20*65536+80           ; [x start] *65536 + [x size]
  351.     mov  ecx,34*65536+14           ; [y start] *65536 + [y size]
  352.     mov  edx,2                     ; button id
  353.     mov  esi,0x5588dd              ; button color RRGGBB
  354.     mcall
  355.    
  356.                                    ; Название на кнопку
  357.     mov  eax,4                     ; function 4 : write text to window
  358.     mov  ebx,23*65536+38           ; [x start] *65536 + [y start]
  359.     mov  ecx,0x000000              ; color of text RRGGBB
  360.     mov  edx,gen_txt               ; pointer to text beginning
  361.     mov  esi,gen_len-gen_txt       ; text length
  362.     mcall
  363.  
  364.     mov  ebx,20*65536+70
  365.     mov  ecx,0x000000
  366.     mov  edx,[text]
  367.     xor  eax,eax
  368.     mov  al, [textlen]
  369.     mov  esi,eax
  370.     mov  eax,4
  371.     mcall
  372.  
  373.     mov  eax,12                    ; function 12:tell os about windowdraw
  374.     mov  ebx,2                     ; 2, end of draw
  375.     mcall
  376.  
  377.     ret
  378.  
  379. ;Область данных
  380.  
  381. title db 'MD5 Generator',0
  382.  
  383. text:  dd 0
  384. textlen: dd 0
  385.  
  386. gen_txt: db 'Сгенерировать'
  387. gen_len:
  388.  
  389. InputMD5Rez:  dd 0
  390. InputMD5Rezlen:
  391.  
  392. ptBuffer:  db '123' ;Заменить на генерируемое слово
  393. rb 61
  394. dtBufferLength: dd 3 ;Размер ptBuffer
  395.  
  396. ptMD5Result:
  397.  
  398. dtA:  dd 0
  399. dtB:  dd 0
  400. dtC:  dd 0
  401. dtD:  dd 0
  402.  
  403. dta:  dd 0
  404. dtb:  dd 0
  405. dtc:  dd 0
  406. dtd:  dd 0
  407.  
  408. x: dd 0
  409. s: dd 0
  410. t: dd 0
  411.  
  412. table: db '0123456789abcdef'
  413. hexresult db 32
  414.  
  415. I_END:
  416.