File Coverage

blib/lib/Webqq/Encryption/TEA/Perl.pm
Criterion Covered Total %
statement 3 222 1.3
branch 0 54 0.0
condition 0 6 0.0
subroutine 1 14 7.1
pod 0 13 0.0
total 4 309 1.2


line stmt bran cond sub pod time code
1             package Webqq::Encryption::TEA::Perl;
2 1     1   5 use strict;
  1         1  
  1         2106  
3             my $r = "";
4             my $a = 0;
5             my @g = ();
6             my @w = ();
7             my $x = 0;
8             my $t = 0;
9             my @l = ();
10             my @s = ();
11             my $m = 1;
12             sub e{
13 0     0 0   return int(0.5+ rand() * 4294967295 );
14             }
15             sub i{
16 0     0 0   my($B,$C,$y) = @_;
17 0 0 0       if (!$y || $y > 4) {
18 0           $y = 4;
19             }
20 0           my $z = 0;
21 0           for (my $A = $C; $A < $C + $y; $A++) {
22 0           $z <<= 8;
23 0           $z |= $B->[$A];
24             }
25 0           return ($z & 4294967295) >> 0;
26             }
27             sub b {
28 0     0 0   my($z, $A, $y) = @_;
29 0           $z->[$A + 3] = ($y >> 0) & 255;
30 0           $z->[$A + 2] = ($y >> 8) & 255;
31 0           $z->[$A + 1] = ($y >> 16) & 255;
32 0           $z->[$A + 0] = ($y >> 24) & 255;
33             }
34              
35             sub v {
36 0     0 0   my($B) = @_;
37 0 0         if(!@$B){
38 0           return "";
39             }
40 0           my $y = "";
41 0           for (my $z = 0; $z < @$B; $z++) {
42 0           my $A = sprintf "%x",$B->[$z]+0;
43 0 0         if(length($A) == 1){
44 0           $A = "0" . $A;
45             }
46 0           $y .= $A;
47             }
48 0           return $y;
49             }
50              
51             sub u {
52 0     0 0   my ($z) = @_;
53 0           my $A = "";
54 0           for( my $y =0;$y
55 0           $A .= chr(hex(substr($z,$y,2)));
56             }
57 0           return $A;
58             }
59              
60             sub c {
61 0     0 0   my ($A) = @_;
62 0 0         if(!$A){
63 0           return "";
64             }
65 0           my @z;
66 0           for (my $y = 0; $y < length($A); $y++) {
67 0           $z[$y] = ord(substr($A,$y,1));
68             }
69 0           return v(\@z);
70             }
71             sub h{
72 0     0 0   my ($A) = @_;
73 0           $x = $t = 0;
74 0           $m = 1;
75 0           $a = 0;
76 0           my $y = @$A;
77 0           my $B = 0;
78 0           $a = ($y + 10) % 8;
79 0 0         $a = 8 - $a if $a!=0;
80 0           $g[0] = ((e() & 248) | $a) & 255;
81 0           for (my $z = 1; $z <= $a; $z++) {
82 0           $g[$z] = e() & 255;
83             }
84 0           $a++;
85 0           for (my $z = 0; $z < 8; $z++) {
86 0           $w[$z] = 0;
87             }
88 0           $B = 1;
89 0           while ($B <= 2) {
90 0 0         if ($a < 8) {
91 0           $g[$a++] = e() & 255;
92 0           $B++;
93             }
94 0 0         if ($a == 8) {
95 0           for (my $y = 0; $y < 8; $y++) {
96 0 0         if ($m) {
97 0           $g[$y] ^= $w[$y];
98             }
99             else{
100 0           $g[$y] ^= $l[$t + $y];
101             }
102             }
103 0           my $z = j(\@g);
104 0           for (my $y = 0; $y < 8; $y++) {
105 0           $l[$x + $y] = $z->[$y] ^ $w[$y];
106 0           $w[$y] = $g[$y];
107             }
108 0           $t = $x;
109 0           $x += 8;
110 0           $a = 0;
111 0           $m = 0;
112             }
113             }
114 0           my $z = 0;
115 0           while ($y > 0) {
116 0 0         if ($a < 8) {
117 0           $g[$a++] = $A->[$z++];
118 0           $y--;
119             }
120 0 0         if ($a == 8) {
121 0           for (my $y = 0; $y < 8; $y++) {
122 0 0         if ($m) {
123 0           $g[$y] ^= $w[$y];
124             }
125             else{
126 0           $g[$y] ^= $l[$t + $y];
127             }
128             }
129 0           my $z = j(\@g);
130 0           for (my $y = 0; $y < 8; $y++) {
131 0           $l[$x + $y] = $z->[$y] ^ $w[$y];
132 0           $w[$y] = $g[$y];
133             }
134 0           $t = $x;
135 0           $x += 8;
136 0           $a = 0;
137 0           $m = 0;
138             }
139             }
140              
141 0           $B = 1;
142 0           while ($B <= 7) {
143 0 0         if ($a < 8) {
144 0           $g[$a++] = 0;
145 0           $B++;
146             }
147 0 0         if ($a == 8) {
148 0           for (my $y = 0; $y < 8; $y++) {
149 0 0         if ($m) {
150 0           $g[$y] ^= $w[$y];
151             }
152             else{
153 0           $g[$y] ^= $l[$t + $y];
154             }
155             }
156 0           my $z = j(\@g);
157 0           for (my $y = 0; $y < 8; $y++) {
158 0           $l[$x + $y] = $z->[$y] ^ $w[$y];
159 0           $w[$y] = $g[$y];
160             }
161 0           $t = $x;
162 0           $x += 8;
163 0           $a = 0;
164 0           $m = 0;
165             }
166             }
167 0           return \@l;
168             }
169              
170             sub p {
171 0     0 0   my ($C) = @_;
172 0           my $B = 0;
173 0           my @z ;#length 8
174 0           my $y = @$C;
175 0           @s = @$C;
176 0 0 0       if ($y % 8 != 0 or $y < 16) {
177 0           return undef;
178             }
179 0           @w = k($C);
180 0           $a = $w[0] & 7;
181 0           $B = $y - $a - 10;
182 0 0         return undef if $B <0;
183 0           for (my $A = 0; $A < 8; $A++) {
184 0           $z[$A] = 0;
185             }
186              
187 0           $t = 0;
188 0           $x = 8;
189 0           $a++;
190 0           my $D = 1;
191 0           while ($D <= 2) {
192 0 0         if ($a < 8) {
193 0           $a++;
194 0           $D++;
195             }
196 0 0         if ($a == 8) {
197 0           @z = @$C;
198             }
199 0 0         if (!f()) {return undef}
  0            
200             }
201              
202 0           my $A = 0;
203 0           while ($B != 0) {
204 0 0         if ($a < 8) {
205 0           $l[$A] = ($z[$t + $a] ^ $w[$a]) & 255;
206 0           $A++;
207 0           $B--;
208 0           $a++;
209             }
210 0 0         if ($a == 8) {
211 0           @z = @$C;
212 0           $t = $x - 8;
213 0 0         if (!f()) {return undef}
  0            
214             }
215             }
216              
217 0           for ($D = 1; $D < 8; $D++) {
218 0 0         if ($a < 8) {
219 0 0         if (($z[$t + $a] ^ $w[$a]) != 0) {
220 0           return undef;
221             }
222 0           $a++;
223             }
224 0 0         if ($a == 8) {
225 0           @z = @$C;
226 0           $t = $x;
227 0 0         if (!f()) {return undef}
  0            
228             }
229             }
230              
231 0           return \@l;
232             }
233              
234             sub j {
235 0     0 0   my $A = shift;
236 0           my $B = 16;
237 0           my $G = i($A, 0, 4);
238 0           my $F = i($A, 4, 4);
239 0           my $I = i($r, 0, 4);
240 0           my $H = i($r, 4, 4);
241 0           my $E = i($r, 8, 4);
242 0           my $D = i($r, 12, 4);
243 0           my $C = 0;
244 0           my $J = 2654435769 >> 0;
245 0           while ($B-- > 0) {
246 0           $C += $J;
247 0           $C = ($C & 4294967295) >> 0;
248 0           $G += (($F << 4) + $I) ^ ($F + $C) ^ (($F >> 5) + $H);
249 0           $G = ($G & 4294967295) >> 0;
250 0           $F += (($G << 4) + $E) ^ ($G + $C) ^ (($G >> 5) + $D);
251 0           $F = ($F & 4294967295) >> 0
252             }
253 0           my @K;
254 0           b(\@K, 0, $G);
255 0           b(\@K, 4, $F);
256 0           return \@K;
257             }
258              
259             sub k {
260 0     0 0   my $A = shift;
261 0           my $B = 16;
262 0           my $G = i($A, 0, 4);
263 0           my $F = i($A, 4, 4);
264 0           my $I = i($r, 0, 4);
265 0           my $H = i($r, 4, 4);
266 0           my $E = i($r, 8, 4);
267 0           my $D = i($r, 12, 4);
268 0           my $C = 3816266640 >> 0;
269 0           my $J = 2654435769 >> 0;
270 0           while ($B-- > 0) {
271 0           $F -= (($G << 4) + $E) ^ ($G + $C) ^ (($G >> 5) + $D);
272 0           $F = ($F & 4294967295) >> 0;
273 0           $G -= (($F << 4) +$I) ^ ($F + $C) ^ (($F >> 5) + $H);
274 0           $G = ($G & 4294967295) >> 0;
275 0           $C -= $J;
276 0           $C = ($C & 4294967295) >> 0
277             }
278 0           my @K;
279 0           b(\@K, 0, $G);
280 0           b(\@K, 4, $F);
281             return \@K
282 0           }
283              
284             sub f {
285 0     0 0   my $y = @s;
286 0           for (my $z = 0; $z < 8; $z++) {
287 0           $w[$z] ^= $s[$x + $z]
288             }
289 0           @w = k(\@w);
290 0           $x += 8;
291 0           $a = 0;
292 0           return 1;
293             }
294              
295             sub n{
296 0     0 0   my($C,$B) = @_;
297 0           my @A;
298 0 0         if ($B) {
299 0           for (my $z = 0; $z < length($C); $z++) {
300 0           $A[$z] = ord(substr($C,$z,1)) & 255;
301             }
302             } else {
303 0           my $y = 0;
304 0           for (my $z = 0; $z < length($C); $z += 2) {
305 0           $A[$y++] = hex(substr($C,$z,2));
306             }
307             }
308 0           return \@A;
309             }
310              
311             sub encrypt {
312 0     0 0   my($key,$data) = @_;
313 0           $r = n($key);
314 0           my $B = n($data);
315 0           my $A = h($B);
316 0           my $y = "";
317 0           for (my $z = 0; $z < @$A; $z++) {
318 0           $y .= chr($A->[$z]);
319             }
320 0           return $y;
321             }
322             1;