Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 halyavin 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: