Commit 6f7ac8e1 authored by Andy Polyakov's avatar Andy Polyakov
Browse files

IA-32 assembler modules (primarily DES) PIC-ification. Idea is to keep

shared libraries shared.
parent a1457874
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -1104,6 +1104,11 @@ if ($no_asm)
	$sha1_obj=$md5_obj=$rmd160_obj="";
	}

if (!$no_shared)
	{
	$cast_obj="";	# CAST assembler is not PIC
	}

if ($threads)
	{
	$cflags=$thread_cflags;
@@ -1119,20 +1124,16 @@ if ($zlib)

# You will find shlib_mark1 and shlib_mark2 explained in Makefile.org
my $shared_mark = "";
if ($shared_target ne "")
if ($shared_target eq "")
	{
	if ($shared_cflag ne "")
		{
		$cflags = "$shared_cflag $cflags";
	$no_shared = 1;
	}
if (!$no_shared)
	{
		#$shared_mark = "\$(SHARED_LIBS)";
		}
	}
else
	if ($shared_cflag ne "")
		{
	$no_shared = 1;
		$cflags = "$shared_cflag $cflags";
		}
	}

if ($no_shared)
+12 −4
Original line number Diff line number Diff line
@@ -67,19 +67,27 @@ des: des.o cbc3_enc.o lib

# elf
asm/dx86-elf.o: asm/dx86unix.cpp
	$(CPP) -DELF -x c asm/dx86unix.cpp | as -o asm/dx86-elf.o
	$(CPP) -DELF	\
		`(echo $(CFLAGS) | egrep -ie '-[fK]PIC') > /dev/null 2>&1 && echo -DPIC`\
		-x c asm/dx86unix.cpp | as -o asm/dx86-elf.o

asm/yx86-elf.o: asm/yx86unix.cpp
	$(CPP) -DELF -x c asm/yx86unix.cpp | as -o asm/yx86-elf.o
	$(CPP) -DELF	\
		`(echo $(CFLAGS) | egrep -ie '-[fK]PIC') > /dev/null 2>&1 && echo -DPIC`\
		-x c asm/yx86unix.cpp | as -o asm/yx86-elf.o

# solaris
asm/dx86-sol.o: asm/dx86unix.cpp
	$(CC) -E -DSOL asm/dx86unix.cpp | sed 's/^#.*//' > asm/dx86-sol.s
	$(CC) -E -DSOL	\
		`(echo $(CFLAGS) | egrep -ie '-[fK]PIC') > /dev/null 2>&1 && echo -DPIC`\
		asm/dx86unix.cpp | sed 's/^#.*//' > asm/dx86-sol.s
	as -o asm/dx86-sol.o asm/dx86-sol.s
	rm -f asm/dx86-sol.s

asm/yx86-sol.o: asm/yx86unix.cpp
	$(CC) -E -DSOL asm/yx86unix.cpp | sed 's/^#.*//' > asm/yx86-sol.s
	$(CC) -E -DSOL	\
		`(echo $(CFLAGS) | egrep -ie '-[fK]PIC') > /dev/null 2>&1 && echo -DPIC`\
		asm/yx86unix.cpp | sed 's/^#.*//' > asm/yx86-sol.s
	as -o asm/yx86-sol.o asm/yx86-sol.s
	rm -f asm/yx86-sol.s

+24 −21
Original line number Diff line number Diff line
@@ -26,11 +26,17 @@ sub fcrypt_body

	&comment("");
	&comment("Load the 2 words");
	$ks="ebp";
	$trans="ebp";

	&xor(	$L,	$L);
	&xor(	$R,	$R);
	&mov($ks,&wparam(1));

	# PIC-ification:-)
	if ($cpp)	{ &picmeup("edx","DES_SPtrans");   }
	else		{ &lea("edx",&DWP("DES_SPtrans")); }
	&push("edx");	# becomes &swtmp(1)
	#
	&mov($trans,&wparam(1)); # reloaded with DES_SPtrans in D_ENCRYPT

	&push(&DWC(25)); # add a variable

@@ -39,11 +45,11 @@ sub fcrypt_body
		{
		&comment("");
		&comment("Round $i");
		&D_ENCRYPT($i,$L,$R,$i*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx");
		&D_ENCRYPT($i,$L,$R,$i*2,$trans,"eax","ebx","ecx","edx");

		&comment("");
		&comment("Round ".sprintf("%d",$i+1));
		&D_ENCRYPT($i+1,$R,$L,($i+1)*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx");
		&D_ENCRYPT($i+1,$R,$L,($i+1)*2,$trans,"eax","ebx","ecx","edx");
		}
	 &mov("ebx",	&swtmp(0));
	&mov("eax",	$L);
@@ -61,14 +67,14 @@ sub fcrypt_body
	&mov(&DWP(0,"edx","",0),"eax");
	&mov(&DWP(4,"edx","",0),$L);

	&pop("ecx");	# remove variable
	&add("esp",8);	# remove variables

	&function_end($name);
	}

sub D_ENCRYPT
	{
	local($r,$L,$R,$S,$ks,$desSP,$u,$tmp1,$tmp2,$t)=@_;
	local($r,$L,$R,$S,$trans,$u,$tmp1,$tmp2,$t)=@_;

	&mov(	$u,		&wparam(2));			# 2
	&mov(	$t,		$R);
@@ -85,9 +91,9 @@ sub D_ENCRYPT
	&shl(	$tmp2,		16); 				# 1
	&xor(	$u,		$tmp1);				# 2
	&xor(	$t,		$tmp2);				# 2
	&mov(	$tmp1,		&DWP(&n2a($S*4),$ks,"",0));	# 2
	&mov(	$tmp1,		&DWP(&n2a($S*4),$trans,"",0));	# 2
	&xor(	$u,		$tmp1);
	&mov(	$tmp2,		&DWP(&n2a(($S+1)*4),$ks,"",0));	# 2
	&mov(	$tmp2,		&DWP(&n2a(($S+1)*4),$trans,"",0));	# 2
	&xor(	$u,		$R);
	&xor(	$t,		$R);
	&xor(	$t,		$tmp2);
@@ -99,31 +105,28 @@ sub D_ENCRYPT
	&movb(	&LB($tmp1),	&LB($u)	);
	&movb(	&LB($tmp2),	&HB($u)	);
	&rotr(	$t,		4		);
	&mov(	$ks,		&DWP("      $desSP",$tmp1,"",0));
	&mov(	$trans,		&swtmp(1));
	&xor(	$L,		&DWP("     ",$trans,$tmp1,0));
	&movb(	&LB($tmp1),	&LB($t)	);
	&xor(	$L,		$ks);
	&mov(	$ks,		&DWP("0x200+$desSP",$tmp2,"",0));
	&xor(	$L,		$ks);
	&xor(	$L,		&DWP("0x200",$trans,$tmp2,0));
	&movb(	&LB($tmp2),	&HB($t)	);
	&shr(	$u,		16);
	&mov(	$ks,		&DWP("0x100+$desSP",$tmp1,"",0));
	&xor(	$L,		$ks); 
	&xor(	$L,		&DWP("0x100",$trans,$tmp1,0));
	&movb(	&LB($tmp1),	&HB($u)	);
	&shr(	$t,		16);
	&mov(	$ks,		&DWP("0x300+$desSP",$tmp2,"",0));
	&xor(	$L,		$ks);
	&mov(	$ks,		&wparam(1));
	&xor(	$L,		&DWP("0x300",$trans,$tmp2,0));
	&movb(	&LB($tmp2),	&HB($t)	);
	&and(	$u,		"0xff"	);
	&and(	$t,		"0xff"	);
	&mov(	$tmp1,		&DWP("0x600+$desSP",$tmp1,"",0));
	&mov(	$tmp1,		&DWP("0x600",$trans,$tmp1,0));
	&xor(	$L,		$tmp1);
	&mov(	$tmp1,		&DWP("0x700+$desSP",$tmp2,"",0));
	&mov(	$tmp1,		&DWP("0x700",$trans,$tmp2,0));
	&xor(	$L,		$tmp1);
	&mov(	$tmp1,		&DWP("0x400+$desSP",$u,"",0));
	&mov(	$tmp1,		&DWP("0x400",$trans,$u,0));
	&xor(	$L,		$tmp1);
	&mov(	$tmp1,		&DWP("0x500+$desSP",$t,"",0));
	&mov(	$tmp1,		&DWP("0x500",$trans,$t,0));
	&xor(	$L,		$tmp1);
	&mov(	$trans,		&wparam(1));
	}

sub n2a
+23 −26
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ sub DES_encrypt

	&comment("");
	&comment("Load the 2 words");
	$ks="ebp";
	$trans="ebp";

	if ($do_ip)
		{
@@ -72,7 +72,11 @@ sub DES_encrypt
		&rotl($L,3);
		}

	&mov(	$ks,		&wparam(1)	);
	# PIC-ification:-)
	if ($cpp)	{ &picmeup($trans,"DES_SPtrans");   }
	else		{ &lea($trans,&DWP("DES_SPtrans")); }

	&mov(	"ecx",	&wparam(1)	);
	&cmp("ebx","0");
	&je(&label("start_decrypt"));

@@ -80,11 +84,11 @@ sub DES_encrypt
		{
		&comment("");
		&comment("Round $i");
		&D_ENCRYPT($i,$L,$R,$i*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx");
		&D_ENCRYPT($i,$L,$R,$i*2,$trans,"eax","ebx","ecx","edx");

		&comment("");
		&comment("Round ".sprintf("%d",$i+1));
		&D_ENCRYPT($i+1,$R,$L,($i+1)*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx");
		&D_ENCRYPT($i+1,$R,$L,($i+1)*2,$trans,"eax","ebx","ecx","edx");
		}
	&jmp(&label("end"));

@@ -94,10 +98,10 @@ sub DES_encrypt
		{
		&comment("");
		&comment("Round $i");
		&D_ENCRYPT(15-$i,$L,$R,$i*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx");
		&D_ENCRYPT(15-$i,$L,$R,$i*2,$trans,"eax","ebx","ecx","edx");
		&comment("");
		&comment("Round ".sprintf("%d",$i-1));
		&D_ENCRYPT(15-$i+1,$R,$L,($i-1)*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx");
		&D_ENCRYPT(15-$i+1,$R,$L,($i-1)*2,$trans,"eax","ebx","ecx","edx");
		}

	&set_label("end");
@@ -134,43 +138,36 @@ sub DES_encrypt

sub D_ENCRYPT
	{
	local($r,$L,$R,$S,$ks,$desSP,$u,$tmp1,$tmp2,$t)=@_;
	local($r,$L,$R,$S,$trans,$u,$tmp1,$tmp2,$t)=@_;

	 &mov(	$u,		&DWP(&n2a($S*4),$ks,"",0));
	 &mov(	$u,		&DWP(&n2a($S*4),$tmp2,"",0));
	&xor(	$tmp1,		$tmp1);
	 &mov(	$t,		&DWP(&n2a(($S+1)*4),$ks,"",0));
	 &mov(	$t,		&DWP(&n2a(($S+1)*4),$tmp2,"",0));
	&xor(	$u,		$R);
	&xor(	$tmp2,		$tmp2);
	 &xor(	$t,		$R);
	&and(	$u,		"0xfcfcfcfc"	);
	 &and(	$t,		"0xcfcfcfcf"	);
	&movb(	&LB($tmp1),	&LB($u)	);
	 &movb(	&LB($tmp2),	&HB($u)	);
	&rotr(	$t,		4		);
	&mov(	$ks,		&DWP("      $desSP",$tmp1,"",0));
	&xor(	$L,		&DWP("     ",$trans,$tmp1,0));
	 &movb(	&LB($tmp1),	&LB($t)	);
	&xor(	$L,		$ks);
	 &mov(	$ks,		&DWP("0x200+$desSP",$tmp2,"",0));
	&xor(	$L,		$ks); ######
	 &xor(	$L,		&DWP("0x200",$trans,$tmp2,0));
	 &movb(	&LB($tmp2),	&HB($t)	);
	&shr(	$u,		16);
	 &mov(	$ks,		&DWP("0x100+$desSP",$tmp1,"",0));
	&xor(	$L,		$ks); ######
	 &xor(	$L,		&DWP("0x100",$trans,$tmp1,0));
	 &movb(	&LB($tmp1),	&HB($u)	);
	&shr(	$t,		16);
	 &mov(	$ks,		&DWP("0x300+$desSP",$tmp2,"",0));
	&xor(	$L,		$ks);
	 &mov(	$ks,		&wparam(1)	);
	 &xor(	$L,		&DWP("0x300",$trans,$tmp2,0));
	&movb(	&LB($tmp2),	&HB($t)	);
	 &and(	$u,		"0xff"	);
	&and(	$t,		"0xff"	);
	 &mov(	$tmp1,		&DWP("0x600+$desSP",$tmp1,"",0));
	&xor(	$L,		$tmp1);
	 &mov(	$tmp1,		&DWP("0x700+$desSP",$tmp2,"",0));
	&xor(	$L,		$tmp1);
	 &mov(	$tmp1,		&DWP("0x400+$desSP",$u,"",0));
	&xor(	$L,		$tmp1);
	 &mov(	$tmp1,		&DWP("0x500+$desSP",$t,"",0));
	&xor(	$L,		$tmp1);
	 &xor(	$L,		&DWP("0x600",$trans,$tmp1,0));
	 &xor(	$L,		&DWP("0x700",$trans,$tmp2,0));
	&mov(	$tmp2,		&wparam(1)	);
	 &xor(	$L,		&DWP("0x400",$trans,$u,0));
	 &xor(	$L,		&DWP("0x500",$trans,$t,0));
	}

sub n2a
+24 −17
Original line number Diff line number Diff line
@@ -146,9 +146,15 @@ sub cbc
	&mov($count,	&wparam(2));	# length
	&and($count,	7);
	&jz(&label("finish"));
	&call(&label("PIC_point"));
&set_label("PIC_point");
	&blindpop("edx");
	&lea("ecx",&DWP(&label("cbc_enc_jmp_table")."-".&label("PIC_point"),"edx"));
	&mov($count,&DWP(0,"ecx",$count,4))
	&add($count,"edx");
	&xor("ecx","ecx");
	&xor("edx","edx");
	&mov($count,&DWP(&label("cbc_enc_jmp_table"),"",$count,4));
	#&mov($count,&DWP(&label("cbc_enc_jmp_table"),"",$count,4));
	&jmp_ptr($count);

&set_label("ej7");
@@ -318,22 +324,23 @@ sub cbc

	&set_label("cbc_enc_jmp_table",1);
	&data_word("0");
	&data_word(&label("ej1"));
	&data_word(&label("ej2"));
	&data_word(&label("ej3"));
	&data_word(&label("ej4"));
	&data_word(&label("ej5"));
	&data_word(&label("ej6"));
	&data_word(&label("ej7"));
	&set_label("cbc_dec_jmp_table",1);
	&data_word("0");
	&data_word(&label("dj1"));
	&data_word(&label("dj2"));
	&data_word(&label("dj3"));
	&data_word(&label("dj4"));
	&data_word(&label("dj5"));
	&data_word(&label("dj6"));
	&data_word(&label("dj7"));
	&data_word(&label("ej1")."-".&label("PIC_point"));
	&data_word(&label("ej2")."-".&label("PIC_point"));
	&data_word(&label("ej3")."-".&label("PIC_point"));
	&data_word(&label("ej4")."-".&label("PIC_point"));
	&data_word(&label("ej5")."-".&label("PIC_point"));
	&data_word(&label("ej6")."-".&label("PIC_point"));
	&data_word(&label("ej7")."-".&label("PIC_point"));
	# not used
	#&set_label("cbc_dec_jmp_table",1);
	#&data_word("0");
	#&data_word(&label("dj1")."-".&label("PIC_point"));
	#&data_word(&label("dj2")."-".&label("PIC_point"));
	#&data_word(&label("dj3")."-".&label("PIC_point"));
	#&data_word(&label("dj4")."-".&label("PIC_point"));
	#&data_word(&label("dj5")."-".&label("PIC_point"));
	#&data_word(&label("dj6")."-".&label("PIC_point"));
	#&data_word(&label("dj7")."-".&label("PIC_point"));

	&function_end_B($name);
	
Loading