Subversion Repositories Kolibri OS

Rev

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