summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/cast/asm/cast-586.pl
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/cast/asm/cast-586.pl')
-rw-r--r--src/lib/libcrypto/cast/asm/cast-586.pl267
1 files changed, 138 insertions, 129 deletions
diff --git a/src/lib/libcrypto/cast/asm/cast-586.pl b/src/lib/libcrypto/cast/asm/cast-586.pl
index d0be004c99..6be0bfe572 100644
--- a/src/lib/libcrypto/cast/asm/cast-586.pl
+++ b/src/lib/libcrypto/cast/asm/cast-586.pl
@@ -1,4 +1,4 @@
1#!/usr/bin/perl 1#!/usr/local/bin/perl
2 2
3# define for pentium pro friendly version 3# define for pentium pro friendly version
4$ppro=1; 4$ppro=1;
@@ -7,7 +7,7 @@ push(@INC,"perlasm","../../perlasm");
7require "x86asm.pl"; 7require "x86asm.pl";
8require "cbc.pl"; 8require "cbc.pl";
9 9
10&asm_init($ARGV[0],"cast-586.pl"); 10&asm_init($ARGV[0],"cast-586.pl",$ARGV[$#ARGV] eq "386");
11 11
12$CAST_ROUNDS=16; 12$CAST_ROUNDS=16;
13$L="edi"; 13$L="edi";
@@ -32,136 +32,145 @@ $S4="CAST_S_table3";
32 32
33&asm_finish(); 33&asm_finish();
34 34
35sub CAST_encrypt 35sub CAST_encrypt {
36 { 36 local($name,$enc)=@_;
37 local($name,$enc)=@_;
38 37
39 local($win_ex)=<<"EOF"; 38 local($win_ex)=<<"EOF";
40EXTERN _CAST_S_table0:DWORD 39EXTERN _CAST_S_table0:DWORD
41EXTERN _CAST_S_table1:DWORD 40EXTERN _CAST_S_table1:DWORD
42EXTERN _CAST_S_table2:DWORD 41EXTERN _CAST_S_table2:DWORD
43EXTERN _CAST_S_table3:DWORD 42EXTERN _CAST_S_table3:DWORD
44EOF 43EOF
45 &main'external_label( 44 &main::external_label(
46 "CAST_S_table0", 45 "CAST_S_table0",
47 "CAST_S_table1", 46 "CAST_S_table1",
48 "CAST_S_table2", 47 "CAST_S_table2",
49 "CAST_S_table3", 48 "CAST_S_table3",
50 ); 49 );
51 50
52 &function_begin_B($name,$win_ex); 51 &function_begin_B($name,$win_ex);
53 52
54 &comment(""); 53 &comment("");
55 54
56 &push("ebp"); 55 &push("ebp");
57 &push("ebx"); 56 &push("ebx");
58 &mov($tmp2,&wparam(0)); 57 &mov($tmp2,&wparam(0));
59 &mov($K,&wparam(1)); 58 &mov($K,&wparam(1));
60 &push("esi"); 59 &push("esi");
61 &push("edi"); 60 &push("edi");
62 61
63 &comment("Load the 2 words"); 62 &comment("Load the 2 words");
64 &mov($L,&DWP(0,$tmp2,"",0)); 63 &mov($L,&DWP(0,$tmp2,"",0));
65 &mov($R,&DWP(4,$tmp2,"",0)); 64 &mov($R,&DWP(4,$tmp2,"",0));
66 65
67 &xor( $tmp3, $tmp3); 66 &comment('Get short key flag');
68 67 &mov($tmp3,&DWP(128,$K,"",0));
69 # encrypting part 68 if($enc) {
70 69 &push($tmp3);
71 if ($enc) 70 } else {
72 { 71 &or($tmp3,$tmp3);
73 &E_CAST( 0,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4); 72 &jnz(&label('cast_dec_skip'));
74 &E_CAST( 1,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4); 73 }
75 &E_CAST( 2,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4); 74
76 &E_CAST( 3,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4); 75 &xor($tmp3, $tmp3);
77 &E_CAST( 4,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4); 76
78 &E_CAST( 5,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4); 77 # encrypting part
79 &E_CAST( 6,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4); 78
80 &E_CAST( 7,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4); 79 if ($enc) {
81 &E_CAST( 8,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4); 80 &E_CAST( 0,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
82 &E_CAST( 9,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4); 81 &E_CAST( 1,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
83 &E_CAST(10,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4); 82 &E_CAST( 2,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
84 &E_CAST(11,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4); 83 &E_CAST( 3,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
85 &E_CAST(12,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4); 84 &E_CAST( 4,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
86 &E_CAST(13,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4); 85 &E_CAST( 5,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
87 &E_CAST(14,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4); 86 &E_CAST( 6,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
88 &E_CAST(15,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4,1); 87 &E_CAST( 7,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
89 } 88 &E_CAST( 8,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
90 else 89 &E_CAST( 9,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
91 { 90 &E_CAST(10,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
92 &E_CAST(15,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4); 91 &E_CAST(11,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
93 &E_CAST(14,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4); 92 &comment('test short key flag');
94 &E_CAST(13,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4); 93 &pop($tmp4);
95 &E_CAST(12,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4); 94 &or($tmp4,$tmp4);
96 &E_CAST(11,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4); 95 &jnz(&label('cast_enc_done'));
97 &E_CAST(10,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4); 96 &E_CAST(12,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
98 &E_CAST( 9,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4); 97 &E_CAST(13,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
99 &E_CAST( 8,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4); 98 &E_CAST(14,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
100 &E_CAST( 7,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4); 99 &E_CAST(15,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
101 &E_CAST( 6,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4); 100 } else {
102 &E_CAST( 5,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4); 101 &E_CAST(15,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
103 &E_CAST( 4,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4); 102 &E_CAST(14,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
104 &E_CAST( 3,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4); 103 &E_CAST(13,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
105 &E_CAST( 2,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4); 104 &E_CAST(12,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
106 &E_CAST( 1,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4); 105 &set_label('cast_dec_skip');
107 &E_CAST( 0,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4,1); 106 &E_CAST(11,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
108 } 107 &E_CAST(10,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
109 108 &E_CAST( 9,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
110 &nop(); 109 &E_CAST( 8,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
111 &mov(&DWP(4,$tmp3,"",0),$L); 110 &E_CAST( 7,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
112 &mov(&DWP(0,$tmp3,"",0),$R); 111 &E_CAST( 6,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
113 &function_end($name); 112 &E_CAST( 5,$S,$L,$R,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
114 } 113 &E_CAST( 4,$S,$R,$L,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
115 114 &E_CAST( 3,$S,$L,$R,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
116sub E_CAST 115 &E_CAST( 2,$S,$R,$L,$K,@F3,$tmp1,$tmp2,$tmp3,$tmp4);
117 { 116 &E_CAST( 1,$S,$L,$R,$K,@F2,$tmp1,$tmp2,$tmp3,$tmp4);
118 local($i,$S,$L,$R,$K,$OP1,$OP2,$OP3,$tmp1,$tmp2,$tmp3,$tmp4,$lst)=@_; 117 &E_CAST( 0,$S,$R,$L,$K,@F1,$tmp1,$tmp2,$tmp3,$tmp4);
119 # Ri needs to have 16 pre added. 118 }
120 119
121 &comment("round $i"); 120 &set_label('cast_enc_done') if $enc;
122 &mov( $tmp4, &DWP($i*8,$K,"",1)); 121# Why the nop? - Ben 17/1/99
123 122 &nop();
124 &mov( $tmp1, &DWP($i*8+4,$K,"",1));# must be word 123 &mov($tmp3,&wparam(0));
125 &$OP1( $tmp4, $R); 124 &mov(&DWP(4,$tmp3,"",0),$L);
126 125 &mov(&DWP(0,$tmp3,"",0),$R);
127 &rotl( $tmp4, &LB($tmp1)); 126 &function_end($name);
128 127}
129 if ($ppro) 128
130 { 129sub E_CAST {
131 &mov( $tmp2, $tmp4); # B 130 local($i,$S,$L,$R,$K,$OP1,$OP2,$OP3,$tmp1,$tmp2,$tmp3,$tmp4)=@_;
132 &xor( $tmp1, $tmp1); 131 # Ri needs to have 16 pre added.
133 132
134 &movb( &LB($tmp1), &HB($tmp4)); # A 133 &comment("round $i");
135 &and( $tmp2, 0xff); 134 &mov( $tmp4, &DWP($i*8,$K,"",1));
136 135
137 &shr( $tmp4, 16); # 136 &mov( $tmp1, &DWP($i*8+4,$K,"",1));
138 &xor( $tmp3, $tmp3); 137 &$OP1( $tmp4, $R);
139 } 138
140 else 139 &rotl( $tmp4, &LB($tmp1));
141 { 140
142 &mov( $tmp2, $tmp4); # B 141 if ($ppro) {
143 &movb( &LB($tmp1), &HB($tmp4)); # A # BAD BAD BAD 142 &mov( $tmp2, $tmp4); # B
144 143 &xor( $tmp1, $tmp1);
145 &shr( $tmp4, 16); # 144
146 &and( $tmp2, 0xff); 145 &movb( &LB($tmp1), &HB($tmp4)); # A
147 } 146 &and( $tmp2, 0xff);
148 147
149 &movb( &LB($tmp3), &HB($tmp4)); # C # BAD BAD BAD 148 &shr( $tmp4, 16); #
150 &and( $tmp4, 0xff); # D 149 &xor( $tmp3, $tmp3);
151 150 } else {
152 &mov( $tmp1, &DWP($S1,"",$tmp1,4)); 151 &mov( $tmp2, $tmp4); # B
153 &mov( $tmp2, &DWP($S2,"",$tmp2,4)); 152 &movb( &LB($tmp1), &HB($tmp4)); # A # BAD BAD BAD
154 153
155 &$OP2( $tmp1, $tmp2); 154 &shr( $tmp4, 16); #
156 &mov( $tmp2, &DWP($S3,"",$tmp3,4)); 155 &and( $tmp2, 0xff);
157 156 }
158 &$OP3( $tmp1, $tmp2); 157
159 &mov( $tmp2, &DWP($S4,"",$tmp4,4)); 158 &movb( &LB($tmp3), &HB($tmp4)); # C # BAD BAD BAD
160 159 &and( $tmp4, 0xff); # D
161 &$OP1( $tmp1, $tmp2); 160
162 &mov($tmp3,&wparam(0)) if $lst; 161 &mov( $tmp1, &DWP($S1,"",$tmp1,4));
163 # XXX 162 &mov( $tmp2, &DWP($S2,"",$tmp2,4));
164 163
165 &xor( $L, $tmp1); 164 &$OP2( $tmp1, $tmp2);
166 # XXX 165 &mov( $tmp2, &DWP($S3,"",$tmp3,4));
167 } 166
167 &$OP3( $tmp1, $tmp2);
168 &mov( $tmp2, &DWP($S4,"",$tmp4,4));
169
170 &$OP1( $tmp1, $tmp2);
171 # XXX
172
173 &xor( $L, $tmp1);
174 # XXX
175}
176