xref: /freebsd/crypto/openssl/crypto/rc5/asm/rc5-586.pl (revision b077aed33b7b6aefca7b17ddb250cf521f938613)
1e71b7053SJung-uk Kim#! /usr/bin/env perl
217f01e99SJung-uk Kim# Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
3e71b7053SJung-uk Kim#
4*b077aed3SPierre Pronchery# Licensed under the Apache License 2.0 (the "License").  You may not use
5e71b7053SJung-uk Kim# this file except in compliance with the License.  You can obtain a copy
6e71b7053SJung-uk Kim# in the file LICENSE in the source distribution or at
7e71b7053SJung-uk Kim# https://www.openssl.org/source/license.html
8e71b7053SJung-uk Kim
974664626SKris Kennaway
101f13597dSJung-uk Kim$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
111f13597dSJung-uk Kimpush(@INC,"${dir}","${dir}../../perlasm");
1274664626SKris Kennawayrequire "x86asm.pl";
1374664626SKris Kennawayrequire "cbc.pl";
1474664626SKris Kennaway
15*b077aed3SPierre Pronchery$output = pop and open STDOUT,">$output";
16e71b7053SJung-uk Kim
17e71b7053SJung-uk Kim&asm_init($ARGV[0]);
1874664626SKris Kennaway
1974664626SKris Kennaway$RC5_MAX_ROUNDS=16;
2074664626SKris Kennaway$RC5_32_OFF=($RC5_MAX_ROUNDS+2)*4;
2174664626SKris Kennaway$A="edi";
2274664626SKris Kennaway$B="esi";
2374664626SKris Kennaway$S="ebp";
2474664626SKris Kennaway$tmp1="eax";
2574664626SKris Kennaway$r="ebx";
2674664626SKris Kennaway$tmpc="ecx";
2774664626SKris Kennaway$tmp4="edx";
2874664626SKris Kennaway
2974664626SKris Kennaway&RC5_32_encrypt("RC5_32_encrypt",1);
3074664626SKris Kennaway&RC5_32_encrypt("RC5_32_decrypt",0);
3174664626SKris Kennaway&cbc("RC5_32_cbc_encrypt","RC5_32_encrypt","RC5_32_decrypt",0,4,5,3,-1,-1);
3274664626SKris Kennaway&asm_finish();
3374664626SKris Kennaway
3417f01e99SJung-uk Kimclose STDOUT or die "error closing STDOUT: $!";
35e71b7053SJung-uk Kim
3674664626SKris Kennawaysub RC5_32_encrypt
3774664626SKris Kennaway	{
3874664626SKris Kennaway	local($name,$enc)=@_;
3974664626SKris Kennaway
4074664626SKris Kennaway	&function_begin_B($name,"");
4174664626SKris Kennaway
4274664626SKris Kennaway	&comment("");
4374664626SKris Kennaway
4474664626SKris Kennaway	&push("ebp");
4574664626SKris Kennaway	 &push("esi");
4674664626SKris Kennaway	&push("edi");
4774664626SKris Kennaway	 &mov($tmp4,&wparam(0));
4874664626SKris Kennaway	&mov($S,&wparam(1));
4974664626SKris Kennaway
5074664626SKris Kennaway	&comment("Load the 2 words");
5174664626SKris Kennaway	 &mov($A,&DWP(0,$tmp4,"",0));
5274664626SKris Kennaway	&mov($B,&DWP(4,$tmp4,"",0));
5374664626SKris Kennaway
5474664626SKris Kennaway	&push($r);
5574664626SKris Kennaway	 &mov($r,	&DWP(0,$S,"",0));
5674664626SKris Kennaway
5774664626SKris Kennaway	# encrypting part
5874664626SKris Kennaway
5974664626SKris Kennaway	if ($enc)
6074664626SKris Kennaway		{
6174664626SKris Kennaway		 &add($A,	&DWP(4+0,$S,"",0));
6274664626SKris Kennaway		&add($B,	&DWP(4+4,$S,"",0));
6374664626SKris Kennaway
6474664626SKris Kennaway		for ($i=0; $i<$RC5_MAX_ROUNDS; $i++)
6574664626SKris Kennaway			{
6674664626SKris Kennaway			 &xor($A,	$B);
6774664626SKris Kennaway			&mov($tmp1,	&DWP(12+$i*8,$S,"",0));
6874664626SKris Kennaway			 &mov($tmpc,	$B);
6974664626SKris Kennaway			&rotl($A,	&LB("ecx"));
7074664626SKris Kennaway			&add($A,	$tmp1);
7174664626SKris Kennaway
7274664626SKris Kennaway			 &xor($B,	$A);
7374664626SKris Kennaway			&mov($tmp1,	&DWP(16+$i*8,$S,"",0));
7474664626SKris Kennaway			 &mov($tmpc,	$A);
7574664626SKris Kennaway			&rotl($B,	&LB("ecx"));
7674664626SKris Kennaway			&add($B,	$tmp1);
7774664626SKris Kennaway			if (($i == 7) || ($i == 11))
7874664626SKris Kennaway				{
7974664626SKris Kennaway			 &cmp($r,	$i+1);
8074664626SKris Kennaway			&je(&label("rc5_exit"));
8174664626SKris Kennaway				}
8274664626SKris Kennaway			}
8374664626SKris Kennaway		}
8474664626SKris Kennaway	else
8574664626SKris Kennaway		{
8674664626SKris Kennaway		 &cmp($r,	12);
8774664626SKris Kennaway		&je(&label("rc5_dec_12"));
8874664626SKris Kennaway		 &cmp($r,	8);
8974664626SKris Kennaway		&je(&label("rc5_dec_8"));
9074664626SKris Kennaway		for ($i=$RC5_MAX_ROUNDS; $i > 0; $i--)
9174664626SKris Kennaway			{
9274664626SKris Kennaway			&set_label("rc5_dec_$i") if ($i == 12) || ($i == 8);
9374664626SKris Kennaway			 &mov($tmp1,	&DWP($i*8+8,$S,"",0));
9474664626SKris Kennaway			&sub($B,	$tmp1);
9574664626SKris Kennaway			 &mov($tmpc,	$A);
9674664626SKris Kennaway			&rotr($B,	&LB("ecx"));
9774664626SKris Kennaway			&xor($B,	$A);
9874664626SKris Kennaway
9974664626SKris Kennaway			 &mov($tmp1,	&DWP($i*8+4,$S,"",0));
10074664626SKris Kennaway			&sub($A,	$tmp1);
10174664626SKris Kennaway			 &mov($tmpc,	$B);
10274664626SKris Kennaway			&rotr($A,	&LB("ecx"));
10374664626SKris Kennaway			&xor($A,	$B);
10474664626SKris Kennaway			}
10574664626SKris Kennaway		 &sub($B,	&DWP(4+4,$S,"",0));
10674664626SKris Kennaway		&sub($A,	&DWP(4+0,$S,"",0));
10774664626SKris Kennaway		}
10874664626SKris Kennaway
10974664626SKris Kennaway	&set_label("rc5_exit");
11074664626SKris Kennaway	 &mov(&DWP(0,$tmp4,"",0),$A);
11174664626SKris Kennaway	&mov(&DWP(4,$tmp4,"",0),$B);
11274664626SKris Kennaway
11374664626SKris Kennaway	 &pop("ebx");
11474664626SKris Kennaway	&pop("edi");
11574664626SKris Kennaway	 &pop("esi");
11674664626SKris Kennaway	&pop("ebp");
11774664626SKris Kennaway	 &ret();
11874664626SKris Kennaway	&function_end_B($name);
11974664626SKris Kennaway	}
12074664626SKris Kennaway
12174664626SKris Kennaway
122