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 | > |