cbc.pl revision 7c478bd95313f5f23a4c958a745db2134aa03244
# void des_ncbc_encrypt(input, output, length, schedule, ivec, enc)
# des_cblock (*input);
# des_cblock (*output);
# long length;
# des_key_schedule schedule;
# des_cblock (*ivec);
# int enc;
#
# calls
# des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT);
#
#&cbc("des_ncbc_encrypt","des_encrypt",0);
#&cbc("BF_cbc_encrypt","BF_encrypt","BF_encrypt",
# 1,4,5,3,5,-1);
#&cbc("des_ncbc_encrypt","des_encrypt","des_encrypt",
# 0,4,5,3,5,-1);
#&cbc("des_ede3_cbc_encrypt","des_encrypt3","des_decrypt3",
# 0,6,7,3,4,5);
#
# When doing a cipher that needs bigendian order,
# for encrypt, the iv is kept in bigendian form,
# while for decrypt, it is kept in little endian.
sub cbc
{
# name is the function name
# swap is true if byte order needs to be reversed
# iv_off is parameter number for the iv
# p1,p2,p3 are the offsets for parameters to be passed to the
# underlying calls.
&comment("");
$in="esi";
$out="edi";
$count="ebp";
&push("ebp");
&push("ebx");
&push("esi");
&push("edi");
$data_off=4;
&comment("getting iv ptr from parameter $iv_off");
# We have loaded them all, how lets push things
&comment("getting encrypt flag from parameter $enc_off");
if ($p3 > 0)
{
&comment("get and push parameter $p3");
else { &push("ecx"); }
}
if ($p2 > 0)
{
&comment("get and push parameter $p2");
else { &push("ecx"); }
}
if ($p1 > 0)
{
&comment("get and push parameter $p1");
else { &push("ecx"); }
}
#############################################################
&set_label("encrypt_loop");
# encrypt start
# "eax" and "ebx" hold iv (or the last cipher text)
# eax and ebx are the next iv.
###################################################################3
&set_label("encrypt_finish");
&set_label("PIC_point");
&blindpop("edx");
#&mov($count,&DWP(&label("cbc_enc_jmp_table"),"",$count,4));
&set_label("ej7");
&set_label("ej6");
&set_label("ej5");
&set_label("ej4");
&set_label("ej3");
&set_label("ej2");
&set_label("ej1");
&set_label("ejend");
#############################################################
#############################################################
# decrypt start
# The next 2 instructions are only for if the jz is taken
&set_label("decrypt_loop");
############################ ENDIT #######################3
&set_label("decrypt_finish");
# this is for when we exit
&set_label("dj7");
&set_label("dj6");
&set_label("dj5");
&set_label("dj4");
&set_label("dj3");
&set_label("dj2");
&set_label("dj1");
&set_label("djend");
# final iv is still in eax:ebx
############################ FINISH #######################3
#################################################
&function_end_A($name);
&data_word("0");
# 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);
}
1;