1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4 
5 MODULE = Crypt::Tea_JS		PACKAGE = Crypt::Tea_JS
6 PROTOTYPES: ENABLE
7 
8 void
9 tea_code(v0,v1,k0,k1,k2,k3)
10 	unsigned long v0
11 	unsigned long v1
12 	unsigned long k0
13 	unsigned long k1
14 	unsigned long k2
15 	unsigned long k3
16 	CODE:
17 		unsigned long sum=0, delta=0x9e3779b9, n=32;
18 		unsigned long k[4]; k[0]=k0;k[1]=k1;k[2]=k2;k[3]=k3;
19 		while (n-- > 0) {
20 			v0 += (((v1<<4) ^ (v1>>5))+v1) ^ (sum+k[sum&3]);
21 #ifdef MY_64bit_FIX_NEEDED
22 			v0 &= 0xffffffff;
23 #endif
24 			sum += delta;
25 			v1 += (((v0<<4) ^ (v0>>5))+v0) ^ (sum+k[sum>>11 & 3]);
26 #ifdef MY_64bit_FIX_NEEDED
27 			v1 &= 0xffffffff;
28 #endif
29 		}
30 	ST(0) = sv_2mortal(newSViv(v0));
31 	ST(1) = sv_2mortal(newSViv(v1));
32 	XSRETURN(2);
33 
34 void
35 tea_decode(v0,v1,k0,k1,k2,k3)
36 	unsigned long v0
37 	unsigned long v1
38 	unsigned long k0
39 	unsigned long k1
40 	unsigned long k2
41 	unsigned long k3
42 	CODE:
43 		unsigned long n=32, sum, delta=0x9e3779b9;
44 		unsigned long k[4]; k[0]=k0;k[1]=k1;k[2]=k2;k[3]=k3;
45 		sum=delta<<5 ;
46 		while (n-- > 0) {
47 			v1 -= (((v0<<4) ^ (v0>>5))+v0) ^ (sum+k[sum>>11 & 3]) ;
48 #ifdef MY_64bit_FIX_NEEDED
49 			v1 &= 0xffffffff;
50 #endif
51 			sum -= delta ;
52 			v0 -= (((v1<<4) ^ (v1>>5))+v1) ^ (sum+k[sum&3]) ;
53 #ifdef MY_64bit_FIX_NEEDED
54 			v0 &= 0xffffffff;
55 #endif
56 		}
57 	ST(0) = sv_2mortal(newSViv(v0));
58 	ST(1) = sv_2mortal(newSViv(v1));
59 	XSRETURN(2);
60 
61 void
62 oldtea_code(v0,v1,k0,k1,k2,k3)
63 	unsigned long v0
64 	unsigned long v1
65 	unsigned long k0
66 	unsigned long k1
67 	unsigned long k2
68 	unsigned long k3
69 	CODE:
70 		unsigned long sum=0, delta=0x9e3779b9, n=32;
71 		while (n-- > 0) {
72 			sum += delta ;
73 			v0 += ((v1<<4)+k0) ^ (v1+sum) ^ ((v1>>5)+k1) ;
74 #ifdef MY_64bit_FIX_NEEDED
75 			v0 &= 0xffffffff;
76 #endif
77 			v1 += ((v0<<4)+k2) ^ (v0+sum) ^ ((v0>>5)+k3) ;
78 #ifdef MY_64bit_FIX_NEEDED
79 			v1 &= 0xffffffff;
80 #endif
81 		}
82 	ST(0) = sv_2mortal(newSViv(v0));
83 	ST(1) = sv_2mortal(newSViv(v1));
84 	XSRETURN(2);
85 
86 void
87 oldtea_decode(v0,v1,k0,k1,k2,k3)
88 	unsigned long v0
89 	unsigned long v1
90 	unsigned long k0
91 	unsigned long k1
92 	unsigned long k2
93 	unsigned long k3
94 	CODE:
95 		unsigned long n=32, sum, delta=0x9e3779b9;
96 		sum=delta<<5 ;
97 		while (n-- > 0) {
98 			v1 -= ((v0<<4)+k2) ^ (v0+sum) ^ ((v0>>5)+k3) ;
99 #ifdef MY_64bit_FIX_NEEDED
100 			v1 &= 0xffffffff;
101 #endif
102 			v0 -= ((v1<<4)+k0) ^ (v1+sum) ^ ((v1>>5)+k1) ;
103 #ifdef MY_64bit_FIX_NEEDED
104 			v0 &= 0xffffffff;
105 #endif
106 			sum -= delta ;
107 		}
108 	ST(0) = sv_2mortal(newSViv(v0));
109 	ST(1) = sv_2mortal(newSViv(v1));
110 	XSRETURN(2);
111 
112