]> git.ipfire.org Git - thirdparty/openssl.git/blame - crypto/rc5/asm/rc5-586.pl
Update copyright year
[thirdparty/openssl.git] / crypto / rc5 / asm / rc5-586.pl
CommitLineData
e0a65194 1#! /usr/bin/env perl
33388b44 2# Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
e0a65194 3#
5e4435a7 4# Licensed under the Apache License 2.0 (the "License"). You may not use
e0a65194
RS
5# this file except in compliance with the License. You can obtain a copy
6# in the file LICENSE in the source distribution or at
7# https://www.openssl.org/source/license.html
8
58964a49 9
339ad7ce
AP
10$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
11push(@INC,"${dir}","${dir}../../perlasm");
58964a49
RE
12require "x86asm.pl";
13require "cbc.pl";
14
1aa89a7a 15$output = pop and open STDOUT,">$output";
ac9888e5 16
e195c8a2 17&asm_init($ARGV[0]);
58964a49
RE
18
19$RC5_MAX_ROUNDS=16;
20$RC5_32_OFF=($RC5_MAX_ROUNDS+2)*4;
21$A="edi";
22$B="esi";
23$S="ebp";
24$tmp1="eax";
25$r="ebx";
26$tmpc="ecx";
27$tmp4="edx";
28
29&RC5_32_encrypt("RC5_32_encrypt",1);
30&RC5_32_encrypt("RC5_32_decrypt",0);
31&cbc("RC5_32_cbc_encrypt","RC5_32_encrypt","RC5_32_decrypt",0,4,5,3,-1,-1);
32&asm_finish();
33
a21314db 34close STDOUT or die "error closing STDOUT: $!";
ac9888e5 35
58964a49
RE
36sub RC5_32_encrypt
37 {
38 local($name,$enc)=@_;
39
40 &function_begin_B($name,"");
41
42 &comment("");
43
44 &push("ebp");
45 &push("esi");
46 &push("edi");
47 &mov($tmp4,&wparam(0));
48 &mov($S,&wparam(1));
49
50 &comment("Load the 2 words");
51 &mov($A,&DWP(0,$tmp4,"",0));
52 &mov($B,&DWP(4,$tmp4,"",0));
53
54 &push($r);
55 &mov($r, &DWP(0,$S,"",0));
56
57 # encrypting part
58
59 if ($enc)
60 {
61 &add($A, &DWP(4+0,$S,"",0));
62 &add($B, &DWP(4+4,$S,"",0));
63
64 for ($i=0; $i<$RC5_MAX_ROUNDS; $i++)
65 {
66 &xor($A, $B);
67 &mov($tmp1, &DWP(12+$i*8,$S,"",0));
68 &mov($tmpc, $B);
69 &rotl($A, &LB("ecx"));
70 &add($A, $tmp1);
71
72 &xor($B, $A);
73 &mov($tmp1, &DWP(16+$i*8,$S,"",0));
74 &mov($tmpc, $A);
75 &rotl($B, &LB("ecx"));
76 &add($B, $tmp1);
77 if (($i == 7) || ($i == 11))
78 {
79 &cmp($r, $i+1);
80 &je(&label("rc5_exit"));
81 }
82 }
83 }
84 else
85 {
86 &cmp($r, 12);
87 &je(&label("rc5_dec_12"));
88 &cmp($r, 8);
89 &je(&label("rc5_dec_8"));
90 for ($i=$RC5_MAX_ROUNDS; $i > 0; $i--)
91 {
92 &set_label("rc5_dec_$i") if ($i == 12) || ($i == 8);
93 &mov($tmp1, &DWP($i*8+8,$S,"",0));
94 &sub($B, $tmp1);
95 &mov($tmpc, $A);
96 &rotr($B, &LB("ecx"));
97 &xor($B, $A);
98
99 &mov($tmp1, &DWP($i*8+4,$S,"",0));
100 &sub($A, $tmp1);
101 &mov($tmpc, $B);
102 &rotr($A, &LB("ecx"));
103 &xor($A, $B);
104 }
105 &sub($B, &DWP(4+4,$S,"",0));
106 &sub($A, &DWP(4+0,$S,"",0));
107 }
108
109 &set_label("rc5_exit");
110 &mov(&DWP(0,$tmp4,"",0),$A);
111 &mov(&DWP(4,$tmp4,"",0),$B);
112
113 &pop("ebx");
114 &pop("edi");
115 &pop("esi");
116 &pop("ebp");
117 &ret();
118 &function_end_B($name);
119 }
120
121