;testing speed of RSA coding (256 bit) ;for program CPUID (WildWest) ;author: halyavin ;structure of long number: ;rd 1 : length of number ;rd 39: digits of number ;length of zero number is equal to 1. number_digits=39 number_size=4*(number_digits+1) ;calling convention: ;procedures can change eax,ecx,edx init_rsatest: ;to do: add initialization which depends on processor. ret set_zero: ;eax - address of number ;[eax]:=0 ;result: eax isn't changed xor ecx,ecx xor edx,edx inc edx mov dword [eax],edx mov edx,39 add eax,4 .loop: mov dword [eax],ecx add eax,4 dec edx jnz .loop sub eax,160 ;size of number ret ladd: ;eax - first number ;edx - second number ;[eax]:=[eax]+[edx] pushad mov ecx,dword [eax] mov esi,dword [edx] mov ebp,eax cmp ecx,esi jg .l1 mov ecx,esi .l1: add eax,4 add edx,4 xor ebx,ebx xor esi,esi mov edi,ecx .l2: add ebx,dword [eax] adc ebx,dword [edx] adc esi,esi mov dword [eax],ebx mov ebx,esi add eax,4 xor esi,esi add edx,4 dec ecx jnz .l2 test ebx,ebx jz .lend inc dword [eax] inc edi .lend: mov eax,ebp mov dword [eax],edi popad ret lsub: ;eax - first number ;edx - second number ;[eax]=[eax]-[edx] ;[eax]>=[edx] pushad mov ecx,dword [eax] mov edi,ecx mov ebp,eax add eax,4 add edx,4 xor ebx,ebx xor esi,esi .l1: mov esi,dword [eax] sub esi,ebx sbb esi,dword [edx] mov dword [eax],esi sbb esi,esi mov ebx,esi neg ebx add eax,4 add edx,4 dec ecx jnz .l1 dec edi jz .lend sub eax,4 .l2: mov ebx,dword [eax] test ebx,ebx jnz .lend sub eax,4 dec edi jnz .l2 .lend: inc edi mov eax,ebp mov [eax],edi popad ret lcmp: ;eax - address of number ;edx - address of number ;result: ecx=1 if eax>edx ; ecx=0 if eax=edx ; ecx=-1 if eax<edx push ebx mov ebx,dword [eax] cmp ebx,dword [edx] jg .l1 jl .l2 push esi push eax push edx lea eax,[eax+4*ebx] lea edx,[edx+4*ebx] .l3: mov esi,dword [eax] cmp esi,dword [edx] ja .l4 jb .l5 sub eax,4 sub edx,4 dec ebx jnz .l3 xor ecx,ecx .lend: pop edx pop eax pop esi pop ebx ret .l4: mov ecx,1 jmp .lend .l5: mov ecx,-1 jmp .lend .l1: mov ecx,1 pop ebx ret .l2: mov ecx,-1 pop ebx ret lshr: ;eax - number ;edx - shift ;[eax]=[eax] shr edx cmp edx,32 jl .general mov ecx,edx shr ecx,5 and edx,31 push esi mov esi,ecx cmp ecx,dword [eax] jng .norm xor esi,esi mov ecx,dword [eax] .norm: push edi push ebp mov ebp,eax add eax,4 .loop1: test esi,esi jz .endloop1 mov edi,dword [eax+4*ecx] mov dword [eax],edi add eax,4 dec esi jmp .loop1 .endloop1: mov eax,ebp mov esi,dword [eax] lea eax,[eax+4*esi] xor edi,edi mov esi,ecx .loop2: mov dword [eax],edi sub eax,4 dec ecx jnz .loop2 mov eax,ebp sub dword [eax],esi jz .len0 .lend1: pop ebp pop edi pop esi jmp .general .len0: inc dword [eax] jmp .lend1 .general: test edx,edx jz .lend push ebx push esi push edi push ebp push eax mov ebx,dword [eax] lea eax,[eax+4*ebx] mov ecx,edx sub ecx,32 neg ecx mov esi,1 shl esi,cl dec esi mov ecx,edx xor ebp,ebp .loop3: mov edi,dword [eax] ror edi,cl mov edx,edi and edx,esi or edx,ebp mov dword [eax],edx mov edx,esi not edx and edi,edx mov ebp,edi sub eax,4 dec ebx jnz .loop3 pop eax mov ebx,dword [eax] mov ecx,dword [eax+4*ebx] dec ebx jz .norm1 test ecx,ecx jnz .norm1 dec dword [eax] .norm1: pop ebp pop edi pop esi pop ebx .lend: ret lshl: ;eax - number ;edx - shift ;[eax]:=[eax] shl edx cmp edx,32 jl .general cmp dword [eax],1 jnz .l1 cmp dword [eax+4],0 jnz .l1 ret .l1: push esi push ebx mov ecx,edx shr ecx,5 and edx,31 mov ebx,dword [eax] add dword [eax],ecx lea eax,[eax+4*ebx] .loop1: mov esi,dword [eax] mov dword [eax+4*ecx],esi sub eax,4 dec ebx jnz .loop1 xor esi,esi lea eax,[eax+4*ecx] .loop2: mov dword [eax],esi sub eax,4 dec ecx jnz .loop2 pop ebx pop esi jmp .general .general: test edx,edx jz .lend pushad mov ecx,edx mov ebx,1 shl ebx,cl dec ebx mov edx,dword [eax] xor esi,esi lea eax,[eax+4*edx] .loop3: mov edi,dword [eax] rol edi,cl mov ebp,edi and ebp,ebx add esi,ebp mov dword [eax+4],esi mov ebp,ebx not ebp and edi,ebp mov esi,edi sub eax,4 dec edx jnz .loop3 mov dword [eax+4],esi mov edx,dword [eax] cmp dword [eax+4*edx+4],0 jz .l2 inc dword [eax] .l2: popad .lend: ret lwrite_bit: ;eax - address of number ;edx - number of bit ;set bit to 1. First bit has number 0. mov ecx,edx shr edx,5 inc edx cmp dword [eax],edx jg .norm mov dword [eax],edx .norm: push ebx mov ebx,1 shl ebx,cl or dword [eax+4*edx],ebx pop ebx ret lcopy: ;eax - address of first number ;edx - address of second number ;[eax]:=[edx] push ebx push esi push eax push edx push dword [eax] mov ebx,dword [edx] mov ecx,ebx add edx,4 add eax,4 .loop1: mov esi,dword [edx] mov dword [eax],esi add eax,4 add edx,4 dec ecx jnz .loop1 pop ecx sub ecx,ebx jng .l1 xor esi,esi .loop2: mov dword [eax],esi add eax,4 dec ecx jnz .loop2 .l1: pop edx pop eax mov dword [eax],ebx pop esi pop ebx ret lmul: ;eax - first number ;edx - second number ;ecx - third number ;[eax]:=[ecx]*[edx] push ecx push edx call set_zero pop edx pop ecx pushad sub esp,16 ; local variables mov ebp,edx mov ebx,dword [edx] mov dword [esp],ebx mov ebx,dword [ecx] mov dword [esp+4],ebx mov ebx,eax add ebp,4 add ecx,4 add ebx,4 xor esi,esi mov dword [esp+8],esi .loop1: xor esi,esi mov dword [esp+12],esi .loop2: mov eax,dword [esp+12] mov eax,dword [ecx+4*eax] mov edi,dword [esp+8] mov edi,dword [ebp+4*edi] mul edi add eax,esi adc edx,0 mov edi,dword [esp+12] add edi,dword [esp+8] add eax,dword [ebx+4*edi] adc edx,0 mov dword [ebx+4*edi],eax mov esi,edx inc dword [esp+12] mov eax,dword [esp+4] cmp dword [esp+12],eax jnz .loop2 test esi,esi jz .loop1end mov eax,dword [esp+12] add eax,dword [esp+8] mov [ebx+4*eax],esi .loop1end: inc dword [esp+8] mov eax,dword [esp] cmp dword [esp+8],eax jnz .loop1 add esp,16 sub ebx,4 mov ecx,39 xor edx,edx .loop3: cmp dword [ebx+4*ecx],edx jnz .loop3end dec ecx jnz .loop3 .loop3end: test ecx,ecx jnz .l1 inc ecx .l1: mov dword [ebx],ecx popad ret lmod: ;eax - address of first number ;edx - address of second number ;[eax]:=[eax] mod [edx] mov ecx,dword [eax] sub ecx,dword [edx] jl .lend pushad inc ecx mov ebp,eax mov eax,edx mov edi,eax shl ecx,5 mov edx,ecx mov esi,ecx call lshl .loop: mov eax,ebp mov edx,edi call lcmp test ecx,ecx jl .l1 call lsub .l1: dec esi js .endloop mov eax,edx mov edx,1 call lshr jmp .loop .endloop: popad .lend: ret rsacode: ;eax - address of message ;edx - open key ;ecx - address of module ;esi - temparary number1 ;edi - temparary number2 ;esi - [eax]^edx mod (ecx) ;[eax] is changed. push eax push edx push ecx xchg eax,esi call set_zero mov dword [eax+4],1 mov esi,eax mov eax,edi call set_zero .loop: mov ecx,dword [esp+4] test ecx,1 jz .l1 mov eax,edi mov edx,esi mov ecx,dword [esp+8] call lmul mov edx,dword [esp] call lmod mov eax,esi mov edx,edi call lcopy .l1: shr dword [esp+4],1 jz .endloop mov edx,dword [esp+8] mov ecx,edx mov eax,edi call lmul mov edx,dword [esp] call lmod mov eax,dword [esp+8] mov edx,edi call lcopy jmp .loop .endloop: pop ecx pop edx pop eax ret rsa_test: mov eax,num1 mov dword [eax],16 mov ecx,1 mov edx,16 .loop: add eax,4 mov dword [eax],ecx dec edx jnz .loop mov eax,num1 mov ebx,[iter] mov dword [eax+4],ebx inc dword [iter] mov edx,[openkey] mov ecx,module mov esi,num2 mov edi,num3 call rsacode ret init_test: xor eax,eax mov [iter],eax mov [openkey],10007 mov eax,num2 call set_zero mov eax,num3 call set_zero ret module: ;module=p*q. ;where ;p= ;dd 9 ;dd 147,2,3,4,5,6,7,8,9 ;times 30 dd 0 ;q= ;dd 9 ;dd 163,4,5,6,7,8,9,10,11 ;times 30 dd 0 dd 17 dd 23961,914,1232,1556,1887,2226,2574,2932,3301,288,308,314,305,280,238,178,99 times 22 dd 0 ;in decimal ;p=1042128803351525332193283695592003066548124262686459610611886292768993621049491 ;q=1273712981880077616387281148672409277231717442781838063285512054053473668300963 ;n=1327372985619988354987062708438042005329282516404896732667039640816200186465366322016844458439816997285872910403676793109807015096535910981266920474905959833