Subversion Repositories Kolibri OS

Rev

Rev 205 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
205 heavyiron 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'
485 heavyiron 15
include '..\..\..\..\macros.inc'
205 heavyiron 16
 
17
use32
18
 
19
                org     0x0
20
 
21
  db     'MENUET01'  ; 8-байтный идентификатор MenuetOS
22
  dd     0x01        ; версия заголовка (всегда 1)
23
  dd     START       ; адрес первой команды
24
  dd     I_END       ; размер программы
485 heavyiron 25
  dd     0x4000      ; количество памяти
26
  dd     0x4000      ; адрес вершины стэка
205 heavyiron 27
  dd     0x0         ; адрес буфера для параметров (не используется)
28
  dd     0x0         ; зарезервировано
29
 
30
START:                                  ; Начало выполнения программы
31
 
485 heavyiron 32
red:
205 heavyiron 33
        call draw_window            ; Сперва перерисуем окно
34
 
35
still:
36
 
485 heavyiron 37
    mov  eax,10                 ; Ожидаем событий
38
    mcall
205 heavyiron 39
 
40
    cmp  eax,1                  ; Запрос на перерисовку ?
41
    jz   red
42
    cmp  eax,2                  ; нажата клавиши ?
485 heavyiron 43
    jnz   button
205 heavyiron 44
 
45
key:
46
    mov  eax,2
485 heavyiron 47
    mcall
205 heavyiron 48
    jmp  still
49
 
50
button:
51
    mov  eax,17
485 heavyiron 52
    mcall
205 heavyiron 53
 
54
    cmp  ah,1                  ;  id кнопки = 1 ?
55
    jnz  noclose
485 heavyiron 56
    or  eax,-1
57
    mcall
205 heavyiron 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
485 heavyiron 338
    mcall
205 heavyiron 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]
485 heavyiron 343
    mov  edx,0x13ffffff            ; color of work area RRGGBB
344
    mov  edi,title                 ; WINDOW LABEL
345
    mcall
205 heavyiron 346
 
485 heavyiron 347
 
205 heavyiron 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
485 heavyiron 354
    mcall
205 heavyiron 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
485 heavyiron 362
    mcall
205 heavyiron 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
485 heavyiron 371
    mcall
205 heavyiron 372
 
373
    mov  eax,12                    ; function 12:tell os about windowdraw
374
    mov  ebx,2                     ; 2, end of draw
485 heavyiron 375
    mcall
205 heavyiron 376
 
377
    ret
378
 
379
;Область данных
380
 
485 heavyiron 381
title db 'MD5 Generator',0
205 heavyiron 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: