diff options
Diffstat (limited to 'src/lib/libcrypto/cast/asm/cast-586.pl')
-rw-r--r-- | src/lib/libcrypto/cast/asm/cast-586.pl | 267 |
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"); | |||
7 | require "x86asm.pl"; | 7 | require "x86asm.pl"; |
8 | require "cbc.pl"; | 8 | require "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 | ||
35 | sub CAST_encrypt | 35 | sub CAST_encrypt { |
36 | { | 36 | local($name,$enc)=@_; |
37 | local($name,$enc)=@_; | ||
38 | 37 | ||
39 | local($win_ex)=<<"EOF"; | 38 | local($win_ex)=<<"EOF"; |
40 | EXTERN _CAST_S_table0:DWORD | 39 | EXTERN _CAST_S_table0:DWORD |
41 | EXTERN _CAST_S_table1:DWORD | 40 | EXTERN _CAST_S_table1:DWORD |
42 | EXTERN _CAST_S_table2:DWORD | 41 | EXTERN _CAST_S_table2:DWORD |
43 | EXTERN _CAST_S_table3:DWORD | 42 | EXTERN _CAST_S_table3:DWORD |
44 | EOF | 43 | EOF |
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); | |
116 | sub 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 | { | 129 | sub 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 | |||