⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmll-x86.pl

📁 OpenSSL 0.9.8k 最新版OpenSSL
💻 PL
📖 第 1 页 / 共 3 页
字号:
	&pop	("ebx");	&ret	();&function_end_B("Camellia_set_key");}@SBOX=(112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65, 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189,134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26,166,225, 57,202,213, 71, 93, 61,217,  1, 90,214, 81, 86,108, 77,139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153,223, 76,203,194, 52,126,118,  5,109,183,169, 49,209, 23,  4,215, 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34,254, 68,207,178,195,181,122,145, 36,  8,232,168, 96,252,105, 80,170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210, 16,196,  0, 72,163,247,117,219,138,  3,230,218,  9, 63,221,148,135, 92,131,  2,205, 74,144, 51,115,103,246,243,157,127,191,226, 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46,233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89,120,152,  6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250,114,  7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164, 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158);sub S1110 { my $i=shift; $i=@SBOX[$i]; return $i<<24|$i<<16|$i<<8; }sub S4404 { my $i=shift; $i=($i<<1|$i>>7)&0xff; $i=@SBOX[$i]; return $i<<24|$i<<16|$i; }	sub S0222 { my $i=shift; $i=@SBOX[$i]; $i=($i<<1|$i>>7)&0xff; return $i<<16|$i<<8|$i; }	sub S3033 { my $i=shift; $i=@SBOX[$i]; $i=($i>>1|$i<<7)&0xff; return $i<<24|$i<<8|$i; }	&set_label("Camellia_SIGMA",64);&data_word(    0xa09e667f, 0x3bcc908b, 0xb67ae858, 0x4caa73b2,    0xc6ef372f, 0xe94f82be, 0x54ff53a5, 0xf1d36f1c,    0x10e527fa, 0xde682d1d, 0xb05688c2, 0xb3e6c1fd,    0,          0,          0,          0);&set_label("Camellia_SBOX",64);# tables are interleaved, remember?for ($i=0;$i<256;$i++) { &data_word(&S1110($i),&S4404($i)); }for ($i=0;$i<256;$i++) { &data_word(&S0222($i),&S3033($i)); }# void Camellia_cbc_encrypt (const void char *inp, unsigned char *out,#			size_t length, const CAMELLIA_KEY *key,#			unsigned char *ivp,const int enc);{# stack frame layout#             -4(%esp)		# return address	 0(%esp)#              0(%esp)		# s0			 4(%esp)#              4(%esp)		# s1			 8(%esp)#              8(%esp)		# s2			12(%esp)#             12(%esp)		# s3			16(%esp)#             16(%esp)		# end of key schedule	20(%esp)#             20(%esp)		# %esp backupmy $_inp=&DWP(24,"esp");	#copy of wparam(0)my $_out=&DWP(28,"esp");	#copy of wparam(1)my $_len=&DWP(32,"esp");	#copy of wparam(2)my $_key=&DWP(36,"esp");	#copy of wparam(3)my $_ivp=&DWP(40,"esp");	#copy of wparam(4)my $ivec=&DWP(44,"esp");	#ivec[16]my $_tmp=&DWP(44,"esp");	#volatile variable [yes, aliases with ivec]my ($s0,$s1,$s2,$s3) = @T;&function_begin("Camellia_cbc_encrypt");	&mov	($s2 eq "ecx"? $s2 : "",&wparam(2));	# load len	&cmp	($s2,0);	&je	(&label("enc_out"));	&pushf	();	&cld	();	&mov	($s0,&wparam(0));	# load inp	&mov	($s1,&wparam(1));	# load out	#&mov	($s2,&wparam(2));	# load len	&mov	($s3,&wparam(3));	# load key	&mov	($Tbl,&wparam(4));	# load ivp	# allocate aligned stack frame...	&lea	($idx,&DWP(-64,"esp"));	&and	($idx,-64);	# place stack frame just "above mod 1024" the key schedule	# this ensures that cache associativity of 2 suffices	&lea	($key,&DWP(-64-63,$s3));	&sub	($key,$idx);	&neg	($key);	&and	($key,0x3C0);	# modulo 1024, but aligned to cache-line	&sub	($idx,$key);	&mov	($key,&wparam(5));	# load enc	&exch	("esp",$idx);	&add	("esp",4);		# reserve for return address!	&mov	($_esp,$idx);		# save %esp	&mov	($_inp,$s0);		# save copy of inp	&mov	($_out,$s1);		# save copy of out	&mov	($_len,$s2);		# save copy of len	&mov	($_key,$s3);		# save copy of key	&mov	($_ivp,$Tbl);		# save copy of ivp	&call   (&label("pic_point"));	# make it PIC!	&set_label("pic_point");	&blindpop($Tbl);	&lea    ($Tbl,&DWP(&label("Camellia_SBOX")."-".&label("pic_point"),$Tbl));	&mov	($idx,32);	&set_label("prefetch_sbox",4);		&mov	($s0,&DWP(0,$Tbl));		&mov	($s1,&DWP(32,$Tbl));		&mov	($s2,&DWP(64,$Tbl));		&mov	($s3,&DWP(96,$Tbl));		&lea	($Tbl,&DWP(128,$Tbl));		&dec	($idx);	&jnz	(&label("prefetch_sbox"));	&mov	($s0,$_key);	&sub	($Tbl,4096);	&mov	($idx,$_inp);	&mov	($s3,&DWP(272,$s0));		# load grandRounds	&cmp	($key,0);	&je	(&label("DECRYPT"));	&mov	($s2,$_len);	&mov	($key,$_ivp);	&shl	($s3,6);	&lea	($s3,&DWP(0,$s0,$s3));	&mov	($_end,$s3);	&test	($s2,0xFFFFFFF0);	&jz	(&label("enc_tail"));		# short input...	&mov	($s0,&DWP(0,$key));		# load iv	&mov	($s1,&DWP(4,$key));	&set_label("enc_loop",4);		&mov	($s2,&DWP(8,$key));		&mov	($s3,&DWP(12,$key));		&xor	($s0,&DWP(0,$idx));	# xor input data		&xor	($s1,&DWP(4,$idx));		&xor	($s2,&DWP(8,$idx));		&bswap	($s0);		&xor	($s3,&DWP(12,$idx));		&bswap	($s1);		&mov	($key,$_key);		# load key		&bswap	($s2);		&bswap	($s3);		&call	("_x86_Camellia_encrypt");		&mov	($idx,$_inp);		# load inp		&mov	($key,$_out);		# load out		&bswap	($s0);		&bswap	($s1);		&bswap	($s2);		&mov	(&DWP(0,$key),$s0);	# save output data		&bswap	($s3);		&mov	(&DWP(4,$key),$s1);		&mov	(&DWP(8,$key),$s2);		&mov	(&DWP(12,$key),$s3);		&mov	($s2,$_len);		# load len		&lea	($idx,&DWP(16,$idx));		&mov	($_inp,$idx);		# save inp		&lea	($s3,&DWP(16,$key));		&mov	($_out,$s3);		# save out		&sub	($s2,16);		&test	($s2,0xFFFFFFF0);		&mov	($_len,$s2);		# save len	&jnz	(&label("enc_loop"));	&test	($s2,15);	&jnz	(&label("enc_tail"));	&mov	($idx,$_ivp);		# load ivp	&mov	($s2,&DWP(8,$key));	# restore last dwords	&mov	($s3,&DWP(12,$key));	&mov	(&DWP(0,$idx),$s0);	# save ivec	&mov	(&DWP(4,$idx),$s1);	&mov	(&DWP(8,$idx),$s2);	&mov	(&DWP(12,$idx),$s3);	&mov	("esp",$_esp);	&popf	();    &set_label("enc_out");	&function_end_A();	&pushf	();			# kludge, never executed    &set_label("enc_tail",4);	&mov	($s0,$key eq "edi" ? $key : "");	&mov	($key,$_out);			# load out	&push	($s0);				# push ivp	&mov	($s1,16);	&sub	($s1,$s2);	&cmp	($key,$idx);			# compare with inp	&je	(&label("enc_in_place"));	&align	(4);	&data_word(0xA4F3F689);	# rep movsb	# copy input	&jmp	(&label("enc_skip_in_place"));    &set_label("enc_in_place");	&lea	($key,&DWP(0,$key,$s2));    &set_label("enc_skip_in_place");	&mov	($s2,$s1);	&xor	($s0,$s0);	&align	(4);	&data_word(0xAAF3F689);	# rep stosb	# zero tail	&pop	($key);				# pop ivp	&mov	($idx,$_out);			# output as input	&mov	($s0,&DWP(0,$key));	&mov	($s1,&DWP(4,$key));	&mov	($_len,16);			# len=16	&jmp	(&label("enc_loop"));		# one more spin...#----------------------------- DECRYPT -----------------------------#&set_label("DECRYPT",16);	&shl	($s3,6);	&lea	($s3,&DWP(0,$s0,$s3));	&mov	($_end,$s0);	&mov	($_key,$s3);	&cmp	($idx,$_out);	&je	(&label("dec_in_place"));	# in-place processing...	&mov	($key,$_ivp);			# load ivp	&mov	($_tmp,$key);	&set_label("dec_loop",4);		&mov	($s0,&DWP(0,$idx));	# read input		&mov	($s1,&DWP(4,$idx));		&mov	($s2,&DWP(8,$idx));		&bswap	($s0);		&mov	($s3,&DWP(12,$idx));		&bswap	($s1);		&mov	($key,$_key);		# load key		&bswap	($s2);		&bswap	($s3);		&call	("_x86_Camellia_decrypt");		&mov	($key,$_tmp);		# load ivp		&mov	($idx,$_len);		# load len		&bswap	($s0);		&bswap	($s1);		&bswap	($s2);		&xor	($s0,&DWP(0,$key));	# xor iv		&bswap	($s3);		&xor	($s1,&DWP(4,$key));		&xor	($s2,&DWP(8,$key));		&xor	($s3,&DWP(12,$key));		&sub	($idx,16);		&jc	(&label("dec_partial"));		&mov	($_len,$idx);		# save len		&mov	($idx,$_inp);		# load inp		&mov	($key,$_out);		# load out		&mov	(&DWP(0,$key),$s0);	# write output		&mov	(&DWP(4,$key),$s1);		&mov	(&DWP(8,$key),$s2);		&mov	(&DWP(12,$key),$s3);		&mov	($_tmp,$idx);		# save ivp		&lea	($idx,&DWP(16,$idx));		&mov	($_inp,$idx);		# save inp		&lea	($key,&DWP(16,$key));		&mov	($_out,$key);		# save out	&jnz	(&label("dec_loop"));	&mov	($key,$_tmp);		# load temp ivp    &set_label("dec_end");	&mov	($idx,$_ivp);		# load user ivp	&mov	($s0,&DWP(0,$key));	# load iv	&mov	($s1,&DWP(4,$key));	&mov	($s2,&DWP(8,$key));	&mov	($s3,&DWP(12,$key));	&mov	(&DWP(0,$idx),$s0);	# copy back to user	&mov	(&DWP(4,$idx),$s1);	&mov	(&DWP(8,$idx),$s2);	&mov	(&DWP(12,$idx),$s3);	&jmp	(&label("dec_out"));    &set_label("dec_partial",4);	&lea	($key,$ivec);	&mov	(&DWP(0,$key),$s0);	# dump output to stack	&mov	(&DWP(4,$key),$s1);	&mov	(&DWP(8,$key),$s2);	&mov	(&DWP(12,$key),$s3);	&lea	($s2 eq "ecx" ? $s2 : "",&DWP(16,$idx));	&mov	($idx eq "esi" ? $idx : "",$key);	&mov	($key eq "edi" ? $key : "",$_out);	# load out	&data_word(0xA4F3F689);	# rep movsb		# copy output	&mov	($key,$_inp);				# use inp as temp ivp	&jmp	(&label("dec_end"));    &set_label("dec_in_place",4);	&set_label("dec_in_place_loop");		&lea	($key,$ivec);		&mov	($s0,&DWP(0,$idx));	# read input		&mov	($s1,&DWP(4,$idx));		&mov	($s2,&DWP(8,$idx));		&mov	($s3,&DWP(12,$idx));		&mov	(&DWP(0,$key),$s0);	# copy to temp		&mov	(&DWP(4,$key),$s1);		&mov	(&DWP(8,$key),$s2);		&bswap	($s0);		&mov	(&DWP(12,$key),$s3);		&bswap	($s1);		&mov	($key,$_key);		# load key		&bswap	($s2);		&bswap	($s3);		&call	("_x86_Camellia_decrypt");		&mov	($key,$_ivp);		# load ivp		&mov	($idx,$_out);		# load out		&bswap	($s0);		&bswap	($s1);		&bswap	($s2);		&xor	($s0,&DWP(0,$key));	# xor iv		&bswap	($s3);		&xor	($s1,&DWP(4,$key));		&xor	($s2,&DWP(8,$key));		&xor	($s3,&DWP(12,$key));		&mov	(&DWP(0,$idx),$s0);	# write output		&mov	(&DWP(4,$idx),$s1);		&mov	(&DWP(8,$idx),$s2);		&mov	(&DWP(12,$idx),$s3);		&lea	($idx,&DWP(16,$idx));		&mov	($_out,$idx);		# save out		&lea	($idx,$ivec);		&mov	($s0,&DWP(0,$idx));	# read temp		&mov	($s1,&DWP(4,$idx));		&mov	($s2,&DWP(8,$idx));		&mov	($s3,&DWP(12,$idx));		&mov	(&DWP(0,$key),$s0);	# copy iv		&mov	(&DWP(4,$key),$s1);		&mov	(&DWP(8,$key),$s2);		&mov	(&DWP(12,$key),$s3);		&mov	($idx,$_inp);		# load inp		&lea	($idx,&DWP(16,$idx));		&mov	($_inp,$idx);		# save inp		&mov	($s2,$_len);		# load len		&sub	($s2,16);		&jc	(&label("dec_in_place_partial"));		&mov	($_len,$s2);		# save len	&jnz	(&label("dec_in_place_loop"));	&jmp	(&label("dec_out"));    &set_label("dec_in_place_partial",4);	# one can argue if this is actually required...	&mov	($key eq "edi" ? $key : "",$_out);	&lea	($idx eq "esi" ? $idx : "",$ivec);	&lea	($key,&DWP(0,$key,$s2));	&lea	($idx,&DWP(16,$idx,$s2));	&neg	($s2 eq "ecx" ? $s2 : "");	&data_word(0xA4F3F689);	# rep movsb	# restore tail    &set_label("dec_out",4);    &mov	("esp",$_esp);    &popf	();&function_end("Camellia_cbc_encrypt");}&asciz("Camellia for x86 by <appro@openssl.org>");&asm_finish();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -