1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#!/usr/local/bin/perl 2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgpush(@INC,"perlasm","../../perlasm"); 4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgrequire "x86asm.pl"; 5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgrequire "cbc.pl"; 6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org&asm_init($ARGV[0],"bf-686.pl"); 8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org$BF_ROUNDS=16; 10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org$BF_OFF=($BF_ROUNDS+2)*4; 11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org$L="ecx"; 12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org$R="edx"; 13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org$P="edi"; 14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org$tot="esi"; 15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org$tmp1="eax"; 16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org$tmp2="ebx"; 17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org$tmp3="ebp"; 18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org&des_encrypt("BF_encrypt",1); 20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org&des_encrypt("BF_decrypt",0); 21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org&cbc("BF_cbc_encrypt","BF_encrypt","BF_decrypt",1,4,5,3,-1,-1); 22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org&asm_finish(); 24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org&file_end(); 26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgsub des_encrypt 28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org local($name,$enc)=@_; 30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &function_begin($name,""); 32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment(""); 34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment("Load the 2 words"); 35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov("eax",&wparam(0)); 36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov($L,&DWP(0,"eax","",0)); 37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov($R,&DWP(4,"eax","",0)); 38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment(""); 40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment("P pointer, s and enc flag"); 41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov($P,&wparam(1)); 42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &xor( $tmp1, $tmp1); 44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &xor( $tmp2, $tmp2); 45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org # encrypting part 47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if ($enc) 49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &xor($L,&DWP(0,$P,"",0)); 51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for ($i=0; $i<$BF_ROUNDS; $i+=2) 52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment(""); 54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment("Round $i"); 55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &BF_ENCRYPT($i+1,$R,$L,$P,$tot,$tmp1,$tmp2,$tmp3); 56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment(""); 58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment("Round ".sprintf("%d",$i+1)); 59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &BF_ENCRYPT($i+2,$L,$R,$P,$tot,$tmp1,$tmp2,$tmp3); 60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &xor($R,&DWP(($BF_ROUNDS+1)*4,$P,"",0)); 62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov("eax",&wparam(0)); 64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov(&DWP(0,"eax","",0),$R); 65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov(&DWP(4,"eax","",0),$L); 66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &function_end_A($name); 67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &xor($L,&DWP(($BF_ROUNDS+1)*4,$P,"",0)); 71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for ($i=$BF_ROUNDS; $i>0; $i-=2) 72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment(""); 74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment("Round $i"); 75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &BF_ENCRYPT($i,$R,$L,$P,$tot,$tmp1,$tmp2,$tmp3); 76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment(""); 77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &comment("Round ".sprintf("%d",$i-1)); 78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &BF_ENCRYPT($i-1,$L,$R,$P,$tot,$tmp1,$tmp2,$tmp3); 79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &xor($R,&DWP(0,$P,"",0)); 81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov("eax",&wparam(0)); 83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov(&DWP(0,"eax","",0),$R); 84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov(&DWP(4,"eax","",0),$L); 85c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &function_end_A($name); 86c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 87c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 88c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &function_end_B($name); 89c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 90c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgsub BF_ENCRYPT 92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org local($i,$L,$R,$P,$tot,$tmp1,$tmp2,$tmp3)=@_; 94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &rotr( $R, 16); 96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov( $tot, &DWP(&n2a($i*4),$P,"",0)); 97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &movb( &LB($tmp1), &HB($R)); 99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &movb( &LB($tmp2), &LB($R)); 100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &rotr( $R, 16); 102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &xor( $L, $tot); 103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov( $tot, &DWP(&n2a($BF_OFF+0x0000),$P,$tmp1,4)); 105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov( $tmp3, &DWP(&n2a($BF_OFF+0x0400),$P,$tmp2,4)); 106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &movb( &LB($tmp1), &HB($R)); 108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &movb( &LB($tmp2), &LB($R)); 109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &add( $tot, $tmp3); 111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov( $tmp1, &DWP(&n2a($BF_OFF+0x0800),$P,$tmp1,4)); # delay 112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &xor( $tot, $tmp1); 114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &mov( $tmp3, &DWP(&n2a($BF_OFF+0x0C00),$P,$tmp2,4)); 115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &add( $tot, $tmp3); 117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &xor( $tmp1, $tmp1); 118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org &xor( $L, $tot); 120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org # delay 121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgsub n2a 124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org sprintf("%d",$_[0]); 126c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 128