Subversion Repositories Kolibri OS

Rev

Rev 485 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 485 Rev 532
1
;testing speed of RSA coding (256 bit)
1
;testing speed of RSA coding (256 bit)
2
;for program CPUID (WildWest)
2
;for program CPUID (WildWest)
3
;author: halyavin
3
;author: halyavin
4
 
4
 
5
;structure of long number:
5
;structure of long number:
6
;rd 1 : length of number
6
;rd 1 : length of number
7
;rd 39: digits of number
7
;rd 39: digits of number
8
;length of zero number is equal to 1.
8
;length of zero number is equal to 1.
9
 
9
 
10
number_digits=39
10
number_digits=39
11
number_size=4*(number_digits+1)
11
number_size=4*(number_digits+1)
12
 
12
 
13
;calling convention:
13
;calling convention:
14
;procedures can change eax,ecx,edx
14
;procedures can change eax,ecx,edx
15
 
15
 
16
init_rsatest:
16
init_rsatest:
17
;to do: add initialization which depends on processor.
17
;to do: add initialization which depends on processor.
18
  ret
18
  ret
19
 
19
 
20
 
20
 
21
set_zero:
21
set_zero:
22
;eax - address of number
22
;eax - address of number
23
;[eax]:=0
23
;[eax]:=0
24
;result: eax isn't changed
24
;result: eax isn't changed
25
  xor  ecx,ecx
25
  xor  ecx,ecx
26
  xor  edx,edx
26
  xor  edx,edx
27
  inc  edx
27
  inc  edx
28
  mov  dword [eax],edx
28
  mov  dword [eax],edx
29
  mov  edx,39
29
  mov  edx,39
30
  add  eax,4
30
  add  eax,4
31
.loop:
31
.loop:
32
  mov  dword [eax],ecx
32
  mov  dword [eax],ecx
33
  add  eax,4
33
  add  eax,4
34
  dec  edx
34
  dec  edx
35
  jnz  .loop
35
  jnz  .loop
36
  sub  eax,160 ;size of number
36
  sub  eax,160 ;size of number
37
  ret
37
  ret
38
 
38
 
39
ladd:
39
ladd:
40
;eax - first number
40
;eax - first number
41
;edx - second number
41
;edx - second number
42
;[eax]:=[eax]+[edx]
42
;[eax]:=[eax]+[edx]
43
  pushad
43
  pushad
44
  mov  ecx,dword [eax]
44
  mov  ecx,dword [eax]
45
  mov  esi,dword [edx]
45
  mov  esi,dword [edx]
46
  mov  ebp,eax
46
  mov  ebp,eax
47
  cmp  ecx,esi
47
  cmp  ecx,esi
48
  jg   .l1
48
  jg   .l1
49
  mov  ecx,esi
49
  mov  ecx,esi
50
.l1:
50
.l1:
51
  add  eax,4
51
  add  eax,4
52
  add  edx,4
52
  add  edx,4
53
  xor  ebx,ebx
53
  xor  ebx,ebx
54
  xor  esi,esi
54
  xor  esi,esi
55
  mov  edi,ecx
55
  mov  edi,ecx
56
.l2:
56
.l2:
57
  add  ebx,dword [eax]
57
  add  ebx,dword [eax]
58
  adc  ebx,dword [edx]
58
  adc  ebx,dword [edx]
59
  adc  esi,esi
59
  adc  esi,esi
60
  mov  dword [eax],ebx
60
  mov  dword [eax],ebx
61
  mov  ebx,esi
61
  mov  ebx,esi
62
  add  eax,4
62
  add  eax,4
63
  xor  esi,esi
63
  xor  esi,esi
64
  add  edx,4
64
  add  edx,4
65
  dec  ecx
65
  dec  ecx
66
  jnz  .l2
66
  jnz  .l2
67
  test ebx,ebx
67
  test ebx,ebx
68
  jz   .lend
68
  jz   .lend
69
  inc  dword  [eax]
69
  inc  dword  [eax]
70
  inc  edi
70
  inc  edi
71
.lend:
71
.lend:
72
  mov  eax,ebp
72
  mov  eax,ebp
73
  mov  dword [eax],edi
73
  mov  dword [eax],edi
74
  popad
74
  popad
75
  ret
75
  ret
76
 
76
 
77
lsub:
77
lsub:
78
;eax - first number
78
;eax - first number
79
;edx - second number
79
;edx - second number
80
;[eax]=[eax]-[edx]
80
;[eax]=[eax]-[edx]
81
;[eax]>=[edx]
81
;[eax]>=[edx]
82
  pushad
82
  pushad
83
  mov  ecx,dword [eax]
83
  mov  ecx,dword [eax]
84
  mov  edi,ecx
84
  mov  edi,ecx
85
  mov  ebp,eax
85
  mov  ebp,eax
86
  add  eax,4
86
  add  eax,4
87
  add  edx,4
87
  add  edx,4
88
  xor  ebx,ebx
88
  xor  ebx,ebx
89
  xor  esi,esi
89
  xor  esi,esi
90
.l1:
90
.l1:
91
  mov  esi,dword [eax]
91
  mov  esi,dword [eax]
92
  sub  esi,ebx
92
  sub  esi,ebx
93
  sbb  esi,dword [edx]
93
  sbb  esi,dword [edx]
94
  mov  dword [eax],esi
94
  mov  dword [eax],esi
95
  sbb  esi,esi
95
  sbb  esi,esi
96
  mov  ebx,esi
96
  mov  ebx,esi
97
  neg  ebx
97
  neg  ebx
98
  add  eax,4
98
  add  eax,4
99
  add  edx,4
99
  add  edx,4
100
  dec  ecx
100
  dec  ecx
101
  jnz  .l1
101
  jnz  .l1
102
  dec  edi
102
  dec  edi
103
  jz   .lend
103
  jz   .lend
104
  sub  eax,4
104
  sub  eax,4
105
.l2:
105
.l2:
106
  mov  ebx,dword [eax]
106
  mov  ebx,dword [eax]
107
  test ebx,ebx
107
  test ebx,ebx
108
  jnz  .lend
108
  jnz  .lend
109
  sub  eax,4
109
  sub  eax,4
110
  dec  edi
110
  dec  edi
111
  jnz  .l2
111
  jnz  .l2
112
.lend:
112
.lend:
113
  inc  edi
113
  inc  edi
114
  mov  eax,ebp
114
  mov  eax,ebp
115
  mov  [eax],edi
115
  mov  [eax],edi
116
  popad
116
  popad
117
  ret
117
  ret
118
 
118
 
119
lcmp:
119
lcmp:
120
;eax - address of number
120
;eax - address of number
121
;edx - address of number
121
;edx - address of number
122
;result: ecx=1 if eax>edx
122
;result: ecx=1 if eax>edx
123
;        ecx=0 if eax=edx
123
;        ecx=0 if eax=edx
124
;        ecx=-1 if eax
124
;        ecx=-1 if eax
125
  push	ebx
125
  push	ebx
126
  mov	ebx,dword [eax]
126
  mov	ebx,dword [eax]
127
  cmp	ebx,dword [edx]
127
  cmp	ebx,dword [edx]
128
  jg	.l1
128
  jg	.l1
129
  jl	.l2
129
  jl	.l2
130
  push	esi
130
  push	esi
131
  push	eax
131
  push	eax
132
  push	edx
132
  push	edx
133
  lea	eax,[eax+4*ebx]
133
  lea	eax,[eax+4*ebx]
134
  lea	edx,[edx+4*ebx]
134
  lea	edx,[edx+4*ebx]
135
.l3:
135
.l3:
136
  mov	esi,dword [eax]
136
  mov	esi,dword [eax]
137
  cmp	esi,dword [edx]
137
  cmp	esi,dword [edx]
138
  ja	.l4
138
  ja	.l4
139
  jb	.l5
139
  jb	.l5
140
  sub	eax,4
140
  sub	eax,4
141
  sub	edx,4
141
  sub	edx,4
142
  dec	ebx
142
  dec	ebx
143
  jnz	.l3
143
  jnz	.l3
144
  xor	ecx,ecx
144
  xor	ecx,ecx
145
.lend:
145
.lend:
146
  pop	edx
146
  pop	edx
147
  pop	eax
147
  pop	eax
148
  pop	esi
148
  pop	esi
149
  pop	ebx
149
  pop	ebx
150
  ret
150
  ret
151
.l4:
151
.l4:
152
  mov	ecx,1
152
  mov	ecx,1
153
  jmp	.lend
153
  jmp	.lend
154
.l5:
154
.l5:
155
  mov	ecx,-1
155
  mov	ecx,-1
156
  jmp	.lend
156
  jmp	.lend
157
.l1:
157
.l1:
158
  mov	ecx,1
158
  mov	ecx,1
159
  pop	ebx
159
  pop	ebx
160
  ret
160
  ret
161
.l2:
161
.l2:
162
  mov	ecx,-1
162
  mov	ecx,-1
163
  pop	ebx
163
  pop	ebx
164
  ret
164
  ret
165
 
165
 
166
lshr:
166
lshr:
167
;eax - number
167
;eax - number
168
;edx - shift
168
;edx - shift
169
;[eax]=[eax] shr edx
169
;[eax]=[eax] shr edx
170
  cmp  edx,32
170
  cmp  edx,32
171
  jl   .general
171
  jl   .general
172
  mov  ecx,edx
172
  mov  ecx,edx
173
  shr  ecx,5
173
  shr  ecx,5
174
  and  edx,31
174
  and  edx,31
175
  push esi
175
  push esi
176
  mov  esi,ecx
176
  mov  esi,ecx
177
  cmp  ecx,dword [eax]
177
  cmp  ecx,dword [eax]
178
  jng  .norm
178
  jng  .norm
179
  xor  esi,esi
179
  xor  esi,esi
180
  mov  ecx,dword [eax]
180
  mov  ecx,dword [eax]
181
.norm:
181
.norm:
182
  push edi
182
  push edi
183
  push ebp
183
  push ebp
184
  mov  ebp,eax
184
  mov  ebp,eax
185
  add  eax,4
185
  add  eax,4
186
.loop1:
186
.loop1:
187
  test esi,esi
187
  test esi,esi
188
  jz   .endloop1
188
  jz   .endloop1
189
  mov  edi,dword [eax+4*ecx]
189
  mov  edi,dword [eax+4*ecx]
190
  mov  dword [eax],edi
190
  mov  dword [eax],edi
191
  add  eax,4
191
  add  eax,4
192
  dec  esi
192
  dec  esi
193
  jmp  .loop1
193
  jmp  .loop1
194
.endloop1:
194
.endloop1:
195
  mov  eax,ebp
195
  mov  eax,ebp
196
  mov  esi,dword [eax]
196
  mov  esi,dword [eax]
197
  lea  eax,[eax+4*esi]
197
  lea  eax,[eax+4*esi]
198
  xor  edi,edi
198
  xor  edi,edi
199
  mov  esi,ecx
199
  mov  esi,ecx
200
.loop2:
200
.loop2:
201
  mov  dword [eax],edi
201
  mov  dword [eax],edi
202
  sub  eax,4
202
  sub  eax,4
203
  dec  ecx
203
  dec  ecx
204
  jnz  .loop2
204
  jnz  .loop2
205
  mov  eax,ebp
205
  mov  eax,ebp
206
  sub  dword [eax],esi
206
  sub  dword [eax],esi
207
  jz   .len0
207
  jz   .len0
208
.lend1:
208
.lend1:
209
  pop  ebp
209
  pop  ebp
210
  pop  edi
210
  pop  edi
211
  pop  esi
211
  pop  esi
212
  jmp  .general
212
  jmp  .general
213
 
213
 
214
.len0:
214
.len0:
215
  inc dword [eax]
215
  inc dword [eax]
216
  jmp .lend1
216
  jmp .lend1
217
 
217
 
218
.general:
218
.general:
219
  test edx,edx
219
  test edx,edx
220
  jz  .lend
220
  jz  .lend
221
  push ebx
221
  push ebx
222
  push esi
222
  push esi
223
  push edi
223
  push edi
224
  push ebp
224
  push ebp
225
  push eax
225
  push eax
226
  mov  ebx,dword [eax]
226
  mov  ebx,dword [eax]
227
  lea  eax,[eax+4*ebx]
227
  lea  eax,[eax+4*ebx]
228
  mov  ecx,edx
228
  mov  ecx,edx
229
  sub  ecx,32
229
  sub  ecx,32
230
  neg  ecx
230
  neg  ecx
231
  mov  esi,1
231
  mov  esi,1
232
  shl  esi,cl
232
  shl  esi,cl
233
  dec  esi
233
  dec  esi
234
  mov  ecx,edx
234
  mov  ecx,edx
235
  xor  ebp,ebp
235
  xor  ebp,ebp
236
.loop3:
236
.loop3:
237
  mov  edi,dword [eax]
237
  mov  edi,dword [eax]
238
  ror  edi,cl
238
  ror  edi,cl
239
  mov  edx,edi
239
  mov  edx,edi
240
  and  edx,esi
240
  and  edx,esi
241
  or   edx,ebp
241
  or   edx,ebp
242
  mov  dword [eax],edx
242
  mov  dword [eax],edx
243
  mov  edx,esi
243
  mov  edx,esi
244
  not  edx
244
  not  edx
245
  and  edi,edx
245
  and  edi,edx
246
  mov  ebp,edi
246
  mov  ebp,edi
247
  sub  eax,4
247
  sub  eax,4
248
  dec  ebx
248
  dec  ebx
249
  jnz  .loop3
249
  jnz  .loop3
250
  pop  eax
250
  pop  eax
251
  mov  ebx,dword [eax]
251
  mov  ebx,dword [eax]
252
  mov  ecx,dword [eax+4*ebx]
252
  mov  ecx,dword [eax+4*ebx]
253
  dec  ebx
253
  dec  ebx
254
  jz   .norm1
254
  jz   .norm1
255
  test ecx,ecx
255
  test ecx,ecx
256
  jnz  .norm1
256
  jnz  .norm1
257
  dec  dword [eax]
257
  dec  dword [eax]
258
.norm1:
258
.norm1:
259
  pop  ebp
259
  pop  ebp
260
  pop  edi
260
  pop  edi
261
  pop  esi
261
  pop  esi
262
  pop  ebx
262
  pop  ebx
263
.lend:
263
.lend:
264
  ret
264
  ret
265
 
265
 
266
lshl:
266
lshl:
267
;eax - number
267
;eax - number
268
;edx - shift
268
;edx - shift
269
;[eax]:=[eax] shl edx
269
;[eax]:=[eax] shl edx
270
  cmp  edx,32
270
  cmp  edx,32
271
  jl   .general
271
  jl   .general
272
  cmp  dword [eax],1
272
  cmp  dword [eax],1
273
  jnz  .l1
273
  jnz  .l1
274
  cmp  dword [eax+4],0
274
  cmp  dword [eax+4],0
275
  jnz	.l1
275
  jnz	.l1
276
  ret
276
  ret
277
.l1:
277
.l1:
278
  push esi
278
  push esi
279
  push ebx
279
  push ebx
280
  mov  ecx,edx
280
  mov  ecx,edx
281
  shr  ecx,5
281
  shr  ecx,5
282
  and  edx,31
282
  and  edx,31
283
  mov  ebx,dword [eax]
283
  mov  ebx,dword [eax]
284
  add  dword [eax],ecx
284
  add  dword [eax],ecx
285
  lea  eax,[eax+4*ebx]
285
  lea  eax,[eax+4*ebx]
286
.loop1:
286
.loop1:
287
  mov  esi,dword [eax]
287
  mov  esi,dword [eax]
288
  mov  dword [eax+4*ecx],esi
288
  mov  dword [eax+4*ecx],esi
289
  sub  eax,4
289
  sub  eax,4
290
  dec  ebx
290
  dec  ebx
291
  jnz  .loop1
291
  jnz  .loop1
292
  xor  esi,esi
292
  xor  esi,esi
293
  lea  eax,[eax+4*ecx]
293
  lea  eax,[eax+4*ecx]
294
.loop2:
294
.loop2:
295
  mov  dword [eax],esi
295
  mov  dword [eax],esi
296
  sub  eax,4
296
  sub  eax,4
297
  dec  ecx
297
  dec  ecx
298
  jnz  .loop2
298
  jnz  .loop2
299
  pop  ebx
299
  pop  ebx
300
  pop  esi
300
  pop  esi
301
  jmp  .general
301
  jmp  .general
302
 
302
 
303
.general:
303
.general:
304
  test edx,edx
304
  test edx,edx
305
  jz   .lend
305
  jz   .lend
306
  pushad
306
  pushad
307
  mov  ecx,edx
307
  mov  ecx,edx
308
  mov  ebx,1
308
  mov  ebx,1
309
  shl  ebx,cl
309
  shl  ebx,cl
310
  dec  ebx
310
  dec  ebx
311
  mov  edx,dword [eax]
311
  mov  edx,dword [eax]
312
  xor  esi,esi
312
  xor  esi,esi
313
  lea  eax,[eax+4*edx]
313
  lea  eax,[eax+4*edx]
314
.loop3:
314
.loop3:
315
  mov  edi,dword [eax]
315
  mov  edi,dword [eax]
316
  rol  edi,cl
316
  rol  edi,cl
317
  mov  ebp,edi
317
  mov  ebp,edi
318
  and  ebp,ebx
318
  and  ebp,ebx
319
  add  esi,ebp
319
  add  esi,ebp
320
  mov  dword [eax+4],esi
320
  mov  dword [eax+4],esi
321
  mov  ebp,ebx
321
  mov  ebp,ebx
322
  not  ebp
322
  not  ebp
323
  and  edi,ebp
323
  and  edi,ebp
324
  mov  esi,edi
324
  mov  esi,edi
325
  sub  eax,4
325
  sub  eax,4
326
  dec  edx
326
  dec  edx
327
  jnz  .loop3
327
  jnz  .loop3
328
  mov  dword [eax+4],esi
328
  mov  dword [eax+4],esi
329
  mov  edx,dword [eax]
329
  mov  edx,dword [eax]
330
  cmp  dword [eax+4*edx+4],0
330
  cmp  dword [eax+4*edx+4],0
331
  jz   .l2
331
  jz   .l2
332
  inc  dword [eax]
332
  inc  dword [eax]
333
.l2:
333
.l2:
334
  popad
334
  popad
335
.lend:
335
.lend:
336
  ret
336
  ret
337
 
337
 
338
lwrite_bit:
338
lwrite_bit:
339
;eax - address of number
339
;eax - address of number
340
;edx - number of bit
340
;edx - number of bit
341
;set bit to 1. First bit has number 0.
341
;set bit to 1. First bit has number 0.
342
  mov  ecx,edx
342
  mov  ecx,edx
343
  shr  edx,5
343
  shr  edx,5
344
  inc  edx
344
  inc  edx
345
  cmp  dword [eax],edx
345
  cmp  dword [eax],edx
346
  jg   .norm
346
  jg   .norm
347
  mov  dword [eax],edx
347
  mov  dword [eax],edx
348
.norm:
348
.norm:
349
  push ebx
349
  push ebx
350
  mov  ebx,1
350
  mov  ebx,1
351
  shl  ebx,cl
351
  shl  ebx,cl
352
  or   dword [eax+4*edx],ebx
352
  or   dword [eax+4*edx],ebx
353
  pop  ebx
353
  pop  ebx
354
  ret
354
  ret
355
 
355
 
356
lcopy:
356
lcopy:
357
;eax - address of first number
357
;eax - address of first number
358
;edx - address of second number
358
;edx - address of second number
359
;[eax]:=[edx]
359
;[eax]:=[edx]
360
  push ebx
360
  push ebx
361
  push esi
361
  push esi
362
  push eax
362
  push eax
363
  push edx
363
  push edx
364
  push dword [eax]
364
  push dword [eax]
365
  mov  ebx,dword [edx]
365
  mov  ebx,dword [edx]
366
  mov  ecx,ebx
366
  mov  ecx,ebx
367
  add  edx,4
367
  add  edx,4
368
  add  eax,4
368
  add  eax,4
369
.loop1:
369
.loop1:
370
  mov  esi,dword [edx]
370
  mov  esi,dword [edx]
371
  mov  dword [eax],esi
371
  mov  dword [eax],esi
372
  add  eax,4
372
  add  eax,4
373
  add  edx,4
373
  add  edx,4
374
  dec  ecx
374
  dec  ecx
375
  jnz  .loop1
375
  jnz  .loop1
376
  pop  ecx
376
  pop  ecx
377
  sub  ecx,ebx
377
  sub  ecx,ebx
378
  jng  .l1
378
  jng  .l1
379
  xor  esi,esi
379
  xor  esi,esi
380
.loop2:
380
.loop2:
381
  mov  dword [eax],esi
381
  mov  dword [eax],esi
382
  add  eax,4
382
  add  eax,4
383
  dec  ecx
383
  dec  ecx
384
  jnz  .loop2
384
  jnz  .loop2
385
.l1:
385
.l1:
386
  pop  edx
386
  pop  edx
387
  pop  eax
387
  pop  eax
388
  mov  dword [eax],ebx
388
  mov  dword [eax],ebx
389
  pop  esi
389
  pop  esi
390
  pop  ebx
390
  pop  ebx
391
  ret
391
  ret
392
 
392
 
393
lmul:
393
lmul:
394
;eax - first number
394
;eax - first number
395
;edx - second number
395
;edx - second number
396
;ecx - third number
396
;ecx - third number
397
;[eax]:=[ecx]*[edx]
397
;[eax]:=[ecx]*[edx]
398
  push ecx
398
  push ecx
399
  push edx
399
  push edx
400
  call set_zero
400
  call set_zero
401
  pop  edx
401
  pop  edx
402
  pop  ecx
402
  pop  ecx
403
  pushad
403
  pushad
404
  sub  esp,16 ; local variables
404
  sub  esp,16 ; local variables
405
  mov  ebp,edx
405
  mov  ebp,edx
406
  mov  ebx,dword [edx]
406
  mov  ebx,dword [edx]
407
  mov  dword [esp],ebx
407
  mov  dword [esp],ebx
408
  mov  ebx,dword [ecx]
408
  mov  ebx,dword [ecx]
409
  mov  dword [esp+4],ebx
409
  mov  dword [esp+4],ebx
410
  mov  ebx,eax
410
  mov  ebx,eax
411
  add  ebp,4
411
  add  ebp,4
412
  add  ecx,4
412
  add  ecx,4
413
  add  ebx,4
413
  add  ebx,4
414
  xor  esi,esi
414
  xor  esi,esi
415
  mov  dword [esp+8],esi
415
  mov  dword [esp+8],esi
416
.loop1:
416
.loop1:
417
  xor  esi,esi
417
  xor  esi,esi
418
  mov  dword [esp+12],esi
418
  mov  dword [esp+12],esi
419
.loop2:
419
.loop2:
420
  mov  eax,dword [esp+12]
420
  mov  eax,dword [esp+12]
421
  mov  eax,dword [ecx+4*eax]
421
  mov  eax,dword [ecx+4*eax]
422
  mov  edi,dword [esp+8]
422
  mov  edi,dword [esp+8]
423
  mov  edi,dword [ebp+4*edi]
423
  mov  edi,dword [ebp+4*edi]
424
  mul  edi
424
  mul  edi
425
  add  eax,esi
425
  add  eax,esi
426
  adc  edx,0
426
  adc  edx,0
427
  mov  edi,dword [esp+12]
427
  mov  edi,dword [esp+12]
428
  add  edi,dword [esp+8]
428
  add  edi,dword [esp+8]
429
  add  eax,dword [ebx+4*edi]
429
  add  eax,dword [ebx+4*edi]
430
  adc  edx,0
430
  adc  edx,0
431
  mov  dword [ebx+4*edi],eax
431
  mov  dword [ebx+4*edi],eax
432
  mov  esi,edx
432
  mov  esi,edx
433
  inc  dword [esp+12]
433
  inc  dword [esp+12]
434
  mov  eax,dword [esp+4]
434
  mov  eax,dword [esp+4]
435
  cmp  dword [esp+12],eax
435
  cmp  dword [esp+12],eax
436
  jnz  .loop2
436
  jnz  .loop2
437
  test esi,esi
437
  test esi,esi
438
  jz   .loop1end
438
  jz   .loop1end
439
  mov  eax,dword [esp+12]
439
  mov  eax,dword [esp+12]
440
  add  eax,dword [esp+8]
440
  add  eax,dword [esp+8]
441
  mov  [ebx+4*eax],esi
441
  mov  [ebx+4*eax],esi
442
.loop1end:
442
.loop1end:
443
  inc  dword [esp+8]
443
  inc  dword [esp+8]
444
  mov  eax,dword [esp]
444
  mov  eax,dword [esp]
445
  cmp  dword [esp+8],eax
445
  cmp  dword [esp+8],eax
446
  jnz  .loop1
446
  jnz  .loop1
447
  add  esp,16
447
  add  esp,16
448
  sub  ebx,4
448
  sub  ebx,4
449
  mov  ecx,39
449
  mov  ecx,39
450
  xor  edx,edx
450
  xor  edx,edx
451
.loop3:
451
.loop3:
452
  cmp  dword [ebx+4*ecx],edx
452
  cmp  dword [ebx+4*ecx],edx
453
  jnz  .loop3end
453
  jnz  .loop3end
454
  dec  ecx
454
  dec  ecx
455
  jnz  .loop3
455
  jnz  .loop3
456
.loop3end:
456
.loop3end:
457
  test ecx,ecx
457
  test ecx,ecx
458
  jnz  .l1
458
  jnz  .l1
459
  inc  ecx
459
  inc  ecx
460
.l1:
460
.l1:
461
  mov  dword [ebx],ecx
461
  mov  dword [ebx],ecx
462
  popad
462
  popad
463
  ret
463
  ret
464
 
464
 
465
lmod:
465
lmod:
466
;eax - address of first number
466
;eax - address of first number
467
;edx - address of second number
467
;edx - address of second number
468
;[eax]:=[eax] mod [edx]
468
;[eax]:=[eax] mod [edx]
469
  mov  ecx,dword [eax]
469
  mov  ecx,dword [eax]
470
  sub  ecx,dword [edx]
470
  sub  ecx,dword [edx]
471
  jl   .lend
471
  jl   .lend
472
  pushad
472
  pushad
473
  inc  ecx
473
  inc  ecx
474
  mov  ebp,eax
474
  mov  ebp,eax
475
  mov  eax,edx
475
  mov  eax,edx
476
  mov  edi,eax
476
  mov  edi,eax
477
  shl  ecx,5
477
  shl  ecx,5
478
  mov  edx,ecx
478
  mov  edx,ecx
479
  mov  esi,ecx
479
  mov  esi,ecx
480
  call lshl
480
  call lshl
481
.loop:
481
.loop:
482
  mov  eax,ebp
482
  mov  eax,ebp
483
  mov  edx,edi
483
  mov  edx,edi
484
  call lcmp
484
  call lcmp
485
  test ecx,ecx
485
  test ecx,ecx
486
  jl   .l1
486
  jl   .l1
487
  call lsub
487
  call lsub
488
.l1:
488
.l1:
489
  dec  esi
489
  dec  esi
490
  js   .endloop
490
  js   .endloop
491
  mov  eax,edx
491
  mov  eax,edx
492
  mov  edx,1
492
  mov  edx,1
493
  call lshr
493
  call lshr
494
  jmp  .loop
494
  jmp  .loop
495
.endloop:
495
.endloop:
496
  popad
496
  popad
497
.lend:
497
.lend:
498
  ret
498
  ret
499
 
499
 
500
rsacode:
500
rsacode:
501
;eax - address of message
501
;eax - address of message
502
;edx - open key
502
;edx - open key
503
;ecx - address of module
503
;ecx - address of module
504
;esi - temparary number1
504
;esi - temparary number1
505
;edi - temparary number2
505
;edi - temparary number2
506
;esi - [eax]^edx mod (ecx)
506
;esi - [eax]^edx mod (ecx)
507
;[eax] is changed.
507
;[eax] is changed.
508
  push eax
508
  push eax
509
  push edx
509
  push edx
510
  push ecx
510
  push ecx
511
  xchg eax,esi
511
  xchg eax,esi
512
  call set_zero
512
  call set_zero
513
  mov  dword [eax+4],1
513
  mov  dword [eax+4],1
514
  mov  esi,eax
514
  mov  esi,eax
515
  mov  eax,edi
515
  mov  eax,edi
516
  call set_zero
516
  call set_zero
517
.loop:
517
.loop:
518
  mov  ecx,dword [esp+4]
518
  mov  ecx,dword [esp+4]
519
  test ecx,1
519
  test ecx,1
520
  jz   .l1
520
  jz   .l1
521
  mov  eax,edi
521
  mov  eax,edi
522
  mov  edx,esi
522
  mov  edx,esi
523
  mov  ecx,dword [esp+8]
523
  mov  ecx,dword [esp+8]
524
  call lmul
524
  call lmul
525
  mov  edx,dword [esp]
525
  mov  edx,dword [esp]
526
  call lmod
526
  call lmod
527
  mov  eax,esi
527
  mov  eax,esi
528
  mov  edx,edi
528
  mov  edx,edi
529
  call lcopy
529
  call lcopy
530
.l1:
530
.l1:
531
  shr  dword [esp+4],1
531
  shr  dword [esp+4],1
532
  jz   .endloop
532
  jz   .endloop
533
  mov  edx,dword [esp+8]
533
  mov  edx,dword [esp+8]
534
  mov  ecx,edx
534
  mov  ecx,edx
535
  mov  eax,edi
535
  mov  eax,edi
536
  call lmul
536
  call lmul
537
  mov  edx,dword [esp]
537
  mov  edx,dword [esp]
538
  call lmod
538
  call lmod
539
  mov  eax,dword [esp+8]
539
  mov  eax,dword [esp+8]
540
  mov  edx,edi
540
  mov  edx,edi
541
  call lcopy
541
  call lcopy
542
  jmp  .loop
542
  jmp  .loop
543
.endloop:
543
.endloop:
544
  pop  ecx
544
  pop  ecx
545
  pop  edx
545
  pop  edx
546
  pop  eax
546
  pop  eax
547
  ret
547
  ret
548
 
548
 
549
rsa_test:
549
rsa_test:
550
  mov  eax,num1
550
  mov  eax,num1
551
  mov  dword [eax],16
551
  mov  dword [eax],16
552
  mov  ecx,1
552
  mov  ecx,1
553
  mov  edx,16
553
  mov  edx,16
554
.loop:
554
.loop:
555
  add  eax,4
555
  add  eax,4
556
  mov  dword [eax],ecx
556
  mov  dword [eax],ecx
557
  dec  edx
557
  dec  edx
558
  jnz  .loop
558
  jnz  .loop
559
  mov  eax,num1
559
  mov  eax,num1
560
  mov  ebx,[iter]
560
  mov  ebx,[iter]
561
  mov  dword [eax+4],ebx
561
  mov  dword [eax+4],ebx
562
  inc  dword [iter]
562
  inc  dword [iter]
563
  mov  edx,[openkey]
563
  mov  edx,[openkey]
564
  mov  ecx,module
564
  mov  ecx,module
565
  mov  esi,num2
565
  mov  esi,num2
566
  mov  edi,num3
566
  mov  edi,num3
567
  call rsacode
567
  call rsacode
568
 
568
 
569
  ret
569
  ret
570
 
570
 
571
init_test:
571
init_test:
572
  xor  eax,eax
572
  xor  eax,eax
573
  mov  [iter],eax
573
  mov  [iter],eax
574
  mov  [openkey],10007
574
  mov  [openkey],10007
575
  mov  eax,num2
575
  mov  eax,num2
576
  call set_zero
576
  call set_zero
577
  mov  eax,num3
577
  mov  eax,num3
578
  call set_zero
578
  call set_zero
579
  ret
579
  ret
580
 
580
 
581
module:
581
module:
582
;module=p*q.
582
;module=p*q.
583
;where
583
;where
584
;p=
584
;p=
585
;dd 9
585
;dd 9
586
;dd 147,2,3,4,5,6,7,8,9
586
;dd 147,2,3,4,5,6,7,8,9
587
;times 30 dd 0
587
;times 30 dd 0
588
;q=
588
;q=
589
;dd 9
589
;dd 9
590
;dd 163,4,5,6,7,8,9,10,11
590
;dd 163,4,5,6,7,8,9,10,11
591
;times 30 dd 0
591
;times 30 dd 0
592
  dd 17
592
  dd 17
593
  dd 23961,914,1232,1556,1887,2226,2574,2932,3301,288,308,314,305,280,238,178,99
593
  dd 23961,914,1232,1556,1887,2226,2574,2932,3301,288,308,314,305,280,238,178,99
594
  times 22 dd 0
594
  times 22 dd 0
595
;in decimal
595
;in decimal
596
;p=1042128803351525332193283695592003066548124262686459610611886292768993621049491
596
;p=1042128803351525332193283695592003066548124262686459610611886292768993621049491
597
;q=1273712981880077616387281148672409277231717442781838063285512054053473668300963
597
;q=1273712981880077616387281148672409277231717442781838063285512054053473668300963
598
;n=1327372985619988354987062708438042005329282516404896732667039640816200186465366322016844458439816997285872910403676793109807015096535910981266920474905959833
598
;n=1327372985619988354987062708438042005329282516404896732667039640816200186465366322016844458439816997285872910403676793109807015096535910981266920474905959833
599
 
-
 
600
  num1 rd 40
-
 
601
  num2 rd 40
-
 
602
  num3 rd 40
-
 
603
  iter rd 1
-
 
604
  openkey rd 1
-
 
605
>
599
>