155714Skris#!/usr/local/bin/perl 255714Skris 355714Skris$L="edi"; 455714Skris$R="esi"; 555714Skris 6109998Smarkmsub DES_encrypt3 755714Skris { 855714Skris local($name,$enc)=@_; 955714Skris 1055714Skris &function_begin_B($name,""); 1155714Skris &push("ebx"); 1255714Skris &mov("ebx",&wparam(0)); 1355714Skris 1455714Skris &push("ebp"); 1555714Skris &push("esi"); 1655714Skris 1755714Skris &push("edi"); 1855714Skris 1955714Skris &comment(""); 2055714Skris &comment("Load the data words"); 2155714Skris &mov($L,&DWP(0,"ebx","",0)); 2255714Skris &mov($R,&DWP(4,"ebx","",0)); 2355714Skris &stack_push(3); 2455714Skris 2555714Skris &comment(""); 2655714Skris &comment("IP"); 2755714Skris &IP_new($L,$R,"edx",0); 2855714Skris 2955714Skris # put them back 3055714Skris 3155714Skris if ($enc) 3255714Skris { 3355714Skris &mov(&DWP(4,"ebx","",0),$R); 3455714Skris &mov("eax",&wparam(1)); 3555714Skris &mov(&DWP(0,"ebx","",0),"edx"); 3655714Skris &mov("edi",&wparam(2)); 3755714Skris &mov("esi",&wparam(3)); 3855714Skris } 3955714Skris else 4055714Skris { 4155714Skris &mov(&DWP(4,"ebx","",0),$R); 4255714Skris &mov("esi",&wparam(1)); 4355714Skris &mov(&DWP(0,"ebx","",0),"edx"); 4455714Skris &mov("edi",&wparam(2)); 4555714Skris &mov("eax",&wparam(3)); 4655714Skris } 4755714Skris &mov(&swtmp(2), (DWC(($enc)?"1":"0"))); 4855714Skris &mov(&swtmp(1), "eax"); 4955714Skris &mov(&swtmp(0), "ebx"); 50109998Smarkm &call("DES_encrypt2"); 5155714Skris &mov(&swtmp(2), (DWC(($enc)?"0":"1"))); 5255714Skris &mov(&swtmp(1), "edi"); 5355714Skris &mov(&swtmp(0), "ebx"); 54109998Smarkm &call("DES_encrypt2"); 5555714Skris &mov(&swtmp(2), (DWC(($enc)?"1":"0"))); 5655714Skris &mov(&swtmp(1), "esi"); 5755714Skris &mov(&swtmp(0), "ebx"); 58109998Smarkm &call("DES_encrypt2"); 5955714Skris 6055714Skris &stack_pop(3); 6155714Skris &mov($L,&DWP(0,"ebx","",0)); 6255714Skris &mov($R,&DWP(4,"ebx","",0)); 6355714Skris 6455714Skris &comment(""); 6555714Skris &comment("FP"); 6655714Skris &FP_new($L,$R,"eax",0); 6755714Skris 6855714Skris &mov(&DWP(0,"ebx","",0),"eax"); 6955714Skris &mov(&DWP(4,"ebx","",0),$R); 7055714Skris 7155714Skris &pop("edi"); 7255714Skris &pop("esi"); 7355714Skris &pop("ebp"); 7455714Skris &pop("ebx"); 7555714Skris &ret(); 7655714Skris &function_end_B($name); 7755714Skris } 7855714Skris 7955714Skris 80