]>
Commit | Line | Data |
---|---|---|
e0a65194 RS |
1 | #! /usr/bin/env perl |
2 | # Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. | |
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; |
11 | push(@INC,"${dir}","${dir}../../perlasm"); | |
58964a49 RE |
12 | require "x86asm.pl"; |
13 | require "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 | 34 | close STDOUT or die "error closing STDOUT: $!"; |
ac9888e5 | 35 | |
58964a49 RE |
36 | sub 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 |