1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#!/usr/local/bin/perl
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# void des_ncbc_encrypt(input, output, length, schedule, ivec, enc)
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# des_cblock (*input);
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# des_cblock (*output);
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# long length;
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# des_key_schedule schedule;
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# des_cblock (*ivec);
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# int enc;
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# calls
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT);
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#&cbc("des_ncbc_encrypt","des_encrypt",0);
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#&cbc("BF_cbc_encrypt","BF_encrypt","BF_encrypt",
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#	1,4,5,3,5,-1);
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#&cbc("des_ncbc_encrypt","des_encrypt","des_encrypt",
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#	0,4,5,3,5,-1);
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#&cbc("des_ede3_cbc_encrypt","des_encrypt3","des_decrypt3",
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#	0,6,7,3,4,5);
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# When doing a cipher that needs bigendian order,
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# for encrypt, the iv is kept in bigendian form,
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# while for decrypt, it is kept in little endian.
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub cbc
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	local($name,$enc_func,$dec_func,$swap,$iv_off,$enc_off,$p1,$p2,$p3)=@_;
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# name is the function name
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# enc_func and dec_func and the functions to call for encrypt/decrypt
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# swap is true if byte order needs to be reversed
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# iv_off is parameter number for the iv
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# enc_off is parameter number for the encrypt/decrypt flag
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# p1,p2,p3 are the offsets for parameters to be passed to the
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# underlying calls.
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&function_begin_B($name,"");
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&comment("");
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$in="esi";
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$out="edi";
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$count="ebp";
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&push("ebp");
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&push("ebx");
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&push("esi");
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&push("edi");
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$data_off=4;
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$data_off+=4 if ($p1 > 0);
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$data_off+=4 if ($p2 > 0);
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$data_off+=4 if ($p3 > 0);
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($count,	&wparam(2));	# length
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&comment("getting iv ptr from parameter $iv_off");
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ebx",	&wparam($iv_off));	# Get iv ptr
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($in,	&DWP(0,"ebx","",0));#	iv[0]
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($out,	&DWP(4,"ebx","",0));#	iv[1]
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&push($out);
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&push($in);
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&push($out);	# used in decrypt for iv[1]
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&push($in);	# used in decrypt for iv[0]
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ebx",	"esp");		# This is the address of tin[2]
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($in,	&wparam(0));	# in
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($out,	&wparam(1));	# out
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# We have loaded them all, how lets push things
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&comment("getting encrypt flag from parameter $enc_off");
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ecx",	&wparam($enc_off));	# Get enc flag
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($p3 > 0)
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&comment("get and push parameter $p3");
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ($enc_off != $p3)
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ &mov("eax",	&wparam($p3)); &push("eax"); }
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else	{ &push("ecx"); }
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($p2 > 0)
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&comment("get and push parameter $p2");
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ($enc_off != $p2)
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ &mov("eax",	&wparam($p2)); &push("eax"); }
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else	{ &push("ecx"); }
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ($p1 > 0)
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&comment("get and push parameter $p1");
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ($enc_off != $p1)
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ &mov("eax",	&wparam($p1)); &push("eax"); }
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else	{ &push("ecx"); }
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&push("ebx");		# push data/iv
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&cmp("ecx",0);
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jz(&label("decrypt"));
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&and($count,0xfffffff8);
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("eax",	&DWP($data_off,"esp","",0));	# load iv[0]
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ebx",	&DWP($data_off+4,"esp","",0));	# load iv[1]
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jz(&label("encrypt_finish"));
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#############################################################
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&set_label("encrypt_loop");
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# encrypt start
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# "eax" and "ebx" hold iv (or the last cipher text)
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ecx",	&DWP(0,$in,"",0));	# load first 4 bytes
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("edx",	&DWP(4,$in,"",0));	# second 4 bytes
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&xor("eax",	"ecx");
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&xor("ebx",	"edx");
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("eax")	if $swap;
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("ebx")	if $swap;
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP($data_off,"esp","",0),	"eax");	# put in array for call
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP($data_off+4,"esp","",0),	"ebx");	#
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&call($enc_func);
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("eax",	&DWP($data_off,"esp","",0));
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ebx",	&DWP($data_off+4,"esp","",0));
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("eax")	if $swap;
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("ebx")	if $swap;
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP(0,$out,"",0),"eax");
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP(4,$out,"",0),"ebx");
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# eax and ebx are the next iv.
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&add($in,	8);
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&add($out,	8);
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&sub($count,	8);
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jnz(&label("encrypt_loop"));
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project###################################################################3
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&set_label("encrypt_finish");
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($count,	&wparam(2));	# length
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&and($count,	7);
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jz(&label("finish"));
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&call(&label("PIC_point"));
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("PIC_point");
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&blindpop("edx");
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&lea("ecx",&DWP(&label("cbc_enc_jmp_table")."-".&label("PIC_point"),"edx"));
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($count,&DWP(0,"ecx",$count,4))
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&add($count,"edx");
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&xor("ecx","ecx");
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&xor("edx","edx");
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#&mov($count,&DWP(&label("cbc_enc_jmp_table"),"",$count,4));
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jmp_ptr($count);
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("ej7");
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&movb(&HB("edx"),	&BP(6,$in,"",0));
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&shl("edx",8);
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("ej6");
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&movb(&HB("edx"),	&BP(5,$in,"",0));
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("ej5");
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&movb(&LB("edx"),	&BP(4,$in,"",0));
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("ej4");
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ecx",		&DWP(0,$in,"",0));
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jmp(&label("ejend"));
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("ej3");
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&movb(&HB("ecx"),	&BP(2,$in,"",0));
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&shl("ecx",8);
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("ej2");
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&movb(&HB("ecx"),	&BP(1,$in,"",0));
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("ej1");
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&movb(&LB("ecx"),	&BP(0,$in,"",0));
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("ejend");
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&xor("eax",	"ecx");
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&xor("ebx",	"edx");
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("eax")	if $swap;
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("ebx")	if $swap;
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP($data_off,"esp","",0),	"eax");	# put in array for call
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP($data_off+4,"esp","",0),	"ebx");	#
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&call($enc_func);
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("eax",	&DWP($data_off,"esp","",0));
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ebx",	&DWP($data_off+4,"esp","",0));
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("eax")	if $swap;
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("ebx")	if $swap;
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP(0,$out,"",0),"eax");
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP(4,$out,"",0),"ebx");
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jmp(&label("finish"));
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#############################################################
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#############################################################
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&set_label("decrypt",1);
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# decrypt start
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&and($count,0xfffffff8);
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# The next 2 instructions are only for if the jz is taken
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("eax",	&DWP($data_off+8,"esp","",0));	# get iv[0]
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ebx",	&DWP($data_off+12,"esp","",0));	# get iv[1]
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jz(&label("decrypt_finish"));
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&set_label("decrypt_loop");
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("eax",	&DWP(0,$in,"",0));	# load first 4 bytes
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ebx",	&DWP(4,$in,"",0));	# second 4 bytes
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("eax")	if $swap;
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("ebx")	if $swap;
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP($data_off,"esp","",0),	"eax");	# put back
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP($data_off+4,"esp","",0),	"ebx");	#
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&call($dec_func);
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("eax",	&DWP($data_off,"esp","",0));	# get return
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ebx",	&DWP($data_off+4,"esp","",0));	#
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("eax")	if $swap;
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("ebx")	if $swap;
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ecx",	&DWP($data_off+8,"esp","",0));	# get iv[0]
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("edx",	&DWP($data_off+12,"esp","",0));	# get iv[1]
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&xor("ecx",	"eax");
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&xor("edx",	"ebx");
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("eax",	&DWP(0,$in,"",0));	# get old cipher text,
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ebx",	&DWP(4,$in,"",0));	# next iv actually
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP(0,$out,"",0),"ecx");
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP(4,$out,"",0),"edx");
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP($data_off+8,"esp","",0),	"eax");	# save iv
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP($data_off+12,"esp","",0),	"ebx");	#
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&add($in,	8);
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&add($out,	8);
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&sub($count,	8);
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jnz(&label("decrypt_loop"));
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project############################ ENDIT #######################3
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&set_label("decrypt_finish");
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov($count,	&wparam(2));	# length
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&and($count,	7);
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jz(&label("finish"));
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("eax",	&DWP(0,$in,"",0));	# load first 4 bytes
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ebx",	&DWP(4,$in,"",0));	# second 4 bytes
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("eax")	if $swap;
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("ebx")	if $swap;
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP($data_off,"esp","",0),	"eax");	# put back
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP($data_off+4,"esp","",0),	"ebx");	#
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&call($dec_func);
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("eax",	&DWP($data_off,"esp","",0));	# get return
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ebx",	&DWP($data_off+4,"esp","",0));	#
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("eax")	if $swap;
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&bswap("ebx")	if $swap;
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ecx",	&DWP($data_off+8,"esp","",0));	# get iv[0]
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("edx",	&DWP($data_off+12,"esp","",0));	# get iv[1]
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&xor("ecx",	"eax");
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&xor("edx",	"ebx");
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# this is for when we exit
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("eax",	&DWP(0,$in,"",0));	# get old cipher text,
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ebx",	&DWP(4,$in,"",0));	# next iv actually
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("dj7");
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&rotr("edx",	16);
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&movb(&BP(6,$out,"",0),	&LB("edx"));
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&shr("edx",16);
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("dj6");
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&movb(&BP(5,$out,"",0),	&HB("edx"));
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("dj5");
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&movb(&BP(4,$out,"",0),	&LB("edx"));
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("dj4");
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP(0,$out,"",0),	"ecx");
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jmp(&label("djend"));
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("dj3");
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&rotr("ecx",	16);
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&movb(&BP(2,$out,"",0),	&LB("ecx"));
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&shl("ecx",16);
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("dj2");
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&movb(&BP(1,$in,"",0),	&HB("ecx"));
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("dj1");
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&movb(&BP(0,$in,"",0),	&LB("ecx"));
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&set_label("djend");
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# final iv is still in eax:ebx
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&jmp(&label("finish"));
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project############################ FINISH #######################3
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&set_label("finish",1);
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov("ecx",	&wparam($iv_off));	# Get iv ptr
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#################################################
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$total=16+4;
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$total+=4 if ($p1 > 0);
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$total+=4 if ($p2 > 0);
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	$total+=4 if ($p3 > 0);
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&add("esp",$total);
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP(0,"ecx","",0),	"eax");	# save iv
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&mov(&DWP(4,"ecx","",0),	"ebx");	# save iv
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&function_end_A($name);
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&align(64);
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&set_label("cbc_enc_jmp_table");
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_word("0");
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_word(&label("ej1")."-".&label("PIC_point"));
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_word(&label("ej2")."-".&label("PIC_point"));
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_word(&label("ej3")."-".&label("PIC_point"));
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_word(&label("ej4")."-".&label("PIC_point"));
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_word(&label("ej5")."-".&label("PIC_point"));
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_word(&label("ej6")."-".&label("PIC_point"));
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&data_word(&label("ej7")."-".&label("PIC_point"));
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	# not used
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#&set_label("cbc_dec_jmp_table",1);
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#&data_word("0");
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#&data_word(&label("dj1")."-".&label("PIC_point"));
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#&data_word(&label("dj2")."-".&label("PIC_point"));
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#&data_word(&label("dj3")."-".&label("PIC_point"));
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#&data_word(&label("dj4")."-".&label("PIC_point"));
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#&data_word(&label("dj5")."-".&label("PIC_point"));
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#&data_word(&label("dj6")."-".&label("PIC_point"));
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	#&data_word(&label("dj7")."-".&label("PIC_point"));
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&align(64);
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	&function_end_B($name);
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project1;
350